Warning: Permanently added '2620:52:3:1:dead:beef:cafe:c297' (ED25519) to the list of known hosts. You can reproduce this build on your computer by running: sudo dnf install copr-rpmbuild /usr/bin/copr-rpmbuild --verbose --drop-resultdir --task-url https://copr.fedorainfracloud.org/backend/get-build-task/8363027-fedora-rawhide-ppc64le --chroot fedora-rawhide-ppc64le Version: 1.2 PID: 15055 Logging PID: 15056 Task: {'allow_user_ssh': False, 'appstream': False, 'background': False, 'build_id': 8363027, 'buildroot_pkgs': [], 'chroot': 'fedora-rawhide-ppc64le', 'enable_net': True, 'fedora_review': False, 'git_hash': 'a9d605adbffbf7e413c37c35fb81f2bbb97625b3', 'git_repo': 'https://copr-dist-git.fedorainfracloud.org/git/packit/evverx-scapy-2/scapy', 'isolation': 'default', 'memory_reqs': 2048, 'package_name': 'scapy', 'package_version': '2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93', 'project_dirname': 'evverx-scapy-2', 'project_name': 'evverx-scapy-2', 'project_owner': 'packit', 'repo_priority': None, 'repos': [{'baseurl': 'https://download.copr.fedorainfracloud.org/results/packit/evverx-scapy-2/fedora-rawhide-ppc64le/', 'id': 'copr_base', 'name': 'Copr repository', 'priority': None}], 'sandbox': 'packit/evverx-scapy-2--packit', 'source_json': {}, 'source_type': None, 'ssh_public_keys': None, 'storage': 0, 'submitter': 'packit', 'tags': [], 'task_id': '8363027-fedora-rawhide-ppc64le', 'timeout': 18000, 'uses_devel_repo': False, 'with_opts': [], 'without_opts': []} Running: git clone https://copr-dist-git.fedorainfracloud.org/git/packit/evverx-scapy-2/scapy /var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy --depth 500 --no-single-branch --recursive cmd: ['git', 'clone', 'https://copr-dist-git.fedorainfracloud.org/git/packit/evverx-scapy-2/scapy', '/var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy', '--depth', '500', '--no-single-branch', '--recursive'] cwd: . rc: 0 stdout: stderr: Cloning into '/var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy'... Running: git checkout a9d605adbffbf7e413c37c35fb81f2bbb97625b3 -- cmd: ['git', 'checkout', 'a9d605adbffbf7e413c37c35fb81f2bbb97625b3', '--'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy rc: 0 stdout: stderr: Note: switching to 'a9d605adbffbf7e413c37c35fb81f2bbb97625b3'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at a9d605a automatic import of scapy Running: dist-git-client sources /usr/bin/tail: /var/lib/copr-rpmbuild/main.log: file truncated cmd: ['dist-git-client', 'sources'] cwd: /var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy rc: 0 stdout: stderr: INFO: Reading stdout from command: git rev-parse --abbrev-ref HEAD INFO: Reading stdout from command: git rev-parse HEAD INFO: Reading sources specification file: sources INFO: Downloading scapy-2.5.0.tar.gz INFO: Reading stdout from command: curl --help all INFO: Calling: curl -H Pragma: -o scapy-2.5.0.tar.gz --location --connect-timeout 60 --retry 3 --retry-delay 10 --remote-time --show-error --fail --retry-all-errors https://copr-dist-git.fedorainfracloud.org/repo/pkgs/packit/evverx-scapy-2/scapy/scapy-2.5.0.tar.gz/md5/b35ff57d31227342c7f39ff64e4bda67/scapy-2.5.0.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 6910k 100 6910k 0 0 21.2M 0 --:--:-- --:--:-- --:--:-- 21.3M INFO: Reading stdout from command: md5sum scapy-2.5.0.tar.gz Running (timeout=18000): unbuffer mock --spec /var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy/scapy.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1733621700.483719 -r /var/lib/copr-rpmbuild/results/configs/child.cfg INFO: mock.py version 5.9 starting (python version = 3.13.0, NVR = mock-5.9-1.fc41), args: /usr/libexec/mock/mock --spec /var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy/scapy.spec --sources /var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1733621700.483719 -r /var/lib/copr-rpmbuild/results/configs/child.cfg Start(bootstrap): init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish(bootstrap): init plugins Start: init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish: init plugins INFO: Signal handler active Start: run INFO: Start(/var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy/scapy.spec) Config(fedora-rawhide-ppc64le) Start: clean chroot Finish: clean chroot Mock Version: 5.9 INFO: Mock Version: 5.9 Start(bootstrap): chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-ppc64le-bootstrap-1733621700.483719/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start(bootstrap): cleaning package manager metadata Finish(bootstrap): cleaning package manager metadata INFO: Guessed host environment type: unknown INFO: Using bootstrap image: registry.fedoraproject.org/fedora:rawhide INFO: Pulling image: registry.fedoraproject.org/fedora:rawhide INFO: Copy content of container registry.fedoraproject.org/fedora:rawhide to /var/lib/mock/fedora-rawhide-ppc64le-bootstrap-1733621700.483719/root INFO: Checking that registry.fedoraproject.org/fedora:rawhide image matches host's architecture INFO: mounting registry.fedoraproject.org/fedora:rawhide with podman image mount INFO: image registry.fedoraproject.org/fedora:rawhide as /var/lib/containers/storage/overlay/a6a990e79d821ede2ba470085c140fb87200cdd64a4eba4e9a39e315a9014e06/merged INFO: umounting image registry.fedoraproject.org/fedora:rawhide (/var/lib/containers/storage/overlay/a6a990e79d821ede2ba470085c140fb87200cdd64a4eba4e9a39e315a9014e06/merged) with podman image umount INFO: Package manager dnf5 detected and used (fallback) INFO: Not updating bootstrap chroot, bootstrap_image_ready=True Start(bootstrap): creating root cache Finish(bootstrap): creating root cache Finish(bootstrap): chroot init Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-ppc64le-1733621700.483719/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Package manager dnf5 detected and used (direct choice) INFO: Buildroot is handled by package management downloaded with a bootstrap image: rpm-4.20.0-1.fc42.ppc64le rpm-sequoia-1.7.0-2.fc41.ppc64le dnf5-5.2.7.0-1.fc42.ppc64le dnf5-plugins-5.2.7.0-1.fc42.ppc64le Start: installing minimal buildroot with dnf5 Updating and loading repositories: fedora 100% | 8.4 MiB/s | 20.1 MiB | 00m02s Copr repository 100% | 20.6 KiB/s | 2.9 KiB | 00m00s Repositories loaded. Package Arch Version Repository Size Installing group/module packages: bash ppc64le 5.2.37-1.fc42 fedora 8.7 MiB bzip2 ppc64le 1.0.8-19.fc41 fedora 427.5 KiB coreutils ppc64le 9.5-11.fc42 fedora 9.4 MiB cpio ppc64le 2.15-2.fc41 fedora 1.2 MiB diffutils ppc64le 3.10-8.fc41 fedora 2.2 MiB fedora-release-common noarch 42-0.11 fedora 19.8 KiB findutils ppc64le 1:4.10.0-4.fc41 fedora 2.2 MiB gawk ppc64le 5.3.0-4.fc41 fedora 4.5 MiB glibc-minimal-langpack ppc64le 2.40.9000-21.fc42 fedora 0.0 B grep ppc64le 3.11-9.fc41 fedora 1.2 MiB gzip ppc64le 1.13-2.fc41 fedora 552.8 KiB info ppc64le 7.1.1-2.fc42 fedora 741.5 KiB patch ppc64le 2.7.6-25.fc41 fedora 390.5 KiB redhat-rpm-config noarch 296-1.fc42 fedora 186.6 KiB rpm-build ppc64le 4.20.0-1.fc42 fedora 1.4 MiB sed ppc64le 4.9-3.fc41 fedora 1.0 MiB shadow-utils ppc64le 2:4.16.0-7.fc42 fedora 5.4 MiB tar ppc64le 2:1.35-4.fc41 fedora 3.2 MiB unzip ppc64le 6.0-65.fc42 fedora 2.3 MiB util-linux ppc64le 2.40.2-8.fc42 fedora 17.2 MiB which ppc64le 2.21-42.fc41 fedora 248.0 KiB xz ppc64le 1:5.6.3-2.fc42 fedora 1.5 MiB Installing dependencies: add-determinism ppc64le 0.4.3-1.fc42 fedora 2.6 MiB alternatives ppc64le 1.30-1.fc41 fedora 218.2 KiB ansible-srpm-macros noarch 1-16.fc41 fedora 35.7 KiB audit-libs ppc64le 4.0.2-1.fc41 fedora 675.2 KiB authselect ppc64le 1.5.0-8.fc42 fedora 309.4 KiB authselect-libs ppc64le 1.5.0-8.fc42 fedora 931.7 KiB basesystem noarch 11-21.fc41 fedora 0.0 B binutils ppc64le 2.43.50-9.fc42 fedora 31.4 MiB build-reproducibility-srpm-macros noarch 0.4.3-1.fc42 fedora 735.0 B bzip2-libs ppc64le 1.0.8-19.fc41 fedora 200.6 KiB ca-certificates noarch 2024.2.69_v8.0.401-3.fc42 fedora 2.6 MiB coreutils-common ppc64le 9.5-11.fc42 fedora 11.2 MiB cracklib ppc64le 2.9.11-6.fc41 fedora 934.2 KiB crypto-policies noarch 20241128-1.gitbb7b0b0.fc42 fedora 137.3 KiB curl ppc64le 8.10.1-2.fc42 fedora 581.3 KiB cyrus-sasl-lib ppc64le 2.1.28-27.fc41 fedora 3.5 MiB debugedit ppc64le 5.1-2.fc42 fedora 308.1 KiB dwz ppc64le 0.15-8.fc42 fedora 450.8 KiB ed ppc64le 1.20.2-2.fc41 fedora 282.8 KiB efi-srpm-macros noarch 5-13.fc42 fedora 40.2 KiB elfutils ppc64le 0.192-7.fc42 fedora 3.4 MiB elfutils-debuginfod-client ppc64le 0.192-7.fc42 fedora 140.9 KiB elfutils-default-yama-scope noarch 0.192-7.fc42 fedora 1.8 KiB elfutils-libelf ppc64le 0.192-7.fc42 fedora 1.2 MiB elfutils-libs ppc64le 0.192-7.fc42 fedora 862.5 KiB fedora-gpg-keys noarch 42-0.3 fedora 126.4 KiB fedora-release noarch 42-0.11 fedora 0.0 B fedora-release-identity-basic noarch 42-0.11 fedora 719.0 B fedora-repos noarch 42-0.3 fedora 4.9 KiB fedora-repos-rawhide noarch 42-0.3 fedora 2.2 KiB file ppc64le 5.45-8.fc42 fedora 139.5 KiB file-libs ppc64le 5.45-8.fc42 fedora 10.0 MiB filesystem ppc64le 3.18-29.fc42 fedora 106.0 B fonts-srpm-macros noarch 1:2.0.5-17.fc41 fedora 55.8 KiB forge-srpm-macros noarch 0.4.0-1.fc42 fedora 38.9 KiB fpc-srpm-macros noarch 1.3-13.fc41 fedora 144.0 B gdb-minimal ppc64le 15.2-3.fc42 fedora 15.7 MiB gdbm ppc64le 1:1.23-7.fc41 fedora 928.3 KiB gdbm-libs ppc64le 1:1.23-7.fc41 fedora 425.5 KiB ghc-srpm-macros noarch 1.9.2-1.fc42 fedora 779.0 B glibc ppc64le 2.40.9000-21.fc42 fedora 11.5 MiB glibc-common ppc64le 2.40.9000-21.fc42 fedora 1.5 MiB glibc-gconv-extra ppc64le 2.40.9000-21.fc42 fedora 18.3 MiB gmp ppc64le 1:6.3.0-2.fc41 fedora 850.3 KiB gnat-srpm-macros noarch 6-6.fc41 fedora 1.0 KiB go-srpm-macros noarch 3.6.0-5.fc42 fedora 60.8 KiB jansson ppc64le 2.14-1.fc42 fedora 221.1 KiB json-c ppc64le 0.18-1.fc42 fedora 139.1 KiB kernel-srpm-macros noarch 1.0-24.fc41 fedora 1.9 KiB keyutils-libs ppc64le 1.6.3-4.fc41 fedora 226.1 KiB krb5-libs ppc64le 1.21.3-3.fc42 fedora 3.0 MiB libacl ppc64le 2.3.2-2.fc41 fedora 195.7 KiB libarchive ppc64le 3.7.7-1.fc42 fedora 1.3 MiB libattr ppc64le 2.5.2-4.fc41 fedora 196.3 KiB libblkid ppc64le 2.40.2-8.fc42 fedora 482.6 KiB libbrotli ppc64le 1.1.0-5.fc41 fedora 1.3 MiB libcap ppc64le 2.71-1.fc42 fedora 508.8 KiB libcap-ng ppc64le 0.8.5-3.fc41 fedora 416.5 KiB libcom_err ppc64le 1.47.1-6.fc42 fedora 239.1 KiB libcurl ppc64le 8.10.1-2.fc42 fedora 1.1 MiB libeconf ppc64le 0.7.4-3.fc42 fedora 85.6 KiB libevent ppc64le 2.1.12-14.fc41 fedora 1.6 MiB libfdisk ppc64le 2.40.2-8.fc42 fedora 611.0 KiB libffi ppc64le 3.4.6-3.fc42 fedora 218.0 KiB libgcc ppc64le 14.2.1-6.fc42 fedora 286.4 KiB libgomp ppc64le 14.2.1-6.fc42 fedora 631.4 KiB libidn2 ppc64le 2.3.7-2.fc41 fedora 456.8 KiB libmount ppc64le 2.40.2-8.fc42 fedora 548.0 KiB libnghttp2 ppc64le 1.64.0-1.fc42 fedora 326.1 KiB libpkgconf ppc64le 2.3.0-1.fc42 fedora 198.0 KiB libpsl ppc64le 0.21.5-4.fc41 fedora 196.2 KiB libpwquality ppc64le 1.4.5-11.fc41 fedora 1.1 MiB librtas ppc64le 2.0.6-2.fc41 fedora 497.6 KiB libselinux ppc64le 3.8-0.rc1.2.fc42 fedora 259.5 KiB libsemanage ppc64le 3.8-0.rc1.1.fc42 fedora 417.0 KiB libsepol ppc64le 3.8-0.rc1.1.fc42 fedora 1.0 MiB libsmartcols ppc64le 2.40.2-8.fc42 fedora 353.5 KiB libssh ppc64le 0.11.1-1.fc42 fedora 777.7 KiB libssh-config noarch 0.11.1-1.fc42 fedora 277.0 B libstdc++ ppc64le 14.2.1-6.fc42 fedora 3.8 MiB libtasn1 ppc64le 4.19.0-9.fc41 fedora 347.4 KiB libtirpc ppc64le 1.3.6-1.fc42 fedora 276.8 KiB libtool-ltdl ppc64le 2.4.7-12.fc41 fedora 222.1 KiB libunistring ppc64le 1.1-8.fc41 fedora 1.9 MiB libuuid ppc64le 2.40.2-8.fc42 fedora 197.4 KiB libverto ppc64le 0.3.2-9.fc41 fedora 197.2 KiB libxcrypt ppc64le 4.4.36-11.fc42 fedora 335.1 KiB libxml2 ppc64le 2.12.8-2.fc41 fedora 2.5 MiB libzstd ppc64le 1.5.6-2.fc41 fedora 988.0 KiB lua-libs ppc64le 5.4.7-1.fc42 fedora 521.0 KiB lua-srpm-macros noarch 1-14.fc41 fedora 1.3 KiB lz4-libs ppc64le 1.10.0-1.fc41 fedora 325.2 KiB mpfr ppc64le 4.2.1-5.fc41 fedora 976.9 KiB ncurses-base noarch 6.5-2.20240629.fc41 fedora 326.3 KiB ncurses-libs ppc64le 6.5-2.20240629.fc41 fedora 2.4 MiB ocaml-srpm-macros noarch 10-3.fc41 fedora 1.9 KiB openblas-srpm-macros noarch 2-18.fc41 fedora 112.0 B openldap ppc64le 2.6.8-6.fc42 fedora 874.8 KiB openssl-libs ppc64le 1:3.2.2-8.fc42 fedora 8.6 MiB p11-kit ppc64le 0.25.5-4.fc42 fedora 3.1 MiB p11-kit-trust ppc64le 0.25.5-4.fc42 fedora 655.4 KiB package-notes-srpm-macros noarch 0.5-12.fc41 fedora 1.6 KiB pam ppc64le 1.7.0-3.fc42 fedora 4.2 MiB pam-libs ppc64le 1.7.0-3.fc42 fedora 286.9 KiB pcre2 ppc64le 10.44-1.fc41.1 fedora 968.8 KiB pcre2-syntax noarch 10.44-1.fc41.1 fedora 251.6 KiB perl-srpm-macros noarch 1-56.fc41 fedora 861.0 B pkgconf ppc64le 2.3.0-1.fc42 fedora 240.5 KiB pkgconf-m4 noarch 2.3.0-1.fc42 fedora 14.4 KiB pkgconf-pkg-config ppc64le 2.3.0-1.fc42 fedora 990.0 B popt ppc64le 1.19-7.fc41 fedora 272.8 KiB publicsuffix-list-dafsa noarch 20240107-4.fc41 fedora 67.5 KiB pyproject-srpm-macros noarch 1.16.3-1.fc42 fedora 1.9 KiB python-srpm-macros noarch 3.13-3.fc41 fedora 51.0 KiB qt5-srpm-macros noarch 5.15.15-1.fc42 fedora 500.0 B qt6-srpm-macros noarch 6.8.0-1.fc42 fedora 456.0 B readline ppc64le 8.2-11.fc42 fedora 881.0 KiB rpm ppc64le 4.20.0-1.fc42 fedora 4.8 MiB rpm-build-libs ppc64le 4.20.0-1.fc42 fedora 390.6 KiB rpm-libs ppc64le 4.20.0-1.fc42 fedora 1.2 MiB rpm-sequoia ppc64le 1.7.0-2.fc41 fedora 2.9 MiB rust-srpm-macros noarch 26.3-3.fc42 fedora 4.8 KiB setup noarch 2.15.0-5.fc41 fedora 720.7 KiB sqlite-libs ppc64le 3.47.1-1.fc42 fedora 1.8 MiB systemd-libs ppc64le 257~rc3-1.fc42 fedora 2.9 MiB util-linux-core ppc64le 2.40.2-8.fc42 fedora 6.2 MiB xxhash-libs ppc64le 0.8.2-4.fc42 fedora 211.9 KiB xz-libs ppc64le 1:5.6.3-2.fc42 fedora 394.1 KiB zig-srpm-macros noarch 1-3.fc41 fedora 1.1 KiB zip ppc64le 3.0-41.fc41 fedora 1.2 MiB zlib-ng-compat ppc64le 2.2.2-1.fc42 fedora 197.7 KiB zstd ppc64le 1.5.6-2.fc41 fedora 2.1 MiB Installing groups: Buildsystem building group Transaction Summary: Installing: 154 packages Total size of inbound packages is 57 MiB. Need to download 57 MiB. After this operation, 264 MiB extra will be used (install 264 MiB, remove 0 B). [ 1/154] bzip2-0:1.0.8-19.fc41.ppc64le 100% | 550.4 KiB/s | 53.4 KiB | 00m00s [ 2/154] cpio-0:2.15-2.fc41.ppc64le 100% | 3.7 MiB/s | 299.5 KiB | 00m00s [ 3/154] bash-0:5.2.37-1.fc42.ppc64le 100% | 9.5 MiB/s | 1.9 MiB | 00m00s [ 4/154] fedora-release-common-0:42-0. 100% | 1.2 MiB/s | 23.9 KiB | 00m00s [ 5/154] findutils-1:4.10.0-4.fc41.ppc 100% | 11.3 MiB/s | 588.1 KiB | 00m00s [ 6/154] diffutils-0:3.10-8.fc41.ppc64 100% | 3.9 MiB/s | 417.5 KiB | 00m00s [ 7/154] glibc-minimal-langpack-0:2.40 100% | 4.1 MiB/s | 120.6 KiB | 00m00s [ 8/154] gawk-0:5.3.0-4.fc41.ppc64le 100% | 14.8 MiB/s | 1.1 MiB | 00m00s [ 9/154] grep-0:3.11-9.fc41.ppc64le 100% | 5.4 MiB/s | 309.5 KiB | 00m00s [ 10/154] gzip-0:1.13-2.fc41.ppc64le 100% | 7.4 MiB/s | 174.2 KiB | 00m00s [ 11/154] patch-0:2.7.6-25.fc41.ppc64le 100% | 5.1 MiB/s | 142.1 KiB | 00m00s [ 12/154] info-0:7.1.1-2.fc42.ppc64le 100% | 5.8 MiB/s | 201.4 KiB | 00m00s [ 13/154] redhat-rpm-config-0:296-1.fc4 100% | 4.5 MiB/s | 82.4 KiB | 00m00s [ 14/154] rpm-build-0:4.20.0-1.fc42.ppc 100% | 2.7 MiB/s | 84.9 KiB | 00m00s [ 15/154] sed-0:4.9-3.fc41.ppc64le 100% | 4.4 MiB/s | 323.2 KiB | 00m00s [ 16/154] shadow-utils-2:4.16.0-7.fc42. 100% | 8.0 MiB/s | 1.3 MiB | 00m00s [ 17/154] coreutils-0:9.5-11.fc42.ppc64 100% | 1.9 MiB/s | 1.2 MiB | 00m01s [ 18/154] tar-2:1.35-4.fc41.ppc64le 100% | 5.5 MiB/s | 882.9 KiB | 00m00s [ 19/154] unzip-0:6.0-65.fc42.ppc64le 100% | 3.6 MiB/s | 192.7 KiB | 00m00s [ 20/154] which-0:2.21-42.fc41.ppc64le 100% | 1.4 MiB/s | 42.9 KiB | 00m00s [ 21/154] xz-1:5.6.3-2.fc42.ppc64le 100% | 3.5 MiB/s | 479.1 KiB | 00m00s [ 22/154] filesystem-0:3.18-29.fc42.ppc 100% | 7.3 MiB/s | 1.1 MiB | 00m00s [ 23/154] ncurses-libs-0:6.5-2.20240629 100% | 6.6 MiB/s | 378.3 KiB | 00m00s [ 24/154] bzip2-libs-0:1.0.8-19.fc41.pp 100% | 1.8 MiB/s | 46.7 KiB | 00m00s [ 25/154] util-linux-0:2.40.2-8.fc42.pp 100% | 2.7 MiB/s | 1.3 MiB | 00m00s [ 26/154] coreutils-common-0:9.5-11.fc4 100% | 7.9 MiB/s | 2.1 MiB | 00m00s [ 27/154] libacl-0:2.3.2-2.fc41.ppc64le 100% | 1.1 MiB/s | 27.3 KiB | 00m00s [ 28/154] libattr-0:2.5.2-4.fc41.ppc64l 100% | 787.8 KiB/s | 18.9 KiB | 00m00s [ 29/154] libcap-0:2.71-1.fc42.ppc64le 100% | 2.9 MiB/s | 92.4 KiB | 00m00s [ 30/154] libselinux-0:3.8-0.rc1.2.fc42 100% | 3.2 MiB/s | 103.8 KiB | 00m00s [ 31/154] gmp-1:6.3.0-2.fc41.ppc64le 100% | 1.2 MiB/s | 309.0 KiB | 00m00s [ 32/154] openssl-libs-1:3.2.2-8.fc42.p 100% | 4.3 MiB/s | 2.5 MiB | 00m01s [ 33/154] glibc-0:2.40.9000-21.fc42.ppc 100% | 2.8 MiB/s | 3.1 MiB | 00m01s [ 34/154] fedora-repos-0:42-0.3.noarch 100% | 483.8 KiB/s | 9.2 KiB | 00m00s [ 35/154] systemd-libs-0:257~rc3-1.fc42 100% | 1.2 MiB/s | 864.1 KiB | 00m01s [ 36/154] readline-0:8.2-11.fc42.ppc64l 100% | 1.6 MiB/s | 230.4 KiB | 00m00s [ 37/154] mpfr-0:4.2.1-5.fc41.ppc64le 100% | 2.2 MiB/s | 354.9 KiB | 00m00s [ 38/154] ed-0:1.20.2-2.fc41.ppc64le 100% | 1.9 MiB/s | 84.7 KiB | 00m00s [ 39/154] ansible-srpm-macros-0:1-16.fc 100% | 1.2 MiB/s | 20.8 KiB | 00m00s [ 40/154] build-reproducibility-srpm-ma 100% | 745.3 KiB/s | 11.2 KiB | 00m00s [ 41/154] pcre2-0:10.44-1.fc41.1.ppc64l 100% | 1.9 MiB/s | 251.9 KiB | 00m00s [ 42/154] dwz-0:0.15-8.fc42.ppc64le 100% | 2.3 MiB/s | 144.0 KiB | 00m00s [ 43/154] efi-srpm-macros-0:5-13.fc42.n 100% | 1.0 MiB/s | 22.5 KiB | 00m00s [ 44/154] fonts-srpm-macros-1:2.0.5-17. 100% | 1.3 MiB/s | 27.0 KiB | 00m00s [ 45/154] file-0:5.45-8.fc42.ppc64le 100% | 2.0 MiB/s | 49.4 KiB | 00m00s [ 46/154] glibc-common-0:2.40.9000-21.f 100% | 2.1 MiB/s | 405.6 KiB | 00m00s [ 47/154] fpc-srpm-macros-0:1.3-13.fc41 100% | 379.1 KiB/s | 8.0 KiB | 00m00s [ 48/154] forge-srpm-macros-0:0.4.0-1.f 100% | 760.0 KiB/s | 19.8 KiB | 00m00s [ 49/154] ghc-srpm-macros-0:1.9.2-1.fc4 100% | 455.9 KiB/s | 9.1 KiB | 00m00s [ 50/154] gnat-srpm-macros-0:6-6.fc41.n 100% | 559.5 KiB/s | 9.0 KiB | 00m00s [ 51/154] go-srpm-macros-0:3.6.0-5.fc42 100% | 1.4 MiB/s | 28.0 KiB | 00m00s [ 52/154] kernel-srpm-macros-0:1.0-24.f 100% | 519.4 KiB/s | 9.9 KiB | 00m00s [ 53/154] lua-srpm-macros-0:1-14.fc41.n 100% | 554.9 KiB/s | 8.9 KiB | 00m00s [ 54/154] ocaml-srpm-macros-0:10-3.fc41 100% | 484.2 KiB/s | 9.2 KiB | 00m00s [ 55/154] openblas-srpm-macros-0:2-18.f 100% | 406.0 KiB/s | 7.7 KiB | 00m00s [ 56/154] package-notes-srpm-macros-0:0 100% | 614.3 KiB/s | 9.8 KiB | 00m00s [ 57/154] perl-srpm-macros-0:1-56.fc41. 100% | 425.6 KiB/s | 8.5 KiB | 00m00s [ 58/154] pyproject-srpm-macros-0:1.16. 100% | 729.8 KiB/s | 13.9 KiB | 00m00s [ 59/154] python-srpm-macros-0:3.13-3.f 100% | 1.4 MiB/s | 23.7 KiB | 00m00s [ 60/154] qt5-srpm-macros-0:5.15.15-1.f 100% | 444.9 KiB/s | 8.9 KiB | 00m00s [ 61/154] qt6-srpm-macros-0:6.8.0-1.fc4 100% | 603.3 KiB/s | 9.0 KiB | 00m00s [ 62/154] rust-srpm-macros-0:26.3-3.fc4 100% | 756.2 KiB/s | 12.1 KiB | 00m00s [ 63/154] zig-srpm-macros-0:1-3.fc41.no 100% | 427.5 KiB/s | 8.1 KiB | 00m00s [ 64/154] zip-0:3.0-41.fc41.ppc64le 100% | 2.8 MiB/s | 274.1 KiB | 00m00s [ 65/154] debugedit-0:5.1-2.fc42.ppc64l 100% | 2.3 MiB/s | 81.6 KiB | 00m00s [ 66/154] rpm-0:4.20.0-1.fc42.ppc64le 100% | 2.4 MiB/s | 549.8 KiB | 00m00s [ 67/154] elfutils-libelf-0:0.192-7.fc4 100% | 2.4 MiB/s | 213.1 KiB | 00m00s [ 68/154] elfutils-0:0.192-7.fc42.ppc64 100% | 3.3 MiB/s | 526.7 KiB | 00m00s [ 69/154] pkgconf-pkg-config-0:2.3.0-1. 100% | 414.0 KiB/s | 9.9 KiB | 00m00s [ 70/154] popt-0:1.19-7.fc41.ppc64le 100% | 1.5 MiB/s | 70.4 KiB | 00m00s [ 71/154] rpm-build-libs-0:4.20.0-1.fc4 100% | 2.3 MiB/s | 107.0 KiB | 00m00s [ 72/154] libarchive-0:3.7.7-1.fc42.ppc 100% | 2.8 MiB/s | 479.7 KiB | 00m00s [ 73/154] rpm-libs-0:4.20.0-1.fc42.ppc6 100% | 3.4 MiB/s | 353.8 KiB | 00m00s [ 74/154] audit-libs-0:4.0.2-1.fc41.ppc 100% | 2.8 MiB/s | 142.5 KiB | 00m00s [ 75/154] libeconf-0:0.7.4-3.fc42.ppc64 100% | 1.7 MiB/s | 39.3 KiB | 00m00s [ 76/154] zstd-0:1.5.6-2.fc41.ppc64le 100% | 2.9 MiB/s | 504.1 KiB | 00m00s [ 77/154] libsemanage-0:3.8-0.rc1.1.fc4 100% | 3.0 MiB/s | 128.0 KiB | 00m00s [ 78/154] pam-libs-0:1.7.0-3.fc42.ppc64 100% | 2.4 MiB/s | 64.0 KiB | 00m00s [ 79/154] libxcrypt-0:4.4.36-11.fc42.pp 100% | 2.8 MiB/s | 129.9 KiB | 00m00s [ 80/154] setup-0:2.15.0-5.fc41.noarch 100% | 3.1 MiB/s | 154.4 KiB | 00m00s [ 81/154] libblkid-0:2.40.2-8.fc42.ppc6 100% | 3.5 MiB/s | 141.6 KiB | 00m00s [ 82/154] authselect-libs-0:1.5.0-8.fc4 100% | 2.6 MiB/s | 222.7 KiB | 00m00s [ 83/154] libcap-ng-0:0.8.5-3.fc41.ppc6 100% | 2.1 MiB/s | 33.7 KiB | 00m00s [ 84/154] libfdisk-0:2.40.2-8.fc42.ppc6 100% | 3.0 MiB/s | 175.7 KiB | 00m00s [ 85/154] libmount-0:2.40.2-8.fc42.ppc6 100% | 3.2 MiB/s | 177.8 KiB | 00m00s [ 86/154] libsmartcols-0:2.40.2-8.fc42. 100% | 3.3 MiB/s | 109.9 KiB | 00m00s [ 87/154] librtas-0:2.0.6-2.fc41.ppc64l 100% | 1.6 MiB/s | 81.3 KiB | 00m00s [ 88/154] libuuid-0:2.40.2-8.fc42.ppc64 100% | 1.9 MiB/s | 30.5 KiB | 00m00s [ 89/154] pam-0:1.7.0-3.fc42.ppc64le 100% | 3.8 MiB/s | 592.9 KiB | 00m00s [ 90/154] util-linux-core-0:2.40.2-8.fc 100% | 3.3 MiB/s | 580.8 KiB | 00m00s [ 91/154] zlib-ng-compat-0:2.2.2-1.fc42 100% | 3.1 MiB/s | 78.9 KiB | 00m00s [ 92/154] xz-libs-1:5.6.3-2.fc42.ppc64l 100% | 2.5 MiB/s | 124.7 KiB | 00m00s [ 93/154] basesystem-0:11-21.fc41.noarc 100% | 368.6 KiB/s | 7.4 KiB | 00m00s [ 94/154] libgcc-0:14.2.1-6.fc42.ppc64l 100% | 2.3 MiB/s | 115.5 KiB | 00m00s [ 95/154] ncurses-base-0:6.5-2.20240629 100% | 2.3 MiB/s | 88.4 KiB | 00m00s [ 96/154] libsepol-0:3.8-0.rc1.1.fc42.p 100% | 3.4 MiB/s | 376.8 KiB | 00m00s [ 97/154] glibc-gconv-extra-0:2.40.9000 100% | 4.8 MiB/s | 1.6 MiB | 00m00s [ 98/154] crypto-policies-0:20241128-1. 100% | 3.2 MiB/s | 98.4 KiB | 00m00s [ 99/154] fedora-gpg-keys-0:42-0.3.noar 100% | 4.1 MiB/s | 133.6 KiB | 00m00s [100/154] fedora-repos-rawhide-0:42-0.3 100% | 515.5 KiB/s | 8.8 KiB | 00m00s [101/154] pcre2-syntax-0:10.44-1.fc41.1 100% | 3.4 MiB/s | 149.9 KiB | 00m00s [102/154] ca-certificates-0:2024.2.69_v 100% | 4.0 MiB/s | 944.5 KiB | 00m00s [103/154] add-determinism-0:0.4.3-1.fc4 100% | 5.3 MiB/s | 941.8 KiB | 00m00s [104/154] file-libs-0:5.45-8.fc42.ppc64 100% | 4.6 MiB/s | 774.1 KiB | 00m00s [105/154] curl-0:8.10.1-2.fc42.ppc64le 100% | 3.6 MiB/s | 225.7 KiB | 00m00s [106/154] alternatives-0:1.30-1.fc41.pp 100% | 1.6 MiB/s | 44.8 KiB | 00m00s [107/154] binutils-0:2.43.50-9.fc42.ppc 100% | 3.6 MiB/s | 6.5 MiB | 00m02s [108/154] elfutils-debuginfod-client-0: 100% | 882.1 KiB/s | 46.7 KiB | 00m00s [109/154] jansson-0:2.14-1.fc42.ppc64le 100% | 991.1 KiB/s | 50.5 KiB | 00m00s [110/154] elfutils-libs-0:0.192-7.fc42. 100% | 3.6 MiB/s | 288.9 KiB | 00m00s [111/154] libzstd-0:1.5.6-2.fc41.ppc64l 100% | 2.5 MiB/s | 336.8 KiB | 00m00s [112/154] lz4-libs-0:1.10.0-1.fc41.ppc6 100% | 4.0 MiB/s | 97.7 KiB | 00m00s [113/154] libstdc++-0:14.2.1-6.fc42.ppc 100% | 5.4 MiB/s | 1.0 MiB | 00m00s [114/154] pkgconf-0:2.3.0-1.fc42.ppc64l 100% | 1.5 MiB/s | 45.9 KiB | 00m00s [115/154] pkgconf-m4-0:2.3.0-1.fc42.noa 100% | 895.1 KiB/s | 14.3 KiB | 00m00s [116/154] lua-libs-0:5.4.7-1.fc42.ppc64 100% | 3.5 MiB/s | 148.1 KiB | 00m00s [117/154] libxml2-0:2.12.8-2.fc41.ppc64 100% | 3.9 MiB/s | 767.3 KiB | 00m00s [118/154] libgomp-0:14.2.1-6.fc42.ppc64 100% | 2.2 MiB/s | 370.0 KiB | 00m00s [119/154] authselect-0:1.5.0-8.fc42.ppc 100% | 2.9 MiB/s | 147.0 KiB | 00m00s [120/154] sqlite-libs-0:3.47.1-1.fc42.p 100% | 4.4 MiB/s | 792.5 KiB | 00m00s [121/154] rpm-sequoia-0:1.7.0-2.fc41.pp 100% | 4.5 MiB/s | 981.0 KiB | 00m00s [122/154] gdbm-1:1.23-7.fc41.ppc64le 100% | 2.7 MiB/s | 158.9 KiB | 00m00s [123/154] gdbm-libs-1:1.23-7.fc41.ppc64 100% | 2.2 MiB/s | 61.7 KiB | 00m00s [124/154] libpwquality-0:1.4.5-11.fc41. 100% | 2.8 MiB/s | 122.3 KiB | 00m00s [125/154] libffi-0:3.4.6-3.fc42.ppc64le 100% | 1.3 MiB/s | 38.2 KiB | 00m00s [126/154] libtirpc-0:1.3.6-1.fc42.ppc64 100% | 2.0 MiB/s | 108.6 KiB | 00m00s [127/154] json-c-0:0.18-1.fc42.ppc64le 100% | 1.4 MiB/s | 48.9 KiB | 00m00s [128/154] p11-kit-trust-0:0.25.5-4.fc42 100% | 2.6 MiB/s | 149.4 KiB | 00m00s [129/154] elfutils-default-yama-scope-0 100% | 479.4 KiB/s | 12.5 KiB | 00m00s [130/154] libpkgconf-0:2.3.0-1.fc42.ppc 100% | 1.4 MiB/s | 42.9 KiB | 00m00s [131/154] p11-kit-0:0.25.5-4.fc42.ppc64 100% | 3.5 MiB/s | 496.5 KiB | 00m00s [132/154] cracklib-0:2.9.11-6.fc41.ppc6 100% | 1.4 MiB/s | 94.1 KiB | 00m00s [133/154] libcom_err-0:1.47.1-6.fc42.pp 100% | 905.5 KiB/s | 27.2 KiB | 00m00s [134/154] libtasn1-0:4.19.0-9.fc41.ppc6 100% | 1.8 MiB/s | 79.3 KiB | 00m00s [135/154] keyutils-libs-0:1.6.3-4.fc41. 100% | 1.0 MiB/s | 32.8 KiB | 00m00s [136/154] libverto-0:0.3.2-9.fc41.ppc64 100% | 569.1 KiB/s | 22.2 KiB | 00m00s [137/154] fedora-release-0:42-0.11.noar 100% | 618.2 KiB/s | 13.0 KiB | 00m00s [138/154] xxhash-libs-0:0.8.2-4.fc42.pp 100% | 1.5 MiB/s | 37.2 KiB | 00m00s [139/154] fedora-release-identity-basic 100% | 919.1 KiB/s | 13.8 KiB | 00m00s [140/154] krb5-libs-0:1.21.3-3.fc42.ppc 100% | 3.7 MiB/s | 846.4 KiB | 00m00s [141/154] libcurl-0:8.10.1-2.fc42.ppc64 100% | 4.0 MiB/s | 411.7 KiB | 00m00s [142/154] libidn2-0:2.3.7-2.fc41.ppc64l 100% | 2.8 MiB/s | 121.0 KiB | 00m00s [143/154] libbrotli-0:1.1.0-5.fc41.ppc6 100% | 3.8 MiB/s | 382.0 KiB | 00m00s [144/154] libpsl-0:0.21.5-4.fc41.ppc64l 100% | 2.8 MiB/s | 65.7 KiB | 00m00s [145/154] libnghttp2-0:1.64.0-1.fc42.pp 100% | 2.8 MiB/s | 85.8 KiB | 00m00s [146/154] openldap-0:2.6.8-6.fc42.ppc64 100% | 3.0 MiB/s | 274.7 KiB | 00m00s [147/154] libssh-0:0.11.1-1.fc42.ppc64l 100% | 2.7 MiB/s | 263.2 KiB | 00m00s [148/154] publicsuffix-list-dafsa-0:202 100% | 2.8 MiB/s | 58.3 KiB | 00m00s [149/154] libssh-config-0:0.11.1-1.fc42 100% | 494.0 KiB/s | 9.4 KiB | 00m00s [150/154] libunistring-0:1.1-8.fc41.ppc 100% | 3.8 MiB/s | 575.2 KiB | 00m00s [151/154] libevent-0:2.1.12-14.fc41.ppc 100% | 3.9 MiB/s | 274.8 KiB | 00m00s [152/154] libtool-ltdl-0:2.4.7-12.fc41. 100% | 1.5 MiB/s | 39.7 KiB | 00m00s [153/154] cyrus-sasl-lib-0:2.1.28-27.fc 100% | 4.0 MiB/s | 883.1 KiB | 00m00s [154/154] gdb-minimal-0:15.2-3.fc42.ppc 100% | 4.5 MiB/s | 4.5 MiB | 00m01s -------------------------------------------------------------------------------- [154/154] Total 100% | 9.6 MiB/s | 56.5 MiB | 00m06s Running transaction Importing PGP key 0x105EF944: UserID : "Fedora (42) " Fingerprint: B0F4950458F69E1150C6C5EDC8AC4916105EF944 From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-42-primary The key was successfully imported. Importing PGP key 0x105EF944: UserID : "Fedora (42) " Fingerprint: B0F4950458F69E1150C6C5EDC8AC4916105EF944 From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-42-primary The key was successfully imported. Importing PGP key 0xE99D6AD1: UserID : "Fedora (41) " Fingerprint: 466CF2D8B60BC3057AA9453ED0622462E99D6AD1 From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-41-primary The key was successfully imported. Importing PGP key 0x31645531: UserID : "Fedora (43) " Fingerprint: C6E7F081CF80E13146676E88829B606631645531 From : file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-43-primary The key was successfully imported. [ 1/156] Verify package files 100% | 255.0 B/s | 154.0 B | 00m01s [ 2/156] Prepare transaction 100% | 1.4 KiB/s | 154.0 B | 00m00s [ 3/156] Installing libgcc-0:14.2.1-6. 100% | 93.7 MiB/s | 287.9 KiB | 00m00s [ 4/156] Installing libssh-config-0:0. 100% | 796.9 KiB/s | 816.0 B | 00m00s [ 5/156] Installing publicsuffix-list- 100% | 66.7 MiB/s | 68.3 KiB | 00m00s [ 6/156] Installing fedora-release-ide 100% | 0.0 B/s | 976.0 B | 00m00s [ 7/156] Installing fedora-repos-rawhi 100% | 2.4 MiB/s | 2.4 KiB | 00m00s [ 8/156] Installing fedora-gpg-keys-0: 100% | 16.8 MiB/s | 172.2 KiB | 00m00s [ 9/156] Installing fedora-repos-0:42- 100% | 5.6 MiB/s | 5.7 KiB | 00m00s [ 10/156] Installing fedora-release-com 100% | 11.8 MiB/s | 24.1 KiB | 00m00s [ 11/156] Installing fedora-release-0:4 100% | 0.0 B/s | 124.0 B | 00m00s [ 12/156] Installing setup-0:2.15.0-5.f 100% | 23.6 MiB/s | 726.1 KiB | 00m00s [ 13/156] Installing filesystem-0:3.18- 100% | 1.5 MiB/s | 212.6 KiB | 00m00s [ 14/156] Installing basesystem-0:11-21 100% | 0.0 B/s | 124.0 B | 00m00s [ 15/156] Installing pkgconf-m4-0:2.3.0 100% | 14.5 MiB/s | 14.8 KiB | 00m00s [ 16/156] Installing pcre2-syntax-0:10. 100% | 82.7 MiB/s | 254.1 KiB | 00m00s [ 17/156] Installing ncurses-base-0:6.5 100% | 28.6 MiB/s | 351.7 KiB | 00m00s [ 18/156] Installing glibc-minimal-lang 100% | 121.1 KiB/s | 124.0 B | 00m00s [ 19/156] Installing ncurses-libs-0:6.5 100% | 152.2 MiB/s | 2.4 MiB | 00m00s [ 20/156] Installing glibc-0:2.40.9000- 100% | 145.7 MiB/s | 11.5 MiB | 00m00s [ 21/156] Installing bash-0:5.2.37-1.fc 100% | 160.6 MiB/s | 8.7 MiB | 00m00s [ 22/156] Installing glibc-common-0:2.4 100% | 99.8 MiB/s | 1.5 MiB | 00m00s [ 23/156] Installing glibc-gconv-extra- 100% | 158.3 MiB/s | 18.4 MiB | 00m00s [ 24/156] Installing zlib-ng-compat-0:2 100% | 96.9 MiB/s | 198.5 KiB | 00m00s [ 25/156] Installing bzip2-libs-0:1.0.8 100% | 98.5 MiB/s | 201.8 KiB | 00m00s [ 26/156] Installing xz-libs-1:5.6.3-2. 100% | 128.6 MiB/s | 395.2 KiB | 00m00s [ 27/156] Installing readline-0:8.2-11. 100% | 143.7 MiB/s | 883.1 KiB | 00m00s [ 28/156] Installing popt-0:1.19-7.fc41 100% | 45.5 MiB/s | 279.4 KiB | 00m00s [ 29/156] Installing libuuid-0:2.40.2-8 100% | 96.9 MiB/s | 198.5 KiB | 00m00s [ 30/156] Installing libblkid-0:2.40.2- 100% | 118.1 MiB/s | 483.8 KiB | 00m00s [ 31/156] Installing gmp-1:6.3.0-2.fc41 100% | 138.8 MiB/s | 852.5 KiB | 00m00s [ 32/156] Installing libattr-0:2.5.2-4. 100% | 96.3 MiB/s | 197.2 KiB | 00m00s [ 33/156] Installing libacl-0:2.3.2-2.f 100% | 96.0 MiB/s | 196.6 KiB | 00m00s [ 34/156] Installing libxcrypt-0:4.4.36 100% | 82.5 MiB/s | 337.8 KiB | 00m00s [ 35/156] Installing libstdc++-0:14.2.1 100% | 164.0 MiB/s | 3.8 MiB | 00m00s [ 36/156] Installing libzstd-0:1.5.6-2. 100% | 161.0 MiB/s | 989.2 KiB | 00m00s [ 37/156] Installing elfutils-libelf-0: 100% | 156.1 MiB/s | 1.2 MiB | 00m00s [ 38/156] Installing libeconf-0:0.7.4-3 100% | 42.6 MiB/s | 87.2 KiB | 00m00s [ 39/156] Installing gdbm-libs-1:1.23-7 100% | 139.1 MiB/s | 427.2 KiB | 00m00s [ 40/156] Installing dwz-0:0.15-8.fc42. 100% | 147.2 MiB/s | 452.1 KiB | 00m00s [ 41/156] Installing mpfr-0:4.2.1-5.fc4 100% | 136.5 MiB/s | 978.6 KiB | 00m00s [ 42/156] Installing gawk-0:5.3.0-4.fc4 100% | 173.6 MiB/s | 4.5 MiB | 00m00s [ 43/156] Installing unzip-0:6.0-65.fc4 100% | 213.2 MiB/s | 2.3 MiB | 00m00s [ 44/156] Installing file-libs-0:5.45-8 100% | 231.7 MiB/s | 10.0 MiB | 00m00s [ 45/156] Installing file-0:5.45-8.fc42 100% | 9.8 MiB/s | 140.9 KiB | 00m00s [ 46/156] Installing crypto-policies-0: 100% | 13.3 MiB/s | 163.7 KiB | 00m00s [ 47/156] Installing pcre2-0:10.44-1.fc 100% | 157.9 MiB/s | 970.3 KiB | 00m00s [ 48/156] Installing grep-0:3.11-9.fc41 100% | 89.2 MiB/s | 1.2 MiB | 00m00s [ 49/156] Installing xz-1:5.6.3-2.fc42. 100% | 100.7 MiB/s | 1.5 MiB | 00m00s [ 50/156] Installing libcap-ng-0:0.8.5- 100% | 136.2 MiB/s | 418.4 KiB | 00m00s [ 51/156] Installing audit-libs-0:4.0.2 100% | 132.3 MiB/s | 677.3 KiB | 00m00s [ 52/156] Installing pam-libs-0:1.7.0-3 100% | 94.2 MiB/s | 289.3 KiB | 00m00s [ 53/156] Installing libcap-0:2.71-1.fc 100% | 100.3 MiB/s | 513.6 KiB | 00m00s [ 54/156] Installing systemd-libs-0:257 100% | 152.5 MiB/s | 2.9 MiB | 00m00s [ 55/156] Installing libsmartcols-0:2.4 100% | 115.4 MiB/s | 354.6 KiB | 00m00s [ 56/156] Installing libsepol-0:3.8-0.r 100% | 130.3 MiB/s | 1.0 MiB | 00m00s [ 57/156] Installing libselinux-0:3.8-0 100% | 84.9 MiB/s | 260.7 KiB | 00m00s [ 58/156] Installing sed-0:4.9-3.fc41.p 100% | 89.6 MiB/s | 1.0 MiB | 00m00s [ 59/156] Installing findutils-1:4.10.0 100% | 127.7 MiB/s | 2.2 MiB | 00m00s [ 60/156] Installing libmount-0:2.40.2- 100% | 134.1 MiB/s | 549.1 KiB | 00m00s [ 61/156] Installing alternatives-0:1.3 100% | 107.3 MiB/s | 219.8 KiB | 00m00s [ 62/156] Installing lz4-libs-0:1.10.0- 100% | 106.2 MiB/s | 326.3 KiB | 00m00s [ 63/156] Installing lua-libs-0:5.4.7-1 100% | 127.5 MiB/s | 522.2 KiB | 00m00s [ 64/156] Installing libffi-0:3.4.6-3.f 100% | 107.1 MiB/s | 219.4 KiB | 00m00s [ 65/156] Installing libcom_err-0:1.47. 100% | 117.3 MiB/s | 240.2 KiB | 00m00s [ 66/156] Installing libtasn1-0:4.19.0- 100% | 113.7 MiB/s | 349.2 KiB | 00m00s [ 67/156] Installing p11-kit-0:0.25.5-4 100% | 125.8 MiB/s | 3.1 MiB | 00m00s [ 68/156] Installing libunistring-0:1.1 100% | 156.0 MiB/s | 1.9 MiB | 00m00s [ 69/156] Installing libidn2-0:2.3.7-2. 100% | 64.6 MiB/s | 462.8 KiB | 00m00s [ 70/156] Installing libpsl-0:0.21.5-4. 100% | 96.4 MiB/s | 197.3 KiB | 00m00s [ 71/156] Installing p11-kit-trust-0:0. 100% | 37.7 MiB/s | 657.1 KiB | 00m00s [ 72/156] Installing zstd-0:1.5.6-2.fc4 100% | 147.6 MiB/s | 2.1 MiB | 00m00s [ 73/156] Installing util-linux-core-0: 100% | 182.3 MiB/s | 6.2 MiB | 00m00s [ 74/156] Installing tar-2:1.35-4.fc41. 100% | 138.8 MiB/s | 3.2 MiB | 00m00s [ 75/156] Installing libsemanage-0:3.8- 100% | 68.2 MiB/s | 418.8 KiB | 00m00s [ 76/156] Installing shadow-utils-2:4.1 100% | 102.0 MiB/s | 5.5 MiB | 00m00s [ 77/156] Installing zip-0:3.0-41.fc41. 100% | 138.7 MiB/s | 1.2 MiB | 00m00s [ 78/156] Installing gdbm-1:1.23-7.fc41 100% | 113.9 MiB/s | 933.2 KiB | 00m00s [ 79/156] Installing cyrus-sasl-lib-0:2 100% | 161.1 MiB/s | 3.5 MiB | 00m00s [ 80/156] Installing libfdisk-0:2.40.2- 100% | 119.6 MiB/s | 612.2 KiB | 00m00s [ 81/156] Installing libxml2-0:2.12.8-2 100% | 148.1 MiB/s | 2.5 MiB | 00m00s [ 82/156] Installing bzip2-0:1.0.8-19.f 100% | 105.5 MiB/s | 432.0 KiB | 00m00s [ 83/156] Installing add-determinism-0: 100% | 152.8 MiB/s | 2.6 MiB | 00m00s [ 84/156] Installing build-reproducibil 100% | 1.0 MiB/s | 1.0 KiB | 00m00s [ 85/156] Installing sqlite-libs-0:3.47 100% | 137.7 MiB/s | 1.8 MiB | 00m00s [ 86/156] Installing ed-0:1.20.2-2.fc41 100% | 92.8 MiB/s | 285.1 KiB | 00m00s [ 87/156] Installing patch-0:2.7.6-25.f 100% | 95.7 MiB/s | 392.1 KiB | 00m00s [ 88/156] Installing elfutils-default-y 100% | 227.0 KiB/s | 2.0 KiB | 00m00s [ 89/156] Installing elfutils-libs-0:0. 100% | 120.6 MiB/s | 864.3 KiB | 00m00s [ 90/156] Installing cpio-0:2.15-2.fc41 100% | 101.7 MiB/s | 1.2 MiB | 00m00s [ 91/156] Installing diffutils-0:3.10-8 100% | 127.7 MiB/s | 2.2 MiB | 00m00s [ 92/156] Installing librtas-0:2.0.6-2. 100% | 40.7 MiB/s | 499.7 KiB | 00m00s [ 93/156] Installing jansson-0:2.14-1.f 100% | 72.4 MiB/s | 222.5 KiB | 00m00s [ 94/156] Installing libgomp-0:14.2.1-6 100% | 123.6 MiB/s | 632.8 KiB | 00m00s [ 95/156] Installing json-c-0:0.18-1.fc 100% | 68.5 MiB/s | 140.4 KiB | 00m00s [ 96/156] Installing libpkgconf-0:2.3.0 100% | 97.2 MiB/s | 199.1 KiB | 00m00s [ 97/156] Installing pkgconf-0:2.3.0-1. 100% | 79.1 MiB/s | 243.0 KiB | 00m00s [ 98/156] Installing pkgconf-pkg-config 100% | 1.7 MiB/s | 1.8 KiB | 00m00s [ 99/156] Installing keyutils-libs-0:1. 100% | 111.1 MiB/s | 227.5 KiB | 00m00s [100/156] Installing libverto-0:0.3.2-9 100% | 97.2 MiB/s | 199.0 KiB | 00m00s [101/156] Installing xxhash-libs-0:0.8. 100% | 104.2 MiB/s | 213.3 KiB | 00m00s [102/156] Installing libbrotli-0:1.1.0- 100% | 140.6 MiB/s | 1.3 MiB | 00m00s [103/156] Installing libnghttp2-0:1.64. 100% | 106.5 MiB/s | 327.2 KiB | 00m00s [104/156] Installing libtool-ltdl-0:2.4 100% | 109.0 MiB/s | 223.2 KiB | 00m00s [105/156] Installing rust-srpm-macros-0 100% | 5.4 MiB/s | 5.6 KiB | 00m00s [106/156] Installing qt6-srpm-macros-0: 100% | 0.0 B/s | 732.0 B | 00m00s [107/156] Installing qt5-srpm-macros-0: 100% | 0.0 B/s | 776.0 B | 00m00s [108/156] Installing perl-srpm-macros-0 100% | 0.0 B/s | 1.1 KiB | 00m00s [109/156] Installing package-notes-srpm 100% | 2.0 MiB/s | 2.0 KiB | 00m00s [110/156] Installing openblas-srpm-macr 100% | 0.0 B/s | 392.0 B | 00m00s [111/156] Installing ocaml-srpm-macros- 100% | 0.0 B/s | 2.2 KiB | 00m00s [112/156] Installing kernel-srpm-macros 100% | 2.3 MiB/s | 2.3 KiB | 00m00s [113/156] Installing gnat-srpm-macros-0 100% | 1.2 MiB/s | 1.3 KiB | 00m00s [114/156] Installing ghc-srpm-macros-0: 100% | 1.0 MiB/s | 1.0 KiB | 00m00s [115/156] Installing fpc-srpm-macros-0: 100% | 410.2 KiB/s | 420.0 B | 00m00s [116/156] Installing ansible-srpm-macro 100% | 17.7 MiB/s | 36.2 KiB | 00m00s [117/156] Installing coreutils-common-0 100% | 153.3 MiB/s | 11.2 MiB | 00m00s [118/156] Installing openssl-libs-1:3.2 100% | 173.0 MiB/s | 8.7 MiB | 00m00s [119/156] Installing coreutils-0:9.5-11 100% | 139.5 MiB/s | 9.5 MiB | 00m00s [120/156] Installing ca-certificates-0: 100% | 990.7 KiB/s | 2.4 MiB | 00m02s [121/156] Installing krb5-libs-0:1.21.3 100% | 84.9 MiB/s | 3.0 MiB | 00m00s [122/156] Installing libarchive-0:3.7.7 100% | 79.2 MiB/s | 1.3 MiB | 00m00s [123/156] Installing gzip-0:1.13-2.fc41 100% | 54.5 MiB/s | 558.4 KiB | 00m00s [124/156] Installing authselect-libs-0: 100% | 57.8 MiB/s | 946.6 KiB | 00m00s [125/156] Installing cracklib-0:2.9.11- 100% | 83.9 MiB/s | 945.6 KiB | 00m00s [126/156] Installing libpwquality-0:1.4 100% | 92.2 MiB/s | 1.1 MiB | 00m00s [127/156] Installing libtirpc-0:1.3.6-1 100% | 68.0 MiB/s | 278.5 KiB | 00m00s [128/156] Installing pam-0:1.7.0-3.fc42 100% | 107.4 MiB/s | 4.3 MiB | 00m00s [129/156] Installing libssh-0:0.11.1-1. 100% | 126.9 MiB/s | 779.8 KiB | 00m00s [130/156] Installing rpm-sequoia-0:1.7. 100% | 159.2 MiB/s | 2.9 MiB | 00m00s [131/156] Installing rpm-libs-0:4.20.0- 100% | 144.5 MiB/s | 1.2 MiB | 00m00s [132/156] Installing rpm-build-libs-0:4 100% | 127.4 MiB/s | 391.4 KiB | 00m00s [133/156] Installing libevent-0:2.1.12- 100% | 158.5 MiB/s | 1.6 MiB | 00m00s [134/156] Installing openldap-0:2.6.8-6 100% | 122.6 MiB/s | 878.5 KiB | 00m00s [135/156] Installing libcurl-0:8.10.1-2 100% | 136.2 MiB/s | 1.1 MiB | 00m00s [136/156] Installing elfutils-debuginfo 100% | 46.6 MiB/s | 143.1 KiB | 00m00s [137/156] Installing binutils-0:2.43.50 100% | 168.9 MiB/s | 31.4 MiB | 00m00s [138/156] Installing elfutils-0:0.192-7 100% | 162.3 MiB/s | 3.4 MiB | 00m00s [139/156] Installing gdb-minimal-0:15.2 100% | 158.2 MiB/s | 15.7 MiB | 00m00s [140/156] Installing debugedit-0:5.1-2. 100% | 60.7 MiB/s | 310.8 KiB | 00m00s [141/156] Installing curl-0:8.10.1-2.fc 100% | 22.8 MiB/s | 583.7 KiB | 00m00s [142/156] Installing rpm-0:4.20.0-1.fc4 100% | 79.9 MiB/s | 3.4 MiB | 00m00s [143/156] Installing efi-srpm-macros-0: 100% | 40.2 MiB/s | 41.2 KiB | 00m00s [144/156] Installing lua-srpm-macros-0: 100% | 1.9 MiB/s | 1.9 KiB | 00m00s [145/156] Installing zig-srpm-macros-0: 100% | 1.6 MiB/s | 1.7 KiB | 00m00s [146/156] Installing fonts-srpm-macros- 100% | 55.7 MiB/s | 57.0 KiB | 00m00s [147/156] Installing forge-srpm-macros- 100% | 39.3 MiB/s | 40.3 KiB | 00m00s [148/156] Installing go-srpm-macros-0:3 100% | 60.5 MiB/s | 62.0 KiB | 00m00s [149/156] Installing python-srpm-macros 100% | 50.9 MiB/s | 52.2 KiB | 00m00s [150/156] Installing redhat-rpm-config- 100% | 37.7 MiB/s | 193.2 KiB | 00m00s [151/156] Installing rpm-build-0:4.20.0 100% | 126.9 MiB/s | 1.4 MiB | 00m00s [152/156] Installing pyproject-srpm-mac 100% | 834.6 KiB/s | 2.5 KiB | 00m00s [153/156] Installing util-linux-0:2.40. 100% | 162.8 MiB/s | 17.3 MiB | 00m00s [154/156] Installing authselect-0:1.5.0 100% | 61.3 MiB/s | 313.8 KiB | 00m00s [155/156] Installing which-0:2.21-42.fc 100% | 81.5 MiB/s | 250.2 KiB | 00m00s [156/156] Installing info-0:7.1.1-2.fc4 100% | 219.9 KiB/s | 741.9 KiB | 00m03s Complete! Finish: installing minimal buildroot with dnf5 Start: creating root cache Finish: creating root cache Finish: chroot init INFO: Installed packages: INFO: add-determinism-0.4.3-1.fc42.ppc64le alternatives-1.30-1.fc41.ppc64le ansible-srpm-macros-1-16.fc41.noarch audit-libs-4.0.2-1.fc41.ppc64le authselect-1.5.0-8.fc42.ppc64le authselect-libs-1.5.0-8.fc42.ppc64le basesystem-11-21.fc41.noarch bash-5.2.37-1.fc42.ppc64le binutils-2.43.50-9.fc42.ppc64le build-reproducibility-srpm-macros-0.4.3-1.fc42.noarch bzip2-1.0.8-19.fc41.ppc64le bzip2-libs-1.0.8-19.fc41.ppc64le ca-certificates-2024.2.69_v8.0.401-3.fc42.noarch coreutils-9.5-11.fc42.ppc64le coreutils-common-9.5-11.fc42.ppc64le cpio-2.15-2.fc41.ppc64le cracklib-2.9.11-6.fc41.ppc64le crypto-policies-20241128-1.gitbb7b0b0.fc42.noarch curl-8.10.1-2.fc42.ppc64le cyrus-sasl-lib-2.1.28-27.fc41.ppc64le debugedit-5.1-2.fc42.ppc64le diffutils-3.10-8.fc41.ppc64le dwz-0.15-8.fc42.ppc64le ed-1.20.2-2.fc41.ppc64le efi-srpm-macros-5-13.fc42.noarch elfutils-0.192-7.fc42.ppc64le elfutils-debuginfod-client-0.192-7.fc42.ppc64le elfutils-default-yama-scope-0.192-7.fc42.noarch elfutils-libelf-0.192-7.fc42.ppc64le elfutils-libs-0.192-7.fc42.ppc64le fedora-gpg-keys-42-0.3.noarch fedora-release-42-0.11.noarch fedora-release-common-42-0.11.noarch fedora-release-identity-basic-42-0.11.noarch fedora-repos-42-0.3.noarch fedora-repos-rawhide-42-0.3.noarch file-5.45-8.fc42.ppc64le file-libs-5.45-8.fc42.ppc64le filesystem-3.18-29.fc42.ppc64le findutils-4.10.0-4.fc41.ppc64le fonts-srpm-macros-2.0.5-17.fc41.noarch forge-srpm-macros-0.4.0-1.fc42.noarch fpc-srpm-macros-1.3-13.fc41.noarch gawk-5.3.0-4.fc41.ppc64le gdb-minimal-15.2-3.fc42.ppc64le gdbm-1.23-7.fc41.ppc64le gdbm-libs-1.23-7.fc41.ppc64le ghc-srpm-macros-1.9.2-1.fc42.noarch glibc-2.40.9000-21.fc42.ppc64le glibc-common-2.40.9000-21.fc42.ppc64le glibc-gconv-extra-2.40.9000-21.fc42.ppc64le glibc-minimal-langpack-2.40.9000-21.fc42.ppc64le gmp-6.3.0-2.fc41.ppc64le gnat-srpm-macros-6-6.fc41.noarch go-srpm-macros-3.6.0-5.fc42.noarch gpg-pubkey-105ef944-65ca83d1 gpg-pubkey-31645531-66b6dccf gpg-pubkey-e99d6ad1-64d2612c grep-3.11-9.fc41.ppc64le gzip-1.13-2.fc41.ppc64le info-7.1.1-2.fc42.ppc64le jansson-2.14-1.fc42.ppc64le json-c-0.18-1.fc42.ppc64le kernel-srpm-macros-1.0-24.fc41.noarch keyutils-libs-1.6.3-4.fc41.ppc64le krb5-libs-1.21.3-3.fc42.ppc64le libacl-2.3.2-2.fc41.ppc64le libarchive-3.7.7-1.fc42.ppc64le libattr-2.5.2-4.fc41.ppc64le libblkid-2.40.2-8.fc42.ppc64le libbrotli-1.1.0-5.fc41.ppc64le libcap-2.71-1.fc42.ppc64le libcap-ng-0.8.5-3.fc41.ppc64le libcom_err-1.47.1-6.fc42.ppc64le libcurl-8.10.1-2.fc42.ppc64le libeconf-0.7.4-3.fc42.ppc64le libevent-2.1.12-14.fc41.ppc64le libfdisk-2.40.2-8.fc42.ppc64le libffi-3.4.6-3.fc42.ppc64le libgcc-14.2.1-6.fc42.ppc64le libgomp-14.2.1-6.fc42.ppc64le libidn2-2.3.7-2.fc41.ppc64le libmount-2.40.2-8.fc42.ppc64le libnghttp2-1.64.0-1.fc42.ppc64le libpkgconf-2.3.0-1.fc42.ppc64le libpsl-0.21.5-4.fc41.ppc64le libpwquality-1.4.5-11.fc41.ppc64le librtas-2.0.6-2.fc41.ppc64le libselinux-3.8-0.rc1.2.fc42.ppc64le libsemanage-3.8-0.rc1.1.fc42.ppc64le libsepol-3.8-0.rc1.1.fc42.ppc64le libsmartcols-2.40.2-8.fc42.ppc64le libssh-0.11.1-1.fc42.ppc64le libssh-config-0.11.1-1.fc42.noarch libstdc++-14.2.1-6.fc42.ppc64le libtasn1-4.19.0-9.fc41.ppc64le libtirpc-1.3.6-1.fc42.ppc64le libtool-ltdl-2.4.7-12.fc41.ppc64le libunistring-1.1-8.fc41.ppc64le libuuid-2.40.2-8.fc42.ppc64le libverto-0.3.2-9.fc41.ppc64le libxcrypt-4.4.36-11.fc42.ppc64le libxml2-2.12.8-2.fc41.ppc64le libzstd-1.5.6-2.fc41.ppc64le lua-libs-5.4.7-1.fc42.ppc64le lua-srpm-macros-1-14.fc41.noarch lz4-libs-1.10.0-1.fc41.ppc64le mpfr-4.2.1-5.fc41.ppc64le ncurses-base-6.5-2.20240629.fc41.noarch ncurses-libs-6.5-2.20240629.fc41.ppc64le ocaml-srpm-macros-10-3.fc41.noarch openblas-srpm-macros-2-18.fc41.noarch openldap-2.6.8-6.fc42.ppc64le openssl-libs-3.2.2-8.fc42.ppc64le p11-kit-0.25.5-4.fc42.ppc64le p11-kit-trust-0.25.5-4.fc42.ppc64le package-notes-srpm-macros-0.5-12.fc41.noarch pam-1.7.0-3.fc42.ppc64le pam-libs-1.7.0-3.fc42.ppc64le patch-2.7.6-25.fc41.ppc64le pcre2-10.44-1.fc41.1.ppc64le pcre2-syntax-10.44-1.fc41.1.noarch perl-srpm-macros-1-56.fc41.noarch pkgconf-2.3.0-1.fc42.ppc64le pkgconf-m4-2.3.0-1.fc42.noarch pkgconf-pkg-config-2.3.0-1.fc42.ppc64le popt-1.19-7.fc41.ppc64le publicsuffix-list-dafsa-20240107-4.fc41.noarch pyproject-srpm-macros-1.16.3-1.fc42.noarch python-srpm-macros-3.13-3.fc41.noarch qt5-srpm-macros-5.15.15-1.fc42.noarch qt6-srpm-macros-6.8.0-1.fc42.noarch readline-8.2-11.fc42.ppc64le redhat-rpm-config-296-1.fc42.noarch rpm-4.20.0-1.fc42.ppc64le rpm-build-4.20.0-1.fc42.ppc64le rpm-build-libs-4.20.0-1.fc42.ppc64le rpm-libs-4.20.0-1.fc42.ppc64le rpm-sequoia-1.7.0-2.fc41.ppc64le rust-srpm-macros-26.3-3.fc42.noarch sed-4.9-3.fc41.ppc64le setup-2.15.0-5.fc41.noarch shadow-utils-4.16.0-7.fc42.ppc64le sqlite-libs-3.47.1-1.fc42.ppc64le systemd-libs-257~rc3-1.fc42.ppc64le tar-1.35-4.fc41.ppc64le unzip-6.0-65.fc42.ppc64le util-linux-2.40.2-8.fc42.ppc64le util-linux-core-2.40.2-8.fc42.ppc64le which-2.21-42.fc41.ppc64le xxhash-libs-0.8.2-4.fc42.ppc64le xz-5.6.3-2.fc42.ppc64le xz-libs-5.6.3-2.fc42.ppc64le zig-srpm-macros-1-3.fc41.noarch zip-3.0-41.fc41.ppc64le zlib-ng-compat-2.2.2-1.fc42.ppc64le zstd-1.5.6-2.fc41.ppc64le Start: buildsrpm Start: rpmbuild -bs Building target platforms: ppc64le Building for target ppc64le setting SOURCE_DATE_EPOCH=1733616000 Wrote: /builddir/build/SRPMS/scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.src.rpm Finish: rpmbuild -bs INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-ppc64le-1733621700.483719/root/var/log/dnf5.log INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz /bin/tar: Removing leading `/' from member names Finish: buildsrpm INFO: Done(/var/lib/copr-rpmbuild/workspace/workdir-1o67ibyc/scapy/scapy.spec) Config(child) 0 minutes 39 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_success=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot INFO: Start(/var/lib/copr-rpmbuild/results/scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.src.rpm) Config(fedora-rawhide-ppc64le) Start(bootstrap): chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-ppc64le-bootstrap-1733621700.483719/root. INFO: reusing tmpfs at /var/lib/mock/fedora-rawhide-ppc64le-bootstrap-1733621700.483719/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start(bootstrap): cleaning package manager metadata Finish(bootstrap): cleaning package manager metadata Finish(bootstrap): chroot init Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-ppc64le-1733621700.483719/root. INFO: calling preinit hooks INFO: enabled root cache Start: unpacking root cache Finish: unpacking root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin INFO: Buildroot is handled by package management downloaded with a bootstrap image: rpm-4.20.0-1.fc42.ppc64le rpm-sequoia-1.7.0-2.fc41.ppc64le dnf5-5.2.7.0-1.fc42.ppc64le dnf5-plugins-5.2.7.0-1.fc42.ppc64le Finish: chroot init Start: build phase for scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.src.rpm Start: build setup for scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.src.rpm Building target platforms: ppc64le Building for target ppc64le setting SOURCE_DATE_EPOCH=1733616000 Wrote: /builddir/build/SRPMS/scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.src.rpm Updating and loading repositories: fedora 100% | 159.1 KiB/s | 5.3 KiB | 00m00s Copr repository 100% | 39.9 KiB/s | 1.5 KiB | 00m00s Repositories loaded. Package "sed-4.9-3.fc41.ppc64le" is already installed. Package Arch Version Repository Size Installing: libpcap ppc64le 14:1.10.5-1.fc42 fedora 627.2 KiB make ppc64le 1:4.4.1-9.fc42 fedora 2.0 MiB openssl ppc64le 1:3.2.2-8.fc42 fedora 2.0 MiB python3-brotli ppc64le 1.1.0-5.fc41 fedora 1.0 MiB python3-coverage ppc64le 7.3.2-5.fc41 fedora 1.8 MiB python3-cryptography ppc64le 43.0.0-3.fc42 fedora 5.1 MiB python3-devel ppc64le 3.13.0-1.fc42 fedora 1.8 MiB python3-ipython noarch 8.30.0-2.fc42 fedora 4.5 MiB python3-setuptools noarch 74.1.3-4.fc42 fedora 8.4 MiB python3-sphinx noarch 1:7.3.7-2.fc41 fedora 10.8 MiB python3-sphinx_rtd_theme noarch 3.0.2-1.fc42 fedora 327.3 KiB python3-tkinter ppc64le 3.13.0-1.fc42 fedora 2.1 MiB python3-zstandard ppc64le 0.23.0-1.fc42 fedora 2.5 MiB samba ppc64le 2:4.21.2-1.fc42 fedora 3.7 MiB samba-client ppc64le 2:4.21.2-1.fc42 fedora 3.0 MiB tcpdump ppc64le 14:4.99.5-1.fc42 fedora 1.7 MiB tox noarch 4.23.2-1.fc42 fedora 1.2 MiB wireshark ppc64le 1:4.4.2-1.fc42 fedora 10.9 MiB Installing dependencies: SDL2 ppc64le 2.30.3-2.fc41 fedora 2.4 MiB abattis-cantarell-vf-fonts noarch 0.301-13.fc41 fedora 192.7 KiB adwaita-cursor-theme noarch 47.0-1.fc42 fedora 10.0 MiB adwaita-icon-theme noarch 47.0-1.fc42 fedora 1.2 MiB adwaita-icon-theme-legacy noarch 46.2-2.fc41 fedora 2.1 MiB alsa-lib ppc64le 1.2.13-3.fc42 fedora 1.9 MiB aribb24 ppc64le 1.0.3^20160216git5e9be27-1.fc42 fedora 202.9 KiB at-spi2-atk ppc64le 2.54.0-1.fc42 fedora 615.0 KiB at-spi2-core ppc64le 2.54.0-1.fc42 fedora 2.0 MiB atk ppc64le 2.54.0-1.fc42 fedora 424.8 KiB avahi-glib ppc64le 0.8-30.fc42 fedora 195.5 KiB avahi-libs ppc64le 0.8-30.fc42 fedora 613.8 KiB bcg729 ppc64le 1.1.1-10.fc41 fedora 231.8 KiB c-ares ppc64le 1.34.2-1.fc42 fedora 466.7 KiB cairo ppc64le 1.18.2-1.fc42 fedora 2.2 MiB cairo-gobject ppc64le 1.18.2-1.fc42 fedora 67.4 KiB cdparanoia-libs ppc64le 10.2-45.fc41 fedora 393.3 KiB cjson ppc64le 1.7.18-1.fc42 fedora 224.0 KiB codec2 ppc64le 1.2.0-5.fc41 fedora 1.5 MiB colord-libs ppc64le 1.4.7-5.fc41 fedora 1.5 MiB cups-filesystem noarch 1:2.4.11-7.fc42 fedora 0.0 B cups-libs ppc64le 1:2.4.11-7.fc42 fedora 913.4 KiB dbus ppc64le 1:1.14.10-4.fc41 fedora 0.0 B dbus-broker ppc64le 36-4.fc41 fedora 742.1 KiB dbus-common noarch 1:1.14.10-4.fc41 fedora 11.2 KiB dbus-libs ppc64le 1:1.14.10-4.fc41 fedora 553.2 KiB default-fonts-core-sans noarch 4.2-2.fc42 fedora 11.9 KiB desktop-file-utils ppc64le 0.27-2.fc41 fedora 638.0 KiB double-conversion ppc64le 3.3.0-4.fc41 fedora 268.4 KiB duktape ppc64le 2.7.0-8.fc41 fedora 1.0 MiB emacs-filesystem noarch 1:30.0-3.fc41 fedora 0.0 B expat ppc64le 2.6.4-1.fc42 fedora 349.2 KiB fdk-aac-free ppc64le 2.0.0-14.fc41 fedora 783.0 KiB flac-libs ppc64le 1.4.3-5.fc41 fedora 805.6 KiB fontawesome4-fonts noarch 1:4.7.0-23.fc41 fedora 296.6 KiB fontconfig ppc64le 2.15.0-8.fc41 fedora 2.6 MiB fonts-filesystem noarch 1:2.0.5-17.fc41 fedora 0.0 B freetype ppc64le 2.13.3-1.fc42 fedora 1.1 MiB fribidi ppc64le 1.0.16-1.fc42 fedora 502.3 KiB game-music-emu ppc64le 0.6.3-15.fc41 fedora 426.6 KiB gdk-pixbuf2 ppc64le 2.42.12-6.fc41 fedora 3.0 MiB gdk-pixbuf2-modules ppc64le 2.42.12-6.fc41 fedora 391.5 KiB giflib ppc64le 5.2.2-2.fc41 fedora 260.0 KiB glib2 ppc64le 2.83.0-2.fc42 fedora 16.3 MiB glx-utils ppc64le 9.0.0-8.fc41 fedora 846.8 KiB gnupg2 ppc64le 2.4.5-4.fc42 fedora 11.2 MiB gnutls ppc64le 3.8.8-1.fc42 fedora 3.6 MiB gnutls-dane ppc64le 3.8.8-1.fc42 fedora 133.8 KiB google-noto-fonts-common noarch 20240901-1.fc42 fedora 17.5 KiB google-noto-sans-vf-fonts noarch 20240901-1.fc42 fedora 1.2 MiB google-roboto-slab-fonts noarch 1.100263-0.24.20150923git.fc41 fedora 699.6 KiB gpgme ppc64le 1.24.0-1.fc42 fedora 817.8 KiB graphene ppc64le 1.10.6-9.fc41 fedora 434.5 KiB graphite2 ppc64le 1.3.14-16.fc41 fedora 495.6 KiB gsm ppc64le 1.0.22-7.fc41 fedora 204.7 KiB gssdp ppc64le 1.6.3-3.fc41 fedora 253.8 KiB gstreamer1 ppc64le 1.24.10-1.fc42 fedora 6.4 MiB gstreamer1-plugins-bad-free-libs ppc64le 1.24.10-1.fc42 fedora 3.9 MiB gstreamer1-plugins-base ppc64le 1.24.10-1.fc42 fedora 9.6 MiB gtk-update-icon-cache ppc64le 3.24.43-2.fc41 fedora 222.2 KiB gtk3 ppc64le 3.24.43-2.fc41 fedora 25.8 MiB gupnp ppc64le 1.6.7-1.fc42 fedora 448.0 KiB gupnp-igd ppc64le 1.6.0-5.fc41 fedora 226.6 KiB harfbuzz ppc64le 10.1.0-1.fc42 fedora 3.1 MiB hicolor-icon-theme noarch 0.17-19.fc41 fedora 72.2 KiB highway ppc64le 1.2.0-3.fc41 fedora 1.9 MiB hiredis ppc64le 1.2.0-4.fc42 fedora 457.8 KiB hwdata noarch 0.390-1.fc42 fedora 9.3 MiB ilbc ppc64le 3.0.4-12.fc42 fedora 207.4 KiB imath ppc64le 3.1.12-1.fc42 fedora 515.7 KiB iso-codes noarch 4.17.0-1.fc42 fedora 20.3 MiB jbigkit-libs ppc64le 2.1-30.fc41 fedora 437.2 KiB json-glib ppc64le 1.10.0-1.fc42 fedora 774.0 KiB lame-libs ppc64le 3.100-18.fc41 fedora 1.3 MiB lato-fonts noarch 2.015-22.fc41 fedora 11.3 MiB lcms2 ppc64le 2.16-4.fc41 fedora 613.0 KiB libICE ppc64le 1.1.1-4.fc41 fedora 337.1 KiB libSM ppc64le 1.2.4-4.fc41 fedora 253.2 KiB libX11 ppc64le 1.8.10-2.fc42 fedora 1.7 MiB libX11-common noarch 1.8.10-2.fc42 fedora 1.1 MiB libX11-xcb ppc64le 1.8.10-2.fc42 fedora 194.7 KiB libXau ppc64le 1.0.11-7.fc41 fedora 242.5 KiB libXcomposite ppc64le 0.4.6-4.fc41 fedora 224.3 KiB libXcursor ppc64le 1.2.3-1.fc42 fedora 69.6 KiB libXdamage ppc64le 1.1.6-4.fc41 fedora 223.5 KiB libXext ppc64le 1.3.6-2.fc41 fedora 273.8 KiB libXfixes ppc64le 6.0.1-4.fc41 fedora 198.1 KiB libXft ppc64le 2.3.8-7.fc41 fedora 320.4 KiB libXi ppc64le 1.8.2-1.fc42 fedora 200.5 KiB libXinerama ppc64le 1.1.5-7.fc41 fedora 198.9 KiB libXrandr ppc64le 1.5.4-4.fc41 fedora 199.6 KiB libXrender ppc64le 0.9.11-7.fc41 fedora 198.0 KiB libXtst ppc64le 1.2.5-1.fc41 fedora 201.4 KiB libXv ppc64le 1.0.12-4.fc41 fedora 198.0 KiB libXxf86vm ppc64le 1.1.5-7.fc41 fedora 197.2 KiB libaom ppc64le 3.9.0-3.fc41 fedora 3.6 MiB libaribcaption ppc64le 1.1.1-1.fc42 fedora 399.9 KiB libassuan ppc64le 2.5.7-2.fc41 fedora 279.8 KiB libasyncns ppc64le 0.8-29.fc41 fedora 227.1 KiB libavcodec-free ppc64le 7.0.2-8.fc42 fedora 13.5 MiB libavformat-free ppc64le 7.0.2-8.fc42 fedora 3.2 MiB libavutil-free ppc64le 7.0.2-8.fc42 fedora 17.0 MiB libb2 ppc64le 0.98.1-12.fc41 fedora 202.1 KiB libbluray ppc64le 1.3.4-7.fc41 fedora 621.8 KiB libchromaprint ppc64le 1.5.1-22.fc42 fedora 208.4 KiB libcloudproviders ppc64le 0.3.5-5.fc41 fedora 284.1 KiB libdatrie ppc64le 0.2.13-10.fc41 fedora 221.6 KiB libdav1d ppc64le 1.5.0-1.fc42 fedora 1.0 MiB libdecor ppc64le 0.2.2-4.fc41 fedora 593.2 KiB libdeflate ppc64le 1.22-2.fc42 fedora 225.8 KiB libdrm ppc64le 2.4.123-1.fc42 fedora 1.1 MiB libdvdnav ppc64le 6.1.1-9.fc41 fedora 223.8 KiB libdvdread ppc64le 6.1.3-7.fc41 fedora 287.9 KiB libedit ppc64le 3.1-53.20240808cvs.fc41 fedora 408.2 KiB libepoxy ppc64le 1.5.10-8.fc41 fedora 1.6 MiB libevdev ppc64le 1.13.3-1.fc42 fedora 198.0 KiB libgcrypt ppc64le 1.11.0-4.fc42 fedora 1.4 MiB libglvnd ppc64le 1:1.7.0-5.fc41 fedora 1.0 MiB libglvnd-egl ppc64le 1:1.7.0-5.fc41 fedora 196.8 KiB libglvnd-glx ppc64le 1:1.7.0-5.fc41 fedora 1.1 MiB libglvnd-opengl ppc64le 1:1.7.0-5.fc41 fedora 392.8 KiB libgpg-error ppc64le 1.51-1.fc42 fedora 1.0 MiB libgudev ppc64le 238-6.fc41 fedora 231.8 KiB libgusb ppc64le 0.4.9-2.fc41 fedora 309.9 KiB libibverbs ppc64le 54.0-3.fc42 fedora 1.8 MiB libicu ppc64le 74.2-2.fc41 fedora 36.8 MiB libinput ppc64le 1.27.0-2.fc42 fedora 935.6 KiB libjpeg-turbo ppc64le 3.0.4-1.fc42 fedora 988.7 KiB libjxl ppc64le 1:0.10.3-5.fc42 fedora 3.8 MiB libksba ppc64le 1.6.7-2.fc41 fedora 590.5 KiB libldb ppc64le 2:4.21.2-1.fc42 fedora 573.7 KiB liblerc ppc64le 4.0.0-7.fc41 fedora 802.4 KiB libmaxminddb ppc64le 1.11.0-1.fc42 fedora 427.8 KiB libmodplug ppc64le 1:0.8.9.0-25.fc41 fedora 539.2 KiB libnetapi ppc64le 2:4.21.2-1.fc42 fedora 616.0 KiB libnice ppc64le 0.1.22-2.fc41 fedora 997.8 KiB libnl3 ppc64le 3.11.0-1.fc42 fedora 1.4 MiB libogg ppc64le 2:1.3.5-9.fc41 fedora 205.2 KiB libopenmpt ppc64le 0.7.12-1.fc42 fedora 1.8 MiB libpciaccess ppc64le 0.16-13.fc41 fedora 200.3 KiB libpng ppc64le 2:1.6.44-1.fc42 fedora 461.7 KiB libproxy ppc64le 0.5.8-1.fc41 fedora 421.9 KiB librabbitmq ppc64le 0.15.0-1.fc42 fedora 133.8 KiB librist ppc64le 0.2.7-5.fc41 fedora 269.3 KiB librsvg2 ppc64le 2.59.2-1.fc42 fedora 5.0 MiB libsbc ppc64le 2.0-5.fc41 fedora 213.1 KiB libseccomp ppc64le 2.5.5-2.fc41 fedora 305.3 KiB libsmbclient ppc64le 2:4.21.2-1.fc42 fedora 212.7 KiB libsmi ppc64le 0.4.8-41.fc41 fedora 21.9 MiB libsndfile ppc64le 1.2.2-5.fc42 fedora 698.5 KiB libsodium ppc64le 1.0.20-2.fc41 fedora 456.1 KiB libsoup3 ppc64le 3.6.1-1.fc42 fedora 1.4 MiB libswresample-free ppc64le 7.0.2-8.fc42 fedora 154.7 KiB libswscale-free ppc64le 7.0.2-8.fc42 fedora 641.4 KiB libtalloc ppc64le 2.4.2-4.fc41 fedora 196.4 KiB libtdb ppc64le 1.4.12-3.fc42 fedora 261.1 KiB libtevent ppc64le 0.16.1-4.fc41 fedora 197.9 KiB libthai ppc64le 0.1.29-9.fc41 fedora 935.4 KiB libtheora ppc64le 1:1.1.1-38.fc41 fedora 852.3 KiB libtiff ppc64le 4.7.0-2.fc42 fedora 786.8 KiB libtracker-sparql ppc64le 3.7.3-3.fc41 fedora 1.7 MiB libudfread ppc64le 1.1.2-9.fc41 fedora 221.7 KiB libunwind ppc64le 1.8.0-5.fc42 fedora 583.8 KiB libusb1 ppc64le 1.0.27-4.fc42 fedora 306.1 KiB libva ppc64le 2.22.0-3.fc41 fedora 1.2 MiB libvdpau ppc64le 1.5-8.fc42 fedora 69.1 KiB libvisual ppc64le 1:0.4.1-5.fc41 fedora 615.4 KiB libvorbis ppc64le 1:1.3.7-11.fc41 fedora 1.2 MiB libvpx ppc64le 1.14.1-2.fc41 fedora 3.2 MiB libwacom ppc64le 2.14.0-1.fc42 fedora 210.0 KiB libwacom-data noarch 2.14.0-1.fc42 fedora 1.3 MiB libwayland-client ppc64le 1.23.0-2.fc41 fedora 198.1 KiB libwayland-cursor ppc64le 1.23.0-2.fc41 fedora 209.3 KiB libwayland-egl ppc64le 1.23.0-2.fc41 fedora 196.2 KiB libwayland-server ppc64le 1.23.0-2.fc41 fedora 198.6 KiB libwbclient ppc64le 2:4.21.2-1.fc42 fedora 93.6 KiB libwebp ppc64le 1.4.0-4.fc41 fedora 1.4 MiB libxcb ppc64le 1.17.0-3.fc42 fedora 5.3 MiB libxkbcommon ppc64le 1.7.0-4.fc41 fedora 659.9 KiB libxkbcommon-x11 ppc64le 1.7.0-4.fc41 fedora 195.3 KiB libxshmfence ppc64le 1.3.2-5.fc42 fedora 68.6 KiB llvm-libs ppc64le 19.1.4-2.fc42 fedora 131.2 MiB lm_sensors-libs ppc64le 3.6.0-20.fc41 fedora 221.8 KiB lmdb-libs ppc64le 0.9.33-2.fc41 fedora 273.2 KiB lpcnetfreedv ppc64le 0.5-6.fc41 fedora 14.9 MiB mbedtls ppc64le 2.28.8-1.fc41 fedora 1.5 MiB mesa-dri-drivers ppc64le 24.3.0-2.fc42 fedora 91.4 MiB mesa-filesystem ppc64le 24.3.0-2.fc42 fedora 3.6 KiB mesa-libEGL ppc64le 24.3.0-2.fc42 fedora 459.2 KiB mesa-libGL ppc64le 24.3.0-2.fc42 fedora 596.2 KiB mesa-libgbm ppc64le 24.3.0-2.fc42 fedora 199.9 KiB mesa-libglapi ppc64le 24.3.0-2.fc42 fedora 268.4 KiB mpdecimal ppc64le 2.5.1-16.fc41 fedora 328.9 KiB mpg123-libs ppc64le 1.32.9-1.fc42 fedora 873.3 KiB mtdev ppc64le 1.1.6-9.fc41 fedora 197.0 KiB nettle ppc64le 3.10-3.fc41 fedora 1.0 MiB noopenh264 ppc64le 0.1.0~openh264_2.4.1-2.fc41 fedora 222.7 KiB npth ppc64le 1.8-1.fc42 fedora 93.1 KiB ocl-icd ppc64le 2.3.2-7.fc41 fedora 346.8 KiB opencore-amr ppc64le 0.1.6-7.fc41 fedora 549.0 KiB openexr-libs ppc64le 3.2.4-3.fc41 fedora 7.4 MiB openjpeg ppc64le 2.5.2-4.fc42 fedora 601.7 KiB openpgm ppc64le 5.2.122-35.fc41 fedora 416.2 KiB opus ppc64le 1.5.2-1.fc42 fedora 583.5 KiB orc ppc64le 0.4.39-1.fc41 fedora 1.3 MiB pango ppc64le 1.54.0-2.fc41 fedora 2.0 MiB pcre2-utf16 ppc64le 10.44-1.fc41.1 fedora 773.6 KiB pixman ppc64le 0.44.0-0.fc42 fedora 589.4 KiB protobuf-c ppc64le 1.5.0-4.fc41 fedora 205.9 KiB pulseaudio-libs ppc64le 17.0-2.fc41 fedora 4.1 MiB pyproject-rpm-macros noarch 1.16.3-1.fc42 fedora 113.7 KiB python-pip-wheel noarch 24.3.1-1.fc42 fedora 1.2 MiB python-rpm-macros noarch 3.13-3.fc41 fedora 22.1 KiB python-setuptools-wheel noarch 74.1.3-4.fc42 fedora 1.2 MiB python-wheel-wheel noarch 1:0.44.0-1.fc42 fedora 66.4 KiB python3 ppc64le 3.13.0-1.fc42 fedora 211.7 KiB python3-asttokens noarch 2.4.1-7.fc41 fedora 209.1 KiB python3-babel noarch 2.16.0-1.fc42 fedora 28.3 MiB python3-cachetools noarch 5.4.0-6.fc42 fedora 138.7 KiB python3-cffi ppc64le 1.17.1-1.fc42 fedora 1.5 MiB python3-chardet noarch 5.2.0-14.fc41 fedora 2.1 MiB python3-charset-normalizer noarch 3.4.0-1.fc42 fedora 319.9 KiB python3-colorama noarch 0.4.6-9.fc41 fedora 191.6 KiB python3-decorator noarch 5.1.1-13.fc42 fedora 78.4 KiB python3-distlib noarch 0.3.9-1.fc42 fedora 1.2 MiB python3-docutils noarch 0.21.2-1.fc42 fedora 4.9 MiB python3-executing noarch 2.1.0^20240916git3f11fdc-1.fc42 fedora 265.2 KiB python3-filelock noarch 3.15.4-2.fc41 fedora 90.2 KiB python3-idna noarch 3.10-1.fc42 fedora 628.0 KiB python3-imagesize noarch 1.4.1-9.fc41 fedora 35.3 KiB python3-jedi noarch 0.19.1-10.fc41 fedora 5.6 MiB python3-jinja2 noarch 3.1.4-5.fc41 fedora 2.9 MiB python3-libs ppc64le 3.13.0-1.fc42 fedora 50.7 MiB python3-markupsafe ppc64le 3.0.2-1.fc42 fedora 112.0 KiB python3-matplotlib-inline noarch 0.1.7-3.fc41 fedora 39.6 KiB python3-packaging noarch 24.2-2.fc42 fedora 555.7 KiB python3-parso noarch 0.8.4-3.fc41 fedora 896.3 KiB python3-pexpect noarch 4.9.0-8.fc42 fedora 620.4 KiB python3-platformdirs noarch 4.2.2-2.fc41 fedora 168.6 KiB python3-pluggy noarch 1.5.0-1.fc41 fedora 193.2 KiB python3-ply noarch 3.11-25.fc41 fedora 568.2 KiB python3-prompt-toolkit noarch 3.0.41-5.fc41 fedora 3.7 MiB python3-ptyprocess noarch 0.7.0-9.fc41 fedora 79.8 KiB python3-pure-eval noarch 0.2.3-1.fc41 fedora 100.3 KiB python3-pycparser noarch 2.20-18.fc41 fedora 821.0 KiB python3-pygments noarch 2.18.0-2.fc42 fedora 10.6 MiB python3-pyproject-api noarch 1.8.0-1.fc42 fedora 79.0 KiB python3-requests noarch 2.32.3-3.fc41 fedora 485.9 KiB python3-rpm-generators noarch 14-11.fc41 fedora 81.7 KiB python3-rpm-macros noarch 3.13-3.fc41 fedora 6.4 KiB python3-six noarch 1.16.0-23.fc41 fedora 118.3 KiB python3-snowballstemmer noarch 2.2.0-13.fc41 fedora 1.7 MiB python3-sphinx-theme-alabaster noarch 0.7.16-6.fc41 fedora 41.9 KiB python3-sphinxcontrib-jquery noarch 4.1-9.fc41 fedora 381.8 KiB python3-stack-data noarch 0.6.3-11.fc42 fedora 208.2 KiB python3-traitlets noarch 5.14.3-3.fc41 fedora 966.9 KiB python3-urllib3 noarch 2.2.3-3.fc42 fedora 1.0 MiB python3-virtualenv noarch 20.26.6-1.fc42 fedora 644.9 KiB python3-wcwidth noarch 0.2.13-5.fc41 fedora 559.8 KiB qt6-filesystem ppc64le 6.8.0-1.fc42 fedora 0.0 B qt6-qt5compat ppc64le 6.8.0-1.fc42 fedora 2.2 MiB qt6-qtbase ppc64le 6.8.0-4.fc42 fedora 16.1 MiB qt6-qtbase-common noarch 6.8.0-4.fc42 fedora 74.0 B qt6-qtbase-gui ppc64le 6.8.0-4.fc42 fedora 33.2 MiB qt6-qtdeclarative ppc64le 6.8.0-3.fc42 fedora 61.9 MiB qt6-qtmultimedia ppc64le 6.8.0-1.fc42 fedora 5.1 MiB qt6-qtquick3d ppc64le 6.8.0-1.fc42 fedora 17.7 MiB qt6-qtquicktimeline ppc64le 6.8.0-1.fc42 fedora 898.8 KiB qt6-qtshadertools ppc64le 6.8.0-1.fc42 fedora 5.4 MiB rav1e-libs ppc64le 0.7.1-4.fc42 fedora 2.3 MiB rsvg-pixbuf-loader ppc64le 2.59.2-1.fc42 fedora 465.6 KiB samba-client-libs ppc64le 2:4.21.2-1.fc42 fedora 23.9 MiB samba-common noarch 2:4.21.2-1.fc42 fedora 208.0 KiB samba-common-libs ppc64le 2:4.21.2-1.fc42 fedora 311.7 KiB samba-common-tools ppc64le 2:4.21.2-1.fc42 fedora 1.6 MiB samba-dcerpc ppc64le 2:4.21.2-1.fc42 fedora 3.4 MiB samba-ldb-ldap-modules ppc64le 2:4.21.2-1.fc42 fedora 69.3 KiB samba-libs ppc64le 2:4.21.2-1.fc42 fedora 449.2 KiB shared-mime-info ppc64le 2.3-6.fc41 fedora 5.3 MiB snappy ppc64le 1.2.1-3.fc42 fedora 210.8 KiB soxr ppc64le 0.1.3-17.fc42 fedora 462.4 KiB spandsp ppc64le 0.0.6-19.fc41 fedora 1.0 MiB speex ppc64le 1.2.0-18.fc41 fedora 264.4 KiB speexdsp ppc64le 1.2.1-7.fc41 fedora 692.8 KiB spirv-tools-libs ppc64le 2024.3-4.fc42 fedora 6.5 MiB srt-libs ppc64le 1.5.4-1.fc42 fedora 1.1 MiB svt-av1-libs ppc64le 2.1.0-2.fc41 fedora 3.8 MiB systemd ppc64le 257~rc3-1.fc42 fedora 22.3 MiB systemd-pam ppc64le 257~rc3-1.fc42 fedora 1.5 MiB systemd-rpm-macros noarch 257~rc3-1.fc42 fedora 10.7 KiB tcl ppc64le 1:8.6.15-6.fc42 fedora 4.7 MiB tk ppc64le 1:8.6.15-1.fc42 fedora 4.3 MiB tpm2-tss ppc64le 4.1.3-3.fc41 fedora 4.0 MiB tslib ppc64le 1.22-11.fc41 fedora 4.6 MiB twolame-libs ppc64le 0.4.0-5.fc41 fedora 285.4 KiB tzdata noarch 2024a-9.fc41 fedora 1.7 MiB unbound-libs ppc64le 1.22.0-8.fc42 fedora 1.8 MiB vapoursynth-libs ppc64le 68-3.fc41 fedora 1.4 MiB vo-amrwbenc ppc64le 0.1.3-21.fc41 fedora 305.7 KiB vulkan-loader ppc64le 1.3.296.0-1.fc42 fedora 800.4 KiB wget2 ppc64le 2.2.0-1.fc42 fedora 1.1 MiB wget2-libs ppc64le 2.2.0-1.fc42 fedora 492.4 KiB wget2-wget ppc64le 2.2.0-1.fc42 fedora 42.0 B wireshark-cli ppc64le 1:4.4.2-1.fc42 fedora 142.9 MiB xcb-util ppc64le 0.4.1-6.fc41 fedora 198.1 KiB xcb-util-cursor ppc64le 0.1.5-1.fc42 fedora 199.2 KiB xcb-util-image ppc64le 0.4.1-6.fc41 fedora 197.9 KiB xcb-util-keysyms ppc64le 0.4.1-6.fc41 fedora 196.4 KiB xcb-util-renderutil ppc64le 0.3.10-6.fc41 fedora 200.4 KiB xcb-util-wm ppc64le 0.4.2-6.fc41 fedora 392.8 KiB xdg-utils noarch 1.2.1-2.fc41 fedora 346.3 KiB xkeyboard-config noarch 2.43-1.fc42 fedora 6.6 MiB xml-common noarch 0.6.3-65.fc41 fedora 78.4 KiB xprop ppc64le 1.2.7-2.fc41 fedora 206.7 KiB xvidcore ppc64le 1.3.7-12.fc41 fedora 808.6 KiB zeromq ppc64le 4.3.5-17.fc41 fedora 1.3 MiB zimg ppc64le 3.0.5-3.fc41 fedora 341.9 KiB zvbi ppc64le 0.2.42-1.fc42 fedora 2.1 MiB Transaction Summary: Installing: 336 packages Total size of inbound packages is 271 MiB. Need to download 271 MiB. After this operation, 1 GiB extra will be used (install 1 GiB, remove 0 B). [ 1/336] libpcap-14:1.10.5-1.fc42.ppc6 100% | 1.0 MiB/s | 186.4 KiB | 00m00s [ 2/336] make-1:4.4.1-9.fc42.ppc64le 100% | 2.9 MiB/s | 601.1 KiB | 00m00s [ 3/336] openssl-1:3.2.2-8.fc42.ppc64l 100% | 4.2 MiB/s | 1.1 MiB | 00m00s [ 4/336] python3-brotli-0:1.1.0-5.fc41 100% | 3.9 MiB/s | 384.2 KiB | 00m00s [ 5/336] python3-coverage-0:7.3.2-5.fc 100% | 4.8 MiB/s | 389.8 KiB | 00m00s [ 6/336] python3-devel-0:3.13.0-1.fc42 100% | 5.9 MiB/s | 402.4 KiB | 00m00s [ 7/336] python3-cryptography-0:43.0.0 100% | 14.8 MiB/s | 1.4 MiB | 00m00s [ 8/336] python3-ipython-0:8.30.0-2.fc 100% | 13.3 MiB/s | 1.1 MiB | 00m00s [ 9/336] python3-sphinx_rtd_theme-0:3. 100% | 1.8 MiB/s | 86.3 KiB | 00m00s [ 10/336] python3-sphinx-1:7.3.7-2.fc41 100% | 34.2 MiB/s | 2.6 MiB | 00m00s [ 11/336] python3-tkinter-0:3.13.0-1.fc 100% | 6.8 MiB/s | 378.7 KiB | 00m00s [ 12/336] python3-setuptools-0:74.1.3-4 100% | 13.4 MiB/s | 2.0 MiB | 00m00s [ 13/336] tox-0:4.23.2-1.fc42.noarch 100% | 7.3 MiB/s | 425.9 KiB | 00m00s [ 14/336] python3-zstandard-0:0.23.0-1. 100% | 10.3 MiB/s | 528.5 KiB | 00m00s [ 15/336] samba-client-2:4.21.2-1.fc42. 100% | 13.3 MiB/s | 859.6 KiB | 00m00s [ 16/336] samba-2:4.21.2-1.fc42.ppc64le 100% | 14.5 MiB/s | 1.1 MiB | 00m00s [ 17/336] tcpdump-14:4.99.5-1.fc42.ppc6 100% | 10.0 MiB/s | 523.8 KiB | 00m00s [ 18/336] python3-0:3.13.0-1.fc42.ppc64 100% | 1.0 MiB/s | 27.9 KiB | 00m00s [ 19/336] libibverbs-0:54.0-3.fc42.ppc6 100% | 7.6 MiB/s | 489.2 KiB | 00m00s [ 20/336] wireshark-1:4.4.2-1.fc42.ppc6 100% | 23.8 MiB/s | 4.6 MiB | 00m00s [ 21/336] python3-decorator-0:5.1.1-13. 100% | 774.3 KiB/s | 31.0 KiB | 00m00s [ 22/336] python3-libs-0:3.13.0-1.fc42. 100% | 28.9 MiB/s | 9.2 MiB | 00m00s [ 23/336] python3-jedi-0:0.19.1-10.fc41 100% | 9.6 MiB/s | 1.6 MiB | 00m00s [ 24/336] python3-cffi-0:1.17.1-1.fc42. 100% | 845.0 KiB/s | 335.5 KiB | 00m00s [ 25/336] python3-matplotlib-inline-0:0 100% | 521.1 KiB/s | 24.0 KiB | 00m00s [ 26/336] python3-pexpect-0:4.9.0-8.fc4 100% | 4.2 MiB/s | 177.1 KiB | 00m00s [ 27/336] python3-stack-data-0:0.6.3-11 100% | 1.3 MiB/s | 63.6 KiB | 00m00s [ 28/336] python3-pygments-0:2.18.0-2.f 100% | 34.7 MiB/s | 2.5 MiB | 00m00s [ 29/336] python3-prompt-toolkit-0:3.0. 100% | 10.5 MiB/s | 849.8 KiB | 00m00s [ 30/336] python3-traitlets-0:5.14.3-3. 100% | 4.9 MiB/s | 214.0 KiB | 00m00s [ 31/336] python3-imagesize-0:1.4.1-9.f 100% | 764.0 KiB/s | 22.2 KiB | 00m00s [ 32/336] python3-jinja2-0:3.1.4-5.fc41 100% | 15.0 MiB/s | 492.8 KiB | 00m00s [ 33/336] python3-docutils-0:0.21.2-1.f 100% | 10.6 MiB/s | 1.1 MiB | 00m00s [ 34/336] python3-packaging-0:24.2-2.fc 100% | 5.4 MiB/s | 153.8 KiB | 00m00s [ 35/336] python3-babel-0:2.16.0-1.fc42 100% | 39.3 MiB/s | 6.5 MiB | 00m00s [ 36/336] python3-requests-0:2.32.3-3.f 100% | 2.6 MiB/s | 159.4 KiB | 00m00s [ 37/336] python3-snowballstemmer-0:2.2 100% | 4.6 MiB/s | 258.4 KiB | 00m00s [ 38/336] python3-sphinx-theme-alabaste 100% | 866.1 KiB/s | 24.3 KiB | 00m00s [ 39/336] google-roboto-slab-fonts-0:1. 100% | 5.6 MiB/s | 239.0 KiB | 00m00s [ 40/336] fontawesome4-fonts-1:4.7.0-23 100% | 3.8 MiB/s | 204.5 KiB | 00m00s [ 41/336] python3-sphinxcontrib-jquery- 100% | 2.3 MiB/s | 114.0 KiB | 00m00s [ 42/336] tcl-1:8.6.15-6.fc42.ppc64le 100% | 14.5 MiB/s | 1.2 MiB | 00m00s [ 43/336] lato-fonts-0:2.015-22.fc41.no 100% | 23.3 MiB/s | 3.1 MiB | 00m00s [ 44/336] tk-1:8.6.15-1.fc42.ppc64le 100% | 19.8 MiB/s | 1.7 MiB | 00m00s [ 45/336] python3-cachetools-0:5.4.0-6. 100% | 805.8 KiB/s | 37.1 KiB | 00m00s [ 46/336] python3-chardet-0:5.2.0-14.fc 100% | 5.5 MiB/s | 298.7 KiB | 00m00s [ 47/336] python3-colorama-0:0.4.6-9.fc 100% | 1.7 MiB/s | 71.2 KiB | 00m00s [ 48/336] python3-filelock-0:3.15.4-2.f 100% | 962.6 KiB/s | 43.3 KiB | 00m00s [ 49/336] python3-platformdirs-0:4.2.2- 100% | 1.0 MiB/s | 46.3 KiB | 00m00s [ 50/336] python3-pyproject-api-0:1.8.0 100% | 959.8 KiB/s | 42.2 KiB | 00m00s [ 51/336] python3-virtualenv-0:20.26.6- 100% | 5.7 MiB/s | 289.6 KiB | 00m00s [ 52/336] avahi-libs-0:0.8-30.fc42.ppc6 100% | 2.7 MiB/s | 71.7 KiB | 00m00s [ 53/336] cups-libs-1:2.4.11-7.fc42.ppc 100% | 10.0 MiB/s | 307.2 KiB | 00m00s [ 54/336] dbus-libs-1:1.14.10-4.fc41.pp 100% | 5.9 MiB/s | 175.9 KiB | 00m00s [ 55/336] gnutls-0:3.8.8-1.fc42.ppc64le 100% | 24.1 MiB/s | 1.1 MiB | 00m00s [ 56/336] libldb-2:4.21.2-1.fc42.ppc64l 100% | 4.0 MiB/s | 215.9 KiB | 00m00s [ 57/336] libnetapi-2:4.21.2-1.fc42.ppc 100% | 2.9 MiB/s | 162.2 KiB | 00m00s [ 58/336] libtalloc-0:2.4.2-4.fc41.ppc6 100% | 719.1 KiB/s | 32.4 KiB | 00m00s [ 59/336] libtdb-0:1.4.12-3.fc42.ppc64l 100% | 1.2 MiB/s | 58.9 KiB | 00m00s [ 60/336] libtevent-0:0.16.1-4.fc41.ppc 100% | 1.1 MiB/s | 52.6 KiB | 00m00s [ 61/336] libwbclient-2:4.21.2-1.fc42.p 100% | 1.1 MiB/s | 54.0 KiB | 00m00s [ 62/336] samba-common-2:4.21.2-1.fc42. 100% | 6.0 MiB/s | 177.7 KiB | 00m00s [ 63/336] samba-common-libs-2:4.21.2-1. 100% | 2.0 MiB/s | 122.1 KiB | 00m00s [ 64/336] libicu-0:74.2-2.fc41.ppc64le 100% | 20.3 MiB/s | 10.6 MiB | 00m01s [ 65/336] samba-common-tools-2:4.21.2-1 100% | 2.2 MiB/s | 554.3 KiB | 00m00s [ 66/336] samba-client-libs-2:4.21.2-1. 100% | 15.2 MiB/s | 5.9 MiB | 00m00s [ 67/336] samba-libs-2:4.21.2-1.fc42.pp 100% | 3.9 MiB/s | 151.8 KiB | 00m00s [ 68/336] libsmbclient-2:4.21.2-1.fc42. 100% | 2.4 MiB/s | 91.1 KiB | 00m00s [ 69/336] hicolor-icon-theme-0:0.17-19. 100% | 2.0 MiB/s | 65.9 KiB | 00m00s [ 70/336] libgcrypt-0:1.11.0-4.fc42.ppc 100% | 15.8 MiB/s | 647.3 KiB | 00m00s [ 71/336] glib2-0:2.83.0-2.fc42.ppc64le 100% | 23.3 MiB/s | 3.2 MiB | 00m00s [ 72/336] libmaxminddb-0:1.11.0-1.fc42. 100% | 1.2 MiB/s | 63.7 KiB | 00m00s [ 73/336] libnl3-0:3.11.0-1.fc42.ppc64l 100% | 7.3 MiB/s | 374.4 KiB | 00m00s [ 74/336] qt6-qt5compat-0:6.8.0-1.fc42. 100% | 8.7 MiB/s | 517.2 KiB | 00m00s [ 75/336] samba-dcerpc-2:4.21.2-1.fc42. 100% | 3.0 MiB/s | 835.3 KiB | 00m00s [ 76/336] qt6-qtbase-0:6.8.0-4.fc42.ppc 100% | 18.0 MiB/s | 4.2 MiB | 00m00s [ 77/336] speexdsp-0:1.2.1-7.fc41.ppc64 100% | 7.5 MiB/s | 460.1 KiB | 00m00s [ 78/336] qt6-qtbase-gui-0:6.8.0-4.fc42 100% | 25.1 MiB/s | 8.3 MiB | 00m00s [ 79/336] xdg-utils-0:1.2.1-2.fc41.noar 100% | 3.0 MiB/s | 79.3 KiB | 00m00s [ 80/336] qt6-qtmultimedia-0:6.8.0-1.fc 100% | 3.3 MiB/s | 1.2 MiB | 00m00s [ 81/336] python3-pycparser-0:2.20-18.f 100% | 3.1 MiB/s | 159.5 KiB | 00m00s [ 82/336] expat-0:2.6.4-1.fc42.ppc64le 100% | 2.1 MiB/s | 120.1 KiB | 00m00s [ 83/336] libb2-0:0.98.1-12.fc41.ppc64l 100% | 395.0 KiB/s | 25.3 KiB | 00m00s [ 84/336] mpdecimal-0:2.5.1-16.fc41.ppc 100% | 2.2 MiB/s | 103.0 KiB | 00m00s [ 85/336] python-pip-wheel-0:24.3.1-1.f 100% | 17.7 MiB/s | 1.2 MiB | 00m00s [ 86/336] python3-parso-0:0.8.4-3.fc41. 100% | 4.0 MiB/s | 212.3 KiB | 00m00s [ 87/336] tzdata-0:2024a-9.fc41.noarch 100% | 4.7 MiB/s | 714.7 KiB | 00m00s [ 88/336] python3-ptyprocess-0:0.7.0-9. 100% | 947.3 KiB/s | 36.0 KiB | 00m00s [ 89/336] python3-asttokens-0:2.4.1-7.f 100% | 1.5 MiB/s | 62.6 KiB | 00m00s [ 90/336] python3-wcwidth-0:0.2.13-5.fc 100% | 845.6 KiB/s | 52.4 KiB | 00m00s [ 91/336] python3-executing-0:2.1.0^202 100% | 1.4 MiB/s | 70.2 KiB | 00m00s [ 92/336] python3-pure-eval-0:0.2.3-1.f 100% | 662.9 KiB/s | 38.4 KiB | 00m00s [ 93/336] python3-markupsafe-0:3.0.2-1. 100% | 637.9 KiB/s | 30.6 KiB | 00m00s [ 94/336] python3-charset-normalizer-0: 100% | 2.7 MiB/s | 109.2 KiB | 00m00s [ 95/336] python3-idna-0:3.10-1.fc42.no 100% | 3.8 MiB/s | 117.2 KiB | 00m00s [ 96/336] wireshark-cli-1:4.4.2-1.fc42. 100% | 30.7 MiB/s | 19.7 MiB | 00m01s [ 97/336] python3-urllib3-0:2.2.3-3.fc4 100% | 2.0 MiB/s | 277.8 KiB | 00m00s [ 98/336] fonts-filesystem-1:2.0.5-17.f 100% | 71.9 KiB/s | 8.5 KiB | 00m00s [ 99/336] libXft-0:2.3.8-7.fc41.ppc64le 100% | 2.8 MiB/s | 78.5 KiB | 00m00s [100/336] libX11-0:1.8.10-2.fc42.ppc64l 100% | 13.9 MiB/s | 699.0 KiB | 00m00s [101/336] fontconfig-0:2.15.0-8.fc41.pp 100% | 4.5 MiB/s | 315.6 KiB | 00m00s [102/336] python-setuptools-wheel-0:74. 100% | 15.7 MiB/s | 1.1 MiB | 00m00s [103/336] python-wheel-wheel-1:0.44.0-1 100% | 1.5 MiB/s | 71.9 KiB | 00m00s [104/336] cups-filesystem-1:2.4.11-7.fc 100% | 517.9 KiB/s | 13.5 KiB | 00m00s [105/336] nettle-0:3.10-3.fc41.ppc64le 100% | 12.6 MiB/s | 464.6 KiB | 00m00s [106/336] python3-distlib-0:0.3.9-1.fc4 100% | 3.0 MiB/s | 266.7 KiB | 00m00s [107/336] lmdb-libs-0:0.9.33-2.fc41.ppc 100% | 1.5 MiB/s | 69.6 KiB | 00m00s [108/336] samba-ldb-ldap-modules-2:4.21 100% | 907.7 KiB/s | 46.3 KiB | 00m00s [109/336] libgpg-error-0:1.51-1.fc42.pp 100% | 4.1 MiB/s | 248.7 KiB | 00m00s [110/336] double-conversion-0:3.3.0-4.f 100% | 1.1 MiB/s | 55.6 KiB | 00m00s [111/336] qt6-qtshadertools-0:6.8.0-1.f 100% | 18.1 MiB/s | 1.6 MiB | 00m00s [112/336] libproxy-0:0.5.8-1.fc41.ppc64 100% | 1.1 MiB/s | 47.2 KiB | 00m00s [113/336] pcre2-utf16-0:10.44-1.fc41.1. 100% | 4.7 MiB/s | 229.8 KiB | 00m00s [114/336] qt6-filesystem-0:6.8.0-1.fc42 100% | 230.2 KiB/s | 10.4 KiB | 00m00s [115/336] qt6-qtbase-common-0:6.8.0-4.f 100% | 236.1 KiB/s | 12.3 KiB | 00m00s [116/336] glx-utils-0:9.0.0-8.fc41.ppc6 100% | 1.2 MiB/s | 72.9 KiB | 00m00s [117/336] freetype-0:2.13.3-1.fc42.ppc6 100% | 5.2 MiB/s | 470.0 KiB | 00m00s [118/336] libICE-0:1.1.1-4.fc41.ppc64le 100% | 2.3 MiB/s | 81.0 KiB | 00m00s [119/336] harfbuzz-0:10.1.0-1.fc42.ppc6 100% | 21.6 MiB/s | 1.1 MiB | 00m00s [120/336] libSM-0:1.2.4-4.fc41.ppc64le 100% | 1.4 MiB/s | 44.4 KiB | 00m00s [121/336] libX11-xcb-0:1.8.10-2.fc42.pp 100% | 344.1 KiB/s | 12.0 KiB | 00m00s [122/336] qt6-qtdeclarative-0:6.8.0-3.f 100% | 31.7 MiB/s | 13.6 MiB | 00m00s [123/336] libglvnd-egl-1:1.7.0-5.fc41.p 100% | 550.3 KiB/s | 40.7 KiB | 00m00s [124/336] libdrm-0:2.4.123-1.fc42.ppc64 100% | 1.9 MiB/s | 177.0 KiB | 00m00s [125/336] libglvnd-opengl-1:1.7.0-5.fc4 100% | 960.0 KiB/s | 40.3 KiB | 00m00s [126/336] libglvnd-glx-1:1.7.0-5.fc41.p 100% | 3.2 MiB/s | 139.1 KiB | 00m00s [127/336] libinput-0:1.27.0-2.fc42.ppc6 100% | 4.5 MiB/s | 243.2 KiB | 00m00s [128/336] libpng-2:1.6.44-1.fc42.ppc64l 100% | 4.3 MiB/s | 137.2 KiB | 00m00s [129/336] libxcb-0:1.17.0-3.fc42.ppc64l 100% | 8.4 MiB/s | 257.0 KiB | 00m00s [130/336] libjpeg-turbo-0:3.0.4-1.fc42. 100% | 4.3 MiB/s | 276.0 KiB | 00m00s [131/336] libxkbcommon-0:1.7.0-4.fc41.p 100% | 3.2 MiB/s | 157.2 KiB | 00m00s [132/336] libxkbcommon-x11-0:1.7.0-4.fc 100% | 554.8 KiB/s | 22.2 KiB | 00m00s [133/336] mesa-libgbm-0:24.3.0-2.fc42.p 100% | 1.1 MiB/s | 55.4 KiB | 00m00s [134/336] tslib-0:1.22-11.fc41.ppc64le 100% | 3.7 MiB/s | 164.9 KiB | 00m00s [135/336] mtdev-0:1.1.6-9.fc41.ppc64le 100% | 396.0 KiB/s | 22.6 KiB | 00m00s [136/336] xcb-util-image-0:0.4.1-6.fc41 100% | 497.2 KiB/s | 19.9 KiB | 00m00s [137/336] xcb-util-cursor-0:0.1.5-1.fc4 100% | 331.5 KiB/s | 20.2 KiB | 00m00s [138/336] xcb-util-keysyms-0:0.4.1-6.fc 100% | 290.1 KiB/s | 14.8 KiB | 00m00s [139/336] xcb-util-renderutil-0:0.3.10- 100% | 419.3 KiB/s | 18.0 KiB | 00m00s [140/336] xcb-util-wm-0:0.4.2-6.fc41.pp 100% | 798.4 KiB/s | 31.9 KiB | 00m00s [141/336] alsa-lib-0:1.2.13-3.fc42.ppc6 100% | 10.6 MiB/s | 587.3 KiB | 00m00s [142/336] gstreamer1-0:1.24.10-1.fc42.p 100% | 15.5 MiB/s | 1.7 MiB | 00m00s [143/336] gstreamer1-plugins-base-0:1.2 100% | 20.9 MiB/s | 2.3 MiB | 00m00s [144/336] libXext-0:1.3.6-2.fc41.ppc64l 100% | 1.1 MiB/s | 40.8 KiB | 00m00s [145/336] gstreamer1-plugins-bad-free-l 100% | 5.3 MiB/s | 909.7 KiB | 00m00s [146/336] libXrandr-0:1.5.4-4.fc41.ppc6 100% | 585.7 KiB/s | 28.7 KiB | 00m00s [147/336] libavutil-free-0:7.0.2-8.fc42 100% | 6.8 MiB/s | 396.6 KiB | 00m00s [148/336] libswresample-free-0:7.0.2-8. 100% | 1.8 MiB/s | 66.1 KiB | 00m00s [149/336] libavcodec-free-0:7.0.2-8.fc4 100% | 23.5 MiB/s | 4.2 MiB | 00m00s [150/336] libavformat-free-0:7.0.2-8.fc 100% | 6.8 MiB/s | 1.3 MiB | 00m00s [151/336] libswscale-free-0:7.0.2-8.fc4 100% | 2.8 MiB/s | 207.4 KiB | 00m00s [152/336] pulseaudio-libs-0:17.0-2.fc41 100% | 9.9 MiB/s | 716.3 KiB | 00m00s [153/336] bcg729-0:1.1.1-10.fc41.ppc64l 100% | 807.3 KiB/s | 57.3 KiB | 00m00s [154/336] c-ares-0:1.34.2-1.fc42.ppc64l 100% | 2.2 MiB/s | 134.7 KiB | 00m00s [155/336] ilbc-0:3.0.4-12.fc42.ppc64le 100% | 1.0 MiB/s | 53.6 KiB | 00m00s [156/336] libsbc-0:2.0-5.fc41.ppc64le 100% | 1.1 MiB/s | 50.6 KiB | 00m00s [157/336] opencore-amr-0:0.1.6-7.fc41.p 100% | 4.5 MiB/s | 184.2 KiB | 00m00s [158/336] opus-0:1.5.2-1.fc42.ppc64le 100% | 4.8 MiB/s | 239.1 KiB | 00m00s [159/336] libsmi-0:0.4.8-41.fc41.ppc64l 100% | 19.2 MiB/s | 2.6 MiB | 00m00s [160/336] snappy-0:1.2.1-3.fc42.ppc64le 100% | 855.9 KiB/s | 42.8 KiB | 00m00s [161/336] spandsp-0:0.0.6-19.fc41.ppc64 100% | 7.6 MiB/s | 372.3 KiB | 00m00s [162/336] desktop-file-utils-0:0.27-2.f 100% | 1.7 MiB/s | 75.4 KiB | 00m00s [163/336] python3-six-0:1.16.0-23.fc41. 100% | 1.5 MiB/s | 41.2 KiB | 00m00s [164/336] python3-ply-0:3.11-25.fc41.no 100% | 2.8 MiB/s | 136.2 KiB | 00m00s [165/336] default-fonts-core-sans-0:4.2 100% | 1.2 MiB/s | 31.3 KiB | 00m00s [166/336] xml-common-0:0.6.3-65.fc41.no 100% | 1.2 MiB/s | 31.2 KiB | 00m00s [167/336] libX11-common-0:1.8.10-2.fc42 100% | 5.9 MiB/s | 175.9 KiB | 00m00s [168/336] libXrender-0:0.9.11-7.fc41.pp 100% | 1.1 MiB/s | 29.2 KiB | 00m00s [169/336] qt6-qtquick3d-0:6.8.0-1.fc42. 100% | 10.1 MiB/s | 4.6 MiB | 00m00s [170/336] graphite2-0:1.3.14-16.fc41.pp 100% | 2.4 MiB/s | 104.9 KiB | 00m00s [171/336] duktape-0:2.7.0-8.fc41.ppc64l 100% | 3.5 MiB/s | 182.1 KiB | 00m00s [172/336] libpciaccess-0:0.16-13.fc41.p 100% | 657.3 KiB/s | 28.3 KiB | 00m00s [173/336] libglvnd-1:1.7.0-5.fc41.ppc64 100% | 2.4 MiB/s | 115.3 KiB | 00m00s [174/336] mesa-libEGL-0:24.3.0-2.fc42.p 100% | 3.1 MiB/s | 154.3 KiB | 00m00s [175/336] libevdev-0:1.13.3-1.fc42.ppc6 100% | 874.4 KiB/s | 40.2 KiB | 00m00s [176/336] libwacom-0:2.14.0-1.fc42.ppc6 100% | 1.0 MiB/s | 47.9 KiB | 00m00s [177/336] mesa-libGL-0:24.3.0-2.fc42.pp 100% | 3.2 MiB/s | 180.8 KiB | 00m00s [178/336] libXau-0:1.0.11-7.fc41.ppc64l 100% | 1.2 MiB/s | 32.7 KiB | 00m00s [179/336] libwayland-server-0:1.23.0-2. 100% | 837.3 KiB/s | 46.0 KiB | 00m00s [180/336] xkeyboard-config-0:2.43-1.fc4 100% | 11.1 MiB/s | 988.3 KiB | 00m00s [181/336] xcb-util-0:0.4.1-6.fc41.ppc64 100% | 304.6 KiB/s | 18.6 KiB | 00m00s [182/336] SDL2-0:2.30.3-2.fc41.ppc64le 100% | 6.1 MiB/s | 748.7 KiB | 00m00s [183/336] libunwind-0:1.8.0-5.fc42.ppc6 100% | 1.1 MiB/s | 68.8 KiB | 00m00s [184/336] libnice-0:0.1.22-2.fc41.ppc64 100% | 3.4 MiB/s | 214.9 KiB | 00m00s [185/336] libva-0:2.22.0-3.fc41.ppc64le 100% | 1.9 MiB/s | 123.4 KiB | 00m00s [186/336] libwayland-client-0:1.23.0-2. 100% | 573.8 KiB/s | 35.0 KiB | 00m00s [187/336] vulkan-loader-0:1.3.296.0-1.f 100% | 2.3 MiB/s | 166.8 KiB | 00m00s [188/336] cairo-0:1.18.2-1.fc42.ppc64le 100% | 10.3 MiB/s | 803.3 KiB | 00m00s [189/336] cdparanoia-libs-0:10.2-45.fc4 100% | 1.2 MiB/s | 60.5 KiB | 00m00s [190/336] mesa-dri-drivers-0:24.3.0-2.f 100% | 42.1 MiB/s | 18.8 MiB | 00m00s [191/336] graphene-0:1.10.6-9.fc41.ppc6 100% | 899.8 KiB/s | 86.4 KiB | 00m00s [192/336] libXi-0:1.8.2-1.fc42.ppc64le 100% | 877.9 KiB/s | 43.0 KiB | 00m00s [193/336] libXv-0:1.0.12-4.fc41.ppc64le 100% | 313.2 KiB/s | 19.4 KiB | 00m00s [194/336] libgudev-0:238-6.fc41.ppc64le 100% | 574.1 KiB/s | 34.4 KiB | 00m00s [195/336] libogg-2:1.3.5-9.fc41.ppc64le 100% | 686.4 KiB/s | 34.3 KiB | 00m00s [196/336] libvisual-1:0.4.1-5.fc41.ppc6 100% | 3.7 MiB/s | 157.6 KiB | 00m00s [197/336] libtheora-1:1.1.1-38.fc41.ppc 100% | 2.3 MiB/s | 173.3 KiB | 00m00s [198/336] libvorbis-1:1.3.7-11.fc41.ppc 100% | 2.8 MiB/s | 204.1 KiB | 00m00s [199/336] libwayland-egl-0:1.23.0-2.fc4 100% | 261.7 KiB/s | 12.8 KiB | 00m00s [200/336] libwayland-cursor-0:1.23.0-2. 100% | 153.6 KiB/s | 20.4 KiB | 00m00s [201/336] orc-0:0.4.39-1.fc41.ppc64le 100% | 5.0 MiB/s | 238.4 KiB | 00m00s [202/336] pango-0:1.54.0-2.fc41.ppc64le 100% | 7.8 MiB/s | 381.1 KiB | 00m00s [203/336] aribb24-0:1.0.3^20160216git5e 100% | 815.3 KiB/s | 42.4 KiB | 00m00s [204/336] fdk-aac-free-0:2.0.0-14.fc41. 100% | 4.8 MiB/s | 362.4 KiB | 00m00s [205/336] codec2-0:1.2.0-5.fc41.ppc64le 100% | 7.3 MiB/s | 670.8 KiB | 00m00s [206/336] iso-codes-0:4.17.0-1.fc42.noa 100% | 6.4 MiB/s | 3.6 MiB | 00m01s [207/336] lame-libs-0:3.100-18.fc41.ppc 100% | 7.1 MiB/s | 353.8 KiB | 00m00s [208/336] gsm-0:1.0.22-7.fc41.ppc64le 100% | 646.5 KiB/s | 39.4 KiB | 00m00s [209/336] libaribcaption-0:1.1.1-1.fc42 100% | 1.9 MiB/s | 113.3 KiB | 00m00s [210/336] lcms2-0:2.16-4.fc41.ppc64le 100% | 2.3 MiB/s | 207.2 KiB | 00m00s [211/336] libaom-0:3.9.0-3.fc41.ppc64le 100% | 11.5 MiB/s | 1.4 MiB | 00m00s [212/336] libdav1d-0:1.5.0-1.fc42.ppc64 100% | 8.0 MiB/s | 442.8 KiB | 00m00s [213/336] librsvg2-0:2.59.2-1.fc42.ppc6 100% | 13.4 MiB/s | 1.8 MiB | 00m00s [214/336] libwebp-0:1.4.0-4.fc41.ppc64l 100% | 5.5 MiB/s | 274.3 KiB | 00m00s [215/336] libvpx-0:1.14.1-2.fc41.ppc64l 100% | 6.3 MiB/s | 1.3 MiB | 00m00s [216/336] libjxl-1:0.10.3-5.fc42.ppc64l 100% | 5.2 MiB/s | 1.4 MiB | 00m00s [217/336] noopenh264-0:0.1.0~openh264_2 100% | 415.6 KiB/s | 22.0 KiB | 00m00s [218/336] speex-0:1.2.0-18.fc41.ppc64le 100% | 724.7 KiB/s | 73.2 KiB | 00m00s [219/336] rav1e-libs-0:0.7.1-4.fc42.ppc 100% | 6.9 MiB/s | 810.6 KiB | 00m00s [220/336] twolame-libs-0:0.4.0-5.fc41.p 100% | 1.2 MiB/s | 74.0 KiB | 00m00s [221/336] svt-av1-libs-0:2.1.0-2.fc41.p 100% | 11.5 MiB/s | 1.2 MiB | 00m00s [222/336] vo-amrwbenc-0:0.1.3-21.fc41.p 100% | 1.5 MiB/s | 84.3 KiB | 00m00s [223/336] xvidcore-0:1.3.7-12.fc41.ppc6 100% | 3.9 MiB/s | 257.1 KiB | 00m00s [224/336] zvbi-0:0.2.42-1.fc42.ppc64le 100% | 4.9 MiB/s | 466.1 KiB | 00m00s [225/336] game-music-emu-0:0.6.3-15.fc4 100% | 2.5 MiB/s | 166.2 KiB | 00m00s [226/336] openjpeg-0:2.5.2-4.fc42.ppc64 100% | 565.8 KiB/s | 213.9 KiB | 00m00s [227/336] libchromaprint-0:1.5.1-22.fc4 100% | 706.0 KiB/s | 45.9 KiB | 00m00s [228/336] libdvdnav-0:6.1.1-9.fc41.ppc6 100% | 916.5 KiB/s | 58.7 KiB | 00m00s [229/336] libbluray-0:1.3.4-7.fc41.ppc6 100% | 1.9 MiB/s | 186.9 KiB | 00m00s [230/336] libdvdread-0:6.1.3-7.fc41.ppc 100% | 1.8 MiB/s | 76.1 KiB | 00m00s [231/336] libmodplug-1:0.8.9.0-25.fc41. 100% | 3.4 MiB/s | 199.7 KiB | 00m00s [232/336] librabbitmq-0:0.15.0-1.fc42.p 100% | 1.1 MiB/s | 48.5 KiB | 00m00s [233/336] libopenmpt-0:0.7.12-1.fc42.pp 100% | 5.6 MiB/s | 714.4 KiB | 00m00s [234/336] srt-libs-0:1.5.4-1.fc42.ppc64 100% | 5.8 MiB/s | 392.7 KiB | 00m00s [235/336] librist-0:0.2.7-5.fc41.ppc64l 100% | 752.1 KiB/s | 84.2 KiB | 00m00s [236/336] libvdpau-0:1.5-8.fc42.ppc64le 100% | 343.5 KiB/s | 16.8 KiB | 00m00s [237/336] zeromq-0:4.3.5-17.fc41.ppc64l 100% | 5.0 MiB/s | 476.9 KiB | 00m00s [238/336] vapoursynth-libs-0:68-3.fc41. 100% | 3.8 MiB/s | 419.9 KiB | 00m00s [239/336] ocl-icd-0:2.3.2-7.fc41.ppc64l 100% | 1.3 MiB/s | 59.0 KiB | 00m00s [240/336] soxr-0:0.1.3-17.fc42.ppc64le 100% | 2.2 MiB/s | 84.7 KiB | 00m00s [241/336] libasyncns-0:0.8-29.fc41.ppc6 100% | 609.5 KiB/s | 31.1 KiB | 00m00s [242/336] libsndfile-0:1.2.2-5.fc42.ppc 100% | 4.0 MiB/s | 242.7 KiB | 00m00s [243/336] qt6-qtquicktimeline-0:6.8.0-1 100% | 1.7 MiB/s | 96.1 KiB | 00m00s [244/336] wget2-wget-0:2.2.0-1.fc42.ppc 100% | 245.1 KiB/s | 9.6 KiB | 00m00s [245/336] emacs-filesystem-1:30.0-3.fc4 100% | 255.1 KiB/s | 7.1 KiB | 00m00s [246/336] libtiff-0:4.7.0-2.fc42.ppc64l 100% | 6.3 MiB/s | 237.2 KiB | 00m00s [247/336] abattis-cantarell-vf-fonts-0: 100% | 3.3 MiB/s | 120.2 KiB | 00m00s [248/336] mesa-libglapi-0:24.3.0-2.fc42 100% | 1.1 MiB/s | 52.6 KiB | 00m00s [249/336] google-noto-sans-vf-fonts-0:2 100% | 7.3 MiB/s | 593.9 KiB | 00m00s [250/336] libXxf86vm-0:1.1.5-7.fc41.ppc 100% | 461.4 KiB/s | 18.5 KiB | 00m00s [251/336] hwdata-0:0.390-1.fc42.noarch 100% | 15.1 MiB/s | 1.6 MiB | 00m00s [252/336] libwacom-data-0:2.14.0-1.fc42 100% | 5.9 MiB/s | 306.8 KiB | 00m00s [253/336] libxshmfence-0:1.3.2-5.fc42.p 100% | 313.6 KiB/s | 13.5 KiB | 00m00s [254/336] lm_sensors-libs-0:3.6.0-20.fc 100% | 897.6 KiB/s | 44.0 KiB | 00m00s [255/336] mesa-filesystem-0:24.3.0-2.fc 100% | 496.8 KiB/s | 20.9 KiB | 00m00s [256/336] gupnp-igd-0:1.6.0-5.fc41.ppc6 100% | 667.4 KiB/s | 35.4 KiB | 00m00s [257/336] libXfixes-0:6.0.1-4.fc41.ppc6 100% | 533.6 KiB/s | 19.7 KiB | 00m00s [258/336] libdecor-0:0.2.2-4.fc41.ppc64 100% | 1.1 MiB/s | 62.4 KiB | 00m00s [259/336] pixman-0:0.44.0-0.fc42.ppc64l 100% | 4.3 MiB/s | 221.4 KiB | 00m00s [260/336] spirv-tools-libs-0:2024.3-4.f 100% | 7.3 MiB/s | 1.6 MiB | 00m00s [261/336] fribidi-0:1.0.16-1.fc42.ppc64 100% | 1.9 MiB/s | 57.3 KiB | 00m00s [262/336] libthai-0:0.1.29-9.fc41.ppc64 100% | 4.4 MiB/s | 213.7 KiB | 00m00s [263/336] giflib-0:5.2.2-2.fc41.ppc64le 100% | 1.1 MiB/s | 55.7 KiB | 00m00s [264/336] highway-0:1.2.0-3.fc41.ppc64l 100% | 2.9 MiB/s | 168.9 KiB | 00m00s [265/336] openexr-libs-0:3.2.4-3.fc41.p 100% | 7.9 MiB/s | 1.1 MiB | 00m00s [266/336] shared-mime-info-0:2.3-6.fc41 100% | 6.9 MiB/s | 394.1 KiB | 00m00s [267/336] cairo-gobject-0:1.18.2-1.fc42 100% | 423.3 KiB/s | 17.4 KiB | 00m00s [268/336] gdk-pixbuf2-0:2.42.12-6.fc41. 100% | 8.3 MiB/s | 498.4 KiB | 00m00s [269/336] rsvg-pixbuf-loader-0:2.59.2-1 100% | 5.0 MiB/s | 193.5 KiB | 00m00s [270/336] libudfread-0:1.1.2-9.fc41.ppc 100% | 698.5 KiB/s | 35.6 KiB | 00m00s [271/336] lpcnetfreedv-0:0.5-6.fc41.ppc 100% | 12.5 MiB/s | 7.3 MiB | 00m01s [272/336] mpg123-libs-0:1.32.9-1.fc42.p 100% | 5.6 MiB/s | 375.4 KiB | 00m00s [273/336] cjson-0:1.7.18-1.fc42.ppc64le 100% | 783.7 KiB/s | 35.3 KiB | 00m00s [274/336] mbedtls-0:2.28.8-1.fc41.ppc64 100% | 5.5 MiB/s | 433.0 KiB | 00m00s [275/336] zimg-0:3.0.5-3.fc41.ppc64le 100% | 1.8 MiB/s | 107.1 KiB | 00m00s [276/336] llvm-libs-0:19.1.4-2.fc42.ppc 100% | 28.1 MiB/s | 31.7 MiB | 00m01s [277/336] libsodium-0:1.0.20-2.fc41.ppc 100% | 893.2 KiB/s | 145.6 KiB | 00m00s [278/336] openpgm-0:5.2.122-35.fc41.ppc 100% | 1.3 MiB/s | 182.6 KiB | 00m00s [279/336] flac-libs-0:1.4.3-5.fc41.ppc6 100% | 4.5 MiB/s | 264.3 KiB | 00m00s [280/336] wget2-0:2.2.0-1.fc42.ppc64le 100% | 3.7 MiB/s | 283.6 KiB | 00m00s [281/336] liblerc-0:4.0.0-7.fc41.ppc64l 100% | 7.4 MiB/s | 228.2 KiB | 00m00s [282/336] google-noto-fonts-common-0:20 100% | 683.6 KiB/s | 17.8 KiB | 00m00s [283/336] jbigkit-libs-0:2.1-30.fc41.pp 100% | 506.8 KiB/s | 56.8 KiB | 00m00s [284/336] libedit-0:3.1-53.20240808cvs. 100% | 2.6 MiB/s | 119.1 KiB | 00m00s [285/336] gssdp-0:1.6.3-3.fc41.ppc64le 100% | 1.3 MiB/s | 60.7 KiB | 00m00s [286/336] libdatrie-0:0.2.13-10.fc41.pp 100% | 1.0 MiB/s | 34.1 KiB | 00m00s [287/336] gupnp-0:1.6.7-1.fc42.ppc64le 100% | 1.4 MiB/s | 116.5 KiB | 00m00s [288/336] imath-0:3.1.12-1.fc42.ppc64le 100% | 1.8 MiB/s | 95.9 KiB | 00m00s [289/336] libdeflate-0:1.22-2.fc42.ppc6 100% | 1.0 MiB/s | 64.6 KiB | 00m00s [290/336] gpgme-0:1.24.0-1.fc42.ppc64le 100% | 6.5 MiB/s | 238.5 KiB | 00m00s [291/336] gtk3-0:3.24.43-2.fc41.ppc64le 100% | 30.0 MiB/s | 5.8 MiB | 00m00s [292/336] libsoup3-0:3.6.1-1.fc42.ppc64 100% | 6.9 MiB/s | 411.8 KiB | 00m00s [293/336] wget2-libs-0:2.2.0-1.fc42.ppc 100% | 2.1 MiB/s | 157.6 KiB | 00m00s [294/336] adwaita-icon-theme-0:47.0-1.f 100% | 9.0 MiB/s | 406.6 KiB | 00m00s [295/336] dbus-1:1.14.10-4.fc41.ppc64le 100% | 170.2 KiB/s | 7.8 KiB | 00m00s [296/336] at-spi2-atk-0:2.54.0-1.fc42.p 100% | 1.9 MiB/s | 96.0 KiB | 00m00s [297/336] atk-0:2.54.0-1.fc42.ppc64le 100% | 1.8 MiB/s | 84.9 KiB | 00m00s [298/336] gdk-pixbuf2-modules-0:2.42.12 100% | 693.2 KiB/s | 29.8 KiB | 00m00s [299/336] libXcomposite-0:0.4.6-4.fc41. 100% | 689.2 KiB/s | 24.8 KiB | 00m00s [300/336] gtk-update-icon-cache-0:3.24. 100% | 752.3 KiB/s | 35.4 KiB | 00m00s [301/336] libXcursor-0:1.2.3-1.fc42.ppc 100% | 824.2 KiB/s | 35.4 KiB | 00m00s [302/336] libXdamage-0:1.1.6-4.fc41.ppc 100% | 449.6 KiB/s | 23.8 KiB | 00m00s [303/336] libXinerama-0:1.1.5-7.fc41.pp 100% | 339.7 KiB/s | 14.6 KiB | 00m00s [304/336] libcloudproviders-0:0.3.5-5.f 100% | 1.0 MiB/s | 47.2 KiB | 00m00s [305/336] colord-libs-0:1.4.7-5.fc41.pp 100% | 1.2 MiB/s | 237.7 KiB | 00m00s [306/336] libepoxy-0:1.5.10-8.fc41.ppc6 100% | 4.0 MiB/s | 238.5 KiB | 00m00s [307/336] libtracker-sparql-0:3.7.3-3.f 100% | 6.6 MiB/s | 400.0 KiB | 00m00s [308/336] libassuan-0:2.5.7-2.fc41.ppc6 100% | 2.4 MiB/s | 70.9 KiB | 00m00s [309/336] gnutls-dane-0:3.8.8-1.fc42.pp 100% | 1.0 MiB/s | 46.5 KiB | 00m00s [310/336] adwaita-cursor-theme-0:47.0-1 100% | 10.3 MiB/s | 326.6 KiB | 00m00s [311/336] dbus-broker-0:36-4.fc41.ppc64 100% | 3.0 MiB/s | 188.0 KiB | 00m00s [312/336] gnupg2-0:2.4.5-4.fc42.ppc64le 100% | 18.8 MiB/s | 2.9 MiB | 00m00s [313/336] adwaita-icon-theme-legacy-0:4 100% | 36.4 MiB/s | 2.5 MiB | 00m00s [314/336] libgusb-0:0.4.9-2.fc41.ppc64l 100% | 1.4 MiB/s | 65.7 KiB | 00m00s [315/336] at-spi2-core-0:2.54.0-1.fc42. 100% | 4.6 MiB/s | 394.0 KiB | 00m00s [316/336] libksba-0:1.6.7-2.fc41.ppc64l 100% | 5.2 MiB/s | 174.3 KiB | 00m00s [317/336] avahi-glib-0:0.8-30.fc42.ppc6 100% | 308.9 KiB/s | 15.4 KiB | 00m00s [318/336] json-glib-0:1.10.0-1.fc42.ppc 100% | 2.9 MiB/s | 164.5 KiB | 00m00s [319/336] npth-0:1.8-1.fc42.ppc64le 100% | 974.3 KiB/s | 25.3 KiB | 00m00s [320/336] tpm2-tss-0:4.1.3-3.fc41.ppc64 100% | 8.9 MiB/s | 390.3 KiB | 00m00s [321/336] dbus-common-1:1.14.10-4.fc41. 100% | 563.9 KiB/s | 14.7 KiB | 00m00s [322/336] unbound-libs-0:1.22.0-8.fc42. 100% | 11.9 MiB/s | 599.2 KiB | 00m00s [323/336] libXtst-0:1.2.5-1.fc41.ppc64l 100% | 614.2 KiB/s | 22.1 KiB | 00m00s [324/336] xprop-0:1.2.7-2.fc41.ppc64le 100% | 912.0 KiB/s | 38.3 KiB | 00m00s [325/336] libusb1-0:1.0.27-4.fc42.ppc64 100% | 1.9 MiB/s | 82.2 KiB | 00m00s [326/336] hiredis-0:1.2.0-4.fc42.ppc64l 100% | 1.2 MiB/s | 53.2 KiB | 00m00s [327/336] python3-pluggy-0:1.5.0-1.fc41 100% | 1.7 MiB/s | 58.6 KiB | 00m00s [328/336] libseccomp-0:2.5.5-2.fc41.ppc 100% | 1.5 MiB/s | 78.4 KiB | 00m00s [329/336] protobuf-c-0:1.5.0-4.fc41.ppc 100% | 327.6 KiB/s | 35.1 KiB | 00m00s [330/336] systemd-pam-0:257~rc3-1.fc42. 100% | 9.0 MiB/s | 443.5 KiB | 00m00s [331/336] systemd-rpm-macros-0:257~rc3- 100% | 800.7 KiB/s | 34.4 KiB | 00m00s [332/336] pyproject-rpm-macros-0:1.16.3 100% | 1.7 MiB/s | 44.6 KiB | 00m00s [333/336] python-rpm-macros-0:3.13-3.fc 100% | 552.1 KiB/s | 17.7 KiB | 00m00s [334/336] python3-rpm-generators-0:14-1 100% | 1.1 MiB/s | 29.3 KiB | 00m00s [335/336] python3-rpm-macros-0:3.13-3.f 100% | 429.1 KiB/s | 12.4 KiB | 00m00s [336/336] systemd-0:257~rc3-1.fc42.ppc6 100% | 24.2 MiB/s | 6.0 MiB | 00m00s -------------------------------------------------------------------------------- [336/336] Total 100% | 28.2 MiB/s | 271.1 MiB | 00m10s Running transaction [ 1/338] Verify package files 100% | 121.0 B/s | 336.0 B | 00m03s [ 2/338] Prepare transaction 100% | 962.0 B/s | 336.0 B | 00m00s [ 3/338] Installing libicu-0:74.2-2.fc 100% | 169.8 MiB/s | 36.8 MiB | 00m00s [ 4/338] Installing libtalloc-0:2.4.2- 100% | 96.3 MiB/s | 197.2 KiB | 00m00s [ 5/338] Installing libtevent-0:0.16.1 100% | 97.0 MiB/s | 198.7 KiB | 00m00s [ 6/338] Installing libtdb-0:1.4.12-3. 100% | 127.9 MiB/s | 261.9 KiB | 00m00s [ 7/338] Installing libpng-2:1.6.44-1. 100% | 150.7 MiB/s | 463.0 KiB | 00m00s [ 8/338] Installing libwayland-client- 100% | 97.3 MiB/s | 199.2 KiB | 00m00s [ 9/338] Installing dbus-libs-1:1.14.1 100% | 135.3 MiB/s | 554.3 KiB | 00m00s [ 10/338] Installing avahi-libs-0:0.8-3 100% | 150.5 MiB/s | 616.4 KiB | 00m00s [ 11/338] Installing libogg-2:1.3.5-9.f 100% | 100.9 MiB/s | 206.7 KiB | 00m00s [ 12/338] Installing libjpeg-turbo-0:3. 100% | 161.2 MiB/s | 990.4 KiB | 00m00s [ 13/338] Installing libX11-xcb-0:1.8.1 100% | 191.0 MiB/s | 195.5 KiB | 00m00s [ 14/338] Installing fonts-filesystem-1 100% | 0.0 B/s | 788.0 B | 00m00s [ 15/338] Installing expat-0:2.6.4-1.fc 100% | 114.4 MiB/s | 351.3 KiB | 00m00s [ 16/338] Installing libgpg-error-0:1.5 100% | 111.2 MiB/s | 1.0 MiB | 00m00s [ 17/338] Installing libgcrypt-0:1.11.0 100% | 144.3 MiB/s | 1.4 MiB | 00m00s [ 18/338] Installing libvorbis-1:1.3.7- 100% | 171.9 MiB/s | 1.2 MiB | 00m00s [ 19/338] Installing opus-0:1.5.2-1.fc4 100% | 142.7 MiB/s | 584.6 KiB | 00m00s [ 20/338] Installing libwayland-cursor- 100% | 102.8 MiB/s | 210.5 KiB | 00m00s [ 21/338] Installing python-rpm-macros- 100% | 22.3 MiB/s | 22.8 KiB | 00m00s [ 22/338] Installing libunwind-0:1.8.0- 100% | 190.7 MiB/s | 585.9 KiB | 00m00s [ 23/338] Installing libglvnd-1:1.7.0-5 100% | 203.7 MiB/s | 1.0 MiB | 00m00s [ 24/338] Installing nettle-0:3.10-3.fc 100% | 142.9 MiB/s | 1.0 MiB | 00m00s [ 25/338] Installing gnutls-0:3.8.8-1.f 100% | 151.2 MiB/s | 3.6 MiB | 00m00s [ 26/338] Installing glib2-0:2.83.0-2.f 100% | 163.6 MiB/s | 16.4 MiB | 00m00s [ 27/338] Installing libsoup3-0:3.6.1-1 100% | 85.4 MiB/s | 1.4 MiB | 00m00s [ 28/338] Installing libnl3-0:3.11.0-1. 100% | 136.3 MiB/s | 1.4 MiB | 00m00s [ 29/338] Installing gssdp-0:1.6.3-3.fc 100% | 124.9 MiB/s | 255.8 KiB | 00m00s [ 30/338] Installing libgudev-0:238-6.f 100% | 57.0 MiB/s | 233.3 KiB | 00m00s [ 31/338] Installing shared-mime-info-0 100% | 102.7 MiB/s | 2.7 MiB | 00m00s [ 32/338] Installing gdk-pixbuf2-0:2.42 100% | 103.7 MiB/s | 3.0 MiB | 00m00s [ 33/338] Installing json-glib-0:1.10.0 100% | 54.8 MiB/s | 785.9 KiB | 00m00s [ 34/338] Installing libglvnd-opengl-1: 100% | 192.2 MiB/s | 393.6 KiB | 00m00s [ 35/338] Installing python3-rpm-macros 100% | 6.5 MiB/s | 6.7 KiB | 00m00s [ 36/338] Installing libassuan-0:2.5.7- 100% | 91.7 MiB/s | 281.6 KiB | 00m00s [ 37/338] Installing libtheora-1:1.1.1- 100% | 166.9 MiB/s | 854.8 KiB | 00m00s [ 38/338] Installing mpg123-libs-0:1.32 100% | 122.2 MiB/s | 875.7 KiB | 00m00s [ 39/338] Installing fribidi-0:1.0.16-1 100% | 123.2 MiB/s | 504.8 KiB | 00m00s [ 40/338] Installing mesa-filesystem-0: 100% | 4.2 MiB/s | 4.3 KiB | 00m00s [ 41/338] Installing libdvdread-0:6.1.3 100% | 94.3 MiB/s | 289.6 KiB | 00m00s [ 42/338] Installing libwebp-0:1.4.0-4. 100% | 158.3 MiB/s | 1.4 MiB | 00m00s [ 43/338] Installing lcms2-0:2.16-4.fc4 100% | 120.1 MiB/s | 614.7 KiB | 00m00s [ 44/338] Installing lame-libs-0:3.100- 100% | 168.3 MiB/s | 1.3 MiB | 00m00s [ 45/338] Installing gsm-0:1.0.22-7.fc4 100% | 100.7 MiB/s | 206.3 KiB | 00m00s [ 46/338] Installing libwayland-egl-0:1 100% | 96.4 MiB/s | 197.4 KiB | 00m00s [ 47/338] Installing libwayland-server- 100% | 97.5 MiB/s | 199.7 KiB | 00m00s [ 48/338] Installing libevdev-0:1.13.3- 100% | 32.4 MiB/s | 199.1 KiB | 00m00s [ 49/338] Installing xml-common-0:0.6.3 100% | 26.4 MiB/s | 81.1 KiB | 00m00s [ 50/338] Installing snappy-0:1.2.1-3.f 100% | 103.7 MiB/s | 212.4 KiB | 00m00s [ 51/338] Installing opencore-amr-0:0.1 100% | 89.8 MiB/s | 551.4 KiB | 00m00s [ 52/338] Installing ilbc-0:3.0.4-12.fc 100% | 102.0 MiB/s | 208.9 KiB | 00m00s [ 53/338] Installing alsa-lib-0:1.2.13- 100% | 87.5 MiB/s | 1.9 MiB | 00m00s [ 54/338] Installing mtdev-0:1.1.6-9.fc 100% | 96.8 MiB/s | 198.2 KiB | 00m00s [ 55/338] Installing libICE-0:1.1.1-4.f 100% | 165.3 MiB/s | 338.4 KiB | 00m00s [ 56/338] Installing python-pip-wheel-0 100% | 177.7 MiB/s | 1.2 MiB | 00m00s [ 57/338] Installing libb2-0:0.98.1-12. 100% | 99.2 MiB/s | 203.2 KiB | 00m00s [ 58/338] Installing speexdsp-0:1.2.1-7 100% | 113.1 MiB/s | 694.9 KiB | 00m00s [ 59/338] Installing libmaxminddb-0:1.1 100% | 70.0 MiB/s | 430.0 KiB | 00m00s [ 60/338] Installing hicolor-icon-theme 100% | 7.3 MiB/s | 179.5 KiB | 00m00s [ 61/338] Installing tcl-1:8.6.15-6.fc4 100% | 97.6 MiB/s | 4.8 MiB | 00m00s [ 62/338] Installing libSM-0:1.2.4-4.fc 100% | 41.4 MiB/s | 254.6 KiB | 00m00s [ 63/338] Installing iso-codes-0:4.17.0 100% | 103.4 MiB/s | 20.5 MiB | 00m00s [ 64/338] Installing libdvdnav-0:6.1.1- 100% | 110.1 MiB/s | 225.5 KiB | 00m00s [ 65/338] Installing libopenmpt-0:0.7.1 100% | 130.2 MiB/s | 1.8 MiB | 00m00s [ 66/338] Installing pyproject-rpm-macr 100% | 37.7 MiB/s | 115.7 KiB | 00m00s [ 67/338] Installing gtk-update-icon-ca 100% | 109.1 MiB/s | 223.3 KiB | 00m00s [ 68/338] Installing libibverbs-0:54.0- 100% | 109.1 MiB/s | 1.9 MiB | 00m00s [ 69/338] Installing libpcap-14:1.10.5- 100% | 102.4 MiB/s | 629.3 KiB | 00m00s [ 70/338] Installing graphene-0:1.10.6- 100% | 142.0 MiB/s | 436.2 KiB | 00m00s [ 71/338] Installing libcloudproviders- 100% | 93.1 MiB/s | 286.0 KiB | 00m00s [ 72/338] Installing avahi-glib-0:0.8-3 100% | 191.7 MiB/s | 196.3 KiB | 00m00s [ 73/338] Installing libtracker-sparql- 100% | 131.3 MiB/s | 1.7 MiB | 00m00s [ 74/338] Installing srt-libs-0:1.5.4-1 100% | 123.4 MiB/s | 1.1 MiB | 00m00s [ 75/338] Installing libksba-0:1.6.7-2. 100% | 96.5 MiB/s | 593.0 KiB | 00m00s [ 76/338] Installing fontawesome4-fonts 100% | 96.9 MiB/s | 297.8 KiB | 00m00s [ 77/338] Installing google-roboto-slab 100% | 114.2 MiB/s | 701.4 KiB | 00m00s [ 78/338] Installing lato-fonts-0:2.015 100% | 153.2 MiB/s | 11.3 MiB | 00m00s [ 79/338] Installing abattis-cantarell- 100% | 94.9 MiB/s | 194.4 KiB | 00m00s [ 80/338] Installing flac-libs-0:1.4.3- 100% | 112.8 MiB/s | 808.4 KiB | 00m00s [ 81/338] Installing libsndfile-0:1.2.2 100% | 136.7 MiB/s | 700.1 KiB | 00m00s [ 82/338] Installing aribb24-0:1.0.3^20 100% | 66.5 MiB/s | 204.3 KiB | 00m00s [ 83/338] Installing zvbi-0:0.2.42-1.fc 100% | 102.0 MiB/s | 2.1 MiB | 00m00s [ 84/338] Installing libseccomp-0:2.5.5 100% | 100.0 MiB/s | 307.1 KiB | 00m00s [ 85/338] Installing protobuf-c-0:1.5.0 100% | 67.5 MiB/s | 207.4 KiB | 00m00s [ 86/338] Installing hiredis-0:1.2.0-4. 100% | 149.6 MiB/s | 459.5 KiB | 00m00s [ 87/338] Installing libusb1-0:1.0.27-4 100% | 100.2 MiB/s | 307.8 KiB | 00m00s [ 88/338] Installing libgusb-0:0.4.9-2. 100% | 76.1 MiB/s | 311.6 KiB | 00m00s [ 89/338] Installing colord-libs-0:1.4. 100% | 151.3 MiB/s | 1.5 MiB | 00m00s [ 90/338] Installing dbus-common-1:1.14 100% | 467.3 KiB/s | 13.6 KiB | 00m00s [ 91/338] Installing dbus-broker-0:36-4 100% | 66.1 MiB/s | 744.6 KiB | 00m00s [ 92/338] Installing dbus-1:1.14.10-4.f 100% | 0.0 B/s | 124.0 B | 00m00s [ 93/338] Installing systemd-pam-0:257~ 100% | 106.0 MiB/s | 1.5 MiB | 00m00s [ 94/338] Installing systemd-0:257~rc3- 100% | 52.6 MiB/s | 22.4 MiB | 00m00s >>> Running post-install scriptlet: systemd-0:257~rc3-1.fc42.ppc64le >>> Finished post-install scriptlet: systemd-0:257~rc3-1.fc42.ppc64le >>> Scriptlet output: >>> Creating group 'systemd-journal' with GID 190. >>> Creating group 'systemd-oom' with GID 999. >>> Creating user 'systemd-oom' (systemd Userspace OOM Killer) with UID 999 and >>> [ 95/338] Installing samba-common-2:4.2 100% | 13.8 MiB/s | 211.6 KiB | 00m00s [ 96/338] Installing gupnp-0:1.6.7-1.fc 100% | 109.8 MiB/s | 449.8 KiB | 00m00s [ 97/338] Installing gupnp-igd-0:1.6.0- 100% | 111.5 MiB/s | 228.4 KiB | 00m00s [ 98/338] Installing libnice-0:0.1.22-2 100% | 32.6 MiB/s | 1.0 MiB | 00m00s [ 99/338] Installing tpm2-tss-0:4.1.3-3 100% | 167.9 MiB/s | 4.0 MiB | 00m00s [100/338] Installing npth-0:1.8-1.fc42. 100% | 46.0 MiB/s | 94.2 KiB | 00m00s [101/338] Installing gnupg2-0:2.4.5-4.f 100% | 131.1 MiB/s | 11.3 MiB | 00m00s [102/338] Installing gpgme-0:1.24.0-1.f 100% | 61.6 MiB/s | 820.3 KiB | 00m00s [103/338] Installing adwaita-icon-theme 100% | 15.2 MiB/s | 2.4 MiB | 00m00s [104/338] Installing adwaita-cursor-the 100% | 196.8 MiB/s | 10.0 MiB | 00m00s [105/338] Installing adwaita-icon-theme 100% | 18.6 MiB/s | 1.3 MiB | 00m00s [106/338] Installing libepoxy-0:1.5.10- 100% | 180.7 MiB/s | 1.6 MiB | 00m00s [107/338] Installing libdeflate-0:1.22- 100% | 74.0 MiB/s | 227.2 KiB | 00m00s [108/338] Installing imath-0:3.1.12-1.f 100% | 101.1 MiB/s | 517.9 KiB | 00m00s [109/338] Installing openexr-libs-0:3.2 100% | 168.3 MiB/s | 7.4 MiB | 00m00s [110/338] Installing libdatrie-0:0.2.13 100% | 108.8 MiB/s | 222.8 KiB | 00m00s [111/338] Installing libthai-0:0.1.29-9 100% | 114.4 MiB/s | 937.2 KiB | 00m00s [112/338] Installing libedit-0:3.1-53.2 100% | 133.4 MiB/s | 409.8 KiB | 00m00s [113/338] Installing llvm-libs-0:19.1.4 100% | 164.4 MiB/s | 131.2 MiB | 00m01s [114/338] Installing google-noto-fonts- 100% | 17.8 MiB/s | 18.3 KiB | 00m00s [115/338] Installing google-noto-sans-v 100% | 124.9 MiB/s | 1.2 MiB | 00m00s [116/338] Installing default-fonts-core 100% | 4.4 MiB/s | 18.2 KiB | 00m00s [117/338] Installing liblerc-0:4.0.0-7. 100% | 112.2 MiB/s | 803.9 KiB | 00m00s [118/338] Installing jbigkit-libs-0:2.1 100% | 143.0 MiB/s | 439.2 KiB | 00m00s [119/338] Installing libtiff-0:4.7.0-2. 100% | 110.1 MiB/s | 789.0 KiB | 00m00s [120/338] Installing spandsp-0:0.0.6-19 100% | 125.5 MiB/s | 1.0 MiB | 00m00s [121/338] Installing gdk-pixbuf2-module 100% | 191.7 MiB/s | 392.7 KiB | 00m00s [122/338] Installing openpgm-0:5.2.122- 100% | 101.9 MiB/s | 417.5 KiB | 00m00s [123/338] Installing libsodium-0:1.0.20 100% | 111.6 MiB/s | 457.2 KiB | 00m00s [124/338] Installing zeromq-0:4.3.5-17. 100% | 85.7 MiB/s | 1.3 MiB | 00m00s [125/338] Installing zimg-0:3.0.5-3.fc4 100% | 83.8 MiB/s | 343.4 KiB | 00m00s [126/338] Installing mbedtls-0:2.28.8-1 100% | 135.0 MiB/s | 1.5 MiB | 00m00s [127/338] Installing cjson-0:1.7.18-1.f 100% | 14.7 MiB/s | 225.3 KiB | 00m00s [128/338] Installing librist-0:0.2.7-5. 100% | 66.1 MiB/s | 270.8 KiB | 00m00s [129/338] Installing libudfread-0:1.1.2 100% | 109.0 MiB/s | 223.1 KiB | 00m00s [130/338] Installing highway-0:1.2.0-3. 100% | 190.9 MiB/s | 1.9 MiB | 00m00s [131/338] Installing giflib-0:5.2.2-2.f 100% | 127.7 MiB/s | 261.6 KiB | 00m00s [132/338] Installing libjxl-1:0.10.3-5. 100% | 134.7 MiB/s | 3.8 MiB | 00m00s [133/338] Installing lpcnetfreedv-0:0.5 100% | 201.7 MiB/s | 14.9 MiB | 00m00s [134/338] Installing codec2-0:1.2.0-5.f 100% | 136.3 MiB/s | 1.5 MiB | 00m00s [135/338] Installing pixman-0:0.44.0-0. 100% | 144.2 MiB/s | 590.5 KiB | 00m00s [136/338] Installing spirv-tools-libs-0 100% | 162.5 MiB/s | 6.5 MiB | 00m00s [137/338] Installing lm_sensors-libs-0: 100% | 108.9 MiB/s | 222.9 KiB | 00m00s [138/338] Installing libxshmfence-0:1.3 100% | 17.0 MiB/s | 69.7 KiB | 00m00s [139/338] Installing libwacom-data-0:2. 100% | 21.6 MiB/s | 1.4 MiB | 00m00s [140/338] Installing hwdata-0:0.390-1.f 100% | 183.1 MiB/s | 9.3 MiB | 00m00s [141/338] Installing libpciaccess-0:0.1 100% | 98.5 MiB/s | 201.7 KiB | 00m00s [142/338] Installing libdrm-0:2.4.123-1 100% | 138.6 MiB/s | 1.1 MiB | 00m00s [143/338] Installing emacs-filesystem-1 100% | 0.0 B/s | 544.0 B | 00m00s [144/338] Installing desktop-file-utils 100% | 104.5 MiB/s | 641.8 KiB | 00m00s [145/338] Installing xdg-utils-0:1.2.1- 100% | 85.3 MiB/s | 349.5 KiB | 00m00s [146/338] Installing libasyncns-0:0.8-2 100% | 111.5 MiB/s | 228.3 KiB | 00m00s [147/338] Installing soxr-0:0.1.3-17.fc 100% | 90.7 MiB/s | 464.5 KiB | 00m00s [148/338] Installing ocl-icd-0:2.3.2-7. 100% | 113.5 MiB/s | 348.7 KiB | 00m00s [149/338] Installing librabbitmq-0:0.15 100% | 65.9 MiB/s | 134.9 KiB | 00m00s [150/338] Installing libmodplug-1:0.8.9 100% | 88.1 MiB/s | 541.0 KiB | 00m00s [151/338] Installing game-music-emu-0:0 100% | 104.5 MiB/s | 428.0 KiB | 00m00s [152/338] Installing xvidcore-0:1.3.7-1 100% | 113.0 MiB/s | 810.3 KiB | 00m00s [153/338] Installing vo-amrwbenc-0:0.1. 100% | 150.0 MiB/s | 307.3 KiB | 00m00s [154/338] Installing twolame-libs-0:0.4 100% | 69.9 MiB/s | 286.5 KiB | 00m00s [155/338] Installing svt-av1-libs-0:2.1 100% | 142.3 MiB/s | 3.8 MiB | 00m00s [156/338] Installing speex-0:1.2.0-18.f 100% | 86.7 MiB/s | 266.3 KiB | 00m00s [157/338] Installing rav1e-libs-0:0.7.1 100% | 135.6 MiB/s | 2.3 MiB | 00m00s [158/338] Installing openjpeg-0:2.5.2-4 100% | 117.9 MiB/s | 603.6 KiB | 00m00s [159/338] Installing noopenh264-0:0.1.0 100% | 73.0 MiB/s | 224.2 KiB | 00m00s [160/338] Installing libvpx-0:1.14.1-2. 100% | 103.3 MiB/s | 3.2 MiB | 00m00s [161/338] Installing libdav1d-0:1.5.0-1 100% | 145.6 MiB/s | 1.0 MiB | 00m00s [162/338] Installing libaom-0:3.9.0-3.f 100% | 148.3 MiB/s | 3.6 MiB | 00m00s [163/338] Installing fdk-aac-free-0:2.0 100% | 109.5 MiB/s | 784.6 KiB | 00m00s [164/338] Installing orc-0:0.4.39-1.fc4 100% | 161.9 MiB/s | 1.3 MiB | 00m00s [165/338] Installing libvisual-1:0.4.1- 100% | 100.6 MiB/s | 617.8 KiB | 00m00s [166/338] Installing cdparanoia-libs-0: 100% | 192.8 MiB/s | 394.8 KiB | 00m00s [167/338] Installing vulkan-loader-0:1. 100% | 98.0 MiB/s | 803.0 KiB | 00m00s [168/338] Installing xkeyboard-config-0 100% | 100.7 MiB/s | 6.6 MiB | 00m00s [169/338] Installing libxkbcommon-0:1.7 100% | 129.2 MiB/s | 661.6 KiB | 00m00s [170/338] Installing libXau-0:1.0.11-7. 100% | 79.4 MiB/s | 244.1 KiB | 00m00s [171/338] Installing libxcb-0:1.17.0-3. 100% | 178.5 MiB/s | 5.4 MiB | 00m00s [172/338] Installing mesa-libgbm-0:24.3 100% | 98.2 MiB/s | 201.2 KiB | 00m00s [173/338] Installing mesa-libglapi-0:24 100% | 131.5 MiB/s | 269.2 KiB | 00m00s [174/338] Installing mesa-dri-drivers-0 100% | 176.4 MiB/s | 91.4 MiB | 00m01s [175/338] Installing xcb-util-renderuti 100% | 65.7 MiB/s | 201.8 KiB | 00m00s [176/338] Installing libglvnd-egl-1:1.7 100% | 96.9 MiB/s | 198.4 KiB | 00m00s [177/338] Installing mesa-libEGL-0:24.3 100% | 112.3 MiB/s | 460.1 KiB | 00m00s [178/338] Installing libxkbcommon-x11-0 100% | 191.6 MiB/s | 196.2 KiB | 00m00s [179/338] Installing xcb-util-keysyms-0 100% | 96.4 MiB/s | 197.5 KiB | 00m00s [180/338] Installing xcb-util-wm-0:0.4. 100% | 96.4 MiB/s | 394.8 KiB | 00m00s [181/338] Installing pulseaudio-libs-0: 100% | 133.1 MiB/s | 4.1 MiB | 00m00s [182/338] Installing xcb-util-0:0.4.1-6 100% | 97.4 MiB/s | 199.5 KiB | 00m00s [183/338] Installing xcb-util-image-0:0 100% | 97.3 MiB/s | 199.4 KiB | 00m00s [184/338] Installing xcb-util-cursor-0: 100% | 97.9 MiB/s | 200.6 KiB | 00m00s [185/338] Installing graphite2-0:1.3.14 100% | 97.2 MiB/s | 497.7 KiB | 00m00s [186/338] Installing freetype-0:2.13.3- 100% | 138.8 MiB/s | 1.1 MiB | 00m00s [187/338] Installing harfbuzz-0:10.1.0- 100% | 136.5 MiB/s | 3.1 MiB | 00m00s [188/338] Installing fontconfig-0:2.15. 100% | 2.4 MiB/s | 2.6 MiB | 00m01s [189/338] Installing libaribcaption-0:1 100% | 98.0 MiB/s | 401.3 KiB | 00m00s [190/338] Installing libbluray-0:1.3.4- 100% | 101.5 MiB/s | 623.3 KiB | 00m00s [191/338] Installing duktape-0:2.7.0-8. 100% | 172.5 MiB/s | 1.0 MiB | 00m00s [192/338] Installing libproxy-0:0.5.8-1 100% | 82.8 MiB/s | 424.2 KiB | 00m00s [193/338] Installing libX11-common-0:1. 100% | 47.5 MiB/s | 1.2 MiB | 00m00s [194/338] Installing libX11-0:1.8.10-2. 100% | 138.0 MiB/s | 1.7 MiB | 00m00s [195/338] Installing libXext-0:1.3.6-2. 100% | 134.3 MiB/s | 275.1 KiB | 00m00s [196/338] Installing libXrender-0:0.9.1 100% | 64.9 MiB/s | 199.2 KiB | 00m00s [197/338] Installing cairo-0:1.18.2-1.f 100% | 135.2 MiB/s | 2.2 MiB | 00m00s [198/338] Installing libXi-0:1.8.2-1.fc 100% | 98.4 MiB/s | 201.6 KiB | 00m00s [199/338] Installing libXfixes-0:6.0.1- 100% | 97.4 MiB/s | 199.5 KiB | 00m00s [200/338] Installing cairo-gobject-0:1. 100% | 66.7 MiB/s | 68.3 KiB | 00m00s [201/338] Installing libXft-0:2.3.8-7.f 100% | 78.6 MiB/s | 321.9 KiB | 00m00s [202/338] Installing pango-0:1.54.0-2.f 100% | 145.4 MiB/s | 2.0 MiB | 00m00s [203/338] Installing librsvg2-0:2.59.2- 100% | 141.8 MiB/s | 5.0 MiB | 00m00s [204/338] Installing rsvg-pixbuf-loader 100% | 113.9 MiB/s | 466.6 KiB | 00m00s [205/338] Installing libXrandr-0:1.5.4- 100% | 24.5 MiB/s | 200.9 KiB | 00m00s [206/338] Installing tk-1:8.6.15-1.fc42 100% | 89.4 MiB/s | 4.3 MiB | 00m00s [207/338] Installing libXcursor-0:1.2.3 100% | 69.6 MiB/s | 71.3 KiB | 00m00s [208/338] Installing libXdamage-0:1.1.6 100% | 109.9 MiB/s | 225.0 KiB | 00m00s [209/338] Installing libXtst-0:1.2.5-1. 100% | 65.9 MiB/s | 202.5 KiB | 00m00s [210/338] Installing libXv-0:1.0.12-4.f 100% | 97.3 MiB/s | 199.2 KiB | 00m00s [211/338] Installing libvdpau-0:1.5-8.f 100% | 69.0 MiB/s | 70.7 KiB | 00m00s [212/338] Installing libXxf86vm-0:1.1.5 100% | 96.9 MiB/s | 198.5 KiB | 00m00s [213/338] Installing libglvnd-glx-1:1.7 100% | 155.0 MiB/s | 1.1 MiB | 00m00s [214/338] Installing mesa-libGL-0:24.3. 100% | 145.8 MiB/s | 597.2 KiB | 00m00s [215/338] Installing libva-0:2.22.0-3.f 100% | 146.6 MiB/s | 1.2 MiB | 00m00s [216/338] Installing libavutil-free-0:7 100% | 240.0 MiB/s | 17.0 MiB | 00m00s [217/338] Installing libswresample-free 100% | 50.7 MiB/s | 155.9 KiB | 00m00s [218/338] Installing libavcodec-free-0: 100% | 166.3 MiB/s | 13.5 MiB | 00m00s [219/338] Installing libchromaprint-0:1 100% | 51.3 MiB/s | 210.0 KiB | 00m00s [220/338] Installing libswscale-free-0: 100% | 156.9 MiB/s | 642.7 KiB | 00m00s [221/338] Installing glx-utils-0:9.0.0- 100% | 207.0 MiB/s | 848.0 KiB | 00m00s [222/338] Installing libXinerama-0:1.1. 100% | 65.1 MiB/s | 200.1 KiB | 00m00s [223/338] Installing libXcomposite-0:0. 100% | 110.3 MiB/s | 225.9 KiB | 00m00s [224/338] Installing xprop-0:1.2.7-2.fc 100% | 101.6 MiB/s | 208.1 KiB | 00m00s [225/338] Installing at-spi2-core-0:2.5 100% | 74.5 MiB/s | 2.0 MiB | 00m00s [226/338] Installing atk-0:2.54.0-1.fc4 100% | 138.7 MiB/s | 426.2 KiB | 00m00s [227/338] Installing at-spi2-atk-0:2.54 100% | 120.5 MiB/s | 617.1 KiB | 00m00s [228/338] Installing libsbc-0:2.0-5.fc4 100% | 104.6 MiB/s | 214.2 KiB | 00m00s [229/338] Installing c-ares-0:1.34.2-1. 100% | 152.4 MiB/s | 468.2 KiB | 00m00s [230/338] Installing bcg729-0:1.1.1-10. 100% | 76.0 MiB/s | 233.3 KiB | 00m00s [231/338] Installing qt6-filesystem-0:6 100% | 3.4 MiB/s | 3.5 KiB | 00m00s [232/338] Installing pcre2-utf16-0:10.4 100% | 151.3 MiB/s | 774.4 KiB | 00m00s [233/338] Installing double-conversion- 100% | 131.9 MiB/s | 270.1 KiB | 00m00s [234/338] Installing qt6-qtbase-common- 100% | 343.8 KiB/s | 352.0 B | 00m00s [235/338] Installing qt6-qtbase-0:6.8.0 100% | 138.7 MiB/s | 16.1 MiB | 00m00s [236/338] Installing lmdb-libs-0:0.9.33 100% | 89.4 MiB/s | 274.6 KiB | 00m00s [237/338] Installing libldb-2:4.21.2-1. 100% | 51.4 MiB/s | 579.0 KiB | 00m00s [238/338] Installing libwbclient-2:4.21 100% | 46.0 MiB/s | 94.2 KiB | 00m00s [239/338] Installing samba-common-libs- 100% | 61.3 MiB/s | 313.7 KiB | 00m00s [240/338] Installing samba-client-libs- 100% | 150.3 MiB/s | 23.9 MiB | 00m00s [241/338] Installing libnetapi-2:4.21.2 100% | 100.4 MiB/s | 616.8 KiB | 00m00s [242/338] Installing samba-libs-2:4.21. 100% | 73.9 MiB/s | 453.8 KiB | 00m00s [243/338] Installing libsmbclient-2:4.2 100% | 69.5 MiB/s | 213.6 KiB | 00m00s [244/338] Installing samba-ldb-ldap-mod 100% | 34.5 MiB/s | 70.7 KiB | 00m00s [245/338] Installing cups-filesystem-1: 100% | 1.7 MiB/s | 1.8 KiB | 00m00s [246/338] Installing cups-libs-1:2.4.11 100% | 111.7 MiB/s | 914.9 KiB | 00m00s [247/338] Installing samba-dcerpc-2:4.2 100% | 142.9 MiB/s | 3.4 MiB | 00m00s [248/338] Installing gtk3-0:3.24.43-2.f 100% | 147.4 MiB/s | 25.8 MiB | 00m00s [249/338] Installing libdecor-0:0.2.2-4 100% | 145.5 MiB/s | 595.8 KiB | 00m00s [250/338] Installing SDL2-0:2.30.3-2.fc 100% | 149.0 MiB/s | 2.4 MiB | 00m00s [251/338] Installing tslib-0:1.22-11.fc 100% | 160.6 MiB/s | 4.7 MiB | 00m00s [252/338] Installing python-wheel-wheel 100% | 65.5 MiB/s | 67.1 KiB | 00m00s [253/338] Installing python-setuptools- 100% | 104.8 MiB/s | 1.2 MiB | 00m00s [254/338] Installing tzdata-0:2024a-9.f 100% | 15.9 MiB/s | 1.9 MiB | 00m00s [255/338] Installing mpdecimal-0:2.5.1- 100% | 29.3 MiB/s | 330.0 KiB | 00m00s [256/338] Installing python3-libs-0:3.1 100% | 122.7 MiB/s | 51.0 MiB | 00m00s [257/338] Installing python3-0:3.13.0-1 100% | 69.5 MiB/s | 213.4 KiB | 00m00s [258/338] Installing python3-packaging- 100% | 55.5 MiB/s | 568.0 KiB | 00m00s [259/338] Installing gstreamer1-0:1.24. 100% | 120.9 MiB/s | 6.4 MiB | 00m00s [260/338] Installing gstreamer1-plugins 100% | 124.0 MiB/s | 9.7 MiB | 00m00s [261/338] Installing python3-pygments-0 100% | 85.4 MiB/s | 10.8 MiB | 00m00s [262/338] Installing python3-traitlets- 100% | 68.6 MiB/s | 984.0 KiB | 00m00s [263/338] Installing python3-docutils-0 100% | 75.3 MiB/s | 5.0 MiB | 00m00s [264/338] Installing python3-filelock-0 100% | 23.7 MiB/s | 97.1 KiB | 00m00s [265/338] Installing python3-platformdi 100% | 42.7 MiB/s | 175.0 KiB | 00m00s [266/338] Installing python3-idna-0:3.1 100% | 103.2 MiB/s | 634.3 KiB | 00m00s [267/338] Installing python3-urllib3-0: 100% | 66.8 MiB/s | 1.0 MiB | 00m00s [268/338] Installing python3-matplotlib 100% | 10.7 MiB/s | 43.7 KiB | 00m00s [269/338] Installing gstreamer1-plugins 100% | 130.7 MiB/s | 3.9 MiB | 00m00s [270/338] Installing python3-pyproject- 100% | 27.7 MiB/s | 85.2 KiB | 00m00s [271/338] Installing python3-rpm-genera 100% | 16.2 MiB/s | 82.9 KiB | 00m00s [272/338] Installing python3-setuptools 100% | 70.7 MiB/s | 8.6 MiB | 00m00s [273/338] Installing python3-decorator- 100% | 13.2 MiB/s | 81.1 KiB | 00m00s [274/338] Installing python3-babel-0:2. 100% | 108.4 MiB/s | 28.5 MiB | 00m00s [275/338] Installing python3-imagesize- 100% | 12.5 MiB/s | 38.3 KiB | 00m00s [276/338] Installing python3-snowballst 100% | 102.6 MiB/s | 1.7 MiB | 00m00s [277/338] Installing python3-sphinx-the 100% | 22.7 MiB/s | 46.4 KiB | 00m00s [278/338] Installing python3-cachetools 100% | 34.7 MiB/s | 142.3 KiB | 00m00s [279/338] Installing python3-chardet-0: 100% | 91.1 MiB/s | 2.1 MiB | 00m00s [280/338] Installing python3-colorama-0 100% | 32.8 MiB/s | 201.5 KiB | 00m00s [281/338] Installing samba-common-tools 100% | 123.0 MiB/s | 1.6 MiB | 00m00s [282/338] Installing python3-parso-0:0. 100% | 42.4 MiB/s | 911.8 KiB | 00m00s [283/338] Installing python3-jedi-0:0.1 100% | 25.4 MiB/s | 6.1 MiB | 00m00s [284/338] Installing python3-ptyprocess 100% | 20.5 MiB/s | 84.0 KiB | 00m00s [285/338] Installing python3-pexpect-0: 100% | 56.7 MiB/s | 638.7 KiB | 00m00s [286/338] Installing python3-wcwidth-0: 100% | 69.0 MiB/s | 565.4 KiB | 00m00s [287/338] Installing python3-prompt-too 100% | 68.3 MiB/s | 3.8 MiB | 00m00s [288/338] Installing python3-executing- 100% | 52.8 MiB/s | 270.2 KiB | 00m00s [289/338] Installing python3-pure-eval- 100% | 51.3 MiB/s | 105.0 KiB | 00m00s [290/338] Installing python3-markupsafe 100% | 28.3 MiB/s | 116.0 KiB | 00m00s [291/338] Installing python3-jinja2-0:3 100% | 111.8 MiB/s | 2.9 MiB | 00m00s [292/338] Installing python3-charset-no 100% | 46.0 MiB/s | 329.8 KiB | 00m00s [293/338] Installing python3-requests-0 100% | 37.4 MiB/s | 498.0 KiB | 00m00s [294/338] Installing python3-sphinx-1:7 100% | 76.6 MiB/s | 11.0 MiB | 00m00s [295/338] Installing python3-sphinxcont 100% | 75.2 MiB/s | 385.0 KiB | 00m00s [296/338] Installing python3-distlib-0: 100% | 106.6 MiB/s | 1.2 MiB | 00m00s [297/338] Installing python3-virtualenv 100% | 23.2 MiB/s | 713.6 KiB | 00m00s [298/338] Installing python3-ply-0:3.11 100% | 93.3 MiB/s | 573.4 KiB | 00m00s [299/338] Installing python3-pycparser- 100% | 90.3 MiB/s | 832.5 KiB | 00m00s [300/338] Installing python3-cffi-0:1.1 100% | 110.4 MiB/s | 1.5 MiB | 00m00s [301/338] Installing python3-six-0:1.16 100% | 39.3 MiB/s | 120.7 KiB | 00m00s [302/338] Installing python3-asttokens- 100% | 52.6 MiB/s | 215.3 KiB | 00m00s [303/338] Installing python3-stack-data 100% | 52.1 MiB/s | 213.5 KiB | 00m00s [304/338] Installing libwacom-0:2.14.0- 100% | 69.1 MiB/s | 212.2 KiB | 00m00s [305/338] Installing libinput-0:1.27.0- 100% | 48.8 MiB/s | 948.6 KiB | 00m00s [306/338] Installing qt6-qtbase-gui-0:6 100% | 158.0 MiB/s | 33.2 MiB | 00m00s [307/338] Installing qt6-qtdeclarative- 100% | 127.5 MiB/s | 62.2 MiB | 00m00s [308/338] Installing qt6-qtshadertools- 100% | 144.9 MiB/s | 5.4 MiB | 00m00s [309/338] Installing qt6-qt5compat-0:6. 100% | 127.9 MiB/s | 2.2 MiB | 00m00s [310/338] Installing qt6-qtquicktimelin 100% | 97.9 MiB/s | 902.6 KiB | 00m00s [311/338] Installing qt6-qtquick3d-0:6. 100% | 120.6 MiB/s | 17.8 MiB | 00m00s [312/338] Installing python3-pluggy-0:1 100% | 64.9 MiB/s | 199.4 KiB | 00m00s [313/338] Installing vapoursynth-libs-0 100% | 129.1 MiB/s | 1.4 MiB | 00m00s [314/338] Installing libavformat-free-0 100% | 141.1 MiB/s | 3.2 MiB | 00m00s [315/338] Installing qt6-qtmultimedia-0 100% | 91.7 MiB/s | 5.1 MiB | 00m00s [316/338] Installing unbound-libs-0:1.2 100% | 126.1 MiB/s | 1.8 MiB | 00m00s [317/338] Installing gnutls-dane-0:3.8. 100% | 65.8 MiB/s | 134.7 KiB | 00m00s [318/338] Installing wget2-libs-0:2.2.0 100% | 120.5 MiB/s | 493.7 KiB | 00m00s [319/338] Installing wget2-0:2.2.0-1.fc 100% | 93.5 MiB/s | 1.1 MiB | 00m00s [320/338] Installing wget2-wget-0:2.2.0 100% | 144.5 KiB/s | 444.0 B | 00m00s [321/338] Installing libsmi-0:0.4.8-41. 100% | 122.8 MiB/s | 22.0 MiB | 00m00s [322/338] Installing wireshark-cli-1:4. 100% | 182.6 MiB/s | 143.0 MiB | 00m01s [323/338] Installing wireshark-1:4.4.2- 100% | 156.0 MiB/s | 10.9 MiB | 00m00s [324/338] Installing tox-0:4.23.2-1.fc4 100% | 35.5 MiB/s | 1.3 MiB | 00m00s [325/338] Installing python3-ipython-0: 100% | 70.3 MiB/s | 4.6 MiB | 00m00s [326/338] Installing python3-cryptograp 100% | 82.8 MiB/s | 5.2 MiB | 00m00s [327/338] Installing python3-sphinx_rtd 100% | 22.7 MiB/s | 348.0 KiB | 00m00s [328/338] Installing samba-2:4.21.2-1.f 100% | 51.7 MiB/s | 3.7 MiB | 00m00s [329/338] Installing python3-coverage-0 100% | 81.2 MiB/s | 1.9 MiB | 00m00s [330/338] Installing python3-devel-0:3. 100% | 53.4 MiB/s | 1.8 MiB | 00m00s [331/338] Installing python3-brotli-0:1 100% | 127.3 MiB/s | 1.0 MiB | 00m00s [332/338] Installing python3-tkinter-0: 100% | 96.0 MiB/s | 2.1 MiB | 00m00s [333/338] Installing python3-zstandard- 100% | 139.2 MiB/s | 2.5 MiB | 00m00s [334/338] Installing samba-client-2:4.2 100% | 52.2 MiB/s | 3.0 MiB | 00m00s [335/338] Installing tcpdump-14:4.99.5- 100% | 132.9 MiB/s | 1.7 MiB | 00m00s [336/338] Installing systemd-rpm-macros 100% | 5.5 MiB/s | 11.2 KiB | 00m00s [337/338] Installing openssl-1:3.2.2-8. 100% | 64.4 MiB/s | 2.0 MiB | 00m00s [338/338] Installing make-1:4.4.1-9.fc4 100% | 2.1 MiB/s | 2.0 MiB | 00m01s Complete! Finish: build setup for scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.src.rpm Start: rpmbuild scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.src.rpm Building target platforms: ppc64le Building for target ppc64le setting SOURCE_DATE_EPOCH=1733616000 Executing(%mkbuilddir): /bin/sh -e /var/tmp/rpm-tmp.YpJ1b2 + umask 022 + cd /builddir/build/BUILD/scapy-2.5.0-build + test -d /builddir/build/BUILD/scapy-2.5.0-build + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w /builddir/build/BUILD/scapy-2.5.0-build + /usr/bin/rm -rf /builddir/build/BUILD/scapy-2.5.0-build + /usr/bin/mkdir -p /builddir/build/BUILD/scapy-2.5.0-build + /usr/bin/mkdir -p /builddir/build/BUILD/scapy-2.5.0-build/SPECPARTS + RPM_EC=0 ++ jobs -p + exit 0 Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.FQv7fy + umask 022 + cd /builddir/build/BUILD/scapy-2.5.0-build + cd /builddir/build/BUILD/scapy-2.5.0-build + rm -rf scapy-2.5.0 + /usr/lib/rpm/rpmuncompress -x /builddir/build/SOURCES/scapy-2.5.0.tar.gz + STATUS=0 + '[' 0 -ne 0 ']' + cd scapy-2.5.0 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . ++ xargs grep -l -e '^#!.*env python' ++ find ./scapy -name '*.py' -print + SHEBANGS='./scapy/contrib/automotive/autosar/pdu.py ./scapy/contrib/automotive/doip.py' + for FILE in $SHEBANGS + sed -i.orig -e 1d ./scapy/contrib/automotive/autosar/pdu.py + touch -r ./scapy/contrib/automotive/autosar/pdu.py.orig ./scapy/contrib/automotive/autosar/pdu.py + rm ./scapy/contrib/automotive/autosar/pdu.py.orig + for FILE in $SHEBANGS + sed -i.orig -e 1d ./scapy/contrib/automotive/doip.py + touch -r ./scapy/contrib/automotive/doip.py.orig ./scapy/contrib/automotive/doip.py + rm ./scapy/contrib/automotive/doip.py.orig + RPM_EC=0 ++ jobs -p + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.JaJXsN + umask 022 + cd /builddir/build/BUILD/scapy-2.5.0-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd scapy-2.5.0 + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + /usr/bin/python3 setup.py build '--executable=/usr/bin/python3 -sP' running build running build_py creating build creating build/lib creating build/lib/scapy copying scapy/__init__.py -> build/lib/scapy copying scapy/__main__.py -> build/lib/scapy copying scapy/all.py -> build/lib/scapy copying scapy/ansmachine.py -> build/lib/scapy copying scapy/as_resolvers.py -> build/lib/scapy copying scapy/asn1fields.py -> build/lib/scapy copying scapy/asn1packet.py -> build/lib/scapy copying scapy/automaton.py -> build/lib/scapy copying scapy/autorun.py -> build/lib/scapy copying scapy/base_classes.py -> build/lib/scapy copying scapy/compat.py -> build/lib/scapy copying scapy/config.py -> build/lib/scapy copying scapy/consts.py -> build/lib/scapy copying scapy/dadict.py -> build/lib/scapy copying scapy/data.py -> build/lib/scapy copying scapy/error.py -> build/lib/scapy copying scapy/fields.py -> build/lib/scapy copying scapy/interfaces.py -> build/lib/scapy copying scapy/main.py -> build/lib/scapy copying scapy/packet.py -> build/lib/scapy copying scapy/pipetool.py -> build/lib/scapy copying scapy/plist.py -> build/lib/scapy copying scapy/pton_ntop.py -> build/lib/scapy copying scapy/route.py -> build/lib/scapy copying scapy/route6.py -> build/lib/scapy copying scapy/scapypipes.py -> build/lib/scapy copying scapy/sendrecv.py -> build/lib/scapy copying scapy/sessions.py -> build/lib/scapy copying scapy/supersocket.py -> build/lib/scapy copying scapy/themes.py -> build/lib/scapy copying scapy/utils.py -> build/lib/scapy copying scapy/utils6.py -> build/lib/scapy copying scapy/volatile.py -> build/lib/scapy creating build/lib/scapy/arch copying scapy/arch/__init__.py -> build/lib/scapy/arch copying scapy/arch/common.py -> build/lib/scapy/arch copying scapy/arch/libpcap.py -> build/lib/scapy/arch copying scapy/arch/solaris.py -> build/lib/scapy/arch copying scapy/arch/unix.py -> build/lib/scapy/arch creating build/lib/scapy/asn1 copying scapy/asn1/__init__.py -> build/lib/scapy/asn1 copying scapy/asn1/asn1.py -> build/lib/scapy/asn1 copying scapy/asn1/ber.py -> build/lib/scapy/asn1 copying scapy/asn1/mib.py -> build/lib/scapy/asn1 creating build/lib/scapy/contrib copying scapy/contrib/__init__.py -> build/lib/scapy/contrib copying scapy/contrib/altbeacon.py -> build/lib/scapy/contrib copying scapy/contrib/aoe.py -> build/lib/scapy/contrib copying scapy/contrib/avs.py -> build/lib/scapy/contrib copying scapy/contrib/bfd.py -> build/lib/scapy/contrib copying scapy/contrib/bgp.py -> build/lib/scapy/contrib copying scapy/contrib/bier.py -> build/lib/scapy/contrib copying scapy/contrib/bp.py -> build/lib/scapy/contrib copying scapy/contrib/cansocket.py -> build/lib/scapy/contrib copying scapy/contrib/cansocket_native.py -> build/lib/scapy/contrib copying scapy/contrib/cansocket_python_can.py -> build/lib/scapy/contrib copying scapy/contrib/carp.py -> build/lib/scapy/contrib copying scapy/contrib/cdp.py -> build/lib/scapy/contrib copying scapy/contrib/chdlc.py -> build/lib/scapy/contrib copying scapy/contrib/coap.py -> build/lib/scapy/contrib copying scapy/contrib/concox.py -> build/lib/scapy/contrib copying scapy/contrib/diameter.py -> build/lib/scapy/contrib copying scapy/contrib/dtp.py -> build/lib/scapy/contrib copying scapy/contrib/eddystone.py -> build/lib/scapy/contrib copying scapy/contrib/eigrp.py -> build/lib/scapy/contrib copying scapy/contrib/enipTCP.py -> build/lib/scapy/contrib copying scapy/contrib/erspan.py -> build/lib/scapy/contrib copying scapy/contrib/esmc.py -> build/lib/scapy/contrib copying scapy/contrib/ethercat.py -> build/lib/scapy/contrib copying scapy/contrib/etherip.py -> build/lib/scapy/contrib copying scapy/contrib/exposure_notification.py -> build/lib/scapy/contrib copying scapy/contrib/geneve.py -> build/lib/scapy/contrib copying scapy/contrib/gtp.py -> build/lib/scapy/contrib copying scapy/contrib/gtp_v2.py -> build/lib/scapy/contrib copying scapy/contrib/gxrp.py -> build/lib/scapy/contrib copying scapy/contrib/hicp.py -> build/lib/scapy/contrib copying scapy/contrib/homeplugav.py -> build/lib/scapy/contrib copying scapy/contrib/homepluggp.py -> build/lib/scapy/contrib copying scapy/contrib/homeplugsg.py -> build/lib/scapy/contrib copying scapy/contrib/http2.py -> build/lib/scapy/contrib copying scapy/contrib/ibeacon.py -> build/lib/scapy/contrib copying scapy/contrib/icmp_extensions.py -> build/lib/scapy/contrib copying scapy/contrib/ife.py -> build/lib/scapy/contrib copying scapy/contrib/igmp.py -> build/lib/scapy/contrib copying scapy/contrib/igmpv3.py -> build/lib/scapy/contrib copying scapy/contrib/ikev2.py -> build/lib/scapy/contrib copying scapy/contrib/isis.py -> build/lib/scapy/contrib copying scapy/contrib/knx.py -> build/lib/scapy/contrib copying scapy/contrib/lacp.py -> build/lib/scapy/contrib copying scapy/contrib/ldp.py -> build/lib/scapy/contrib copying scapy/contrib/lldp.py -> build/lib/scapy/contrib copying scapy/contrib/loraphy2wan.py -> build/lib/scapy/contrib copying scapy/contrib/ltp.py -> build/lib/scapy/contrib copying scapy/contrib/mac_control.py -> build/lib/scapy/contrib copying scapy/contrib/macsec.py -> build/lib/scapy/contrib copying scapy/contrib/metawatch.py -> build/lib/scapy/contrib copying scapy/contrib/modbus.py -> build/lib/scapy/contrib copying scapy/contrib/mount.py -> build/lib/scapy/contrib copying scapy/contrib/mpls.py -> build/lib/scapy/contrib copying scapy/contrib/mqtt.py -> build/lib/scapy/contrib copying scapy/contrib/mqttsn.py -> build/lib/scapy/contrib copying scapy/contrib/nfs.py -> build/lib/scapy/contrib copying scapy/contrib/nlm.py -> build/lib/scapy/contrib copying scapy/contrib/nrf_sniffer.py -> build/lib/scapy/contrib copying scapy/contrib/nsh.py -> build/lib/scapy/contrib copying scapy/contrib/oam.py -> build/lib/scapy/contrib copying scapy/contrib/oncrpc.py -> build/lib/scapy/contrib copying scapy/contrib/opc_da.py -> build/lib/scapy/contrib copying scapy/contrib/openflow.py -> build/lib/scapy/contrib copying scapy/contrib/openflow3.py -> build/lib/scapy/contrib copying scapy/contrib/ospf.py -> build/lib/scapy/contrib copying scapy/contrib/pfcp.py -> build/lib/scapy/contrib copying scapy/contrib/pim.py -> build/lib/scapy/contrib copying scapy/contrib/pnio.py -> build/lib/scapy/contrib copying scapy/contrib/pnio_dcp.py -> build/lib/scapy/contrib copying scapy/contrib/pnio_rpc.py -> build/lib/scapy/contrib copying scapy/contrib/portmap.py -> build/lib/scapy/contrib copying scapy/contrib/postgres.py -> build/lib/scapy/contrib copying scapy/contrib/ppi_cace.py -> build/lib/scapy/contrib copying scapy/contrib/ppi_geotag.py -> build/lib/scapy/contrib copying scapy/contrib/ripng.py -> build/lib/scapy/contrib copying scapy/contrib/roce.py -> build/lib/scapy/contrib copying scapy/contrib/rpl.py -> build/lib/scapy/contrib copying scapy/contrib/rpl_metrics.py -> build/lib/scapy/contrib copying scapy/contrib/rsvp.py -> build/lib/scapy/contrib copying scapy/contrib/rtcp.py -> build/lib/scapy/contrib copying scapy/contrib/rtr.py -> build/lib/scapy/contrib copying scapy/contrib/rtsp.py -> build/lib/scapy/contrib copying scapy/contrib/sdnv.py -> build/lib/scapy/contrib copying scapy/contrib/sebek.py -> build/lib/scapy/contrib copying scapy/contrib/send.py -> build/lib/scapy/contrib copying scapy/contrib/skinny.py -> build/lib/scapy/contrib copying scapy/contrib/slowprot.py -> build/lib/scapy/contrib copying scapy/contrib/socks.py -> build/lib/scapy/contrib copying scapy/contrib/stamp.py -> build/lib/scapy/contrib copying scapy/contrib/stun.py -> build/lib/scapy/contrib copying scapy/contrib/tacacs.py -> build/lib/scapy/contrib copying scapy/contrib/tcpao.py -> build/lib/scapy/contrib copying scapy/contrib/tcpros.py -> build/lib/scapy/contrib copying scapy/contrib/tzsp.py -> build/lib/scapy/contrib copying scapy/contrib/vqp.py -> build/lib/scapy/contrib copying scapy/contrib/vtp.py -> build/lib/scapy/contrib copying scapy/contrib/wireguard.py -> build/lib/scapy/contrib creating build/lib/scapy/layers copying scapy/layers/__init__.py -> build/lib/scapy/layers copying scapy/layers/all.py -> build/lib/scapy/layers copying scapy/layers/bluetooth.py -> build/lib/scapy/layers copying scapy/layers/bluetooth4LE.py -> build/lib/scapy/layers copying scapy/layers/can.py -> build/lib/scapy/layers copying scapy/layers/clns.py -> build/lib/scapy/layers copying scapy/layers/dcerpc.py -> build/lib/scapy/layers copying scapy/layers/dhcp.py -> build/lib/scapy/layers copying scapy/layers/dhcp6.py -> build/lib/scapy/layers copying scapy/layers/dns.py -> build/lib/scapy/layers copying scapy/layers/dot11.py -> build/lib/scapy/layers copying scapy/layers/dot15d4.py -> build/lib/scapy/layers copying scapy/layers/eap.py -> build/lib/scapy/layers copying scapy/layers/gprs.py -> build/lib/scapy/layers copying scapy/layers/gssapi.py -> build/lib/scapy/layers copying scapy/layers/hsrp.py -> build/lib/scapy/layers copying scapy/layers/http.py -> build/lib/scapy/layers copying scapy/layers/inet.py -> build/lib/scapy/layers copying scapy/layers/inet6.py -> build/lib/scapy/layers copying scapy/layers/ipsec.py -> build/lib/scapy/layers copying scapy/layers/ir.py -> build/lib/scapy/layers copying scapy/layers/isakmp.py -> build/lib/scapy/layers copying scapy/layers/kerberos.py -> build/lib/scapy/layers copying scapy/layers/l2.py -> build/lib/scapy/layers copying scapy/layers/l2tp.py -> build/lib/scapy/layers copying scapy/layers/ldap.py -> build/lib/scapy/layers copying scapy/layers/llmnr.py -> build/lib/scapy/layers copying scapy/layers/lltd.py -> build/lib/scapy/layers copying scapy/layers/mgcp.py -> build/lib/scapy/layers copying scapy/layers/mobileip.py -> build/lib/scapy/layers copying scapy/layers/netbios.py -> build/lib/scapy/layers copying scapy/layers/netflow.py -> build/lib/scapy/layers copying scapy/layers/ntlm.py -> build/lib/scapy/layers copying scapy/layers/ntp.py -> build/lib/scapy/layers copying scapy/layers/pflog.py -> build/lib/scapy/layers copying scapy/layers/ppi.py -> build/lib/scapy/layers copying scapy/layers/ppp.py -> build/lib/scapy/layers copying scapy/layers/pptp.py -> build/lib/scapy/layers copying scapy/layers/radius.py -> build/lib/scapy/layers copying scapy/layers/rip.py -> build/lib/scapy/layers copying scapy/layers/rtp.py -> build/lib/scapy/layers copying scapy/layers/sctp.py -> build/lib/scapy/layers copying scapy/layers/sixlowpan.py -> build/lib/scapy/layers copying scapy/layers/skinny.py -> build/lib/scapy/layers copying scapy/layers/smb.py -> build/lib/scapy/layers copying scapy/layers/smb2.py -> build/lib/scapy/layers copying scapy/layers/smbclient.py -> build/lib/scapy/layers copying scapy/layers/smbserver.py -> build/lib/scapy/layers copying scapy/layers/snmp.py -> build/lib/scapy/layers copying scapy/layers/spnego.py -> build/lib/scapy/layers copying scapy/layers/ssh.py -> build/lib/scapy/layers copying scapy/layers/tftp.py -> build/lib/scapy/layers copying scapy/layers/tuntap.py -> build/lib/scapy/layers copying scapy/layers/usb.py -> build/lib/scapy/layers copying scapy/layers/vrrp.py -> build/lib/scapy/layers copying scapy/layers/vxlan.py -> build/lib/scapy/layers copying scapy/layers/x509.py -> build/lib/scapy/layers copying scapy/layers/zigbee.py -> build/lib/scapy/layers creating build/lib/scapy/libs copying scapy/libs/__init__.py -> build/lib/scapy/libs copying scapy/libs/ethertypes.py -> build/lib/scapy/libs copying scapy/libs/extcap.py -> build/lib/scapy/libs copying scapy/libs/manuf.py -> build/lib/scapy/libs copying scapy/libs/matplot.py -> build/lib/scapy/libs copying scapy/libs/rfc3961.py -> build/lib/scapy/libs copying scapy/libs/structures.py -> build/lib/scapy/libs copying scapy/libs/test_pyx.py -> build/lib/scapy/libs copying scapy/libs/winpcapy.py -> build/lib/scapy/libs creating build/lib/scapy/modules copying scapy/modules/__init__.py -> build/lib/scapy/modules copying scapy/modules/nmap.py -> build/lib/scapy/modules copying scapy/modules/p0f.py -> build/lib/scapy/modules copying scapy/modules/p0fv2.py -> build/lib/scapy/modules copying scapy/modules/ticketer.py -> build/lib/scapy/modules copying scapy/modules/voip.py -> build/lib/scapy/modules creating build/lib/scapy/tools copying scapy/tools/UTscapy.py -> build/lib/scapy/tools copying scapy/tools/__init__.py -> build/lib/scapy/tools copying scapy/tools/check_asdis.py -> build/lib/scapy/tools copying scapy/tools/generate_ethertypes.py -> build/lib/scapy/tools copying scapy/tools/generate_manuf.py -> build/lib/scapy/tools copying scapy/tools/scapy_pyannotate.py -> build/lib/scapy/tools creating build/lib/scapy/arch/bpf copying scapy/arch/bpf/__init__.py -> build/lib/scapy/arch/bpf copying scapy/arch/bpf/consts.py -> build/lib/scapy/arch/bpf copying scapy/arch/bpf/core.py -> build/lib/scapy/arch/bpf copying scapy/arch/bpf/pfroute.py -> build/lib/scapy/arch/bpf copying scapy/arch/bpf/supersocket.py -> build/lib/scapy/arch/bpf creating build/lib/scapy/arch/linux copying scapy/arch/linux/__init__.py -> build/lib/scapy/arch/linux copying scapy/arch/linux/rtnetlink.py -> build/lib/scapy/arch/linux creating build/lib/scapy/arch/windows copying scapy/arch/windows/__init__.py -> build/lib/scapy/arch/windows copying scapy/arch/windows/native.py -> build/lib/scapy/arch/windows copying scapy/arch/windows/structures.py -> build/lib/scapy/arch/windows creating build/lib/scapy/contrib/automotive copying scapy/contrib/automotive/__init__.py -> build/lib/scapy/contrib/automotive copying scapy/contrib/automotive/ccp.py -> build/lib/scapy/contrib/automotive copying scapy/contrib/automotive/ecu.py -> build/lib/scapy/contrib/automotive copying scapy/contrib/automotive/kwp.py -> build/lib/scapy/contrib/automotive copying scapy/contrib/automotive/someip.py -> build/lib/scapy/contrib/automotive copying scapy/contrib/automotive/uds.py -> build/lib/scapy/contrib/automotive copying scapy/contrib/automotive/uds_ecu_states.py -> build/lib/scapy/contrib/automotive copying scapy/contrib/automotive/uds_logging.py -> build/lib/scapy/contrib/automotive copying scapy/contrib/automotive/uds_scan.py -> build/lib/scapy/contrib/automotive copying scapy/contrib/automotive/doip.py -> build/lib/scapy/contrib/automotive creating build/lib/scapy/contrib/isotp copying scapy/contrib/isotp/__init__.py -> build/lib/scapy/contrib/isotp copying scapy/contrib/isotp/isotp_native_socket.py -> build/lib/scapy/contrib/isotp copying scapy/contrib/isotp/isotp_packet.py -> build/lib/scapy/contrib/isotp copying scapy/contrib/isotp/isotp_scanner.py -> build/lib/scapy/contrib/isotp copying scapy/contrib/isotp/isotp_soft_socket.py -> build/lib/scapy/contrib/isotp copying scapy/contrib/isotp/isotp_utils.py -> build/lib/scapy/contrib/isotp creating build/lib/scapy/contrib/rtps copying scapy/contrib/rtps/__init__.py -> build/lib/scapy/contrib/rtps copying scapy/contrib/rtps/common_types.py -> build/lib/scapy/contrib/rtps copying scapy/contrib/rtps/pid_types.py -> build/lib/scapy/contrib/rtps copying scapy/contrib/rtps/rtps.py -> build/lib/scapy/contrib/rtps creating build/lib/scapy/contrib/scada copying scapy/contrib/scada/__init__.py -> build/lib/scapy/contrib/scada copying scapy/contrib/scada/pcom.py -> build/lib/scapy/contrib/scada creating build/lib/scapy/contrib/automotive/autosar copying scapy/contrib/automotive/autosar/__init__.py -> build/lib/scapy/contrib/automotive/autosar copying scapy/contrib/automotive/autosar/secoc.py -> build/lib/scapy/contrib/automotive/autosar copying scapy/contrib/automotive/autosar/secoc_canfd.py -> build/lib/scapy/contrib/automotive/autosar copying scapy/contrib/automotive/autosar/secoc_pdu.py -> build/lib/scapy/contrib/automotive/autosar copying scapy/contrib/automotive/autosar/pdu.py -> build/lib/scapy/contrib/automotive/autosar creating build/lib/scapy/contrib/automotive/bmw copying scapy/contrib/automotive/bmw/__init__.py -> build/lib/scapy/contrib/automotive/bmw copying scapy/contrib/automotive/bmw/definitions.py -> build/lib/scapy/contrib/automotive/bmw copying scapy/contrib/automotive/bmw/enumerator.py -> build/lib/scapy/contrib/automotive/bmw copying scapy/contrib/automotive/bmw/hsfz.py -> build/lib/scapy/contrib/automotive/bmw creating build/lib/scapy/contrib/automotive/gm copying scapy/contrib/automotive/gm/__init__.py -> build/lib/scapy/contrib/automotive/gm copying scapy/contrib/automotive/gm/gmlan.py -> build/lib/scapy/contrib/automotive/gm copying scapy/contrib/automotive/gm/gmlan_ecu_states.py -> build/lib/scapy/contrib/automotive/gm copying scapy/contrib/automotive/gm/gmlan_logging.py -> build/lib/scapy/contrib/automotive/gm copying scapy/contrib/automotive/gm/gmlan_scanner.py -> build/lib/scapy/contrib/automotive/gm copying scapy/contrib/automotive/gm/gmlanutils.py -> build/lib/scapy/contrib/automotive/gm creating build/lib/scapy/contrib/automotive/obd copying scapy/contrib/automotive/obd/__init__.py -> build/lib/scapy/contrib/automotive/obd copying scapy/contrib/automotive/obd/obd.py -> build/lib/scapy/contrib/automotive/obd copying scapy/contrib/automotive/obd/packet.py -> build/lib/scapy/contrib/automotive/obd copying scapy/contrib/automotive/obd/scanner.py -> build/lib/scapy/contrib/automotive/obd copying scapy/contrib/automotive/obd/services.py -> build/lib/scapy/contrib/automotive/obd creating build/lib/scapy/contrib/automotive/scanner copying scapy/contrib/automotive/scanner/__init__.py -> build/lib/scapy/contrib/automotive/scanner copying scapy/contrib/automotive/scanner/configuration.py -> build/lib/scapy/contrib/automotive/scanner copying scapy/contrib/automotive/scanner/enumerator.py -> build/lib/scapy/contrib/automotive/scanner copying scapy/contrib/automotive/scanner/executor.py -> build/lib/scapy/contrib/automotive/scanner copying scapy/contrib/automotive/scanner/graph.py -> build/lib/scapy/contrib/automotive/scanner copying scapy/contrib/automotive/scanner/staged_test_case.py -> build/lib/scapy/contrib/automotive/scanner copying scapy/contrib/automotive/scanner/test_case.py -> build/lib/scapy/contrib/automotive/scanner creating build/lib/scapy/contrib/automotive/volkswagen copying scapy/contrib/automotive/volkswagen/__init__.py -> build/lib/scapy/contrib/automotive/volkswagen copying scapy/contrib/automotive/volkswagen/definitions.py -> build/lib/scapy/contrib/automotive/volkswagen creating build/lib/scapy/contrib/automotive/xcp copying scapy/contrib/automotive/xcp/__init__.py -> build/lib/scapy/contrib/automotive/xcp copying scapy/contrib/automotive/xcp/cto_commands_master.py -> build/lib/scapy/contrib/automotive/xcp copying scapy/contrib/automotive/xcp/cto_commands_slave.py -> build/lib/scapy/contrib/automotive/xcp copying scapy/contrib/automotive/xcp/scanner.py -> build/lib/scapy/contrib/automotive/xcp copying scapy/contrib/automotive/xcp/utils.py -> build/lib/scapy/contrib/automotive/xcp copying scapy/contrib/automotive/xcp/xcp.py -> build/lib/scapy/contrib/automotive/xcp creating build/lib/scapy/contrib/automotive/obd/iid copying scapy/contrib/automotive/obd/iid/__init__.py -> build/lib/scapy/contrib/automotive/obd/iid copying scapy/contrib/automotive/obd/iid/iids.py -> build/lib/scapy/contrib/automotive/obd/iid creating build/lib/scapy/contrib/automotive/obd/mid copying scapy/contrib/automotive/obd/mid/__init__.py -> build/lib/scapy/contrib/automotive/obd/mid copying scapy/contrib/automotive/obd/mid/mids.py -> build/lib/scapy/contrib/automotive/obd/mid creating build/lib/scapy/contrib/automotive/obd/pid copying scapy/contrib/automotive/obd/pid/__init__.py -> build/lib/scapy/contrib/automotive/obd/pid copying scapy/contrib/automotive/obd/pid/pids.py -> build/lib/scapy/contrib/automotive/obd/pid copying scapy/contrib/automotive/obd/pid/pids_00_1F.py -> build/lib/scapy/contrib/automotive/obd/pid copying scapy/contrib/automotive/obd/pid/pids_20_3F.py -> build/lib/scapy/contrib/automotive/obd/pid copying scapy/contrib/automotive/obd/pid/pids_40_5F.py -> build/lib/scapy/contrib/automotive/obd/pid copying scapy/contrib/automotive/obd/pid/pids_60_7F.py -> build/lib/scapy/contrib/automotive/obd/pid copying scapy/contrib/automotive/obd/pid/pids_80_9F.py -> build/lib/scapy/contrib/automotive/obd/pid copying scapy/contrib/automotive/obd/pid/pids_A0_C0.py -> build/lib/scapy/contrib/automotive/obd/pid creating build/lib/scapy/contrib/automotive/obd/tid copying scapy/contrib/automotive/obd/tid/__init__.py -> build/lib/scapy/contrib/automotive/obd/tid copying scapy/contrib/automotive/obd/tid/tids.py -> build/lib/scapy/contrib/automotive/obd/tid creating build/lib/scapy/contrib/scada/iec104 copying scapy/contrib/scada/iec104/__init__.py -> build/lib/scapy/contrib/scada/iec104 copying scapy/contrib/scada/iec104/iec104_fields.py -> build/lib/scapy/contrib/scada/iec104 copying scapy/contrib/scada/iec104/iec104_information_elements.py -> build/lib/scapy/contrib/scada/iec104 copying scapy/contrib/scada/iec104/iec104_information_objects.py -> build/lib/scapy/contrib/scada/iec104 creating build/lib/scapy/layers/msrpce copying scapy/layers/msrpce/__init__.py -> build/lib/scapy/layers/msrpce copying scapy/layers/msrpce/all.py -> build/lib/scapy/layers/msrpce copying scapy/layers/msrpce/ept.py -> build/lib/scapy/layers/msrpce copying scapy/layers/msrpce/msdcom.py -> build/lib/scapy/layers/msrpce copying scapy/layers/msrpce/msdrsr.py -> build/lib/scapy/layers/msrpce copying scapy/layers/msrpce/msnrpc.py -> build/lib/scapy/layers/msrpce copying scapy/layers/msrpce/mspac.py -> build/lib/scapy/layers/msrpce copying scapy/layers/msrpce/rpcclient.py -> build/lib/scapy/layers/msrpce copying scapy/layers/msrpce/rpcserver.py -> build/lib/scapy/layers/msrpce creating build/lib/scapy/layers/tls copying scapy/layers/tls/__init__.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/all.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/automaton.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/automaton_cli.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/automaton_srv.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/basefields.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/cert.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/extensions.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/handshake.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/handshake_sslv2.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/keyexchange.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/keyexchange_tls13.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/record.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/record_sslv2.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/record_tls13.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/session.py -> build/lib/scapy/layers/tls copying scapy/layers/tls/tools.py -> build/lib/scapy/layers/tls creating build/lib/scapy/layers/msrpce/raw copying scapy/layers/msrpce/raw/__init__.py -> build/lib/scapy/layers/msrpce/raw copying scapy/layers/msrpce/raw/ept.py -> build/lib/scapy/layers/msrpce/raw copying scapy/layers/msrpce/raw/ms_dcom.py -> build/lib/scapy/layers/msrpce/raw copying scapy/layers/msrpce/raw/ms_drsr.py -> build/lib/scapy/layers/msrpce/raw copying scapy/layers/msrpce/raw/ms_nrpc.py -> build/lib/scapy/layers/msrpce/raw copying scapy/layers/msrpce/raw/ms_samr.py -> build/lib/scapy/layers/msrpce/raw copying scapy/layers/msrpce/raw/ms_srvs.py -> build/lib/scapy/layers/msrpce/raw copying scapy/layers/msrpce/raw/ms_wkst.py -> build/lib/scapy/layers/msrpce/raw creating build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/__init__.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/all.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/cipher_aead.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/cipher_block.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/cipher_stream.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/ciphers.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/common.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/compression.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/groups.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/h_mac.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/hash.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/hkdf.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/kx_algs.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/md4.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/pkcs1.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/prf.py -> build/lib/scapy/layers/tls/crypto copying scapy/layers/tls/crypto/suites.py -> build/lib/scapy/layers/tls/crypto creating build/lib/scapy/modules/krack copying scapy/modules/krack/__init__.py -> build/lib/scapy/modules/krack copying scapy/modules/krack/automaton.py -> build/lib/scapy/modules/krack copying scapy/modules/krack/crypto.py -> build/lib/scapy/modules/krack creating build/lib/scapy/tools/automotive copying scapy/tools/automotive/__init__.py -> build/lib/scapy/tools/automotive copying scapy/tools/automotive/isotpscanner.py -> build/lib/scapy/tools/automotive copying scapy/tools/automotive/obdscanner.py -> build/lib/scapy/tools/automotive copying scapy/tools/automotive/xcpscanner.py -> build/lib/scapy/tools/automotive running egg_info creating scapy.egg-info writing scapy.egg-info/PKG-INFO writing dependency_links to scapy.egg-info/dependency_links.txt writing entry points to scapy.egg-info/entry_points.txt writing requirements to scapy.egg-info/requires.txt writing top-level names to scapy.egg-info/top_level.txt writing manifest file 'scapy.egg-info/SOURCES.txt' reading manifest file 'scapy.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' adding license file 'LICENSE' writing manifest file 'scapy.egg-info/SOURCES.txt' copying scapy/py.typed -> build/lib/scapy + make -C doc/scapy html BUILDDIR=_build_doc SPHINXBUILD=sphinx-build-3.13 make: Entering directory '/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/doc/scapy' Running Sphinx v7.3.7 making output directory... done apitree: install_deps doc/scapy> python -I -m pip install sphinx apitree: commands[0]> sphinx-apidoc -f --no-toc -d 1 --separate --module-first --templatedir=_templates --output-dir api ../../scapy ../../scapy/modules/ ../../scapy/libs/ ../../scapy/tools/ ../../scapy/arch/ '../../scapy/contrib/scada/*' ../../scapy/layers/msrpce/raw/ ../../scapy/layers/msrpce/all.py ../../scapy/all.py ../../scapy/layers/all.py ../../scapy/compat.py apitree: OK (11.66=setup[10.71]+cmd[0.95] seconds) congratulations :) (12.35 seconds) building [mo]: targets for 0 po files that are out of date writing output... building [html]: targets for 26 source files that are out of date updating environment: [new config] 326 added, 0 changed, 0 removed reading sources... [ 0%] advanced_usage reading sources... [ 1%] api/scapy reading sources... [ 1%] api/scapy.ansmachine reading sources... [ 1%] api/scapy.as_resolvers reading sources... [ 2%] api/scapy.asn1 reading sources... [ 2%] api/scapy.asn1.asn1 reading sources... [ 2%] api/scapy.asn1.ber reading sources... [ 2%] api/scapy.asn1.mib reading sources... [ 3%] api/scapy.asn1fields reading sources... [ 3%] api/scapy.asn1packet reading sources... [ 3%] api/scapy.automaton reading sources... [ 4%] api/scapy.autorun reading sources... [ 4%] api/scapy.base_classes reading sources... [ 4%] api/scapy.config reading sources... [ 5%] api/scapy.consts reading sources... [ 5%] api/scapy.contrib reading sources... [ 5%] api/scapy.contrib.altbeacon reading sources... [ 6%] api/scapy.contrib.aoe reading sources... [ 6%] api/scapy.contrib.automotive reading sources... [ 6%] api/scapy.contrib.automotive.autosar reading sources... [ 6%] api/scapy.contrib.automotive.autosar.pdu reading sources... [ 7%] api/scapy.contrib.automotive.autosar.secoc reading sources... [ 7%] api/scapy.contrib.automotive.autosar.secoc_canfd reading sources... [ 7%] api/scapy.contrib.automotive.autosar.secoc_pdu reading sources... [ 8%] api/scapy.contrib.automotive.bmw reading sources... [ 8%] api/scapy.contrib.automotive.bmw.definitions reading sources... [ 8%] api/scapy.contrib.automotive.bmw.enumerator reading sources... [ 9%] api/scapy.contrib.automotive.bmw.hsfz reading sources... [ 9%] api/scapy.contrib.automotive.ccp reading sources... [ 9%] api/scapy.contrib.automotive.doip reading sources... [ 10%] api/scapy.contrib.automotive.ecu reading sources... [ 10%] api/scapy.contrib.automotive.gm reading sources... [ 10%] api/scapy.contrib.automotive.gm.gmlan INFO: Specify "conf.contribs['GMLAN'] = {'treat-response-pending-as-answer': True}" to treat a negative response 'RequestCorrectlyReceived-ResponsePending' as answer of a request. The default value is False. reading sources... [ 10%] api/scapy.contrib.automotive.gm.gmlan_ecu_states reading sources... [ 11%] api/scapy.contrib.automotive.gm.gmlan_logging reading sources... [ 11%] api/scapy.contrib.automotive.gm.gmlan_scanner INFO: "conf.contribs['GMLAN']['treat-response-pending-as-answer']" set to True). This is required by the GMLAN-Utils module to operate correctly. reading sources... [ 11%] api/scapy.contrib.automotive.gm.gmlanutils reading sources... [ 12%] api/scapy.contrib.automotive.kwp reading sources... [ 12%] api/scapy.contrib.automotive.obd reading sources... [ 12%] api/scapy.contrib.automotive.obd.iid reading sources... [ 13%] api/scapy.contrib.automotive.obd.iid.iids reading sources... [ 13%] api/scapy.contrib.automotive.obd.mid reading sources... [ 13%] api/scapy.contrib.automotive.obd.mid.mids reading sources... [ 13%] api/scapy.contrib.automotive.obd.obd INFO: Specify "conf.contribs['OBD'] = {'treat-response-pending-as-answer': True}" to treat a negative response 'requestCorrectlyReceived-ResponsePending' as answer of a request. The default value is False. reading sources... [ 14%] api/scapy.contrib.automotive.obd.packet reading sources... [ 14%] api/scapy.contrib.automotive.obd.pid reading sources... [ 14%] api/scapy.contrib.automotive.obd.pid.pids reading sources... [ 15%] api/scapy.contrib.automotive.obd.pid.pids_00_1F reading sources... [ 15%] api/scapy.contrib.automotive.obd.pid.pids_20_3F reading sources... [ 15%] api/scapy.contrib.automotive.obd.pid.pids_40_5F reading sources... [ 16%] api/scapy.contrib.automotive.obd.pid.pids_60_7F reading sources... [ 16%] api/scapy.contrib.automotive.obd.pid.pids_80_9F reading sources... [ 16%] api/scapy.contrib.automotive.obd.pid.pids_A0_C0 reading sources... [ 17%] api/scapy.contrib.automotive.obd.scanner reading sources... [ 17%] api/scapy.contrib.automotive.obd.services reading sources... [ 17%] api/scapy.contrib.automotive.obd.tid reading sources... [ 17%] api/scapy.contrib.automotive.obd.tid.tids reading sources... [ 18%] api/scapy.contrib.automotive.scanner reading sources... [ 18%] api/scapy.contrib.automotive.scanner.configuration reading sources... [ 18%] api/scapy.contrib.automotive.scanner.enumerator reading sources... [ 19%] api/scapy.contrib.automotive.scanner.executor reading sources... [ 19%] api/scapy.contrib.automotive.scanner.graph reading sources... [ 19%] api/scapy.contrib.automotive.scanner.staged_test_case reading sources... [ 20%] api/scapy.contrib.automotive.scanner.test_case reading sources... [ 20%] api/scapy.contrib.automotive.someip reading sources... [ 20%] api/scapy.contrib.automotive.uds reading sources... [ 21%] api/scapy.contrib.automotive.uds_ecu_states reading sources... [ 21%] api/scapy.contrib.automotive.uds_logging reading sources... [ 21%] api/scapy.contrib.automotive.uds_scan reading sources... [ 21%] api/scapy.contrib.automotive.volkswagen reading sources... [ 22%] api/scapy.contrib.automotive.volkswagen.definitions reading sources... [ 22%] api/scapy.contrib.automotive.xcp reading sources... [ 22%] api/scapy.contrib.automotive.xcp.cto_commands_master reading sources... [ 23%] api/scapy.contrib.automotive.xcp.cto_commands_slave reading sources... [ 23%] api/scapy.contrib.automotive.xcp.scanner reading sources... [ 23%] api/scapy.contrib.automotive.xcp.utils reading sources... [ 24%] api/scapy.contrib.automotive.xcp.xcp reading sources... [ 24%] api/scapy.contrib.avs reading sources... [ 24%] api/scapy.contrib.bfd reading sources... [ 25%] api/scapy.contrib.bgp WARNING: [bgp.py] use_2_bytes_asn: True reading sources... [ 25%] api/scapy.contrib.bier reading sources... [ 25%] api/scapy.contrib.bp reading sources... [ 25%] api/scapy.contrib.cansocket reading sources... [ 26%] api/scapy.contrib.cansocket_native reading sources... [ 26%] api/scapy.contrib.cansocket_python_can reading sources... [ 26%] api/scapy.contrib.carp WARNING: CARP overwrites VRRP ! reading sources... [ 27%] api/scapy.contrib.cdp reading sources... [ 27%] api/scapy.contrib.chdlc reading sources... [ 27%] api/scapy.contrib.coap reading sources... [ 28%] api/scapy.contrib.concox reading sources... [ 28%] api/scapy.contrib.diameter reading sources... [ 28%] api/scapy.contrib.dtp reading sources... [ 29%] api/scapy.contrib.eddystone reading sources... [ 29%] api/scapy.contrib.eigrp reading sources... [ 29%] api/scapy.contrib.enipTCP reading sources... [ 29%] api/scapy.contrib.erspan reading sources... [ 30%] api/scapy.contrib.esmc reading sources... [ 30%] api/scapy.contrib.ethercat reading sources... [ 30%] api/scapy.contrib.etherip reading sources... [ 31%] api/scapy.contrib.exposure_notification reading sources... [ 31%] api/scapy.contrib.geneve reading sources... [ 31%] api/scapy.contrib.gtp reading sources... [ 32%] api/scapy.contrib.gtp_v2 reading sources... [ 32%] api/scapy.contrib.gxrp reading sources... [ 32%] api/scapy.contrib.hicp reading sources... [ 33%] api/scapy.contrib.homeplugav reading sources... [ 33%] api/scapy.contrib.homepluggp reading sources... [ 33%] api/scapy.contrib.homeplugsg reading sources... [ 33%] api/scapy.contrib.http2 reading sources... [ 34%] api/scapy.contrib.ibeacon reading sources... [ 34%] api/scapy.contrib.icmp_extensions reading sources... [ 34%] api/scapy.contrib.ife reading sources... [ 35%] api/scapy.contrib.igmp reading sources... [ 35%] api/scapy.contrib.igmpv3 reading sources... [ 35%] api/scapy.contrib.ikev2 reading sources... [ 36%] api/scapy.contrib.isis reading sources... [ 36%] api/scapy.contrib.isotp reading sources... [ 36%] api/scapy.contrib.isotp.isotp_native_socket reading sources... [ 37%] api/scapy.contrib.isotp.isotp_packet reading sources... [ 37%] api/scapy.contrib.isotp.isotp_scanner reading sources... [ 37%] api/scapy.contrib.isotp.isotp_soft_socket reading sources... [ 37%] api/scapy.contrib.isotp.isotp_utils reading sources... [ 38%] api/scapy.contrib.knx reading sources... [ 38%] api/scapy.contrib.lacp reading sources... [ 38%] api/scapy.contrib.ldp reading sources... [ 39%] api/scapy.contrib.lldp reading sources... [ 39%] api/scapy.contrib.loraphy2wan reading sources... [ 39%] api/scapy.contrib.ltp reading sources... [ 40%] api/scapy.contrib.mac_control reading sources... [ 40%] api/scapy.contrib.macsec reading sources... [ 40%] api/scapy.contrib.metawatch reading sources... [ 40%] api/scapy.contrib.modbus reading sources... [ 41%] api/scapy.contrib.mount reading sources... [ 41%] api/scapy.contrib.mpls reading sources... [ 41%] api/scapy.contrib.mqtt reading sources... [ 42%] api/scapy.contrib.mqttsn reading sources... [ 42%] api/scapy.contrib.nfs reading sources... [ 42%] api/scapy.contrib.nlm reading sources... [ 43%] api/scapy.contrib.nrf_sniffer reading sources... [ 43%] api/scapy.contrib.nsh reading sources... [ 43%] api/scapy.contrib.oam reading sources... [ 44%] api/scapy.contrib.oncrpc reading sources... [ 44%] api/scapy.contrib.opc_da reading sources... [ 44%] api/scapy.contrib.openflow reading sources... [ 44%] api/scapy.contrib.openflow3 reading sources... [ 45%] api/scapy.contrib.ospf reading sources... [ 45%] api/scapy.contrib.pfcp reading sources... [ 45%] api/scapy.contrib.pim reading sources... [ 46%] api/scapy.contrib.pnio reading sources... [ 46%] api/scapy.contrib.pnio_dcp reading sources... [ 46%] api/scapy.contrib.pnio_rpc reading sources... [ 47%] api/scapy.contrib.portmap reading sources... [ 47%] api/scapy.contrib.postgres reading sources... [ 47%] api/scapy.contrib.ppi_cace reading sources... [ 48%] api/scapy.contrib.ppi_geotag reading sources... [ 48%] api/scapy.contrib.ripng reading sources... [ 48%] api/scapy.contrib.roce reading sources... [ 48%] api/scapy.contrib.rpl reading sources... [ 49%] api/scapy.contrib.rpl_metrics reading sources... [ 49%] api/scapy.contrib.rsvp reading sources... [ 49%] api/scapy.contrib.rtcp reading sources... [ 50%] api/scapy.contrib.rtps reading sources... [ 50%] api/scapy.contrib.rtps.common_types reading sources... [ 50%] api/scapy.contrib.rtps.pid_types reading sources... [ 51%] api/scapy.contrib.rtps.rtps reading sources... [ 51%] api/scapy.contrib.rtr reading sources... [ 51%] api/scapy.contrib.rtsp reading sources... [ 52%] api/scapy.contrib.sdnv reading sources... [ 52%] api/scapy.contrib.sebek reading sources... [ 52%] api/scapy.contrib.send reading sources... [ 52%] api/scapy.contrib.skinny reading sources... [ 53%] api/scapy.contrib.slowprot reading sources... [ 53%] api/scapy.contrib.socks reading sources... [ 53%] api/scapy.contrib.stamp reading sources... [ 54%] api/scapy.contrib.stun reading sources... [ 54%] api/scapy.contrib.tacacs reading sources... [ 54%] api/scapy.contrib.tcpao reading sources... [ 55%] api/scapy.contrib.tcpros reading sources... [ 55%] api/scapy.contrib.tzsp reading sources... [ 55%] api/scapy.contrib.vqp reading sources... [ 56%] api/scapy.contrib.vtp reading sources... [ 56%] api/scapy.contrib.wireguard reading sources... [ 56%] api/scapy.dadict reading sources... [ 56%] api/scapy.data reading sources... [ 57%] api/scapy.error reading sources... [ 57%] api/scapy.fields reading sources... [ 57%] api/scapy.interfaces reading sources... [ 58%] api/scapy.layers reading sources... [ 58%] api/scapy.layers.bluetooth reading sources... [ 58%] api/scapy.layers.bluetooth4LE reading sources... [ 59%] api/scapy.layers.can reading sources... [ 59%] api/scapy.layers.clns reading sources... [ 59%] api/scapy.layers.dcerpc reading sources... [ 60%] api/scapy.layers.dhcp reading sources... [ 60%] api/scapy.layers.dhcp6 reading sources... [ 60%] api/scapy.layers.dns reading sources... [ 60%] api/scapy.layers.dot11 reading sources... [ 61%] api/scapy.layers.dot15d4 reading sources... [ 61%] api/scapy.layers.eap reading sources... [ 61%] api/scapy.layers.gprs reading sources... [ 62%] api/scapy.layers.gssapi reading sources... [ 62%] api/scapy.layers.hsrp reading sources... [ 62%] api/scapy.layers.http reading sources... [ 63%] api/scapy.layers.inet reading sources... [ 63%] api/scapy.layers.inet6 reading sources... [ 63%] api/scapy.layers.ipsec reading sources... [ 63%] api/scapy.layers.ir reading sources... [ 64%] api/scapy.layers.isakmp reading sources... [ 64%] api/scapy.layers.kerberos reading sources... [ 64%] api/scapy.layers.l2 reading sources... [ 65%] api/scapy.layers.l2tp reading sources... [ 65%] api/scapy.layers.ldap reading sources... [ 65%] api/scapy.layers.llmnr reading sources... [ 66%] api/scapy.layers.lltd reading sources... [ 66%] api/scapy.layers.mgcp reading sources... [ 66%] api/scapy.layers.mobileip reading sources... [ 67%] api/scapy.layers.msrpce reading sources... [ 67%] api/scapy.layers.msrpce.ept reading sources... [ 67%] api/scapy.layers.msrpce.msdcom reading sources... [ 67%] api/scapy.layers.msrpce.msdrsr reading sources... [ 68%] api/scapy.layers.msrpce.msnrpc reading sources... [ 68%] api/scapy.layers.msrpce.mspac reading sources... [ 68%] api/scapy.layers.msrpce.rpcclient reading sources... [ 69%] api/scapy.layers.msrpce.rpcserver reading sources... [ 69%] api/scapy.layers.netbios reading sources... [ 69%] api/scapy.layers.netflow reading sources... [ 70%] api/scapy.layers.ntlm reading sources... [ 70%] api/scapy.layers.ntp reading sources... [ 70%] api/scapy.layers.pflog reading sources... [ 71%] api/scapy.layers.ppi reading sources... [ 71%] api/scapy.layers.ppp reading sources... [ 71%] api/scapy.layers.pptp reading sources... [ 71%] api/scapy.layers.radius reading sources... [ 72%] api/scapy.layers.rip reading sources... [ 72%] api/scapy.layers.rtp reading sources... [ 72%] api/scapy.layers.sctp reading sources... [ 73%] api/scapy.layers.sixlowpan reading sources... [ 73%] api/scapy.layers.skinny reading sources... [ 73%] api/scapy.layers.smb reading sources... [ 74%] api/scapy.layers.smb2 reading sources... [ 74%] api/scapy.layers.smbclient reading sources... [ 74%] api/scapy.layers.smbserver reading sources... [ 75%] api/scapy.layers.snmp reading sources... [ 75%] api/scapy.layers.spnego reading sources... [ 75%] api/scapy.layers.ssh reading sources... [ 75%] api/scapy.layers.tftp reading sources... [ 76%] api/scapy.layers.tls reading sources... [ 76%] api/scapy.layers.tls.all reading sources... [ 76%] api/scapy.layers.tls.automaton reading sources... [ 77%] api/scapy.layers.tls.automaton_cli reading sources... [ 77%] api/scapy.layers.tls.automaton_srv reading sources... [ 77%] api/scapy.layers.tls.basefields reading sources... [ 78%] api/scapy.layers.tls.cert reading sources... [ 78%] api/scapy.layers.tls.crypto reading sources... [ 78%] api/scapy.layers.tls.crypto.all reading sources... [ 79%] api/scapy.layers.tls.crypto.cipher_aead reading sources... [ 79%] api/scapy.layers.tls.crypto.cipher_block reading sources... [ 79%] api/scapy.layers.tls.crypto.cipher_stream reading sources... [ 79%] api/scapy.layers.tls.crypto.ciphers reading sources... [ 80%] api/scapy.layers.tls.crypto.common reading sources... [ 80%] api/scapy.layers.tls.crypto.compression reading sources... [ 80%] api/scapy.layers.tls.crypto.groups reading sources... [ 81%] api/scapy.layers.tls.crypto.h_mac reading sources... [ 81%] api/scapy.layers.tls.crypto.hash reading sources... [ 81%] api/scapy.layers.tls.crypto.hkdf reading sources... [ 82%] api/scapy.layers.tls.crypto.kx_algs reading sources... [ 82%] api/scapy.layers.tls.crypto.md4 reading sources... [ 82%] api/scapy.layers.tls.crypto.pkcs1 reading sources... [ 83%] api/scapy.layers.tls.crypto.prf reading sources... [ 83%] api/scapy.layers.tls.crypto.suites reading sources... [ 83%] api/scapy.layers.tls.extensions reading sources... [ 83%] api/scapy.layers.tls.handshake reading sources... [ 84%] api/scapy.layers.tls.handshake_sslv2 reading sources... [ 84%] api/scapy.layers.tls.keyexchange reading sources... [ 84%] api/scapy.layers.tls.keyexchange_tls13 reading sources... [ 85%] api/scapy.layers.tls.record reading sources... [ 85%] api/scapy.layers.tls.record_sslv2 reading sources... [ 85%] api/scapy.layers.tls.record_tls13 reading sources... [ 86%] api/scapy.layers.tls.session reading sources... [ 86%] api/scapy.layers.tls.tools reading sources... [ 86%] api/scapy.layers.tuntap reading sources... [ 87%] api/scapy.layers.usb reading sources... [ 87%] api/scapy.layers.vrrp reading sources... [ 87%] api/scapy.layers.vxlan reading sources... [ 87%] api/scapy.layers.x509 reading sources... [ 88%] api/scapy.layers.zigbee reading sources... [ 88%] api/scapy.main reading sources... [ 88%] api/scapy.packet reading sources... [ 89%] api/scapy.pipetool reading sources... [ 89%] api/scapy.plist reading sources... [ 89%] api/scapy.pton_ntop reading sources... [ 90%] api/scapy.route reading sources... [ 90%] api/scapy.route6 reading sources... [ 90%] api/scapy.scapypipes reading sources... [ 90%] api/scapy.sendrecv reading sources... [ 91%] api/scapy.sessions reading sources... [ 91%] api/scapy.supersocket reading sources... [ 91%] api/scapy.themes reading sources... [ 92%] api/scapy.utils reading sources... [ 92%] api/scapy.utils6 reading sources... [ 92%] api/scapy.volatile reading sources... [ 93%] backmatter reading sources... [ 93%] build_dissect reading sources... [ 93%] development reading sources... [ 94%] extending reading sources... [ 94%] functions reading sources... [ 94%] index reading sources... [ 94%] installation reading sources... [ 95%] introduction reading sources... [ 95%] layers/automotive reading sources... [ 95%] layers/bluetooth reading sources... [ 96%] layers/dcerpc reading sources... [ 96%] layers/gssapi reading sources... [ 96%] layers/http reading sources... [ 97%] layers/index reading sources... [ 97%] layers/kerberos reading sources... [ 97%] layers/ldap reading sources... [ 98%] layers/netflow reading sources... [ 98%] layers/pnio reading sources... [ 98%] layers/sctp reading sources... [ 98%] layers/smb reading sources... [ 99%] layers/tcp reading sources... [ 99%] layers/tuntap reading sources... [ 99%] routing reading sources... [100%] troubleshooting reading sources... [100%] usage looking for now-outdated files... none found pickling environment... done checking consistency... done preparing documents... done copying assets... copying static files... done copying extra files... done done writing output... [ 0%] advanced_usage writing output... [ 1%] api/scapy writing output... [ 1%] api/scapy.ansmachine writing output... [ 1%] api/scapy.as_resolvers writing output... [ 2%] api/scapy.asn1 writing output... [ 2%] api/scapy.asn1.asn1 writing output... [ 2%] api/scapy.asn1.ber writing output... [ 2%] api/scapy.asn1.mib writing output... [ 3%] api/scapy.asn1fields writing output... [ 3%] api/scapy.asn1packet writing output... [ 3%] api/scapy.automaton writing output... [ 4%] api/scapy.autorun writing output... [ 4%] api/scapy.base_classes writing output... [ 4%] api/scapy.config writing output... [ 5%] api/scapy.consts writing output... [ 5%] api/scapy.contrib writing output... [ 5%] api/scapy.contrib.altbeacon writing output... [ 6%] api/scapy.contrib.aoe writing output... [ 6%] api/scapy.contrib.automotive writing output... [ 6%] api/scapy.contrib.automotive.autosar writing output... [ 6%] api/scapy.contrib.automotive.autosar.pdu writing output... [ 7%] api/scapy.contrib.automotive.autosar.secoc writing output... [ 7%] api/scapy.contrib.automotive.autosar.secoc_canfd writing output... [ 7%] api/scapy.contrib.automotive.autosar.secoc_pdu writing output... [ 8%] api/scapy.contrib.automotive.bmw writing output... [ 8%] api/scapy.contrib.automotive.bmw.definitions writing output... [ 8%] api/scapy.contrib.automotive.bmw.enumerator writing output... [ 9%] api/scapy.contrib.automotive.bmw.hsfz writing output... [ 9%] api/scapy.contrib.automotive.ccp writing output... [ 9%] api/scapy.contrib.automotive.doip writing output... [ 10%] api/scapy.contrib.automotive.ecu writing output... [ 10%] api/scapy.contrib.automotive.gm writing output... [ 10%] api/scapy.contrib.automotive.gm.gmlan writing output... [ 10%] api/scapy.contrib.automotive.gm.gmlan_ecu_states writing output... [ 11%] api/scapy.contrib.automotive.gm.gmlan_logging writing output... [ 11%] api/scapy.contrib.automotive.gm.gmlan_scanner writing output... [ 11%] api/scapy.contrib.automotive.gm.gmlanutils writing output... [ 12%] api/scapy.contrib.automotive.kwp writing output... [ 12%] api/scapy.contrib.automotive.obd writing output... [ 12%] api/scapy.contrib.automotive.obd.iid writing output... [ 13%] api/scapy.contrib.automotive.obd.iid.iids writing output... [ 13%] api/scapy.contrib.automotive.obd.mid writing output... [ 13%] api/scapy.contrib.automotive.obd.mid.mids writing output... [ 13%] api/scapy.contrib.automotive.obd.obd writing output... [ 14%] api/scapy.contrib.automotive.obd.packet writing output... [ 14%] api/scapy.contrib.automotive.obd.pid writing output... [ 14%] api/scapy.contrib.automotive.obd.pid.pids writing output... [ 15%] api/scapy.contrib.automotive.obd.pid.pids_00_1F writing output... [ 15%] api/scapy.contrib.automotive.obd.pid.pids_20_3F writing output... [ 15%] api/scapy.contrib.automotive.obd.pid.pids_40_5F writing output... [ 16%] api/scapy.contrib.automotive.obd.pid.pids_60_7F writing output... [ 16%] api/scapy.contrib.automotive.obd.pid.pids_80_9F writing output... [ 16%] api/scapy.contrib.automotive.obd.pid.pids_A0_C0 writing output... [ 17%] api/scapy.contrib.automotive.obd.scanner writing output... [ 17%] api/scapy.contrib.automotive.obd.services writing output... [ 17%] api/scapy.contrib.automotive.obd.tid writing output... [ 17%] api/scapy.contrib.automotive.obd.tid.tids writing output... [ 18%] api/scapy.contrib.automotive.scanner writing output... [ 18%] api/scapy.contrib.automotive.scanner.configuration writing output... [ 18%] api/scapy.contrib.automotive.scanner.enumerator writing output... [ 19%] api/scapy.contrib.automotive.scanner.executor writing output... [ 19%] api/scapy.contrib.automotive.scanner.graph writing output... [ 19%] api/scapy.contrib.automotive.scanner.staged_test_case writing output... [ 20%] api/scapy.contrib.automotive.scanner.test_case writing output... [ 20%] api/scapy.contrib.automotive.someip writing output... [ 20%] api/scapy.contrib.automotive.uds writing output... [ 21%] api/scapy.contrib.automotive.uds_ecu_states writing output... [ 21%] api/scapy.contrib.automotive.uds_logging writing output... [ 21%] api/scapy.contrib.automotive.uds_scan writing output... [ 21%] api/scapy.contrib.automotive.volkswagen writing output... [ 22%] api/scapy.contrib.automotive.volkswagen.definitions writing output... [ 22%] api/scapy.contrib.automotive.xcp writing output... [ 22%] api/scapy.contrib.automotive.xcp.cto_commands_master writing output... [ 23%] api/scapy.contrib.automotive.xcp.cto_commands_slave writing output... [ 23%] api/scapy.contrib.automotive.xcp.scanner writing output... [ 23%] api/scapy.contrib.automotive.xcp.utils writing output... [ 24%] api/scapy.contrib.automotive.xcp.xcp writing output... [ 24%] api/scapy.contrib.avs writing output... [ 24%] api/scapy.contrib.bfd writing output... [ 25%] api/scapy.contrib.bgp writing output... [ 25%] api/scapy.contrib.bier writing output... [ 25%] api/scapy.contrib.bp writing output... [ 25%] api/scapy.contrib.cansocket writing output... [ 26%] api/scapy.contrib.cansocket_native writing output... [ 26%] api/scapy.contrib.cansocket_python_can writing output... [ 26%] api/scapy.contrib.carp writing output... [ 27%] api/scapy.contrib.cdp writing output... [ 27%] api/scapy.contrib.chdlc writing output... [ 27%] api/scapy.contrib.coap writing output... [ 28%] api/scapy.contrib.concox writing output... [ 28%] api/scapy.contrib.diameter writing output... [ 28%] api/scapy.contrib.dtp writing output... [ 29%] api/scapy.contrib.eddystone writing output... [ 29%] api/scapy.contrib.eigrp writing output... [ 29%] api/scapy.contrib.enipTCP writing output... [ 29%] api/scapy.contrib.erspan writing output... [ 30%] api/scapy.contrib.esmc writing output... [ 30%] api/scapy.contrib.ethercat writing output... [ 30%] api/scapy.contrib.etherip writing output... [ 31%] api/scapy.contrib.exposure_notification writing output... [ 31%] api/scapy.contrib.geneve writing output... [ 31%] api/scapy.contrib.gtp writing output... [ 32%] api/scapy.contrib.gtp_v2 writing output... [ 32%] api/scapy.contrib.gxrp writing output... [ 32%] api/scapy.contrib.hicp writing output... [ 33%] api/scapy.contrib.homeplugav writing output... [ 33%] api/scapy.contrib.homepluggp writing output... [ 33%] api/scapy.contrib.homeplugsg writing output... [ 33%] api/scapy.contrib.http2 writing output... [ 34%] api/scapy.contrib.ibeacon writing output... [ 34%] api/scapy.contrib.icmp_extensions writing output... [ 34%] api/scapy.contrib.ife writing output... [ 35%] api/scapy.contrib.igmp writing output... [ 35%] api/scapy.contrib.igmpv3 writing output... [ 35%] api/scapy.contrib.ikev2 writing output... [ 36%] api/scapy.contrib.isis writing output... [ 36%] api/scapy.contrib.isotp writing output... [ 36%] api/scapy.contrib.isotp.isotp_native_socket writing output... [ 37%] api/scapy.contrib.isotp.isotp_packet writing output... [ 37%] api/scapy.contrib.isotp.isotp_scanner writing output... [ 37%] api/scapy.contrib.isotp.isotp_soft_socket writing output... [ 37%] api/scapy.contrib.isotp.isotp_utils writing output... [ 38%] api/scapy.contrib.knx writing output... [ 38%] api/scapy.contrib.lacp writing output... [ 38%] api/scapy.contrib.ldp writing output... [ 39%] api/scapy.contrib.lldp writing output... [ 39%] api/scapy.contrib.loraphy2wan writing output... [ 39%] api/scapy.contrib.ltp writing output... [ 40%] api/scapy.contrib.mac_control writing output... [ 40%] api/scapy.contrib.macsec writing output... [ 40%] api/scapy.contrib.metawatch writing output... [ 40%] api/scapy.contrib.modbus writing output... [ 41%] api/scapy.contrib.mount writing output... [ 41%] api/scapy.contrib.mpls writing output... [ 41%] api/scapy.contrib.mqtt writing output... [ 42%] api/scapy.contrib.mqttsn writing output... [ 42%] api/scapy.contrib.nfs writing output... [ 42%] api/scapy.contrib.nlm writing output... [ 43%] api/scapy.contrib.nrf_sniffer writing output... [ 43%] api/scapy.contrib.nsh writing output... [ 43%] api/scapy.contrib.oam writing output... [ 44%] api/scapy.contrib.oncrpc writing output... [ 44%] api/scapy.contrib.opc_da writing output... [ 44%] api/scapy.contrib.openflow writing output... [ 44%] api/scapy.contrib.openflow3 writing output... [ 45%] api/scapy.contrib.ospf writing output... [ 45%] api/scapy.contrib.pfcp writing output... [ 45%] api/scapy.contrib.pim writing output... [ 46%] api/scapy.contrib.pnio writing output... [ 46%] api/scapy.contrib.pnio_dcp writing output... [ 46%] api/scapy.contrib.pnio_rpc writing output... [ 47%] api/scapy.contrib.portmap writing output... [ 47%] api/scapy.contrib.postgres writing output... [ 47%] api/scapy.contrib.ppi_cace writing output... [ 48%] api/scapy.contrib.ppi_geotag writing output... [ 48%] api/scapy.contrib.ripng writing output... [ 48%] api/scapy.contrib.roce writing output... [ 48%] api/scapy.contrib.rpl writing output... [ 49%] api/scapy.contrib.rpl_metrics writing output... [ 49%] api/scapy.contrib.rsvp writing output... [ 49%] api/scapy.contrib.rtcp writing output... [ 50%] api/scapy.contrib.rtps writing output... [ 50%] api/scapy.contrib.rtps.common_types writing output... [ 50%] api/scapy.contrib.rtps.pid_types writing output... [ 51%] api/scapy.contrib.rtps.rtps writing output... [ 51%] api/scapy.contrib.rtr writing output... [ 51%] api/scapy.contrib.rtsp writing output... [ 52%] api/scapy.contrib.sdnv writing output... [ 52%] api/scapy.contrib.sebek writing output... [ 52%] api/scapy.contrib.send writing output... [ 52%] api/scapy.contrib.skinny writing output... [ 53%] api/scapy.contrib.slowprot writing output... [ 53%] api/scapy.contrib.socks writing output... [ 53%] api/scapy.contrib.stamp writing output... [ 54%] api/scapy.contrib.stun writing output... [ 54%] api/scapy.contrib.tacacs writing output... [ 54%] api/scapy.contrib.tcpao writing output... [ 55%] api/scapy.contrib.tcpros writing output... [ 55%] api/scapy.contrib.tzsp writing output... [ 55%] api/scapy.contrib.vqp writing output... [ 56%] api/scapy.contrib.vtp writing output... [ 56%] api/scapy.contrib.wireguard writing output... [ 56%] api/scapy.dadict writing output... [ 56%] api/scapy.data writing output... [ 57%] api/scapy.error writing output... [ 57%] api/scapy.fields writing output... [ 57%] api/scapy.interfaces writing output... [ 58%] api/scapy.layers writing output... [ 58%] api/scapy.layers.bluetooth writing output... [ 58%] api/scapy.layers.bluetooth4LE writing output... [ 59%] api/scapy.layers.can writing output... [ 59%] api/scapy.layers.clns writing output... [ 59%] api/scapy.layers.dcerpc writing output... [ 60%] api/scapy.layers.dhcp writing output... [ 60%] api/scapy.layers.dhcp6 writing output... [ 60%] api/scapy.layers.dns writing output... [ 60%] api/scapy.layers.dot11 writing output... [ 61%] api/scapy.layers.dot15d4 writing output... [ 61%] api/scapy.layers.eap writing output... [ 61%] api/scapy.layers.gprs writing output... [ 62%] api/scapy.layers.gssapi writing output... [ 62%] api/scapy.layers.hsrp writing output... [ 62%] api/scapy.layers.http writing output... [ 63%] api/scapy.layers.inet writing output... [ 63%] api/scapy.layers.inet6 writing output... [ 63%] api/scapy.layers.ipsec writing output... [ 63%] api/scapy.layers.ir writing output... [ 64%] api/scapy.layers.isakmp writing output... [ 64%] api/scapy.layers.kerberos writing output... [ 64%] api/scapy.layers.l2 writing output... [ 65%] api/scapy.layers.l2tp writing output... [ 65%] api/scapy.layers.ldap writing output... [ 65%] api/scapy.layers.llmnr writing output... [ 66%] api/scapy.layers.lltd writing output... [ 66%] api/scapy.layers.mgcp writing output... [ 66%] api/scapy.layers.mobileip writing output... [ 67%] api/scapy.layers.msrpce writing output... [ 67%] api/scapy.layers.msrpce.ept writing output... [ 67%] api/scapy.layers.msrpce.msdcom writing output... [ 67%] api/scapy.layers.msrpce.msdrsr writing output... [ 68%] api/scapy.layers.msrpce.msnrpc writing output... [ 68%] api/scapy.layers.msrpce.mspac writing output... [ 68%] api/scapy.layers.msrpce.rpcclient writing output... [ 69%] api/scapy.layers.msrpce.rpcserver writing output... [ 69%] api/scapy.layers.netbios writing output... [ 69%] api/scapy.layers.netflow writing output... [ 70%] api/scapy.layers.ntlm writing output... [ 70%] api/scapy.layers.ntp writing output... [ 70%] api/scapy.layers.pflog writing output... [ 71%] api/scapy.layers.ppi writing output... [ 71%] api/scapy.layers.ppp writing output... [ 71%] api/scapy.layers.pptp writing output... [ 71%] api/scapy.layers.radius writing output... [ 72%] api/scapy.layers.rip writing output... [ 72%] api/scapy.layers.rtp writing output... [ 72%] api/scapy.layers.sctp writing output... [ 73%] api/scapy.layers.sixlowpan writing output... [ 73%] api/scapy.layers.skinny writing output... [ 73%] api/scapy.layers.smb writing output... [ 74%] api/scapy.layers.smb2 writing output... [ 74%] api/scapy.layers.smbclient writing output... [ 74%] api/scapy.layers.smbserver writing output... [ 75%] api/scapy.layers.snmp writing output... [ 75%] api/scapy.layers.spnego writing output... [ 75%] api/scapy.layers.ssh writing output... [ 75%] api/scapy.layers.tftp writing output... [ 76%] api/scapy.layers.tls writing output... [ 76%] api/scapy.layers.tls.all writing output... [ 76%] api/scapy.layers.tls.automaton writing output... [ 77%] api/scapy.layers.tls.automaton_cli writing output... [ 77%] api/scapy.layers.tls.automaton_srv writing output... [ 77%] api/scapy.layers.tls.basefields writing output... [ 78%] api/scapy.layers.tls.cert writing output... [ 78%] api/scapy.layers.tls.crypto writing output... [ 78%] api/scapy.layers.tls.crypto.all writing output... [ 79%] api/scapy.layers.tls.crypto.cipher_aead writing output... [ 79%] api/scapy.layers.tls.crypto.cipher_block writing output... [ 79%] api/scapy.layers.tls.crypto.cipher_stream writing output... [ 79%] api/scapy.layers.tls.crypto.ciphers writing output... [ 80%] api/scapy.layers.tls.crypto.common writing output... [ 80%] api/scapy.layers.tls.crypto.compression writing output... [ 80%] api/scapy.layers.tls.crypto.groups writing output... [ 81%] api/scapy.layers.tls.crypto.h_mac writing output... [ 81%] api/scapy.layers.tls.crypto.hash writing output... [ 81%] api/scapy.layers.tls.crypto.hkdf writing output... [ 82%] api/scapy.layers.tls.crypto.kx_algs writing output... [ 82%] api/scapy.layers.tls.crypto.md4 writing output... [ 82%] api/scapy.layers.tls.crypto.pkcs1 writing output... [ 83%] api/scapy.layers.tls.crypto.prf writing output... [ 83%] api/scapy.layers.tls.crypto.suites writing output... [ 83%] api/scapy.layers.tls.extensions writing output... [ 83%] api/scapy.layers.tls.handshake writing output... [ 84%] api/scapy.layers.tls.handshake_sslv2 writing output... [ 84%] api/scapy.layers.tls.keyexchange writing output... [ 84%] api/scapy.layers.tls.keyexchange_tls13 writing output... [ 85%] api/scapy.layers.tls.record writing output... [ 85%] api/scapy.layers.tls.record_sslv2 writing output... [ 85%] api/scapy.layers.tls.record_tls13 writing output... [ 86%] api/scapy.layers.tls.session writing output... [ 86%] api/scapy.layers.tls.tools writing output... [ 86%] api/scapy.layers.tuntap writing output... [ 87%] api/scapy.layers.usb writing output... [ 87%] api/scapy.layers.vrrp writing output... [ 87%] api/scapy.layers.vxlan writing output... [ 87%] api/scapy.layers.x509 writing output... [ 88%] api/scapy.layers.zigbee writing output... [ 88%] api/scapy.main writing output... [ 88%] api/scapy.packet writing output... [ 89%] api/scapy.pipetool writing output... [ 89%] api/scapy.plist writing output... [ 89%] api/scapy.pton_ntop writing output... [ 90%] api/scapy.route writing output... [ 90%] api/scapy.route6 writing output... [ 90%] api/scapy.scapypipes writing output... [ 90%] api/scapy.sendrecv writing output... [ 91%] api/scapy.sessions writing output... [ 91%] api/scapy.supersocket writing output... [ 91%] api/scapy.themes writing output... [ 92%] api/scapy.utils writing output... [ 92%] api/scapy.utils6 writing output... [ 92%] api/scapy.volatile writing output... [ 93%] backmatter writing output... [ 93%] build_dissect writing output... [ 93%] development writing output... [ 94%] extending writing output... [ 94%] functions writing output... [ 94%] index writing output... [ 94%] installation writing output... [ 95%] introduction writing output... [ 95%] layers/automotive writing output... [ 95%] layers/bluetooth writing output... [ 96%] layers/dcerpc writing output... [ 96%] layers/gssapi writing output... [ 96%] layers/http writing output... [ 97%] layers/index writing output... [ 97%] layers/kerberos writing output... [ 97%] layers/ldap writing output... [ 98%] layers/netflow writing output... [ 98%] layers/pnio writing output... [ 98%] layers/sctp writing output... [ 98%] layers/smb writing output... [ 99%] layers/tcp writing output... [ 99%] layers/tuntap writing output... [ 99%] routing writing output... [100%] troubleshooting writing output... [100%] usage generating indices... genindex py-modindex done writing additional pages... search done copying images... [ 2%] graphics/ATMT_HelloWorld.png copying images... [ 3%] graphics/ATMT_TFTP_read.png copying images... [ 5%] graphics/ATMT_TCP_client.svg copying images... [ 7%] graphics/pipetool_demo.svg copying images... [ 8%] graphics/animations/pipetool_demo.gif copying images... [ 10%] graphics/pipetool_engine.png copying images... [ 12%] graphics/scapy_logo.png copying images... [ 14%] graphics/scapy-win-screenshot1.png copying images... [ 15%] graphics/scapy-win-screenshot2.png copying images... [ 17%] graphics/testing-taxonomy.png copying images... [ 19%] graphics/scapy-concept.png copying images... [ 20%] graphics/default-values-ip.png copying images... [ 22%] graphics/automotive/Simple-CAN-Bus-.png copying images... [ 24%] graphics/automotive/ZGW-CAN-Bus-.png copying images... [ 25%] graphics/automotive/DC-ZGW-CAN-Bus-.png copying images... [ 27%] graphics/automotive/can-bus-states.png copying images... [ 29%] graphics/automotive/CAN-full-frame.jpg copying images... [ 31%] graphics/automotive/can-frame-socket-can.png copying images... [ 32%] graphics/automotive/isotp-flow.png copying images... [ 34%] graphics/automotive/isotp-frames.png copying images... [ 36%] graphics/automotive/diag-stack.png copying images... [ 37%] graphics/automotive/XCP_ReferenceBook.png copying images... [ 39%] graphics/animations/animation-scapy-canframe.svg copying images... [ 41%] graphics/animations/animation-scapy-rdpcap.svg copying images... [ 42%] graphics/animations/animation-scapy-rdcandump.svg copying images... [ 44%] graphics/animations/animation-cansend.svg copying images... [ 46%] graphics/animations/animation-scapy-native-cansocket.svg copying images... [ 47%] graphics/animations/animation-scapy-cansockets-sniff.svg copying images... [ 49%] graphics/animations/animation-scapy-cansockets-mitm.svg copying images... [ 51%] graphics/animations/animation-scapy-cansockets-mitm2.svg copying images... [ 53%] graphics/animations/animation-scapy-isotpscan.svg copying images... [ 54%] graphics/animations/animation-scapy-uds.svg copying images... [ 56%] graphics/animations/animation-scapy-uds2.svg copying images... [ 58%] graphics/animations/animation-scapy-uds3.svg copying images... [ 59%] graphics/animations/animation-scapy-gmlan.svg copying images... [ 61%] graphics/animations/animation-scapy-obd.svg copying images... [ 63%] graphics/automotive/autosar1.png copying images... [ 64%] graphics/automotive/autosar2.png copying images... [ 66%] graphics/automotive/autosar3.png copying images... [ 68%] graphics/automotive/autosar4.png copying images... [ 69%] graphics/ble_eddystone_url.png copying images... [ 71%] graphics/ble_ibeacon.png copying images... [ 73%] graphics/dcerpc/ndr_conformant_varying_array.png copying images... [ 75%] graphics/dcerpc/ndr_full_pointer.png copying images... [ 76%] graphics/http_tcp.png copying images... [ 78%] graphics/kerberos/kerberos_atmt.png copying images... [ 80%] graphics/kerberos/wireshark_asreq.png copying images... [ 81%] graphics/kerberos/ticketer.png copying images... [ 83%] graphics/kerberos/as_req_fast.png copying images... [ 85%] graphics/smb/smb_client.png copying images... [ 86%] graphics/smb/smb_server.png copying images... [ 88%] graphics/fieldsmanagement.png copying images... [ 90%] graphics/isakmp_dump.png copying images... [ 92%] graphics/traceroute_worldplot.png copying images... [ 93%] graphics/animations/animation-scapy-asyncsniffer.svg copying images... [ 95%] graphics/ipid.png copying images... [ 97%] graphics/graph_traceroute.png copying images... [ 98%] graphics/trace3d_1.png copying images... [100%] graphics/trace3d_2.png dumping search index in English (code: en)... done dumping object inventory... done build succeeded. The HTML pages are in _build_doc/html. make: Leaving directory '/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/doc/scapy' + rm -f doc/scapy/_build_doc/html/.buildinfo + rm -f doc/scapy/_build_doc/html/_static/_dummy + RPM_EC=0 ++ jobs -p + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.L9FAuB + umask 022 + cd /builddir/build/BUILD/scapy-2.5.0-build + '[' /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT '!=' / ']' + rm -rf /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT ++ dirname /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT + mkdir -p /builddir/build/BUILD/scapy-2.5.0-build + mkdir /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd scapy-2.5.0 + install -dp -m0755 /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/share/man/man1 + install -Dp -m0644 doc/scapy.1 /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/share/man/man1/ + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + /usr/bin/python3 setup.py install -O1 --skip-build --root /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT --prefix /usr running install /usr/lib/python3.13/site-packages/setuptools/_distutils/cmd.py:66: SetuptoolsDeprecationWarning: setup.py install is deprecated. !! ******************************************************************************** Please avoid running ``setup.py`` directly. Instead, use pypa/build, pypa/installer or other standards-based tools. Follow the current Python packaging guidelines when building Python RPM packages. See https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html and https://docs.fedoraproject.org/en-US/packaging-guidelines/Python/ for details. ******************************************************************************** !! self.initialize_options() running install_lib creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13 creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/__main__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/all.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/ansmachine.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/as_resolvers.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/asn1fields.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/asn1packet.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/automaton.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/autorun.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/base_classes.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/compat.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/config.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/consts.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/dadict.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/data.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/error.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/fields.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/interfaces.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/main.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/packet.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/pipetool.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/plist.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/pton_ntop.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/route.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/route6.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/scapypipes.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/sendrecv.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/sessions.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/supersocket.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/themes.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/utils.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/utils6.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/volatile.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch copying build/lib/scapy/arch/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch copying build/lib/scapy/arch/common.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch copying build/lib/scapy/arch/libpcap.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch copying build/lib/scapy/arch/solaris.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch copying build/lib/scapy/arch/unix.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf copying build/lib/scapy/arch/bpf/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf copying build/lib/scapy/arch/bpf/consts.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf copying build/lib/scapy/arch/bpf/core.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf copying build/lib/scapy/arch/bpf/pfroute.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf copying build/lib/scapy/arch/bpf/supersocket.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/linux copying build/lib/scapy/arch/linux/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/linux copying build/lib/scapy/arch/linux/rtnetlink.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/linux creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/windows copying build/lib/scapy/arch/windows/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/windows copying build/lib/scapy/arch/windows/native.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/windows copying build/lib/scapy/arch/windows/structures.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/windows creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1 copying build/lib/scapy/asn1/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1 copying build/lib/scapy/asn1/asn1.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1 copying build/lib/scapy/asn1/ber.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1 copying build/lib/scapy/asn1/mib.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1 creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/altbeacon.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/aoe.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/avs.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/bfd.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/bgp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/bier.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/bp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/cansocket.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/cansocket_native.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/cansocket_python_can.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/carp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/cdp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/chdlc.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/coap.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/concox.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/diameter.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/dtp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/eddystone.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/eigrp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/enipTCP.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/erspan.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/esmc.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/ethercat.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/etherip.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/exposure_notification.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/geneve.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/gtp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/gtp_v2.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/gxrp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/hicp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/homeplugav.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/homepluggp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/homeplugsg.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/http2.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/ibeacon.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/icmp_extensions.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/ife.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/igmp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/igmpv3.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/ikev2.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/isis.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/knx.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/lacp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/ldp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/lldp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/loraphy2wan.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/ltp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/mac_control.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/macsec.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/metawatch.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/modbus.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/mount.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/mpls.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/mqtt.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/mqttsn.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/nfs.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/nlm.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/nrf_sniffer.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/nsh.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/oam.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/oncrpc.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/opc_da.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/openflow.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/openflow3.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/ospf.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/pfcp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/pim.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/pnio.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/pnio_dcp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/pnio_rpc.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/portmap.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/postgres.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/ppi_cace.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/ppi_geotag.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/ripng.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/roce.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/rpl.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/rpl_metrics.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/rsvp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/rtcp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/rtr.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/rtsp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/sdnv.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/sebek.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/send.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/skinny.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/slowprot.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/socks.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/stamp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/stun.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/tacacs.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/tcpao.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/tcpros.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/tzsp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/vqp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/vtp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib copying build/lib/scapy/contrib/wireguard.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive copying build/lib/scapy/contrib/automotive/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive copying build/lib/scapy/contrib/automotive/ccp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive copying build/lib/scapy/contrib/automotive/ecu.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive copying build/lib/scapy/contrib/automotive/kwp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive copying build/lib/scapy/contrib/automotive/someip.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive copying build/lib/scapy/contrib/automotive/uds.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive copying build/lib/scapy/contrib/automotive/uds_ecu_states.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive copying build/lib/scapy/contrib/automotive/uds_logging.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive copying build/lib/scapy/contrib/automotive/uds_scan.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive copying build/lib/scapy/contrib/automotive/doip.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar copying build/lib/scapy/contrib/automotive/autosar/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar copying build/lib/scapy/contrib/automotive/autosar/secoc.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar copying build/lib/scapy/contrib/automotive/autosar/secoc_canfd.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar copying build/lib/scapy/contrib/automotive/autosar/secoc_pdu.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar copying build/lib/scapy/contrib/automotive/autosar/pdu.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw copying build/lib/scapy/contrib/automotive/bmw/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw copying build/lib/scapy/contrib/automotive/bmw/definitions.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw copying build/lib/scapy/contrib/automotive/bmw/enumerator.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw copying build/lib/scapy/contrib/automotive/bmw/hsfz.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm copying build/lib/scapy/contrib/automotive/gm/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm copying build/lib/scapy/contrib/automotive/gm/gmlan.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm copying build/lib/scapy/contrib/automotive/gm/gmlan_ecu_states.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm copying build/lib/scapy/contrib/automotive/gm/gmlan_logging.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm copying build/lib/scapy/contrib/automotive/gm/gmlan_scanner.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm copying build/lib/scapy/contrib/automotive/gm/gmlanutils.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd copying build/lib/scapy/contrib/automotive/obd/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd copying build/lib/scapy/contrib/automotive/obd/obd.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd copying build/lib/scapy/contrib/automotive/obd/packet.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd copying build/lib/scapy/contrib/automotive/obd/scanner.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd copying build/lib/scapy/contrib/automotive/obd/services.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/iid copying build/lib/scapy/contrib/automotive/obd/iid/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/iid copying build/lib/scapy/contrib/automotive/obd/iid/iids.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/iid creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/mid copying build/lib/scapy/contrib/automotive/obd/mid/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/mid copying build/lib/scapy/contrib/automotive/obd/mid/mids.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/mid creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid copying build/lib/scapy/contrib/automotive/obd/pid/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid copying build/lib/scapy/contrib/automotive/obd/pid/pids.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid copying build/lib/scapy/contrib/automotive/obd/pid/pids_00_1F.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid copying build/lib/scapy/contrib/automotive/obd/pid/pids_20_3F.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid copying build/lib/scapy/contrib/automotive/obd/pid/pids_40_5F.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid copying build/lib/scapy/contrib/automotive/obd/pid/pids_60_7F.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid copying build/lib/scapy/contrib/automotive/obd/pid/pids_80_9F.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid copying build/lib/scapy/contrib/automotive/obd/pid/pids_A0_C0.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/tid copying build/lib/scapy/contrib/automotive/obd/tid/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/tid copying build/lib/scapy/contrib/automotive/obd/tid/tids.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/tid creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner copying build/lib/scapy/contrib/automotive/scanner/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner copying build/lib/scapy/contrib/automotive/scanner/configuration.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner copying build/lib/scapy/contrib/automotive/scanner/enumerator.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner copying build/lib/scapy/contrib/automotive/scanner/executor.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner copying build/lib/scapy/contrib/automotive/scanner/graph.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner copying build/lib/scapy/contrib/automotive/scanner/staged_test_case.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner copying build/lib/scapy/contrib/automotive/scanner/test_case.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/volkswagen copying build/lib/scapy/contrib/automotive/volkswagen/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/volkswagen copying build/lib/scapy/contrib/automotive/volkswagen/definitions.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/volkswagen creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp copying build/lib/scapy/contrib/automotive/xcp/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp copying build/lib/scapy/contrib/automotive/xcp/cto_commands_master.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp copying build/lib/scapy/contrib/automotive/xcp/cto_commands_slave.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp copying build/lib/scapy/contrib/automotive/xcp/scanner.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp copying build/lib/scapy/contrib/automotive/xcp/utils.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp copying build/lib/scapy/contrib/automotive/xcp/xcp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp copying build/lib/scapy/contrib/isotp/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp copying build/lib/scapy/contrib/isotp/isotp_native_socket.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp copying build/lib/scapy/contrib/isotp/isotp_packet.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp copying build/lib/scapy/contrib/isotp/isotp_scanner.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp copying build/lib/scapy/contrib/isotp/isotp_soft_socket.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp copying build/lib/scapy/contrib/isotp/isotp_utils.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps copying build/lib/scapy/contrib/rtps/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps copying build/lib/scapy/contrib/rtps/common_types.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps copying build/lib/scapy/contrib/rtps/pid_types.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps copying build/lib/scapy/contrib/rtps/rtps.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada copying build/lib/scapy/contrib/scada/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada copying build/lib/scapy/contrib/scada/pcom.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104 copying build/lib/scapy/contrib/scada/iec104/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104 copying build/lib/scapy/contrib/scada/iec104/iec104_fields.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104 copying build/lib/scapy/contrib/scada/iec104/iec104_information_elements.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104 copying build/lib/scapy/contrib/scada/iec104/iec104_information_objects.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104 creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/all.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/bluetooth.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/bluetooth4LE.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/can.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/clns.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/dcerpc.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/dhcp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/dhcp6.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/dns.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/dot11.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/dot15d4.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/eap.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/gprs.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/gssapi.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/hsrp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/http.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/inet.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/inet6.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/ipsec.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/ir.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/isakmp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/kerberos.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/l2.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/l2tp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/ldap.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/llmnr.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/lltd.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/mgcp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/mobileip.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/netbios.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/netflow.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/ntlm.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/ntp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/pflog.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/ppi.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/ppp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/pptp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/radius.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/rip.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/rtp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/sctp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/sixlowpan.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/skinny.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/smb.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/smb2.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/smbclient.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/smbserver.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/snmp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/spnego.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/ssh.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/tftp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/tuntap.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/usb.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/vrrp.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/vxlan.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/x509.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers copying build/lib/scapy/layers/zigbee.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce copying build/lib/scapy/layers/msrpce/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce copying build/lib/scapy/layers/msrpce/all.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce copying build/lib/scapy/layers/msrpce/ept.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce copying build/lib/scapy/layers/msrpce/msdcom.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce copying build/lib/scapy/layers/msrpce/msdrsr.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce copying build/lib/scapy/layers/msrpce/msnrpc.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce copying build/lib/scapy/layers/msrpce/mspac.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce copying build/lib/scapy/layers/msrpce/rpcclient.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce copying build/lib/scapy/layers/msrpce/rpcserver.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw copying build/lib/scapy/layers/msrpce/raw/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw copying build/lib/scapy/layers/msrpce/raw/ept.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw copying build/lib/scapy/layers/msrpce/raw/ms_dcom.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw copying build/lib/scapy/layers/msrpce/raw/ms_drsr.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw copying build/lib/scapy/layers/msrpce/raw/ms_nrpc.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw copying build/lib/scapy/layers/msrpce/raw/ms_samr.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw copying build/lib/scapy/layers/msrpce/raw/ms_srvs.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw copying build/lib/scapy/layers/msrpce/raw/ms_wkst.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/all.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/automaton.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/automaton_cli.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/automaton_srv.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/basefields.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/cert.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/extensions.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/handshake.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/handshake_sslv2.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/keyexchange.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/keyexchange_tls13.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/record.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/record_sslv2.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/record_tls13.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/session.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls copying build/lib/scapy/layers/tls/tools.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/all.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/cipher_aead.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/cipher_block.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/cipher_stream.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/ciphers.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/common.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/compression.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/groups.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/h_mac.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/hash.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/hkdf.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/kx_algs.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/md4.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/pkcs1.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/prf.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto copying build/lib/scapy/layers/tls/crypto/suites.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs copying build/lib/scapy/libs/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs copying build/lib/scapy/libs/ethertypes.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs copying build/lib/scapy/libs/extcap.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs copying build/lib/scapy/libs/manuf.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs copying build/lib/scapy/libs/matplot.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs copying build/lib/scapy/libs/rfc3961.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs copying build/lib/scapy/libs/structures.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs copying build/lib/scapy/libs/test_pyx.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs copying build/lib/scapy/libs/winpcapy.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules copying build/lib/scapy/modules/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules copying build/lib/scapy/modules/nmap.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules copying build/lib/scapy/modules/p0f.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules copying build/lib/scapy/modules/p0fv2.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules copying build/lib/scapy/modules/ticketer.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules copying build/lib/scapy/modules/voip.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack copying build/lib/scapy/modules/krack/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack copying build/lib/scapy/modules/krack/automaton.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack copying build/lib/scapy/modules/krack/crypto.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools copying build/lib/scapy/tools/UTscapy.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools copying build/lib/scapy/tools/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools copying build/lib/scapy/tools/check_asdis.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools copying build/lib/scapy/tools/generate_ethertypes.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools copying build/lib/scapy/tools/generate_manuf.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools copying build/lib/scapy/tools/scapy_pyannotate.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools creating /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive copying build/lib/scapy/tools/automotive/__init__.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive copying build/lib/scapy/tools/automotive/isotpscanner.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive copying build/lib/scapy/tools/automotive/obdscanner.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive copying build/lib/scapy/tools/automotive/xcpscanner.py -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive copying build/lib/scapy/py.typed -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy copying build/lib/scapy/VERSION -> /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__main__.py to __main__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/all.py to all.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/ansmachine.py to ansmachine.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/as_resolvers.py to as_resolvers.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1fields.py to asn1fields.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1packet.py to asn1packet.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/automaton.py to automaton.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/autorun.py to autorun.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/base_classes.py to base_classes.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/compat.py to compat.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/config.py to config.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/consts.py to consts.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/dadict.py to dadict.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/data.py to data.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/error.py to error.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/fields.py to fields.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/interfaces.py to interfaces.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/main.py to main.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/packet.py to packet.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/pipetool.py to pipetool.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/plist.py to plist.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/pton_ntop.py to pton_ntop.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/route.py to route.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/route6.py to route6.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/scapypipes.py to scapypipes.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/sendrecv.py to sendrecv.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/sessions.py to sessions.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/supersocket.py to supersocket.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/themes.py to themes.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/utils.py to utils.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/utils6.py to utils6.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/volatile.py to volatile.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/common.py to common.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/libpcap.py to libpcap.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/solaris.py to solaris.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/unix.py to unix.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf/consts.py to consts.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf/core.py to core.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf/pfroute.py to pfroute.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf/supersocket.py to supersocket.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/linux/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/linux/rtnetlink.py to rtnetlink.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/windows/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/windows/native.py to native.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/windows/structures.py to structures.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1/asn1.py to asn1.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1/ber.py to ber.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1/mib.py to mib.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/altbeacon.py to altbeacon.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/aoe.py to aoe.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/avs.py to avs.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/bfd.py to bfd.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/bgp.py to bgp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/bier.py to bier.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/bp.py to bp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/cansocket.py to cansocket.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/cansocket_native.py to cansocket_native.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/cansocket_python_can.py to cansocket_python_can.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/carp.py to carp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/cdp.py to cdp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/chdlc.py to chdlc.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/coap.py to coap.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/concox.py to concox.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/diameter.py to diameter.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/dtp.py to dtp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/eddystone.py to eddystone.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/eigrp.py to eigrp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/enipTCP.py to enipTCP.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/erspan.py to erspan.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/esmc.py to esmc.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/ethercat.py to ethercat.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/etherip.py to etherip.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/exposure_notification.py to exposure_notification.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/geneve.py to geneve.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/gtp.py to gtp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/gtp_v2.py to gtp_v2.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/gxrp.py to gxrp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/hicp.py to hicp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/homeplugav.py to homeplugav.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/homepluggp.py to homepluggp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/homeplugsg.py to homeplugsg.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/http2.py to http2.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/ibeacon.py to ibeacon.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/icmp_extensions.py to icmp_extensions.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/ife.py to ife.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/igmp.py to igmp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/igmpv3.py to igmpv3.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/ikev2.py to ikev2.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isis.py to isis.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/knx.py to knx.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/lacp.py to lacp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/ldp.py to ldp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/lldp.py to lldp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/loraphy2wan.py to loraphy2wan.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/ltp.py to ltp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/mac_control.py to mac_control.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/macsec.py to macsec.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/metawatch.py to metawatch.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/modbus.py to modbus.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/mount.py to mount.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/mpls.py to mpls.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/mqtt.py to mqtt.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/mqttsn.py to mqttsn.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/nfs.py to nfs.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/nlm.py to nlm.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/nrf_sniffer.py to nrf_sniffer.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/nsh.py to nsh.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/oam.py to oam.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/oncrpc.py to oncrpc.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/opc_da.py to opc_da.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/openflow.py to openflow.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/openflow3.py to openflow3.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/ospf.py to ospf.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/pfcp.py to pfcp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/pim.py to pim.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/pnio.py to pnio.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/pnio_dcp.py to pnio_dcp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/pnio_rpc.py to pnio_rpc.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/portmap.py to portmap.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/postgres.py to postgres.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/ppi_cace.py to ppi_cace.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/ppi_geotag.py to ppi_geotag.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/ripng.py to ripng.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/roce.py to roce.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rpl.py to rpl.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rpl_metrics.py to rpl_metrics.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rsvp.py to rsvp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtcp.py to rtcp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtr.py to rtr.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtsp.py to rtsp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/sdnv.py to sdnv.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/sebek.py to sebek.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/send.py to send.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/skinny.py to skinny.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/slowprot.py to slowprot.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/socks.py to socks.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/stamp.py to stamp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/stun.py to stun.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/tacacs.py to tacacs.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/tcpao.py to tcpao.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/tcpros.py to tcpros.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/tzsp.py to tzsp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/vqp.py to vqp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/vtp.py to vtp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/wireguard.py to wireguard.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/ccp.py to ccp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/ecu.py to ecu.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/kwp.py to kwp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/someip.py to someip.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/uds.py to uds.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/uds_ecu_states.py to uds_ecu_states.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/uds_logging.py to uds_logging.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/uds_scan.py to uds_scan.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/doip.py to doip.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar/secoc.py to secoc.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar/secoc_canfd.py to secoc_canfd.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar/secoc_pdu.py to secoc_pdu.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar/pdu.py to pdu.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw/definitions.py to definitions.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw/enumerator.py to enumerator.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw/hsfz.py to hsfz.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/gmlan.py to gmlan.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/gmlan_ecu_states.py to gmlan_ecu_states.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/gmlan_logging.py to gmlan_logging.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/gmlan_scanner.py to gmlan_scanner.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/gmlanutils.py to gmlanutils.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/obd.py to obd.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/packet.py to packet.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/scanner.py to scanner.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/services.py to services.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/iid/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/iid/iids.py to iids.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/mid/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/mid/mids.py to mids.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/pids.py to pids.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/pids_00_1F.py to pids_00_1F.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/pids_20_3F.py to pids_20_3F.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/pids_40_5F.py to pids_40_5F.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/pids_60_7F.py to pids_60_7F.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/pids_80_9F.py to pids_80_9F.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/pids_A0_C0.py to pids_A0_C0.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/tid/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/tid/tids.py to tids.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/configuration.py to configuration.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/enumerator.py to enumerator.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/executor.py to executor.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/graph.py to graph.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/staged_test_case.py to staged_test_case.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/test_case.py to test_case.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/volkswagen/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/volkswagen/definitions.py to definitions.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/cto_commands_master.py to cto_commands_master.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/cto_commands_slave.py to cto_commands_slave.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/scanner.py to scanner.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/utils.py to utils.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/xcp.py to xcp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/isotp_native_socket.py to isotp_native_socket.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/isotp_packet.py to isotp_packet.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/isotp_scanner.py to isotp_scanner.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/isotp_soft_socket.py to isotp_soft_socket.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/isotp_utils.py to isotp_utils.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps/common_types.py to common_types.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps/pid_types.py to pid_types.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps/rtps.py to rtps.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/pcom.py to pcom.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104/iec104_fields.py to iec104_fields.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104/iec104_information_elements.py to iec104_information_elements.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104/iec104_information_objects.py to iec104_information_objects.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/all.py to all.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/bluetooth.py to bluetooth.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/bluetooth4LE.py to bluetooth4LE.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/can.py to can.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/clns.py to clns.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/dcerpc.py to dcerpc.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/dhcp.py to dhcp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/dhcp6.py to dhcp6.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/dns.py to dns.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/dot11.py to dot11.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/dot15d4.py to dot15d4.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/eap.py to eap.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/gprs.py to gprs.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/gssapi.py to gssapi.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/hsrp.py to hsrp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/http.py to http.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/inet.py to inet.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/inet6.py to inet6.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/ipsec.py to ipsec.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/ir.py to ir.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/isakmp.py to isakmp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/kerberos.py to kerberos.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/l2.py to l2.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/l2tp.py to l2tp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/ldap.py to ldap.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/llmnr.py to llmnr.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/lltd.py to lltd.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/mgcp.py to mgcp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/mobileip.py to mobileip.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/netbios.py to netbios.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/netflow.py to netflow.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/ntlm.py to ntlm.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/ntp.py to ntp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/pflog.py to pflog.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/ppi.py to ppi.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/ppp.py to ppp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/pptp.py to pptp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/radius.py to radius.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/rip.py to rip.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/rtp.py to rtp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/sctp.py to sctp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/sixlowpan.py to sixlowpan.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/skinny.py to skinny.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/smb.py to smb.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/smb2.py to smb2.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/smbclient.py to smbclient.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/smbserver.py to smbserver.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/snmp.py to snmp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/spnego.py to spnego.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/ssh.py to ssh.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tftp.py to tftp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tuntap.py to tuntap.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/usb.py to usb.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/vrrp.py to vrrp.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/vxlan.py to vxlan.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/x509.py to x509.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/zigbee.py to zigbee.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/all.py to all.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/ept.py to ept.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/msdcom.py to msdcom.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/msdrsr.py to msdrsr.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/msnrpc.py to msnrpc.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/mspac.py to mspac.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/rpcclient.py to rpcclient.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/rpcserver.py to rpcserver.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/ept.py to ept.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/ms_dcom.py to ms_dcom.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/ms_drsr.py to ms_drsr.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/ms_nrpc.py to ms_nrpc.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/ms_samr.py to ms_samr.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/ms_srvs.py to ms_srvs.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/ms_wkst.py to ms_wkst.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/all.py to all.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/automaton.py to automaton.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/automaton_cli.py to automaton_cli.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/automaton_srv.py to automaton_srv.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/basefields.py to basefields.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/cert.py to cert.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/extensions.py to extensions.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/handshake.py to handshake.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/handshake_sslv2.py to handshake_sslv2.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/keyexchange.py to keyexchange.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/keyexchange_tls13.py to keyexchange_tls13.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/record.py to record.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/record_sslv2.py to record_sslv2.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/record_tls13.py to record_tls13.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/session.py to session.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/tools.py to tools.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/all.py to all.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/cipher_aead.py to cipher_aead.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/cipher_block.py to cipher_block.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/cipher_stream.py to cipher_stream.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/ciphers.py to ciphers.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/common.py to common.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/compression.py to compression.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/groups.py to groups.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/h_mac.py to h_mac.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/hash.py to hash.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/hkdf.py to hkdf.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/kx_algs.py to kx_algs.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/md4.py to md4.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/pkcs1.py to pkcs1.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/prf.py to prf.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/suites.py to suites.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/ethertypes.py to ethertypes.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/extcap.py to extcap.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/manuf.py to manuf.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/matplot.py to matplot.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/rfc3961.py to rfc3961.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/structures.py to structures.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/test_pyx.py to test_pyx.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/winpcapy.py to winpcapy.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/nmap.py to nmap.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/p0f.py to p0f.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/p0fv2.py to p0fv2.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/ticketer.py to ticketer.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/voip.py to voip.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack/automaton.py to automaton.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack/crypto.py to crypto.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/UTscapy.py to UTscapy.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/check_asdis.py to check_asdis.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/generate_ethertypes.py to generate_ethertypes.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/generate_manuf.py to generate_manuf.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/scapy_pyannotate.py to scapy_pyannotate.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive/__init__.py to __init__.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive/isotpscanner.py to isotpscanner.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive/obdscanner.py to obdscanner.cpython-313.pyc byte-compiling /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive/xcpscanner.py to xcpscanner.cpython-313.pyc writing byte-compilation script '/tmp/tmpgca_2z67.py' /usr/bin/python3 /tmp/tmpgca_2z67.py removing /tmp/tmpgca_2z67.py running install_data running install_egg_info running egg_info writing scapy.egg-info/PKG-INFO writing dependency_links to scapy.egg-info/dependency_links.txt writing entry points to scapy.egg-info/entry_points.txt writing requirements to scapy.egg-info/requires.txt writing top-level names to scapy.egg-info/top_level.txt reading manifest file 'scapy.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' adding license file 'LICENSE' writing manifest file 'scapy.egg-info/SOURCES.txt' Copying scapy.egg-info to /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy-2.5.0.dev467-py3.13.egg-info running install_scripts Installing scapy script to /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/bin + rm -rfv /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/bin/__pycache__ + rm -f /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy-2.5.0.dev467-py3.13.egg-info/requires.txt + mv -f /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/bin/scapy /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/bin/scapy3 + ln -s /usr/bin/scapy3 /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/bin/scapy + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/redhat/brp-ldconfig + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip /usr/bin/strip + /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump + /usr/lib/rpm/redhat/brp-strip-lto /usr/bin/strip + /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip + /usr/lib/rpm/check-rpaths + /usr/lib/rpm/redhat/brp-mangle-shebangs + /usr/lib/rpm/brp-remove-la-files + env /usr/lib/rpm/redhat/brp-python-bytecompile '' 1 0 -j5 Bytecompiling .py files below /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13 using python3.13 + /usr/lib/rpm/redhat/brp-python-hardlink + /usr/bin/add-determinism --brp -j5 /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf/__pycache__/consts.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf/__pycache__/core.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf/__pycache__/supersocket.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/linux/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/windows/__pycache__/native.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/windows/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/__pycache__/common.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/bpf/__pycache__/pfroute.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/__pycache__/solaris.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/linux/__pycache__/rtnetlink.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/__pycache__/unix.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/windows/__pycache__/structures.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/arch/__pycache__/libpcap.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar/__pycache__/secoc.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar/__pycache__/secoc_canfd.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar/__pycache__/secoc_pdu.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/autosar/__pycache__/pdu.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1/__pycache__/mib.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw/__pycache__/enumerator.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1/__pycache__/ber.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw/__pycache__/hsfz.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/__pycache__/gmlan_ecu_states.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/__pycache__/gmlan_logging.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1/__pycache__/asn1.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/bmw/__pycache__/definitions.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/iid/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/asn1/__pycache__/asn1.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/mid/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/__pycache__/gmlanutils.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/iid/__pycache__/iids.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/__pycache__/gmlan.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/__pycache__/pids.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/__pycache__/pids_00_1F.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/__pycache__/pids_20_3F.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/__pycache__/pids_40_5F.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/__pycache__/pids_A0_C0.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/tid/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/__pycache__/pids_60_7F.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/pid/__pycache__/pids_80_9F.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/__pycache__/packet.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/__pycache__/obd.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/tid/__pycache__/tids.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/__pycache__/configuration.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/__pycache__/services.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/gm/__pycache__/gmlan_scanner.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/__pycache__/scanner.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/__pycache__/graph.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/obd/mid/__pycache__/mids.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/volkswagen/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/__pycache__/test_case.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/__pycache__/executor.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/__pycache__/staged_test_case.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/__pycache__/scanner.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/__pycache__/utils.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/scanner/__pycache__/enumerator.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/__pycache__/cto_commands_master.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/__pycache__/xcp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/xcp/__pycache__/cto_commands_slave.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__pycache__/ccp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__pycache__/someip.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__pycache__/uds_ecu_states.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__pycache__/ecu.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__pycache__/uds_logging.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__pycache__/kwp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/volkswagen/__pycache__/definitions.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/__pycache__/isotp_native_socket.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__pycache__/doip.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/__pycache__/isotp_packet.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/__pycache__/isotp_scanner.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/__pycache__/isotp_utils.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps/__pycache__/common_types.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/isotp/__pycache__/isotp_soft_socket.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps/__pycache__/rtps.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__pycache__/uds.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104/__pycache__/iec104_fields.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/rtps/__pycache__/pid_types.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/automotive/__pycache__/uds_scan.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/altbeacon.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/avs.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/__pycache__/pcom.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/aoe.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/bier.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/bfd.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/cansocket.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/bp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/cansocket_native.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/carp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/cansocket_python_can.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104/__pycache__/iec104_information_elements.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/chdlc.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/coap.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/concox.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/dtp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/cdp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/eddystone.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/scada/iec104/__pycache__/iec104_information_objects.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/erspan.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/enipTCP.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/esmc.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/etherip.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/exposure_notification.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/geneve.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/eigrp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/ethercat.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/gxrp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/hicp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/bgp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/homepluggp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/homeplugsg.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/gtp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/ibeacon.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/icmp_extensions.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/ife.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/igmp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/igmpv3.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/gtp_v2.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/http2.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/homeplugav.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/lacp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/ikev2.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/ldp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/knx.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/diameter.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/mac_control.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/ltp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/metawatch.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/macsec.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/mount.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/lldp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/mpls.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/loraphy2wan.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/isis.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/mqtt.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/mqttsn.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/nrf_sniffer.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/nlm.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/nsh.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/oncrpc.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/modbus.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/oam.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/nfs.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/opc_da.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/pim.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/openflow.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/pnio.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/ospf.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/portmap.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/pnio_dcp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/ppi_cace.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/ppi_geotag.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/ripng.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/pnio_rpc.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/postgres.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/roce.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/rpl.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/rpl_metrics.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/rsvp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/rtcp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/rtsp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/sdnv.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/rtr.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/send.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/slowprot.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/sebek.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/socks.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/openflow3.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/stamp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/stun.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/tcpao.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/skinny.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/vqp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/tcpros.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/tacacs.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/wireguard.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/vtp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/tzsp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/__pycache__/ept.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/pfcp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/__pycache__/ms_nrpc.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/__pycache__/ms_dcom.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/__pycache__/ms_samr.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/__pycache__/ms_drsr.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/pnio.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/__pycache__/ms_wkst.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/raw/__pycache__/ms_srvs.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/msdrsr.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/ept.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/all.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/msdcom.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/rpcclient.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/rpcserver.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/msnrpc.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/all.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/mspac.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/rpcclient.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/cipher_block.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/ciphers.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/common.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/msrpce/__pycache__/msnrpc.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/cipher_stream.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/cipher_aead.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/compression.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/hash.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/h_mac.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/hkdf.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/groups.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/md4.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/kx_algs.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/all.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/contrib/__pycache__/http2.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/pkcs1.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/prf.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/automaton.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/basefields.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/cert.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/extensions.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/automaton_cli.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/crypto/__pycache__/suites.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/keyexchange_tls13.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/handshake_sslv2.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/record_sslv2.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/automaton_srv.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/record_tls13.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/record.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/tools.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/all.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/keyexchange.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/handshake.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/clns.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/bluetooth4LE.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/tls/__pycache__/session.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/can.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/dhcp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/dhcp6.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/bluetooth.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/dns.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/gprs.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/gssapi.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/dot11.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/hsrp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/dot15d4.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/eap.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/dcerpc.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/ir.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/ipsec.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/isakmp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/http.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/l2tp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/l2.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/llmnr.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/ldap.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/mgcp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/lltd.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/mobileip.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/netbios.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/inet.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/netflow.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/pflog.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/ppi.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/kerberos.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/ntlm.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/ntp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/pptp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/rtp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/rip.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/ppp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/inet6.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/skinny.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/radius.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/sixlowpan.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/sctp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/snmp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/smb.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/ssh.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/smbserver.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/spnego.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/tuntap.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/usb.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/vxlan.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/vrrp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/tftp.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/smbclient.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/x509.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/zigbee.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/smb2.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/dns.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/ldap.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/dcerpc.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__pycache__/ethertypes.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/sixlowpan.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__pycache__/extcap.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__pycache__/matplot.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/ntlm.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__pycache__/structures.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__pycache__/test_pyx.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__pycache__/winpcapy.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__pycache__/manuf.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/smbclient.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/layers/__pycache__/kerberos.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__pycache__/rfc3961.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack/__pycache__/crypto.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack/__pycache__/crypto.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/__pycache__/nmap.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack/__pycache__/automaton.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/__pycache__/p0fv2.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/libs/__pycache__/rfc3961.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/__pycache__/voip.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive/__pycache__/isotpscanner.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive/__pycache__/obdscanner.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/krack/__pycache__/automaton.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/__pycache__/check_asdis.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/automotive/__pycache__/xcpscanner.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/__pycache__/generate_ethertypes.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/__pycache__/scapy_pyannotate.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/__pycache__/generate_manuf.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/__main__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/all.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/__init__.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/__pycache__/p0f.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/as_resolvers.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/asn1packet.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/ansmachine.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/autorun.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/tools/__pycache__/UTscapy.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/compat.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/asn1fields.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/consts.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/base_classes.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/dadict.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/modules/__pycache__/ticketer.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/error.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/data.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/interfaces.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/config.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/automaton.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/main.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/pton_ntop.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/route.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/plist.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/route6.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/pipetool.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/scapypipes.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/sessions.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/themes.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/supersocket.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/utils6.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/sendrecv.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/packet.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/config.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/fields.cpython-313.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/sessions.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/sendrecv.cpython-313.opt-1.pyc: replacing with normalized version /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/volatile.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/utils.cpython-313.pyc: rewriting with normalized contents /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/scapy/__pycache__/fields.cpython-313.opt-1.pyc: replacing with normalized version Scanned 76 directories and 1096 files, processed 381 inodes, 381 modified (38 replaced + 343 rewritten), 0 unsupported format, 0 errors Executing(%check): /bin/sh -e /var/tmp/rpm-tmp.ltco69 + umask 022 + cd /builddir/build/BUILD/scapy-2.5.0-build + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection ' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mcpu=power8 -mtune=power8 -fasynchronous-unwind-tables -fstack-clash-protection -I/usr/lib64/gfortran/modules ' + export FCFLAGS + VALAFLAGS=-g + export VALAFLAGS + RUSTFLAGS='-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Clink-arg=-specs=/usr/lib/rpm/redhat/redhat-package-notes --cap-lints=warn' + export RUSTFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + cd scapy-2.5.0 ++ python3 ./.config/ci/openssl.py + OPENSSL_CONF=/tmp/tmp9ydwc446.cnf + ./test/run_tests -c test/configs/linux.utsc -K automotive_comm -K ci_only -K scanner Begin emission reading from file /tmp/tmpx6yssznz, link-type IPV4 (Raw IPv4), snapshot length 65535 reading from file /tmp/tmpx6yssznz, link-type IPV4 (Raw IPv4), snapshot length 65535 reading from file /tmp/tmpx6yssznz, link-type IPV4 (Raw IPv4), snapshot length 65535 reading from file -, link-type IPV4 (Raw IPv4), snapshot length 65535 reading from file /tmp/tmp9jif552a, link-type IPV4 (Raw IPv4), snapshot length 65535 reading from file -, link-type IPV4 (Raw IPv4), snapshot length 65535 reading from file -, link-type IPV4 (Raw IPv4), snapshot length 65535 reading from file -, link-type IPV4 (Raw IPv4), snapshot length 65535 reading from file -, link-type EN10MB (Ethernet), snapshot length 65535 reading from file /tmp/scapyyv_c7yh5.pcap, link-type EN10MB (Ethernet), snapshot length 65535 reading from file -, link-type EN10MB (Ethernet), snapshot length 65535 reading from file /tmp/scapyn_jo8314, link-type IEEE802_11_RADIO (802.11 plus radiotap header), snapshot length 65535 Begin emission Finished sending 1 packets *━ UTScapy - Scapy 2.5.0.dev467 - 3.13.0 └ Loaded config file test/configs/linux.utsc └ Non-root mode └ Booting scapy... └ Discovering tests files... ━ Loading: test/answering_machines.uts passed CA80D318 000.04s Generic answering machine mocker passed 7ABD0259 000.01s BOOT_am passed BB811897 000.01s DHCP_am passed 5F9A0C99 000.01s ARP_am passed EB3E3649 000.01s ICMPEcho_am passed DEBF7F6E 000.06s DNS_am passed 1F6AE33B 000.02s LLMNR_am passed 2D6027F7 000.03s mDNS_am passed F428DA3D 000.01s WiFi_am passed FCCB156F 000.04s NBNS_am passed 4F26CADB 000.06s LdapPing_am Campaign CRC=A3589811 in 000.30s SHA=67244FF8B6FF5D6CE1BC7AB6E090622553186737 PASSED=11 FAILED=0 ━ Loading: test/fields.uts passed 49EC0DD3 000.01s ConditionnalField class passed C10B7C25 000.00s Simple tests passed D131D69E 000.00s MACField class passed A3965953 000.00s LEMACField class passed 1AE4144B 000.00s SourceMACField passed A8B908D5 000.00s IPField class passed E54209E8 000.00s SourceIPField passed F80FF879 000.00s ThreeBytesField passed B4537C2F 000.01s NBytesField passed 4C32BD99 000.00s StrField passed 5A8E3367 000.00s StrFieldUtf16 passed 8D875933 000.00s StrFieldUtf16 passed E71A4E80 000.01s Creation of a layer with ActionField passed 39015249 000.00s Triggering action passed 648CCA2E 000.00s Creation of a layer with FieldLenField passed FD69822A 000.00s Assembly of an empty packet passed 418F18DF 000.00s Assembly of non empty packet passed D70A4723 000.00s Disassembly passed 56252579 000.01s BitFieldLenField test passed 507AC347 000.00s Test BitLenField passed BAEBDE7D 000.00s Test UTCTimeField passed DDF60244 000.00s Creation of a layer passed BBDF976B 000.00s Assembly of an empty packet passed 10BFFBF0 000.00s Assembly of a non-empty packet passed 271331C3 000.00s Disassemble passed 5248251B 000.00s Disassemble unaligned passed C7F07619 000.00s Manipulate passed E54B8BB1 000.00s Test mutability of the default values passed 68DB9CF4 000.00s Create a layer passed BE210CA7 000.00s Test the PacketListField assembly passed 4A105497 000.00s Test the PacketListField assembly 2 passed D7560C6C 000.01s Test disassembly passed 8EC9F5F9 000.01s Nested PacketListField passed F0F8088A 000.00s Create a layer passed BE210CA7 000.00s Test the PacketListField assembly passed 4A105497 000.00s Test the PacketListField assembly 2 passed D7560C6C 000.01s Test disassembly passed D59DE86D 000.00s Test parent reference passed 781E4EFA 000.00s Test parent reference in guess_payload_class passed 8EC9F5F9 000.01s Nested PacketListField passed 16BFB6B2 000.02s Complex packet passed 952B8BB0 000.00s Test calls on TCPOptionsField.getfield passed F0F8088A 000.00s Create a layer passed BE210CA7 000.00s Test the PacketListField assembly passed 4A105497 000.00s Test the PacketListField assembly 2 passed D7560C6C 000.01s Test disassembly passed 8EC9F5F9 000.01s Nested PacketListField passed 5BF7A4B9 000.01s Complex packet passed EBD4DC4F 000.01s Create layers for heterogeneous PacketListField passed A6889902 000.01s Test heterogeneous PacketListField passed A7CDB158 000.01s Create layers for heterogeneous PacketListField with memory passed E1C63552 000.00s Test heterogeneous PacketListField with memory passed CCD82B3B 000.27s Test nested PacketListFields passed 24D89AA7 000.01s Test cache handling of payload modification in a PacketListField passed 9A9CE8BE 000.01s Test cache handling of payload modification in a PacketField passed E463C228 000.01s Test calls on MultiFlagsField.any2i passed 7AB18CC6 000.01s Test calls on MultiFlagsField.i2m passed 37E9323B 000.01s Test calls on MultiFlagsField.m2i passed 4E80D133 000.01s Test calls on MultiFlagsField.i2repr passed 8DE519CD 000.00s EnumField tests initialization passed 13F48087 000.00s EnumField.any2i_one passed 93C7C3E9 000.00s EnumField.any2i passed C689060A 000.01s EnumField.i2repr_one passed 8E7E251E 000.01s EnumField.i2repr passed C3EA18B7 000.00s EnumField with Enum passed 03EA15DC 000.00s LE3BytesEnumField passed 3D43DF31 000.00s LE3BytesEnumField.i2repr_one passed B35760E8 000.00s XLE3BytesEnumField passed 1597D3EA 000.00s Building expect_exception handler passed D688FCD5 000.00s CharEnumField tests initialization passed D5F5A4AB 000.00s CharEnumField.any2i_one passed 1597D3EA 000.00s Building expect_exception handler passed B7B39436 000.00s XByteEnumField tests initialization passed 30A25CC2 000.00s XByteEnumField.i2repr_one passed 384257A1 000.00s XByteEnumField update tests initialization passed 488C1015 000.00s XByteEnumField.i2repr_one with update passed 1597D3EA 000.00s Building expect_exception handler passed 1DA6EA64 000.00s XShortEnumField tests initialization passed 30A25CC2 000.00s XShortEnumField.i2repr_one passed 0D59ADD1 000.00s XShortEnumField update tests initialization passed 488C1015 000.00s XShortEnumField.i2repr_one with update passed 0DAC950D 000.00s Raise exception - test data passed B45DBB97 000.00s default usage passed 74654715 000.00s inverted yes - no (scalar config) passed 92895491 000.00s inverted yes - no (range config) passed F22EC4EE 000.00s yes - no (using sets) passed 1E2122AB 000.00s yes, no and invalid passed F50D4F62 000.00s invalid scalar spec passed 1696BECE 000.00s invalid range spec - invalid length passed 4B8B44BC 000.00s invalid range spec - invalid value passed 3A64A190 000.00s invalid set spec - invalid value passed FD5682F6 000.00s FlasgField - Python incompatible name passed 7ABC2B56 000.00s Test initialization order passed D8E6560B 000.00s Default order passed 39AC5ACF 000.00s Reversed order passed 99D0148A 000.00s Test default values auto-update passed E8107B46 000.00s MultipleTypeField - syntax error passed 91DF4F1E 000.00s Test Flags Field Iterator passed 9E7F4CB7 000.00s Test upper nibble passed 1B04A4FD 000.00s Test lower nibble passed 7D3838E6 000.00s Test single flag 1 passed 571CAF9B 000.00s Test single flag 2 passed 6A1EFD0B 000.00s Test single flag 0x80 passed CDAC6203 000.00s Test pattern 0x55 passed 890D9CEB 000.00s Test pattern 0xAA passed 15FCB607 000.00s Test pattern 0x00 passed 567E8BE8 000.00s Test pattern 0xFF passed BF2749BA 000.00s FlagsField with str passed 0C4F6B6D 000.00s FlagsField with dict passed 5DF233C4 000.00s Conditional FlagsField command passed 44B19AAB 000.00s ScalingField Test default behaviour passed A231573C 000.00s ScalingField Test string assignment passed D18D7CEF 000.00s ScalingField Test scaling passed B56FEC5C 000.00s ScalingField Test scaling signed passed 5884C0E1 000.00s ScalingField Test scaling signed offset passed 3C241A76 000.00s ScalingField Test scaling offset passed AD7F3300 000.00s ScalingField Test unit passed B4122C4B 000.00s ScalingField Test unit and ndigits passed 100B2821 000.00s ScalingField Test unit and ndigits 2 passed FDA807AC 000.00s ScalingField Test unit and ndigits 3 passed E16F5885 000.00s ScalingField randval byte passed F67EC324 000.00s ScalingField randval byte 2 passed 0A84E725 000.00s ScalingField signed randval byte passed B8218E92 000.00s ScalingField signed randval byte 2 passed 620F1A7F 000.00s ScalingField signed randval short passed 2C1E2061 000.00s ScalingField signed randval int passed A3E507E5 000.00s ScalingField signed randval long passed 15384BF6 000.00s ScalingField signed randval long passed EACF4FA7 000.00s BitExtendedField: simple test passed 62207ABD 000.00s BitExtendedField i2m: corner values passed 8A2C0BEF 000.00s BitExtendedField i2m: field expansion passed D21BFA46 000.00s BitExtendedField i2m: test all FX bit positions passed 68193544 000.00s BitExtendedField m2i: test all FX bit positions passed 0DBE57AB 000.00s BitExtendedField m2i: stop at FX zero passed 8D9DD8E9 000.00s BitExtendedField m2i: multiple bytes passed C608B5D5 000.01s BitExtendedField m2i: invalid field with no stopping bit passed 1B29C871 000.00s LSBExtendedField passed B7CFE1FD 000.00s MSBExtendedField passed C8DF1936 000.00s Field Deprecation test passed 824FE140 000.01s FCSField: basic test passed F1FEB0EE 000.01s FCSField: multiple passed 9722690D 000.01s PacketField: randval() passed C4C85BD3 000.00s PacketField: randval(), PacketField in PacketField passed C8D9B7FA 000.01s Test parent reference in guess_payload_class passed 25F1894D 000.00s i2repr passed 69949DCF 000.00s unaligned data passed D760F7FF 000.01s unaligned data Campaign CRC=181E3724 in 000.78s SHA=29E3F06FCA977F3560B073D95875194E4F0DA687 PASSED=147 FAILED=0 ━ Loading: test/imports.uts passed 456053A5 000.03s Prepare importing all scapy files passed 816770EE 005.66s Try importing all core separately passed 1D3DC2E3 036.81s Try importing all layers separately passed B57BFE53 026.40s Try importing all contribs separately Campaign CRC=97C3718C in 068.90s SHA=BE08F1CED6FC819738093A665A97A1D86CC6FA71 PASSED=4 FAILED=0 ━ Loading: test/linux.uts passed CF5AD4BE 000.04s IPv6 link-local address selection passed CFDD191F 000.03s Routing table, interface with no names passed FE81D5D6 000.08s Reload interfaces & routes Campaign CRC=5789BFF4 in 000.16s SHA=BCC1041F9F4C6CB28F66E662207F370A0AF99477 PASSED=3 FAILED=0 ━ Loading: test/nmap.uts passed D4B85D3C 000.01s Module loading passed D4A566B0 000.01s Test functions passed 6E9310F7 000.23s Fetch database passed 445BCB55 000.11s Database loading passed 1E3CA419 000.00s Nmap base not available passed E290FF8C 000.00s Clear temp files Campaign CRC=B595AF90 in 000.36s SHA=C090CE797E3688F8B80D55D9F4798A85E211A867 PASSED=6 FAILED=0 ━ Loading: test/p0f.uts passed FDBDA0E1 000.03s Module loading passed 08581CC6 000.08s Fetch database passed AEE5211D 000.00s Test TCP p0f, SYN - Windows passed D3DDF7DC 000.00s Test TCP p0f, SYN - Linux passed 6D3D3134 000.01s Test TCP p0f, SYN - IPv6 FreeBSD passed D3DAB7CC 000.00s Test TCP p0f, SYN-ACK - Linux passed 25E0D8BE 000.01s Test HTTP p0f, request - wget passed A8B31707 000.00s Test HTTP p0f, response - nginx passed B470B9E2 000.00s Test MTU p0f passed 57328C93 000.00s Check that the impersonated packet is properly detected by p0f passed 51FF2E2E 000.01s Check incidence of MSS value on linux version detection passed 061C7EE9 000.00s Impersonate when window size must be multiple of some integer passed 0734A2D0 000.00s Impersonate when window size must be multiple of mss passed 86005C3B 000.01s Impersonate when the following quirks are present: seq-,ack-,pushf+,urgf+ passed E5AAFFD8 000.00s Use valid option values from original packet passed 13B8F121 000.00s Discard invalid options values passed 9BA73FDB 000.00s Remove fp files Campaign CRC=5F92BAA3 in 000.17s SHA=3FE27B3DC58E23C336CA83E42AE82C3C5F7C13BD PASSED=17 FAILED=0 ━ Loading: test/p0fv2.uts passed 2BDF8058 000.01s Module loading passed 1F11CF7C 000.40s Fetch database passed B64E3887 000.01s Test p0f passed 080CB4AC 000.00s Test prnp0f passed D1A1144A 000.00s Impersonate when window size must be multiple of some integer passed E1ED9C6C 000.00s Handle unusual flags ("F") quirk passed AE160304 000.00s Use valid option values from original packet passed 02854DEE 000.00s Use valid option values when multiples required passed 2129AF15 000.00s Discard non-multiple option values when multiples required passed 1FC59A60 000.00s Discard bad timestamp values passed E2259EB3 000.00s Discard 2nd timestamp of 0 if "T" quirk is present passed 101E107E 000.00s Remove fp files Campaign CRC=D4B8D091 in 000.46s SHA=06E614E4652E43AA44696CC54EE5C62F747B588A PASSED=12 FAILED=0 ━ Loading: test/pipetool.uts passed 5C9C4D1E 003.01s Test default test case passed 10405756 000.00s Test add_pipe passed F205E1DE 000.01s Test exhausted source passed DF905DB3 000.01s Test add_pipe on running instance passed 04395C32 000.01s Test Operators passed 03E71414 000.00s Test doc passed 6FD12EEC 000.01s Test RawConsoleSink with CLIFeeder passed 5993C5A6 000.01s Test QueueSink with CLIFeeder passed 78AB5F06 000.01s Test UpDrain passed F37DF15D 000.01s Test DownDrain passed B4648AEB 000.01s Test PeriodicSource exhaustion passed 47FD7E26 000.02s Test SniffSource passed 00D6F2A1 000.01s Test SniffSource with socket passed E9142AC6 000.00s Test SniffSource with invalid args passed C6C50B82 000.01s Test exhausted AutoSource and SniffSource passed 51B6A5D7 000.01s Test WiresharkSink passed 65269375 000.01s Test WiresharkSink with linktype passed B52144EC 000.01s Test WiresharkSink with args passed 9BC24C3D 000.02s Test RdpcapSource and WrpcapSink passed 5253C3FC 000.01s TriggerDrain and TriggeredValve with CLIFeeder passed 38B83B94 000.01s TriggerDrain and TriggeredValve with CLIHighFeeder passed 5253C3FC 000.02s TriggerDrain and TriggeredQueueingValve with CLIFeeder passed BDD3E66C 000.01s TriggerDrain and TriggeredSwitch with CLIFeeder on high channel passed 046C140A 000.01s TriggerDrain and TriggeredSwitch with CLIHighFeeder on low channel passed 1C0C74BE 000.02s TriggerDrain and TriggeredMessage passed 4B4F8A83 000.01s TriggerDrain and TriggeredQueueingValve on low channel passed 0B3A37E0 000.01s TriggerDrain and TriggeredQueueingValve on high channel passed 50B65DF1 000.02s UDPDrain passed B242EE60 000.00s FDSourceSink on a ObjectPipe object Campaign CRC=6433D204 in 003.31s SHA=53EFD29A2886FCDDE2BDBCEE54CB5FC6F4DF501F PASSED=29 FAILED=0 ━ Loading: test/random.uts passed E361BE7E 000.00s RandomEnumeration passed AFD3663D 000.00s RandIP6 passed B6596B0E 000.00s RandMAC passed CA109994 000.00s RandOID passed 33B58F1E 000.00s RandRegExp passed 2C4BB77C 000.00s Corrupted(Bytes|Bits) passed 44322B3F 000.00s RandEnumKeys passed 6B4FDBCB 000.00s RandSingNum passed ECCFC8E0 000.00s Rand* passed B54D1038 000.00s RandInt (test __bool__) passed 237847F1 000.01s Various volatiles Campaign CRC=3D33A34F in 000.03s SHA=8D3FA17266E4A181743FB7CC1D15456242A79A1D PASSED=11 FAILED=0 ━ Loading: test/regression.uts passed DA599690 000.00s Setup passed D18177CF 000.03s Get conf passed C7B4EFF2 000.00s Test module version detection passed FCFED32B 000.01s Check Scapy version passed 19EC7768 000.02s List layers passed FE0F029B 000.01s List layers - advanced passed CA149C8C 000.01s List packet fields - ls passed B614219C 000.00s List commands passed 8D74D4EE 000.02s List contribs passed 47087492 000.00s Test packet show() on LatexTheme passed 4D8EC3A7 000.01s Test rfc() passed DE8CCBA1 000.02s Check that all contrib modules are well-configured passed 0A631592 000.00s Configuration passed 3F6538B8 000.00s Configuration conf.use_* LINUX passed 37C97003 000.10s Configuration conf.use_pcap passed A123BCF3 000.01s Test layer filtering passed 970EB61E 000.00s UTscapy route check passed F5B5F60E 000.04s Interface related functions passed BF73AD45 000.00s More Interfaces related functions passed FC3E1AC8 000.07s Test conf.ifaces passed 735378A8 000.25s Test extcap detection in conf.ifaces passed 009779EA 000.06s Test read_routes6() - default output passed B5AC1166 000.01s Test read_routes6() - check mandatory routes passed 41EBC767 000.00s Test ifchange() passed DB13F153 000.00s Packet.route() passed 725E2FEF 000.00s utils/in4_is* passed 7A248DDC 000.00s plain_str test passed 16835536 000.00s test bytes_hex/hex_bytes passed 451B4F17 000.00s orb/chb passed 17CCED4A 000.01s Pickle and unpickle a packet passed 29EB7522 000.00s Usage test passed A5957D3E 000.25s Session test passed 358903D2 000.01s Session test with fname passed 77972341 000.00s Clear session files passed 0D050B28 000.02s Emulate interact() passed A6D81098 000.02s Emulate interact() and test startup.py with ptpython passed 7DF4BCBE 000.03s Test explore() with GUI mode passed 0BA85D98 000.01s Test explore() with non-GUI mode passed E528FB12 000.11s Test load_contrib overwrite passed E0AD57DF 000.00s Test load_contrib failure passed B97A8D27 000.00s Test sane function passed 83735EC6 000.00s Test lhex function passed 5E111AD7 000.01s Test restart function passed 709E8D59 000.00s Test linehexdump function passed 84F60AFB 000.00s Test chexdump function passed 77D2AF54 000.00s Test repr_hex function passed 18D9F734 000.00s Test hexstr function passed 135C9327 000.00s Test fletcher16 functions passed E79A6CFF 000.65s Test hexdiff function passed 5412F8DD 000.00s Test mysummary functions - Ether passed 438CB37E 000.00s Test zerofree_randstring function passed 1004ED2C 000.00s Test strand function passed 551512DF 000.00s Test export_object and import_object functions passed 15EB18BA 000.00s Test tex_escape function passed 2B1115A9 000.00s Test colgen function passed 025482C8 000.00s Test incremental_label function passed 31C7812D 000.00s Test corrupt_* functions passed BF0AED7D 000.00s Test save_object and load_object functions passed 5C42B43B 000.20s Test whois function passed 3DD268BC 000.08s Test manuf DB methods passed 0893702D 000.05s Test multiple wireshark's manuf formats passed 39DAE179 000.01s Test load_services passed 5D20ABC2 000.00s Test utility functions - network related passed 19F686D3 000.01s Test autorun functions passed A2664C3F 000.00s Test autorun with logging passed 33DA38EA 000.00s Test utility TEX functions passed 4BD657EE 000.00s Test config file functions passed 3E957C7C 000.00s Test config file functions failures passed 79DA91B5 000.00s Test CacheInstance repr passed 3CA5F78F 000.00s Test pyx detection functions passed 85701CA0 000.01s Test matplotlib detection functions passed 8A1DD746 000.00s Packet class methods passed B9320340 000.00s hide_defaults passed 630C8C4F 000.00s split_layers passed 3635E2A7 000.00s fuzz passed FE9D1A24 000.00s fuzz a Packet with MultipleTypeField passed 48E1CA2A 000.01s fuzz on packets with advanced RandNum passed 52407322 000.00s fuzz on packets with FlagsField passed 6CABED80 000.01s Building some packets passed 5975ADFF 000.00s Manipulating some packets passed 836BF8D1 000.01s Bind string array as payload passed 4E09A425 000.00s Checking overloads passed 3E36F166 000.00s sprintf() function passed 5D99FA28 000.00s sprintf() function passed F24A9F91 000.00s haslayer function passed 7B185480 000.01s getlayer function passed 3F096904 000.00s getlayer / haslayer with name passed EB905B84 000.00s getlayer with a filter passed 1751C560 000.00s specific haslayer and getlayer implementations for EAP passed 69995C65 000.00s specific haslayer and getlayer implementations for RadiusAttribute passed 7F8D0DEC 000.01s equality passed 8C9734CF 000.01s answers passed FA97BD89 000.04s answers - Net passed 82B9D32E 000.00s conf.checkIPsrc passed 91F3736E 000.00s Test command() with normal packet passed C775095D 000.00s Test json() with normal packet passed 24F3D7C5 000.00s Test command() with nested packet passed 639219AE 000.00s Test json() with nested packet passed 00B7D354 000.00s Test command() with ASN.1 packet passed 5E265BAA 000.00s Test json(à with ASN.1 packet passed 4FDDD895 000.00s Test command() with meaningless payload passed 11C404B0 000.00s Test json() with meaningless payload passed B05A8416 000.00s Padding assembly passed 4EE5535A 000.00s Padding and length computation passed E27148F7 000.00s PadField test passed 15BD6ED7 000.00s ReversePadField passed CBAAEDAF 000.00s Creation of an IPv3 class from IP class with different default values passed 6FA614B4 000.00s Test of IPv3 class passed 078501B1 000.00s ASN1 - ASN1_Object passed 850D779D 000.00s ASN1 - RandASN1Object passed 7EA44FC4 000.00s ASN1 - ASN1_BIT_STRING passed 5CF0AB92 000.00s ASN1 - ASN1_SEQUENCE passed 3AA85782 000.00s ASN1 - ASN1_DECODING_ERROR passed DD7EF478 000.00s ASN1 - ASN1_INTEGER passed 0613C657 000.00s ASN1 - ASN1_OID passed 7E6A9D70 000.00s RandASN1Object(), specific crashes passed 01E62F5E 000.01s SSID is parsed properly even with the presence of RSN Information passed AA451BE8 000.01s SSID is parsed properly even when the Country Information Tag Element has an odd length (not complying with the standard) and a missing pad byte passed 8C311638 000.04s Test sniffing with AsyncSniffer on failed passed 0B0BE316 000.00s test chainEX passed D5631F8D 000.20s Whois request passed 82E3936A 006.92s AS resolvers passed ABA510B8 000.64s AS resolver - IPv6 passed 0FA8EBD5 000.00s AS resolver - socket error passed A0F4B95B 000.01s sendpfast passed 6E277EB6 000.01s Implicit logic 1 passed 4C656AED 000.00s Implicit logic 2 passed 65799897 000.01s Implicit logic 3 passed 8373A7AD 000.01s sniff() with socket failure passed 83D0766D 000.00s Test SuperSocket.select passed 5DCEE3B3 000.00s Test L2ListenTcpdump socket passed 6746E7CA 000.00s __repr__ passed 1583A3C8 000.00s check _resolve_MAC passed 6F55A5F4 000.00s Variable creations passed 4F9FD49A 000.00s Read a pcap file passed 2B295E32 000.00s Read a pcapng file passed 9B99CFB9 000.00s Read a pcap file with nanosecond precision passed 6B69CA4B 000.01s Read a pcapng file with nanosecond precision and default tsresol passed 99487D9B 000.00s Read a pcapng with little-endian SHB passed F696F373 000.00s Write a pcapng passed 609DE317 000.01s Check wrpcapng() passed 6F000798 000.01s rdpcap on fifo passed A0F74356 000.20s Check multiple packets with different combination of linktype,comment,direction,sniffed_on fields. test both wrpcap() and wrpcapng() passed DBAB56A7 000.00s PcapNg - Process Information Block passed 8DA2919F 000.01s OSS-Fuzz Findings passed B86EA77D 000.00s Read a pcap file with wirelen != captured len passed 1A36F5AE 000.00s Check all packet lists are the same passed B2AE1B2E 000.00s Check packets from pcap file passed 81B3996C 000.00s Check wirelen value from pcap file passed 3B142116 000.00s Check wrpcap() then rdpcap() with wirelen passed 160D8ACD 000.00s Check wrpcap() then rdpcap() with sent_time on SndRcvList passed E20CA410 000.00s Check wrpcap() passed CDB28B86 000.00s Check offline sniff() (by PacketList) passed 5DB7D967 000.00s Check offline sniff() (by filename) passed 2F421D82 000.00s Check offline sniff() (by file object) passed 3C94713B 000.04s Check offline sniff() with a filter (by filename) passed FA2B2E6F 000.02s Check offline sniff() with a filter (by file object) passed AF82AAB9 000.01s Check offline sniff() with a PcapNg file and a filter (by file object) passed B1AB5190 000.04s Check offline sniff() with Packets and tcpdump with a filter passed 3BF7ACD4 000.00s Check offline sniff() with Packets, tcpdump and a bad filter passed E8881540 000.00s Check offline sniff with lfilter passed 1EBB8176 000.00s Check offline sniff() without a tcpdump binary passed B8A9D336 000.01s Check wrpcap(nano=True) passed 8C272C25 000.01s Check PcapNg with nanosecond precision using obsolete packet block passed 44D28963 000.00s Check PcapNg using Simple Packet Block passed BDD39671 000.00s Invalid pcapng files passed 9948C982 000.00s Check PcapWriter on null write passed 238CECEE 000.01s Check PcapWriter sets correct linktype after null write passed 30CD1304 000.00s Check RawPcapReader on pcap passed B9031CC5 000.00s Check RawPcapReader with a Context Manager passed EB3F93CD 000.00s Check RawPcapWriter passed C7C685B6 000.02s Check tcpdump() passed 12CFDB8E 000.01s Check tcpdump() command with linktype passed 06544347 000.01s Check tcpdump() command with linktype and args passed 15AD5567 000.02s Check sniff() offline with linktype & 802.11 filter passed 03178F06 000.00s Check tcpdump() command rejects non-string input for prog passed A1537C4A 000.23s Check tcpdump() command with tshark passed 206EA769 000.22s Check tdecode command directly for tshark passed 4B70552F 000.21s Check tdecode with linktype passed 4384A0D9 000.01s Check wireshark() passed 9D04DCE6 000.01s Check Raw IP pcap files passed C465B88B 000.00s Check wrpcap() with no packet passed A03B785B 000.00s Check wrpcap() with SndRcvList passed CAC4ACCF 000.00s Check wrpcap() with different packets types passed 4ABE5A5B 000.43s Check wrpcap() with the Loopback layer passed 7B522BF1 000.00s Variable creations passed E74E34A3 000.00s Check reading of ERF Ethernet file passed 1705B0BB 000.01s Check writing of ERF Ethernet file passed 349DEF1F 000.00s Check rderf passed 16EEC042 000.04s Create patcher util passed A1E67F25 000.02s OpenBSD 7.5 amd64 - read_routes() passed D100F6FF 000.04s OpenBSD 7.5 amd64 - read_routes6() passed 411CCCEB 000.01s FreeBSD 14.1 amd64 - read_routes() passed 85530AC7 000.02s FreeBSD 14.1 amd64 - read_routes6() passed D695A5A6 000.01s NetBSD 10.0 amd64 - read_routes() passed 22504BE8 000.04s NetBSD 10.0 amd64 - read_routes6() passed A14A0A4C 000.06s Darwin 23.6 (MacOS 14.5) x86_64 - read_routes() passed 309D51F5 000.21s Darwin 23.6 (MacOS 14.5) x86_64 - read_routes6() passed FE72B112 000.00s Test mocked _parse_tcpreplay_result passed A449085C 000.01s Test more recent version with flows passed 70BDE6F3 000.06s Mocked IPv4 routes calls passed 5B2614E8 000.07s Mocked IPv6 routes calls passed 2255E1EB 000.00s Windows: reset routes properly passed 5AA2E285 000.02s Test with DNS over TCP passed 93BC90F6 000.00s Test with recv() calls that return exact packet-length rawings passed 846CD785 000.00s Test with recv() calls that return twice as much data as the exact packet-length passed 31729BDB 000.01s Test with recv() calls that return not enough data passed 7F5F6D30 000.01s IPv6 bin to rawing conversion passed 4F88E5E2 000.00s IPv6 bin to rawing conversion - Zero-block of length 1 passed B043B4EE 000.00s IPv6 bin to rawing conversion - Illegal sizes passed F8B22202 000.00s Net passed 0999A1C4 000.01s Net using name passed 84596368 000.01s Net using implicit format in IP passed 5B4904DD 000.02s Multiple IP addresses test passed 2609BE5E 000.00s OID passed AD4A8CE3 000.00s Net6 passed DD990A2C 000.00s Net6 using implicit format in IPv6 passed E5893D82 000.01s Test repr on Net passed F878CD1A 000.00s in6_getLocalUniquePrefix() passed 4E154B45 000.00s Misc addresses manipulation functions passed 9B356652 000.00s in6_getscope() passed 158E29B1 000.00s construct_source_candidate_set() passed 8F99F845 000.01s inet_pton() passed 3E6AD142 000.05s make_route() passed 7C251239 000.05s add() & delt() passed C132633E 000.00s ifchange() passed 163CE9C0 000.00s ifdel() passed DB35A643 000.03s ifadd() & get_if_bcast() passed 80D1F40F 000.02s Remove dummy interface passed AB5C26EE 000.00s IP flags passed F79BD7F8 000.00s TCP flags passed E2D16013 000.00s Flag values mutation with .raw_packet_cache passed B29AD6EA 000.00s Operations on flag values passed 09859BDA 000.00s Test detection passed D68DAFF2 000.00s MIB passed F3924381 000.05s MIB - graph passed 80453ECF 000.00s MIB - test aliases passed 13DE7129 000.00s DADict tests passed 0F3147E1 000.01s Test ETHER_TYPES passed D17E70CE 000.00s MIB - Check that MIB OIDs are not duplicated passed 665F5863 000.00s BER tests passed 902D8DDD 000.00s BER trigger failures passed A40F4ACC 000.00s FieldLenField with BitField passed 97456282 000.00s PacketListField passed 8D363177 000.00s Test PacketListField deepcopy passed EE5096F6 000.00s PacketField passed FA8512FC 000.00s Parsing a human-readable UUID passed 20F8FDCC 000.00s Parsing a machine-encoded UUID passed 6D66DB8E 000.01s Parsing a tuple of values passed 43FF993A 000.00s Handle None values passed 84F5FFBA 000.00s Get a UUID for dissection passed E2A34AC6 000.00s Verify little endian UUIDField passed 814A1D27 000.00s Verify reversed UUIDField passed 84A2B964 000.00s RandUUID setup passed 54DEBA8F 000.00s RandUUID default behaviour passed F3EF8632 000.00s RandUUID incorrect implicit args passed FDED75F1 000.00s RandUUID v4 UUID (correct args) passed EC5945DF 000.00s RandUUID v4 UUID (incorrect args) passed 5C0AB483 000.00s RandUUID v1 UUID passed ECECDA5B 000.00s RandUUID v1 UUID (implicit version) passed 3060B0FE 000.00s RandUUID v1 UUID (incorrect args) passed 568DB606 000.00s RandUUID v5 UUID passed 367129C0 000.00s RandUUID v5 UUID (incorrect args) passed 3454E097 000.00s RandUUID v3 UUID passed 367129C0 000.00s RandUUID v3 UUID (incorrect args) passed 650D0FCF 000.00s RandUUID looks like a UUID with str passed F110F700 000.00s RandUUID with a static part passed B1A68738 000.00s RandUUID with a range part passed C6E5E197 000.01s MPLS - build/dissection passed 2248430B 000.00s MPLS encapsulated Ethernet with CW - build/dissection passed 71766601 000.01s MPLS encapsulated Ethernet without CW - build/dissection passed 24283CE2 000.00s MPLS encapsulated IP - build/dissection passed 176FDD85 000.01s sr() passed 1E6ADEC5 000.00s pickle test passed C50409A5 000.02s plot() passed 38181FB3 000.01s diffplot() passed E270A491 000.01s multiplot() passed 4A05AF0D 000.00s rawhexdump() passed 8CFD584C 000.00s hexraw() passed 869E1761 000.01s hexdump() passed DB8A3CCD 000.00s import_hexcap() passed 418D2AC7 000.00s import_hexcap(input_string) passed 3E3FECFE 000.00s padding() passed E22AFC40 000.00s nzpadding() passed 7239B5A7 000.02s conversations() passed AB4582C2 000.01s sessions() passed ECB6BF97 000.01s afterglow() passed FF32138C 000.00s psdump() passed 42D03931 000.00s pdfdump() passed 9147B2FC 000.00s svgdump() passed 99F51C1E 000.00s __getstate__ / __setstate__ (used by pickle) passed EDC07E3E 000.00s EDecimal passed C70C1056 000.01s _version() passed 7E1C8D9B 000.02s UTscapy HTML output passed 7B4709F1 000.00s test get_temp_dir passed 6AC51E14 000.02s test fragleak functions Campaign CRC=9885A784 in 013.13s SHA=7121F90D38A534BF2BE02979CAB9FBBCC6CB0427 PASSED=296 FAILED=0 ━ Loading: test/sendsniff.uts Campaign CRC=1B323DE1 in 000.00s SHA=603E2DF65E023EB72BB207472F4DA360B44FAD58 PASSED=0 FAILED=0 ━ Loading: test/tftp.uts passed CBBFDA20 000.00s Test answers passed 5F53F39B 000.01s Utilities passed 3E108A7F 000.01s TFTP_read() automaton passed 55E5D49C 000.01s TFTP_read() automaton error passed 38147847 000.01s TFTP_write() automaton passed 1A8CF22D 000.01s TFTP_write() automaton error passed 5EB44746 000.01s TFTP_WRQ_server() automaton passed D50C0642 000.02s TFTP_WRQ_server() automaton with options passed 85BF55FE 000.03s TFTP_RRQ_server() automaton Campaign CRC=FD085C8A in 000.11s SHA=C6E7B65D70B3CFF62892AD947E1FB8CDB364B386 PASSED=9 FAILED=0 ━ Loading: test/tuntap.uts passed 2120E469 000.00s Linux-specific protocol headers passed FE81D5D6 000.11s Cleanup Campaign CRC=A874BEBE in 000.11s SHA=809470408AEC04F3295A5A2078813729F0232618 PASSED=2 FAILED=0 ━ Loading: test/scapy/layers/asn1.uts passed D95C6143 000.00s short HH passed 4E127845 000.00s short HH (invalid) passed 11A165F1 000.00s short HHMM passed 3DDCEF2A 000.00s short HHMM (invalid) passed 10A0D165 000.00s full passed BA309686 000.00s full (invalid) passed 1F34F644 000.00s with microseconds passed CE4BFAE0 000.00s with microseconds (invalid) passed 97A83935 000.01s Z short HH passed 4F42A5D4 000.00s Z short HHMM passed 26C55C28 000.00s Z full passed 7766A817 000.00s Z with microseconds passed 613CB9BD 000.00s offset short HH passed 7C82C5EE 000.00s offset short HHMM passed 83BBD361 000.00s offset full passed 14F5D1B3 000.00s offset with microseconds passed 48ABFD3F 000.00s offset negative passed 2813116B 000.00s offset invalid (offset >= 24h) passed 503D7C59 000.01s UTC short HHMM passed 2E838E84 000.00s UTC short HHMM (no Z) passed 1D91B1AF 000.00s UTC short HHMM (invalid) passed 57E7CF21 000.00s UTC full passed 9C4E3B7F 000.00s UTC full (no Z) passed 7017A636 000.00s UTC full (invalid) passed 3656A400 000.00s prepare passed 4FD5C4D9 000.00s short HH datetime passed 940DD4D6 000.00s short HHMM datetime passed 2EC32DF0 000.01s full datetime passed FCA54579 000.00s datetime assignment passed 5842960D 000.00s datetime construction passed FA47C6CF 000.00s datetime construction (UTC) passed 1D5906A5 000.00s datetime construction (offset) passed 0F9574FF 000.00s UTC datetime construction passed ED1A0631 000.00s UTC datetime construction (Z) passed 92B6E418 000.00s UTC datetime construction (offset) Campaign CRC=BA410C79 in 000.07s SHA=69C8A829E09737E048CB60509F9F50D0EB2AB23A PASSED=35 FAILED=0 ━ Loading: test/scapy/layers/bluetooth.uts passed D48EE59B 000.02s HCI layers passed 34B7B7FD 000.00s Test HCI_PHDR_Hdr passed 0945B5F0 000.00s Create Connection passed 34517038 000.00s Authentication Requested passed 65B69FF7 000.00s Link Key Request Reply passed 124A25AA 000.00s Set Connection Encryption passed 838D2C41 000.00s Remote Name Request passed 3EFF5247 000.00s 7.3.12 Read Local Name passed 2AAB6934 000.01s 7.4.1 Read Local Version Information passed C39CD371 000.01s 7.4.4 Read Local Extended Features passed 4CF7049E 000.01s LE Create Connection passed 8D103942 000.01s LE Create Connection Cancel passed D4F061CB 000.00s Disconnect passed D9305D66 000.00s LE Connection Update Command passed 8FB83513 000.00s Inquiry Complete passed 74F973F6 000.00s Inquiry Result passed D8205367 000.00s Connection Complete passed 812F10A0 000.00s Disconnection Complete passed 7476554C 000.00s Remote Name Request Complete passed CFF63975 000.00s Encryption Change passed 6B00B916 000.00s Read Remote Supported Features Complete passed 6C8DDF9C 000.00s Read Remote Version Information Complete passed FA5A9D40 000.00s Command Complete passed 767927A5 000.00s Command Status passed 613BB124 000.00s Number Of Completed Packets passed 4BC0925C 000.00s Link Key Request passed 00000000 000.00s Inquiry Result with RSSI passed 9477E521 000.00s Read Remote Extended Features Complete passed 807A8100 000.00s Extended Inquiry Result passed CBC64E70 000.00s IO Capability Response passed 52263D53 000.00s LE Meta passed 6B099A56 000.00s LE Connection Update Event passed C6CE084A 000.00s Parse EIR_IncompleteList32BitServiceUUIDs passed 2639EC0A 000.00s Parse EIR_CompleteList32BitServiceUUIDs passed D98B8CD3 000.00s Parse EIR_ClassOfDevice passed 0913CFED 000.00s Parse EIR_ServiceData32BitUUID passed E279ABBA 000.00s Parse EIR_Flags, EIR_CompleteList16BitServiceUUIDs, EIR_CompleteLocalName and EIR_TX_Power_Level passed CBCEBE25 000.00s Parse EIR_Manufacturer_Specific_Data passed 75E9A69D 000.01s Parse EIR_Manufacturer_Specific_Data with magic passed D5066B69 000.00s Parse EIR_ServiceData16BitUUID passed FAD81431 000.00s Basic L2CAP dissect passed 88BBF466 000.00s Basic HCI_ACL_Hdr build & dissect passed E06C4A06 000.00s Complex HCI - L2CAP build passed 30734F0C 000.00s Complex HCI - L2CAP dissect passed F536B25B 000.00s HCI - L2CAP Echo test passed 15D30BED 000.00s HCI - L2CAP Create Channel request passed A86E9865 000.00s L2CAP Conn Answers passed 6A7A605D 000.01s EIR_Hdr - HCI_LE_Meta_Advertising_Report (single report) passed FE8DE930 000.02s EIR_Hdr - HCI_LE_Meta_Advertising_Report (duplicate reports) passed 8AE37F5F 000.02s ATT_Hdr - misc passed 15EAADC4 000.00s ATT Read_By_Type_Response passed 1B61265D 000.00s SM_Public_Key() tests passed 3B7175FE 000.00s SM_DHKey_Check() tests passed A2E7E815 000.00s HCI_Mon - Bluetooth Monitor Pcap Header passed 04770C4D 000.00s HCI_Mon - Bluetooth Monitor HCI_Mon_New_Index passed 604BFBCC 000.00s HCI_Mon - Bluetooth Monitor HCI_Mon_Delete_Index passed CB5F00BC 000.00s HCI_Mon - Bluetooth Monitor HCI_Mon_Index_Info passed 6E0C9B0F 000.00s HCI_Mon - Bluetooth Monitor HCI_Mon_System_Note Campaign CRC=5FC17991 in 000.23s SHA=BB6A36B28CDF0648A0487C6C530D324D2124274E PASSED=58 FAILED=0 ━ Loading: test/scapy/layers/bluetooth4LE.uts passed 9984EE5A 000.00s Default build passed 20EEB610 000.00s Basic dissection passed D470A3B4 000.00s BTLE_DATA build passed 9ECB5866 000.01s Longer BTLE_ADV passed A782E4AD 000.00s BTLE_DATA + EIR_ShortenedLocalName passed 5499128D 000.00s LL_CONNECTION_UPDATE_IND passed 78F80AEE 000.00s LL_CHANNEL_MAP_IND passed A9A5DC61 000.00s LL_TERMINATE_IND passed FB368406 000.00s LL_ENC_REQ passed 08337861 000.00s LL_ENC_RSP passed 48F7FD44 000.00s LL_START_ENC_REQ passed 14E88AAC 000.00s LL_START_ENC_RSP passed 3D51D732 000.00s LL_UNKNOWN_RSP passed DBE9DF2C 000.00s LL_FEATURE_REQ passed 888AA2CF 000.00s LL_FEATURE_RSP passed D102B049 000.00s LL_PAUSE_ENC_REQ passed 23A5A621 000.00s LL_PAUSE_ENC_RSP passed 6485E439 000.00s LL_VERSION_IND passed 9BB04ED5 000.00s LL_REJECT_IND passed 50577846 000.00s LL_SLAVE_FEATURE_REQ passed E47BD306 000.01s LL_CONNECTION_PARAM_REQ passed 0740BDA8 000.01s LL_CONNECTION_PARAM_RSP passed CDC0A9ED 000.00s LL_REJECT_EXT_IND passed FF3A5E4B 000.00s LL_PING_REQ passed 0D9D4823 000.00s LL_PING_RSP passed 2E009C5A 000.00s LL_LENGTH_REQ passed 13EE388C 000.00s LL_LENGTH_RSP passed FF72160E 000.00s LL_PHY_REQ passed E6D76118 000.01s LL_PHY_RSP passed 6211D420 000.06s LL_PHY_UPDATE_IND passed 9AB7FD6C 000.00s BTLE_DATA + BTLE_EMPTY_PDU passed A21263DF 000.01s BTLE_DATA + ATT_PrepareWriteReq passed F0D2F433 000.01s BTLE layers passed 8BF33286 000.01s BTLE_RF link passed 9E7FFC52 000.00s DLT_USER0 with PPI passed 0F3537E5 000.00s DLT_BLUETOOTH_LE_LL with PPI passed 00356CCF 000.00s DLT_BLUETOOTH_LE_LL without PPI Campaign CRC=740E8BA5 in 000.20s SHA=F2EEDBDADE3F1B9DE047118A37CAC8FB1F8B6AC5 PASSED=37 FAILED=0 ━ Loading: test/scapy/layers/can.uts passed 337E8646 000.00s Load module passed BF15F873 000.00s Build a packet passed E055F517 000.01s Dissect & parse passed D0813640 000.00s Check flags values passed 967F2D9F 000.00s Read PCAP file passed C1A6EB8B 000.00s Check if parsing worked: each packet has a CAN layer passed E40575B5 000.00s Check if parsing worked: no packet has a Raw or Padding layer passed 76311047 000.00s Identifiers passed EF39590C 000.00s Flags passed BC62DA16 000.00s Data length passed 23AC1A94 000.00s read PCAP of a CookedLinux/SocketCAN capture with CANFD frames passed 0756AB29 000.00s Check if parsing worked: each packet has a CANFD layer passed 29FDCD48 000.00s read PCAP of a CookedLinux/SocketCAN capture (CAN standard and extended) passed DD95CBA8 000.00s check CAN is detected over CookedLinux (each packet has both layers) passed E40575B5 000.00s Check if parsing worked: no packet has a Raw or Padding layer passed 95A2D6C1 000.00s Check byte swap for dissection passed FF99CC4C 000.00s Check byte swap-back for building passed A09B1357 000.00s Check building CAN packet with not padded data field passed 24B03B95 000.00s Check rdcandump default passed E9F17638 000.01s Check rdcandump_iterable default passed EFC00941 000.01s Check rdcandump filter passed 2F042CAE 000.00s interface not log file format passed 2F273CB6 000.00s interface not log file format filtered 1 passed E2835480 000.00s interface not log file format filtered 2 passed 23D70CAA 000.00s interface not log file format filtered 2 count 1 passed E04C11E0 000.00s interface not log file format filtered 2 count 2 passed 62BD1BB3 000.00s default reading passed B8050045 000.00s default reading passed 83C56D45 000.00s interface not log file format passed D748BFF8 000.00s Test invalid fields_desc passed 37ECFE8D 000.00s Test invalid fields_desc with ConditionalField passed FBB1EC76 000.01s Motorola byte order (Big Endian) dissect test passed 299CE32F 000.00s Motorola byte order (Big Endian) build test passed 738149B8 000.01s Motorola byte order (Big Endian) dissect test with mixed field order passed 1A9ED9BD 000.01s Motorola byte order (Big Endian) build test with mixed field order passed 8C8E3C8A 000.01s Intel byte order (Little Endian) dissect test passed 0AB215A0 000.00s Intel byte order (Little Endian) build test passed C4E18912 000.01s Intel byte order (Little Endian) build test with mixed field order passed 99ADA4DE 000.01s Intel byte order (Little Endian) build test with short package passed 090EC7E7 000.00s Packet with mixed endianness fields build test passed F41DFA9D 000.01s Muxed Packet with mixed endianness fields build test passed 764AE80B 000.01s Muxed Packet build test passed 33B8634D 000.01s SignalHeader Muxed Packet build test passed FEE5D5D7 000.01s Intel byte order (Little Endian) SignalPacket dissect test passed D06AB3A7 000.01s Intel byte order (Little Endian) short SignalPacket dissect test passed A97DBA7D 000.01s Intel byte order (Little Endian) short SignalPacket dissect test mixed field order passed 090EC7E7 000.01s Packet with mixed endianness fields build test passed D856826B 000.01s Packet with mixed endianness fields build test, mixed field order passed 155DA1AC 000.00s Packet with mixed endianness fields dissect test, mixed field order passed 94ECA0C2 000.01s Packet with mixed endianness fields dissect test, mixed field order and scaling passed 94ECA0C2 000.01s Packet with mixed endianness fields dissect test, mixed field order and scaling passed 3AA461CB 000.01s Packet with mixed endianness fields dissect test, mixed field order and scaling and offset passed AE88B971 000.01s Packet with mixed endianness fields dissect test, mixed field order and scaling and offset passed 9B2587C8 000.00s Packet with mixed endianness fields dissect test, mixed field order and scaling with signed values passed 45D3C7E8 000.00s Packet with mixed endianness fields dissect test, mixed field order and scaling with signed values passed 1D12D05F 000.01s Packet with big endianness signals passed 373FF5DF 000.01s Packet with little endianness signals passed 47174EEF 000.00s Packet with float signals build test passed B142439C 000.00s Packet with float signals dissect test passed 2B4A2A85 000.00s Packet with float signals build test 2 passed B142439C 000.00s Packet with float signals dissect test 2 passed 66AC128B 000.00s Packet with float signals randval passed 5C3B739B 000.00s Packet with float signals fuzz passed AF9620A5 000.16s Test signal fuzzing offset 1 passed BAB8DA21 000.15s Test signal fuzzing offset 2 and scaling passed CFF360AC 000.15s Test signal fuzzing offset 3 passed 1732949E 000.14s Test signal fuzzing offset 4 and scaling passed 89FE5A16 000.15s Test signal fuzzing offset 5 and scaling passed A9DC7F3D 000.09s Test FloatSignal fuzzing 1 passed 4087DAA7 000.01s Load SecOC_CANFD passed 9EBF066B 000.01s Test SecOC_CANFD build Campaign CRC=ED9DB948 in 001.16s SHA=A9847F0B41F4112BAAC85A3C2A2C5CA87FBE0772 PASSED=71 FAILED=0 ━ Loading: test/scapy/layers/dcerpc.uts passed 6564624A 000.00s Import the DCE/RPC layer passed 3B4AF116 000.00s Little Endian IntField getfield passed EEA94D51 000.00s Little Endian IntField addfield passed CFF1CF21 000.00s Big Endian IntField getfield passed 7D9771FD 000.00s Big Endian IntField addfield passed 1091B51E 000.00s Little Endian StrField getfield passed 643EE84F 000.00s Little Endian StrField addfield passed 21C411D6 000.00s Big Endian StrField getfield passed 5F14CFE1 000.00s Big Endian StrField addfield passed F2D3D36C 000.00s Little Endian UUIDField getfield passed 1021AB20 000.00s Little Endian UUIDField addfield passed 4B64C739 000.00s Big Endian UUIDField getfield passed 9C60EDE9 000.00s Big Endian UUIDField addfield passed B0F45D0C 000.00s Dissect DCE/RPC v5 Request with Kerberos GSSAPI/RFC1964 passed AC92A165 000.00s Dissect DCE/RPC v5 Request EPM map request passed 3B692EDC 000.01s Dissect DCE/RPC v5 Bind request with NETLOGON secure channel passed 25CDDA83 000.00s Dissect DCE/RPC v5 Bind Response with NETLOGON secure channel passed AB6C37C7 000.00s Dissect DCE/RPC v5 Response with NETLOGON secure channel passed 23297174 000.01s Build and dissect DCE/RPC with auth_pad passed 77C7CC87 000.01s Build and dissect DCE/RPC with vt_trailer passed FF113B72 000.01s Dissect DCE/RPC containing two fragments: Auth3 and a Request passed C16AE844 000.00s DCE/RPC 4 default values passed 7D6FF451 000.00s DCE/RPC 4: payload length computation passed E119BDBD 000.00s DCE/RPC 4: Guess payload class fallback with no possible payload passed 2A0D9AE1 000.00s DCE/RPC 4: Guess payload class to a registered heuristic payload passed E119BDBD 000.00s DCE/RPC 4: Guess payload class fallback with possible payload classes passed 778CA3BA 000.00s DCE/RPC 4: little-endian build passed 967BCC82 000.00s DCE/RPC 4: little-endian dissection passed 2B7D1382 000.00s DCE/RPC 5 NDR: Create NDR Packet passed B32DA411 000.00s DCE/RPC 5 NDR: Check user friendliness passed BA9C44DE 000.00s DCE/RPC 5 NDR: Try building it passed C3A41653 000.00s DCE/RPC 5 NDR: Re-dissect passed A7CEBAEB 000.01s DCE/RPC 5 NDR: Same thing with NDR32 passed 842B0E5D 000.03s DCE/RPC 5 NDR: Define structs passed D2FD498F 000.00s DCE/RPC 5 NDR: Build test passed C590BA57 000.01s DCE/RPC 5 NDR: Dissect test passed 591B1959 000.54s DCE/RPC 5 NDR: Dissect packet with NDRVarStrLenField passed 9AF3A684 000.04s DCE/RPC 5 NDR: Test DEPORTED_CONFORMANTS with offsetted padding passed 0BB890F8 000.07s [PASSIVE] Passive sniffing of DCE/RPC packets encrypted with SPNEGOSSP[NTLMSSP] passed A87BC174 000.11s [PASSIVE] Passive sniffing of DCE/RPC packets encrypted with SPNEGOSSP[KerberosSSP] with AES passed F9A453C5 000.05s Functional: Define a MS-RPC server passed DEB39184 000.01s Functional: Define wrapper over samba's rpcclient passed D29D4A5B 000.01s Functional: Start the MS-RPC server over NCACN_IP_TCP with NTLMSSP passed 60C1A17F 000.12s Functional: Connect to it with DCERPC_Client over NCACN_IP_TCP with NTLMSSP passed 37D34B9C 000.00s Functional: Close the server passed 40A042D4 000.08s Functional: Re-Start the same MS-RPC server over NCACN_IP_TCP with KerberosSSP passed 88D5049F 000.10s Functional: Connect to it with DCERPC_Client over NCACN_IP_TCP with KerberosSSP passed 37D34B9C 000.00s Functional: Close the server passed 8E808E8C 000.01s Functional: Re-Start the same MS-RPC server over NCACN_NP passed 7BDFFF83 000.16s Functional: Connect to it with DCERPC_Client over NCACN_NP passed D1AC5C99 000.01s Functional: Re-Start the same MS-RPC server over NCACN_NP with SPNEGOSSP+NTLMSSP passed A7D9BBD0 000.17s Functional: Connect to it with DCERPC_Client over NCACN_NP with NTLMSSP passed 251B7DAA 000.17s Functional: Connect to the server with samba's rpcclient over NCACN_NP with NTLMSSP passed 37D34B9C 000.01s Functional: Close the server Campaign CRC=3F73852B in 001.79s SHA=E0880544C7B4F22698B7EB7B2FD4F184C2586253 PASSED=54 FAILED=0 ━ Loading: test/scapy/layers/dhcp.uts passed E40548DD 000.00s BOOTP - misc passed E3D749AC 000.00s DHCPOptionsField passed 96947C8B 000.01s DHCP - build passed 23EF30BE 000.00s DHCP - fuzz passed B87DCF29 000.01s DHCP - dissection passed B1A86CEC 000.00s DHCPOptions passed 4B8425B0 000.00s Check that the dhcpd alias is properly defined and documented Campaign CRC=9928D8C9 in 000.04s SHA=95109C0C5DF6748BAE4003224340026BFE5B8543 PASSED=7 FAILED=0 ━ Loading: test/scapy/layers/dhcp6.uts passed C79D9319 000.00s DUID_LLT basic instantiation passed 573F6218 000.00s DUID_LLT basic build passed 126A2667 000.00s DUID_LLT build with specific values passed 77E99B3D 000.00s DUID_LLT basic dissection passed 643AC523 000.00s DUID_LLT dissection with specific values passed CF5040FC 000.00s DUID_EN basic instantiation passed 69C01E88 000.00s DUID_EN basic build passed ACC4AB6F 000.00s DUID_EN build with specific values passed 160378C7 000.00s DUID_EN basic dissection passed 6582ABBC 000.00s DUID_EN dissection with specific values passed B1DCDB18 000.00s DUID_LL basic instantiation passed 0A128751 000.00s DUID_LL basic build passed FF3E4251 000.00s DUID_LL build with specific values passed F3F48399 000.00s DUID_LL basic dissection passed 5F3C7367 000.00s DUID_LL with specific values passed 47906855 000.00s DUID_UUID basic instantiation passed E1F2A3BA 000.00s DUID_UUID basic build passed 28EAD2EC 000.00s DUID_UUID build with specific values passed 8B0D92F1 000.00s DUID_UUID basic dissection passed BBC16669 000.00s DUID_UUID with specific values passed 7BAA0C6D 000.00s DHCP6 Opt Unknown basic instantiation passed 2B585C11 000.00s DHCP6 Opt Unknown basic build (default values) passed 35654E89 000.00s DHCP6 Opt Unknown - len computation test passed 362E31B1 000.00s DHCP6OptClientId basic instantiation passed FF2048D7 000.00s DHCP6OptClientId basic build passed EB8F837C 000.00s DHCP6OptClientId instantiation with specific values passed 90E0BE87 000.00s DHCP6OptClientId instantiation with DUID_LL passed E251CCE9 000.00s DHCP6OptClientId instantiation with DUID_LLT passed EF3404CD 000.00s DHCP6OptClientId instantiation with DUID_EN passed 770629E3 000.00s DHCP6OptClientId instantiation with specified length passed 4D7691F7 000.00s DHCP6OptClientId basic dissection passed 770629E3 000.00s DHCP6OptClientId instantiation with specified length passed 4D7691F7 000.00s DHCP6OptClientId basic dissection passed 02025171 000.00s DHCP6OptClientId dissection with specific duid value passed 4BF9A59A 000.00s DHCP6OptClientId dissection with specific DUID_LL as duid value passed 7335375D 000.00s DHCP6OptClientId dissection with specific DUID_LLT as duid value passed 96FDC4D3 000.00s DHCP6OptClientId dissection with specific DUID_EN as duid value passed 2F43A84F 000.00s DHCP6OptServerId basic instantiation passed 4C04F6BC 000.00s DHCP6OptServerId basic build passed AD40A748 000.00s DHCP6OptServerId basic build with specific values passed C8B4C371 000.00s DHCP6OptServerId instantiation with DUID_LL passed B34DB4DA 000.00s DHCP6OptServerId instantiation with DUID_LLT passed F24A4510 000.00s DHCP6OptServerId instantiation with DUID_EN passed 2ACA0AC9 000.00s DHCP6OptServerId instantiation with specified length passed 0E4510ED 000.00s DHCP6OptServerId basic dissection passed 25088EF1 000.00s DHCP6OptServerId dissection with specific duid value passed FCEA3AAD 000.00s DHCP6OptServerId dissection with specific DUID_LL as duid value passed 17596198 000.00s DHCP6OptServerId dissection with specific DUID_LLT as duid value passed 02BDF3DF 000.00s DHCP6OptServerId dissection with specific DUID_EN as duid value passed 8E5AF373 000.00s DHCP6OptIAAddress - Basic Instantiation passed 50C9AB86 000.00s DHCP6OptIAAddress - Basic Dissection passed 5C745AE2 000.00s DHCP6OptIAAddress - Instantiation with specific values passed 180DE904 000.00s DHCP6OptIAAddress - Instantiation with specific values (default optlen computation) passed 5304CAF8 000.00s DHCP6OptIAAddress - Dissection with specific values passed 77B71ADD 000.00s DHCP6OptIA_NA - Basic Instantiation passed FA5B1DB5 000.00s DHCP6OptIA_NA - Basic Dissection passed 124509AF 000.00s DHCP6OptIA_NA - Instantiation with specific values (keep automatic length computation) passed 35BE0F11 000.00s DHCP6OptIA_NA - Instantiation with specific values (forced optlen) passed 2BF7A72A 000.00s DHCP6OptIA_NA - Instantiation with a list of IA Addresses (optlen automatic computation) passed CC90E33C 000.00s DHCP6OptIA_NA - Dissection with specific values passed C90EBD9B 000.00s DHCP6OptIA_NA - Instantiation with a list of different opts: IA Address and Status Code (optlen automatic computation) passed 2049AD1A 000.00s DHCP6OptIA_TA - Basic Instantiation passed 3445CAE0 000.00s DHCP6OptIA_TA - Basic Dissection passed C518AC84 000.00s DHCP6OptIA_TA - Instantiation with specific values passed 758C776D 000.00s DHCP6OptIA_TA - Dissection with specific values passed C5715683 000.00s DHCP6OptIA_TA - Instantiation with a list of different opts: IA Address and Status Code (optlen automatic computation) passed 36705FC1 000.00s DHCP6OptOptReq - Basic Instantiation passed 74BD65BF 000.00s DHCP6OptOptReq - optlen field computation passed 1966E096 000.00s DHCP6OptOptReq - instantiation with empty list passed 4562AC37 000.00s DHCP6OptOptReq - Basic dissection passed 2CEBB2FD 000.00s DHCP6OptOptReq - Dissection with specific value passed EF01D128 000.00s DHCP6OptOptReq - repr passed 83CD3B19 000.00s DHCP6OptPref - Basic instantiation passed 9ABD2F75 000.00s DHCP6OptPref - Instantiation with specific values passed A26ADA84 000.00s DHCP6OptPref - Basic Dissection passed 5A11B8FB 000.00s DHCP6OptPref - Dissection with specific values passed F99BAE27 000.00s DHCP6OptElapsedTime - Basic Instantiation passed 3170EBDD 000.00s DHCP6OptElapsedTime - Instantiation with specific elapsedtime value passed 01D564C9 000.00s DHCP6OptElapsedTime - Basic Dissection passed A0FC2104 000.00s DHCP6OptElapsedTime - Dissection with specific values passed EF01D128 000.00s DHCP6OptElapsedTime - Repr passed 12093175 000.00s DHCP6OptServerUnicast - Basic Instantiation passed B593271B 000.00s DHCP6OptServerUnicast - Instantiation with specific values (test 1) passed AB1E0B0E 000.00s DHCP6OptServerUnicast - Instantiation with specific values (test 2) passed E68815C3 000.00s DHCP6OptServerUnicast - Dissection with default values passed 0A2A1DCB 000.00s DHCP6OptServerUnicast - Dissection with specific values (test 1) passed ABCD8B8B 000.00s DHCP6OptServerUnicast - Dissection with specific values (test 2) passed 483BB9D5 000.00s DHCP6OptStatusCode - Basic Instantiation passed 59E4DBFE 000.00s DHCP6OptStatusCode - Instantiation with specific values passed C973546A 000.00s DHCP6OptStatusCode - Automatic Length computation passed C12FEA58 000.00s DHCP6OptRapidCommit - Basic Instantiation passed 89359BEA 000.00s DHCP6OptRapidCommit - Basic Dissection passed 21E9E578 000.00s DHCP6OptUserClass - Basic Instantiation passed C728FB45 000.00s DHCP6OptUserClass - Basic Dissection passed 4FFE3CEC 000.00s DHCP6OptUserClass - Instantiation with one user class data rawucture passed 1397460A 000.00s DHCP6OptUserClass - Dissection with one user class data rawucture passed 57A1E3CB 000.00s DHCP6OptUserClass - Instantiation with two user class data rawuctures passed 1841DC70 000.00s DHCP6OptUserClass - Dissection with two user class data rawuctures passed 42297BF6 000.00s DHCP6OptVendorClass - Basic Instantiation passed 4CE36928 000.00s DHCP6OptVendorClass - Basic Dissection passed 9B354873 000.00s DHCP6OptVendorClass - Instantiation with one vendor class data rawucture passed 469486B5 000.00s DHCP6OptVendorClass - Dissection with one vendor class data rawucture passed C023DF29 000.00s DHCP6OptVendorClass - Instantiation with two vendor class data rawuctures passed 1D2D4C13 000.00s DHCP6OptVendorClass - Dissection with two vendor class data rawuctures passed 6E1B3AF2 000.00s DHCP6OptVendorSpecificInfo - Basic Instantiation passed C428A8A6 000.00s DHCP6OptVendorSpecificInfo - Basic Dissection passed F67D2ACA 000.00s DHCP6OptVendorSpecificInfo - Instantiation with specific values (one option) passed F5159739 000.00s DHCP6OptVendorSpecificInfo - Dissection with with specific values (one option) passed 3BD3252A 000.00s DHCP6OptVendorSpecificInfo - Instantiation with specific values (two options) passed D85C1FDC 000.00s DHCP6OptVendorSpecificInfo - Dissection with with specific values (two options) passed AE0C4328 000.00s DHCP6OptIfaceId - Basic Instantiation passed 54DD9335 000.00s DHCP6OptIfaceId - Basic Dissection passed 9500371E 000.00s DHCP6OptIfaceId - Instantiation with specific value passed 692CCF89 000.00s DHCP6OptIfaceId - Dissection with specific value passed FE4BFB1C 000.00s DHCP6OptReconfMsg - Basic Instantiation passed 97DE5AA0 000.00s DHCP6OptReconfMsg - Basic Dissection passed 63C038DE 000.00s DHCP6OptReconfMsg - Instantiation with specific values passed 223A58FB 000.00s DHCP6OptReconfMsg - Dissection with specific values passed 7FE87B62 000.00s DHCP6OptReconfAccept - Basic Instantiation passed CCE32A09 000.00s DHCP6OptReconfAccept - Basic Dissection passed 6884B85A 000.00s DHCP6OptReconfAccept - Instantiation with specific values passed 7E254112 000.00s DHCP6OptReconfAccept - Dssection with specific values passed 6A0FEC94 000.00s DHCP6OptSIPDomains - Basic Instantiation passed 5C613FC4 000.00s DHCP6OptSIPDomains - Basic Dissection passed 222818B4 000.00s DHCP6OptSIPDomains - Instantiation with one domain passed 1A45951B 000.00s DHCP6OptSIPDomains - Dissection with one domain passed 1B52FA95 000.00s DHCP6OptSIPDomains - Instantiation with two domains passed F9C93597 000.00s DHCP6OptSIPDomains - Dissection with two domains passed AF257E77 000.00s DHCP6OptSIPDomains - Enforcing only one dot at end of domain passed 9E523117 000.00s DHCP6OptSIPServers - Basic Instantiation passed 759AFEC2 000.00s DHCP6OptSIPServers - Basic Dissection passed EF893C3F 000.00s DHCP6OptSIPServers - Instantiation with specific values (1 address) passed 8F637FA2 000.00s DHCP6OptSIPServers - Dissection with specific values (1 address) passed 63D24C8F 000.00s DHCP6OptSIPServers - Instantiation with specific values (2 addresses) passed CDDCF6B2 000.00s DHCP6OptSIPServers - Dissection with specific values (2 addresses) passed A2AE85FD 000.00s DHCP6OptDNSServers - Basic Instantiation passed 58D8E580 000.00s DHCP6OptDNSServers - Basic Dissection passed A9444EC5 000.00s DHCP6OptDNSServers - Instantiation with specific values (1 address) passed BC746583 000.00s DHCP6OptDNSServers - Dissection with specific values (1 address) passed ED35320B 000.00s DHCP6OptDNSServers - Instantiation with specific values (2 addresses) passed 952E3E66 000.00s DHCP6OptDNSServers - Dissection with specific values (2 addresses) passed 4CCFB8F0 000.00s DHCP6OptDNSDomains - Basic Instantiation passed E1F53152 000.00s DHCP6OptDNSDomains - Basic Dissection passed 17CB7DD8 000.00s DHCP6OptDNSDomains - Instantiation with specific values (1 domain) passed 5535AD9E 000.00s DHCP6OptDNSDomains - Dissection with specific values (1 domain) passed 4AD4CE63 000.00s DHCP6OptDNSDomains - Instantiation with specific values (2 domains) passed 9FB29EBC 000.00s DHCP6OptDNSDomains - Dissection with specific values (2 domains) passed 6FC64603 000.00s DHCP6OptIAPrefix - Basic Instantiation passed 8BC01797 000.00s DHCP6OptIAPrefix - Basic Dissection passed 890662B7 000.00s DHCP6OptIAPrefix - Instantiation with specific values passed 3CA899EB 000.00s DHCP6OptIAPrefix - Instantiation with specific values (default optlen computation) passed 7F436536 000.00s DHCP6OptIAPrefix - Dissection with specific values passed B851ABE7 000.00s DHCP6OptIA_PD - Basic Instantiation passed 1ED94E0C 000.00s DHCP6OptIA_PD - Basic Dissection passed 8CE67D52 000.00s DHCP6OptIA_PD - Instantiation with specific values (keep automatic length computation) passed 67D8D9BC 000.00s DHCP6OptIA_PD - Instantiation with specific values (forced optlen) passed 4065D7F8 000.00s DHCP6OptIA_PD - Instantiation with a list of IA Prefixes (optlen automatic computation) passed 1D7BEA97 000.00s DHCP6OptIA_PD - Dissection with specific values passed B4D0102A 000.00s DHCP6OptIA_PD - Instantiation with a list of different opts: IA Prefix and Status Code (optlen automatic computation) passed 7FEABB0F 000.00s DHCP6OptNISServers - Basic Instantiation passed 2D3E55AB 000.00s DHCP6OptNISServers - Basic Dissection passed 8A415BEB 000.00s DHCP6OptNISServers - Instantiation with specific values (1 address) passed A2FEE027 000.00s DHCP6OptNISServers - Dissection with specific values (1 address) passed 7219CF98 000.00s DHCP6OptNISServers - Instantiation with specific values (2 addresses) passed 7F300088 000.00s DHCP6OptNISServers - Dissection with specific values (2 addresses) passed 9F10D357 000.00s DHCP6OptNISPServers - Basic Instantiation passed 7C52E80C 000.00s DHCP6OptNISPServers - Basic Dissection passed DB9FD9BA 000.00s DHCP6OptNISPServers - Instantiation with specific values (1 address) passed 132B557E 000.00s DHCP6OptNISPServers - Dissection with specific values (1 address) passed 0B2A759C 000.00s DHCP6OptNISPServers - Instantiation with specific values (2 addresses) passed 0B95A772 000.00s DHCP6OptNISPServers - Dissection with specific values (2 addresses) passed 35E92EE5 000.00s DHCP6OptNISDomain - Basic Instantiation passed FC357773 000.00s DHCP6OptNISDomain - Basic Dissection passed 771D2456 000.00s DHCP6OptNISDomain - Instantiation with one domain name passed B60B8275 000.00s DHCP6OptNISDomain - Dissection with one domain name passed E3058EF2 000.00s DHCP6OptNISDomain - Instantiation with one domain with trailing dot passed E7939353 000.00s DHCP6OptNISPDomain - Basic Instantiation passed EEDA00A7 000.00s DHCP6OptNISPDomain - Basic Dissection passed 83274083 000.00s DHCP6OptNISPDomain - Instantiation with one domain name passed 2E63DD48 000.00s DHCP6OptNISPDomain - Dissection with one domain name passed 521B902B 000.00s DHCP6OptNISPDomain - Instantiation with one domain with trailing dot passed 76F9E6A2 000.00s DHCP6OptSNTPServers - Basic Instantiation passed A82BAC3C 000.00s DHCP6OptSNTPServers - Basic Dissection passed C6B08BC2 000.00s DHCP6OptSNTPServers - Instantiation with specific values (1 address) passed 1DA0E113 000.00s DHCP6OptSNTPServers - Dissection with specific values (1 address) passed E6063C82 000.00s DHCP6OptSNTPServers - Instantiation with specific values (2 addresses) passed 1A9361CE 000.00s DHCP6OptSNTPServers - Dissection with specific values (2 addresses) passed 32E1CE95 000.00s DHCP6OptInfoRefreshTime - Basic Instantiation passed DB05D6F2 000.00s DHCP6OptInfoRefreshTime - Basic Dissction passed 0C267524 000.00s DHCP6OptInfoRefreshTime - Instantiation with specific values passed 4B176846 000.00s DHCP6OptBCMCSServers - Basic Instantiation passed DB90931E 000.00s DHCP6OptBCMCSServers - Basic Dissection passed D169C53A 000.00s DHCP6OptBCMCSServers - Instantiation with specific values (1 address) passed 5E8A233D 000.00s DHCP6OptBCMCSServers - Dissection with specific values (1 address) passed 8C4433DB 000.00s DHCP6OptBCMCSServers - Instantiation with specific values (2 addresses) passed B47B1DC0 000.00s DHCP6OptBCMCSServers - Dissection with specific values (2 addresses) passed 6379536D 000.00s DHCP6OptBCMCSDomains - Basic Instantiation passed E3180DCC 000.00s DHCP6OptBCMCSDomains - Basic Dissection passed 3F135354 000.00s DHCP6OptBCMCSDomains - Instantiation with specific values (1 domain) passed FF72EB2B 000.00s DHCP6OptBCMCSDomains - Dissection with specific values (1 domain) passed 6D92A894 000.00s DHCP6OptBCMCSDomains - Instantiation with specific values (2 domains) passed 477EE63F 000.00s DHCP6OptBCMCSDomains - Dissection with specific values (2 domains) passed 8C71EC2F 000.00s DHCP6OptRemoteID - Basic Instantiation passed 6B9A6137 000.00s DHCP6OptRemoteID - Basic Dissection passed B03424CE 000.00s DHCP6OptRemoteID - Instantiation with specific values passed D46CC6A3 000.00s DHCP6OptRemoteID - Dissection with specific values passed DCD7B680 000.00s DHCP6OptSubscriberID - Basic Instantiation passed 139DE428 000.00s DHCP6OptSubscriberID - Basic Dissection passed CD2EC53A 000.00s DHCP6OptSubscriberID - Instantiation with specific values passed A13CA093 000.00s DHCP6OptSubscriberID - Dissection with specific values passed 3F74488E 000.00s DHCP6OptClientFQDN - Basic Instantiation passed A84B7210 000.00s DHCP6OptClientFQDN - Basic Dissection passed FDF061CC 000.00s DHCP6OptClientFQDN - Instantiation with various flags combinations passed 1787A293 000.00s DHCP6OptClientFQDN - Instantiation with one fqdn passed 3E86FB9D 000.00s DHCP6OptClientFQDN - Dissection with one fqdn passed 6E81346C 000.00s DHCP6OptPanaAuthAgent - Basic Instantiation passed 66B70519 000.00s DHCP6OptPanaAuthAgent - Basic Dissection passed 270758CB 000.00s DHCP6OptPanaAuthAgent - Instantiation with specific values (1 address) passed E7473B76 000.00s DHCP6OptPanaAuthAgent - Dissection with specific values (1 address) passed EECF4952 000.00s DHCP6OptPanaAuthAgent - Instantiation with specific values (2 addresses) passed 49DD3BD5 000.00s DHCP6OptPanaAuthAgent - Dissection with specific values (2 addresses) passed 83EC1F66 000.00s DHCP6OptNewPOSIXTimeZone - Basic Instantiation passed 1A01D8C2 000.00s DHCP6OptNewPOSIXTimeZone - Basic Dissection passed 32525614 000.00s DHCP6OptNewPOSIXTimeZone - Instantiation with specific values passed B3E5F651 000.00s DHCP6OptNewPOSIXTimeZone - Dissection with specific values passed F16DE64E 000.00s DHCP6OptNewTZDBTimeZone - Basic Instantiation passed 35770912 000.00s DHCP6OptNewTZDBTimeZone - Basic Dissection passed 91CBB7C3 000.00s DHCP6OptNewTZDBTimeZone - Instantiation with specific values passed 68A1BDD3 000.00s DHCP6OptNewTZDBTimeZone - Dissection with specific values passed C1BBFC50 000.00s DHCP6OptRelayAgentERO - Basic Instantiation passed D87CE796 000.00s DHCP6OptRelayAgentERO - optlen field computation passed 55C856B2 000.00s DHCP6OptRelayAgentERO - instantiation with empty list passed 871F6DE1 000.00s DHCP6OptRelayAgentERO - Basic dissection passed 5B368CD2 000.00s DHCP6OptRelayAgentERO - Dissection with specific value passed 3B63A4EA 000.00s DHCP6OptLQClientLink - Basic Instantiation passed A8B0154E 000.01s DHCP6OptLQClientLink - Basic Dissection passed 2549610B 000.00s DHCP6OptLQClientLink - Instantiation with specific values (1 address) passed EBE32745 000.00s DHCP6OptLQClientLink - Dissection with specific values (1 address) passed 8B1EA20B 000.01s DHCP6OptLQClientLink - Instantiation with specific values (2 addresses) passed A29C5ADB 000.00s DHCP6OptLQClientLink - Dissection with specific values (2 addresses) passed BD11CB00 000.00s DHCP6NTPSubOptSrvAddr - Basic dissection/instantiation passed D9511686 000.00s DHCP6NTPSubOptSrvAddr - Dissection/instantiation with specific values passed 7873EBF2 000.00s DHCP6NTPSubOptMCAddr - Basic dissection/instantiation passed 74306B72 000.00s DHCP6NTPSubOptMCAddr - Dissection/instantiation with specific values passed B2841678 000.00s DHCP6NTPSubOptSrvFQDN - Basic dissection/instantiation passed 383CF431 000.00s DHCP6NTPSubOptSrvFQDN - Dissection/instantiation with specific values passed 487CB1A2 000.00s DHCP6OptNTPServer - Basic dissection/instantiation passed 340DF634 000.00s DHCP6OptNTPServer - Dissection/instantiation with specific values passed BBC77F5A 000.00s DHCP6OptBootFileUrl - Basic Instantiation passed BFB16E14 000.00s DHCP6OptBootFileUrl - Basic Dissection passed B7F7EE32 000.00s DHCP6OptBootFileUrl - Instantiation with specific values passed 26B38B0D 000.00s DHCP6OptBootFileUrl - Dissection with specific values passed 76E07503 000.00s DHCP6OptClientArchType - Basic Instantiation passed D35B9876 000.00s DHCP6OptClientArchType - Basic Dissection passed 62F5E414 000.00s DHCP6OptClientArchType - Instantiation with specific value as just int passed 5D2F43DD 000.00s DHCP6OptClientArchType - Instantiation with specific value as single item list of int passed B12768B0 000.00s DHCP6OptClientArchType - Dissection with specific 1 value list passed C97B6CE1 000.00s DHCP6OptClientArchType - Instantiation with specific value as 2 item list of int passed C5832B1C 000.00s DHCP6OptClientArchType - Dissection with specific 2 values list passed ADEB6593 000.00s DHCP6OptClientNetworkInterId - Basic Instantiation passed B7D0A9A5 000.00s DHCP6OptClientNetworkInterId - Basic Dissection passed A598FE2F 000.00s DHCP6OptClientNetworkInterId - Instantiation with specific values passed 3D6C910C 000.00s DHCP6OptClientNetworkInterId - Dissection with specific values passed BDDB4B3E 000.00s DHCP6OptERPDomain - Basic Instantiation passed 1475A5B4 000.00s DHCP6OptERPDomain - Basic Dissection passed 39AAB580 000.00s DHCP6OptERPDomain - Instantiation with specific values (1 domain) passed E591D50C 000.00s DHCP6OptERPDomain - Dissection with specific values (1 domain) passed 79350BF2 000.00s DHCP6OptERPDomain - Instantiation with specific values (2 domains) passed 50E6BDC7 000.00s DHCP6OptERPDomain - Dissection with specific values (2 domains) passed 7F12A31A 000.00s DHCP6OptRelaySuppliedOpt - Basic Instantiation passed BB870D4D 000.00s DHCP6OptRelaySuppliedOpt - Basic Dissection passed 9D40CF7E 000.00s DHCP6OptRelaySuppliedOpt - Instantiation with specific values passed EDA0BF0C 000.00s DHCP6OptRelaySuppliedOpt - Dissection with specific values passed E03ECA34 000.02s DHCP6OptRelaySuppliedOpt - deeply nested DHCP6OptRelaySuppliedOpt passed 0FE079FB 000.00s Basic build & dissect passed 53DDC15C 000.00s Basic build & dissect passed 38C2E33C 000.00s Basic build & dissect passed A706ABE7 000.00s Basic build & dissect passed 05ECD4D8 000.00s DHCP6_Solicit - Basic Instantiation passed ACA2C22D 000.00s DHCP6_Solicit - Basic Dissection passed B2FBFD0B 000.00s DHCP6_Solicit - Basic test of DHCP6_solicit.hashret() passed 78A6A805 000.00s DHCP6_Solicit - Test of DHCP6_solicit.hashret() with specific values passed 4037380B 000.00s DHCP6_Solicit - UDP ports overload passed BEA9393A 000.00s DHCP6_Solicit - Dispatch based on UDP port passed 49F7AC73 000.00s DHCP6_Advertise - Basic Instantiation passed BA6768A7 000.00s DHCP6_Advertise - Basic test of DHCP6_solicit.hashret() passed C5AEA977 000.00s DHCP6_Advertise - Test of DHCP6_Advertise.hashret() with specific values passed DBEE0DCC 000.00s DHCP6_Advertise - Basic test of answers() with solicit message passed F7C12A80 000.00s DHCP6_Advertise - Test of answers() with solicit message passed 5A5E5880 000.00s DHCP6_Advertise - UDP ports overload passed 987B8472 000.00s DHCP6_Request - Basic Instantiation passed D7F0076D 000.00s DHCP6_Request - Basic Dissection passed FE7E857E 000.00s DHCP6_Request - UDP ports overload passed 4698F0F7 000.00s DHCP6_Confirm - Basic Instantiation passed B145C8FA 000.00s DHCP6_Confirm - Basic Dissection passed 94A6B80F 000.00s DHCP6_Confirm - UDP ports overload passed 1BCB0635 000.00s DHCP6_Renew - Basic Instantiation passed 8CD9AFA1 000.00s DHCP6_Renew - Basic Dissection passed CD9AC729 000.00s DHCP6_Renew - UDP ports overload passed A4C424A0 000.00s DHCP6_Rebind - Basic Instantiation passed 3978B36A 000.00s DHCP6_Rebind - Basic Dissection passed 2A50EFE4 000.00s DHCP6_Rebind - UDP ports overload passed 3111C41E 000.00s DHCP6_Reply - Basic Instantiation passed 7CB6CA69 000.00s DHCP6_Reply - Basic Dissection passed DB5DDF19 000.00s DHCP6_Reply - UDP ports overload passed C7904878 000.00s DHCP6_Reply - Answers passed 6C00D155 000.00s DHCP6_Release - Basic Instantiation passed 30BC1D29 000.00s DHCP6_Release - Basic Dissection passed 80229F74 000.00s DHCP6_Release - UDP ports overload passed 7A3B85FE 000.00s DHCP6_Decline - Basic Instantiation passed B0CB486C 000.00s DHCP6_Confirm - Basic Dissection passed A3A8FDD0 000.00s DHCP6_Decline - UDP ports overload passed 5B7F3836 000.00s DHCP6_Reconf - Basic Instantiation passed 81C7B54D 000.00s DHCP6_Reconf - Basic Dissection passed 31A261BB 000.00s DHCP6_Reconf - UDP ports overload passed 3373BDBE 000.00s DHCP6_InfoRequest - Basic Instantiation passed 547C2E0D 000.00s DHCP6_InfoRequest - Basic Dissection passed 9DD90FD6 000.00s DHCP6_InfoRequest - UDP ports overload passed 2C4775D8 000.00s DHCP6_RelayForward - Basic Instantiation passed 18D6F270 000.00s DHCP6_RelayForward - Basic Dissection passed 897EEC87 000.00s DHCP6_RelayForward - Dissection with options passed DB68DA15 000.00s DHCP6_RelayForward - Advanced dissection passed 9508CE5B 000.00s DHCP6OptRelayMsg - Basic Instantiation passed 911A600A 000.00s DHCP6OptRelayMsg - Basic Dissection passed F14D078C 000.00s DHCP6OptRelayMsg - Embedded DHCP6 packet Instantiation passed 0ACE3538 000.00s DHCP6OptRelayMsg - Embedded DHCP6 packet Dissection passed 3B907575 000.00s DHCP6_RelayReply - Basic Instantiation passed 607A1E6F 000.00s DHCP6_RelayReply - Basic Dissection Campaign CRC=CAD57613 in 000.38s SHA=B3F98D4472ABC8469B12F47C4F96F442971C1C6C PASSED=328 FAILED=0 ━ Loading: test/scapy/layers/dns.uts passed 61E076CE 000.03s DNS request using dns_resolve passed 7DD097C3 000.00s DNS labels passed A454408D 000.01s DNS frame with advanced decompression passed C7DDC889 000.01s DNS frame with DNSRRSRV passed 600A6DDF 000.01s DNS frame with decompression hidden args passed 91197942 000.00s Other compressed DNS passed 58D32DA9 000.01s DNS advanced building passed 281A63F6 000.01s Basic DNS Compression passed 1C63E8EE 000.00s DNS cache clearance on sub change passed B258DD46 000.01s DNS frames with MX records passed E0B64605 000.00s DNS frame with typebitmaps passed AE6F56D2 000.00s Advanced dns_get_str tests passed 6946A990 000.00s Decompression loop in dns_get_str passed 877CC182 000.00s Prematured end in dns_get_str passed 5B7D6337 000.00s DNS record type 13 (HINFO) passed 3326492F 000.00s DNS record type 15 (MX) passed 7022E4BE 000.01s DNS record type 16 (TXT) passed 7058BE42 000.00s DNS record type 35 (NAPTR) passed 4ACE55C2 000.01s DNS record type 39 (DNAME) passed 3A991B53 000.01s DNS record type 64, 65 (SVCB, HTTPS) passed 632A0BC8 000.01s DNS - Malformed DNS over TCP message passed 02289E62 000.01s DNS - dns_compress on decompressed packet passed B58AF690 000.01s DNS - dns_compress on close indexes passed 88452109 000.03s DNS - dns_compress with 1-length strings passed 7B48D445 000.00s DNS - dns_encode edge cases passed 6683AEB1 000.00s DNS - simple request passed 7440EE2E 000.25s DNS - OOM test passed 9B97F8D3 000.01s DNS - Backward compatibility: keep deprecated behavior passed C2EA6D37 000.00s DNS - command passed 7B3D64D1 000.00s DNS - iter through DNSStrFields Campaign CRC=C57FCD6F in 000.44s SHA=CCE380E8BA427EC22451F8BF8F7A789ADE204A3A PASSED=30 FAILED=0 ━ Loading: test/scapy/layers/dns_dnssec.uts passed 01F134E9 000.00s example from RFC 4034 passed 95B7A220 000.00s [0] passed 7AF543C7 000.00s [0,1,2,3,4,5,6,7] passed E6640B6D 000.00s [256,512,4096,36864] passed A63AF85B 000.00s [65535] passed D0647AEE 000.00s example from RFC 4034 passed 0818D1B5 000.00s [0] passed 6B6F484A 000.00s [0,1,2,3,4,5,6,7] passed C34A7B08 000.00s [256,512,4096,36864] passed BEACAC75 000.00s [65535] passed EB8F00DF 000.00s DNSRRNSEC(), basic instantiation passed 85F328F1 000.00s DNSRRRNSEC(), check parameters passed 06D8E113 000.00s DNSRRNSEC3(), basic instantiation passed 83835EFE 000.00s DNSRRRNSEC3(), check parameters passed AB7DB468 000.00s DNSRRNSEC3PARAM(), basic instantiation passed 7A5BA656 000.00s DNSRRRNSEC3PARAM(), check parameters passed 79BF520A 000.00s DNSRRRSIG(), basic instantiation passed B328C932 000.00s DNSRRRSIG(), check parameters passed E86741B7 000.00s DNSRRRSIG(), dissection passed 98DDC0CB 000.00s DNSRRDNSKEY(), basic instantiation passed CBB44857 000.00s DNSRRDNSKEY(), check parameters passed EEE416B6 000.00s DNSRRDNSKEY(), dissection passed 2CF66A6D 000.00s DNSRRDS() and DNSRRDLV(), basic instancaition passed CCA6DC1B 000.00s DNSRRDS(), check parameters passed B94145A9 000.00s DNSRR(type="TXT") instantiation passed E22D54A9 000.00s Build DNSRR passed 4B145851 000.00s DNSRRR(), check parameters passed 176E770E 000.00s DNSRRTSIG basic instantiation passed 5730FB06 000.00s DNSRRTSIG(), check parameters passed B6EA4108 000.00s TimeField methods Campaign CRC=1DA82BA6 in 000.05s SHA=155D22714D3F9FAA9CA1385075DA95058D481041 PASSED=30 FAILED=0 ━ Loading: test/scapy/layers/dns_edns0.uts passed 41DCEAAC 000.00s EDNS0TLV(), basic instantiation passed 1715585A 000.00s EDNS0TLV(), check parameters passed 4D78447D 000.00s EDNS0TLV(), check computed optlen passed 50A50DC2 000.00s EDNS0TLV(), dissection passed 5F5E2642 000.00s DNSRROPT(), basic instantiation passed 89FFB862 000.00s DNSRROPT(), check parameters passed 8FBAF2A9 000.00s DNSRROPT() & EDN0TLV(), check parameters passed 2BAF6684 000.00s DNSRROP(), dissection passed A11CE60B 000.00s EDNS-PING - basic instantiation passed 50F22D72 000.00s EDNS-COOKIE - basic instantiation passed A378306E 000.00s NSID- basic instantiation passed 247DAD24 000.00s Basic instantiation & dissection passed AD2D5CCB 000.00s Basic instantiation & dissection passed 4C6F12CD 000.00s Basic instantiation & dissection passed 1F5BED34 000.01s Basic instantiation & dissection passed D6D5E002 000.00s Basic instantiation & dissection passed 937CFBC7 000.02s Basic instantiation & dissection Campaign CRC=D0B75F28 in 000.06s SHA=204E2717F48C9E1AB6B85DD10F090864F761C427 PASSED=17 FAILED=0 ━ Loading: test/scapy/layers/dot11.uts passed 7232562B 000.01s 802.11 - misc passed 5C51DE63 000.00s Dot11 - build passed 4E6E6642 000.00s Dot11 - dissection passed 92B10465 000.00s Dot11QoS - build passed F133DC56 000.01s Dot11 - binary in SSID passed C9A318DA 000.00s Dot11QoS - dissection passed 899846BF 000.00s Dot11 - answers passed 8C5E89D2 000.00s Dot11 - misc passed A7A517D4 000.00s Dot11 - type 1 subtype 4, 5, 6 passed 76EE9F2C 000.00s Multiple Dot11Elt layers passed CB43C4CC 000.01s Dot11WEP - build passed A30D532E 000.00s Dot11WEP - dissect passed 331B5870 000.00s Dot11TKIP - dissection passed C580C6A2 000.01s Dot11CCMP - dissection passed 9184A24C 000.01s Dot11 - answers passed 727C1186 000.01s Dot11Beacon network_stats() passed A9942AFF 000.02s Dot11EltCountry dissection passed 257388B5 000.00s RSNCipherSuite passed DF857CAD 000.00s AKMSuite passed AB60021B 000.00s PMKIDListPacket passed 15C94D9C 000.01s Dot11EltRSN passed B5747628 000.00s Dot11EltMicrosoftWPA passed 0AAD6CC4 000.00s Dot11EltVendorSpecific passed 1B4BA993 000.01s Beacon with RSN IE passed FD604782 000.00s Other Beacon with RSN IE passed 6629BBA9 000.00s Beacon with Microsoft WPA IE passed CED7778E 000.01s HT Capabilities passed 1D067C5A 000.01s HT Capabilities with fuzzed values passed 0C2D8919 000.01s RadioTap - MCS weird padding passed EC25B047 000.00s RadioTap MCS passed 25DA5D74 000.01s RadioTap ts, HE, HE-MU, LSIG passed 6699C361 000.00s Reassociation request passed 39BC1BA4 000.00s Backward compatibility of Dot11Elt passed 766077DC 000.00s Dot11FCS parent matching passed 05126D7A 000.01s Dot11FCS - test FCS with FCSField passed EA560CD5 000.00s Dot11FCS computation passed 73630092 000.00s WEP tests passed E13623A6 000.01s RadioTap - dissection & build passed BB29AD86 000.00s RadioTap Big-Small endian dissection passed 3806F42D 000.00s RadioTap MCS dissection passed 74C25A1B 000.00s RadioTap RX/TX Flags dissection passed BB589A68 000.00s RadioTap, other fields passed 5651AA7E 000.00s RadioTap - Dissection - guess_payload_class() test passed 820C6AFF 000.01s RadioTap - Dissection with Extended presence mask passed DCC54F08 000.00s RadioTap - Build with Extended presence mask passed FABBE3AC 000.01s RadioTap - dissect & build TLVs passed 453205F1 000.01s fuzz() calls for Dot11Elt() passed FD9379A5 000.00s PMKIDListPacket - Check computation of nb_pmkids passed C797C178 000.02s Dot11EltRSN - Check computation of nb_pairwise_cipher_suites and nb_akm_suites passed 5B830B66 000.01s Dot11EltMicrosoftWPA - Check computation of nb_pairwise_cipher_suites and nb_akm_suites passed 415F8E34 000.01s Dot11BSSTMRequest - dissection passed BC84AE9B 000.01s Dot11BSSTMResponse - dissection passed F0B95F2B 000.00s Dot11Ack passed 8677E748 000.01s Dot11CSA passed 952B46DE 000.01s Dot11OBSS passed 6FB08FA4 000.01s Dot11VHTOperation passed 77773153 000.00s Dot11EltVHTOperation in isolation passed D7C0704D 000.00s Dot11EltOBSS in isolation passed DF16804A 000.00s Dot11EltCSA in isolation Campaign CRC=058AA9A8 in 000.33s SHA=E6B2DAF5F10007A669AE8840767A5F6C77C6CE7E PASSED=59 FAILED=0 ━ Loading: test/scapy/layers/dot15d4.uts passed 02A90162 000.02s Dot15D4 layers passed 6F6DE6FD 000.00s Dot15d4FCS parent matching passed E6F99953 000.01s Dot15d4FCS - Beacon (without pending addresses) passed A0A5F80D 000.01s Dot15d4FCS - Beacon (with pending addresses) passed 87BAD503 000.01s Dot15d4FCS - Coordinator Realignment (without the channel page) passed FFEF437E 000.01s Dot15d4FCS - Coordinator Realignment (with the channel page) passed E42C06AC 000.00s Set SixLoWPAN passed 102CC8AF 000.00s SixLoWPAN layers passed 0719EC8F 000.00s Default dissection passed A0F43B4C 000.00s Frag second dissection passed 1E2ADD41 000.01s LoWPAN_IPHC dissections passed E91D09A7 000.01s LoWPAN_IPHC - M=1, DAC=1, DAM=0 passed 45DAC9F2 000.01s LoWPAN_NHC - NHC_UDP passed 7ED5CECB 000.01s LoWPAN_NHC - compute UDP NHC_UDP passed 53D1B570 000.00s LoWPAN_NHC - NHC_IPv6Ext passed ED77A2DA 000.01s LoWPAN_HC1 dissection & build passed F6763E0E 000.01s LoWPAN_HC1 build from scratch passed E73CE9DE 000.02s Advanced packets - dissection & FCS computation passed F62E82C6 000.00s Dot15d4AuxSecurityHeader - build & dissect passed 0CA0C1B8 000.01s Fragmentate packet & defragmentate passed 00000000 000.00s Mesh Header. passed 944B4C7A 000.00s SixLoWPAN - Advanced 1 passed 9415FC7C 000.00s SixLoWPAN - Advanced 2 passed 25C7B580 000.01s SixLoWPAN - Advanced 3 passed F96673AB 000.00s SixLoWPAN - Using ICMP passed 8B03A86B 000.02s LoWPAN_IPHC - Extracted packet passed 788652DA 000.02s LoWPAN_IPHC - Extracted packet 2 passed FDA7F30B 000.01s SixLoWPAN - Check Traffic Class and Flow Label when TF=0 passed CAC867F0 000.01s SixLoWPAN - Check Traffic Class and Flow Label when TF=1 passed 57EFE8B6 000.01s SixLoWPAN - Check Traffic Class and Flow Label when TF=2 passed 072CF461 000.02s SixLoWPAN - Checking the Hop Limit value in the IPv6 packet decompressed passed 7E3BCADD 000.01s SixLoWPAN - Check Source Address passed 62040B9E 000.01s SixLoWPAN over Ethernet passed 9C127224 000.01s Compressed SixLoWPAN - real packets with ZEP2 passed 3814A8F3 000.01s SixLoWPAN - Using ETH passed 1448B91E 000.01s SixLoWPAN - Using ETH 2 passed 7D4C31B6 000.01s SixLoWPAN - Using ETH 3 passed EB847AC1 000.00s Set zigbee passed C6026C51 000.00s ZigbeeNWKStub - ZigbeeNWK dispatch_hook passed 8E22AE0D 000.00s Zigbee - ZCLGeneralReadAttributesResponse passed 7C78C9E6 000.00s Zigbee - ZigbeeAppDataPayload passed BC86B4AF 000.03s Zigbee - advanced dissection passed F6A5B810 000.01s Zigbee - skke_1 transport key passed 26CF1774 000.01s Zigbee - Link Status passed A0FBF41E 000.00s Zigbee - Network Report passed F75E85D2 000.00s Zigbee - End Device Timeout Request passed B26A7844 000.00s Zigbee - End Device Timeout Response passed 6EE5003C 000.00s Zigbee - Transport Key passed F905A9D3 000.00s Zigbee - Request Key passed 950EECCE 000.00s Zigbee - Tunnel passed C6D4F8D9 000.00s Zigbee - Verify Key passed 5CBCDD40 000.00s Zigbee - Confirm Key passed CA622A7A 000.00s Zigbee - APS acknowledgment (with the Acknowledgment Format enabled) passed 9581C79B 000.00s Zigbee - APS acknowledgment (with the Acknowledgment Format disabled) passed 04D8D369 000.00s Zigbee - ZDP command passed F0F15001 000.01s Zigbee - ZDP command: Device_annce passed 33B4CFEF 000.01s Zigbee - ZCL General command: Read Attributes passed 4B07B502 000.00s Zigbee - ZCL General command: Read Attributes Response passed 8E1F9454 000.00s Zigbee - ZCL IAS Zone command: Zone Enroll Response Campaign CRC=557BD19F in 000.40s SHA=F28796EB0569D828BE27C9E9796858857ADB338D PASSED=59 FAILED=0 ━ Loading: test/scapy/layers/eap.uts passed 5259CA59 000.00s EAPOL - Basic Instantiation passed D337081E 000.00s EAPOL - Instantiation with specific values passed 465FDAD8 000.00s EAPOL - Dissection (1) passed 89D468C8 000.00s EAPOL - Dissection (2) passed FA7DF1D6 000.00s EAPOL - Dissection (3) passed 18748F1F 000.00s EAPOL - Dissection (4) passed C75183A7 000.00s EAPOL - Dissection (5) passed 1B0AF81F 000.00s EAPOL - Dissection (6) passed FFF9C884 000.00s EAPOK-Key - over 802.11 - Dissection passed F7FADDB7 000.00s EAPOL-Key - Key 1 - Dissection (1) passed 607292E6 000.00s EAPOL_KEY - Key 2 - Dissection (2) passed 8736A48F 000.00s EAPOL_KEY - Key 3 - Dissection (3) passed 4CF90687 000.00s EAPOL_KEY - Key 4 - Dissection (4) passed 3635E96C 000.00s EAPOL-MKA - With Basic parameter set - Dissection passed 080818B5 000.00s EAPOL-MKA - With Potential Peer List parameter set - Dissection passed 8BBD849B 000.00s EAPOL-MKA - With Live Peer List parameter set - Dissection passed 5897890C 000.00s EAPOL-MKA - With SAK Use parameter set - Dissection passed 3BC417E4 000.00s EAPOL-MKA - With Distributed SAK parameter set - Dissection passed 8C5B5629 000.00s EAP - Basic Instantiation passed 00852BB9 000.00s EAP - Instantiation with specific values passed 7D59BE49 000.00s EAP - Instantiation - Multiple desired authentication types passed CC02FE22 000.00s EAP - Dissection (1) passed 390137BE 000.00s EAP - Dissection (2) passed D35419A0 000.00s EAP - Dissection (3) passed 228E8966 000.00s EAP - Dissection (4) passed C34F247B 000.00s EAP - Dissection (5) passed 63BCBC77 000.00s EAP - Dissection (6) passed 3B382531 000.00s EAP - Dissection (7) passed D8BC9843 000.00s EAP - Dissection (8) passed 02A2E196 000.00s EAP - EAP_TLS - Basic Instantiation passed ABC6CAE9 000.00s EAP - EAP_FAST - Basic Instantiation passed D41E649B 000.00s EAP - EAP_TTLS - Basic Instantiation passed 55E8207D 000.00s EAP - EAP_PEAP - Basic Instantiation passed 8CB571E8 000.00s EAP - EAP_MD5 - Basic Instantiation passed AF8A8FF8 000.00s EAP - EAP_MD5 - Request - Dissection (8) passed 33064507 000.00s EAP - EAP_MD5 - Response - Dissection (9) passed 6D444E21 000.00s EAP - LEAP - Basic Instantiation passed C0E7C5F1 000.00s EAP - LEAP - Request - Dissection (10) passed 4D475170 000.00s EAP - LEAP - Response - Dissection (11) passed 5801E6ED 000.00s EAP - PEAP - Request - Dissection passed EA31A827 000.00s EAP - PEAP - Response - Dissection passed BE238C63 000.00s EAP - Layers (1) passed 152D3B74 000.00s EAP - Layers (2) passed BC8A3153 000.00s EAP - sessions (1) passed 147CEDA0 000.00s EAP - sessions (2) Campaign CRC=2F828CEB in 000.09s SHA=FBD9895C5C8DCD1E27E4211B6BB152A174E7A302 PASSED=45 FAILED=0 ━ Loading: test/scapy/layers/hsrp.uts passed C638A950 000.00s HSRP - build & dissection Campaign CRC=27F64651 in 000.00s SHA=3F436271EF6352DD5DC95DC2E23E95E9762F52C7 PASSED=1 FAILED=0 ━ Loading: test/scapy/layers/http.uts passed C718F280 000.06s TCPSession - dissect HTTP 1.0 chunked image passed B6FCD3E5 000.04s TCPSession - dissect HTTP 1.0 html page with Content_Length passed 3502382B 000.01s TCPSession - dissect HTTP 1.0 HEAD response passed 1BF1F901 000.00s HTTP build with 'chunked' content type passed A3A5CE24 000.02s HTTP decompression (gzip) passed 4092AD89 000.02s HTTP decompression (gzip) with retransmission passed 5E68D7C3 000.01s HTTP decompression (brotli) passed FF26C0AD 000.01s HTTP decompression (zstd) passed 308B5151 000.02s HTTP PSH bug fix passed 814EB491 000.01s HTTP build passed CB515FDC 000.04s HTTP 1.1 -> HTTP 2.0 Upgrade (h2c) passed 062A6ADB 000.01s Test chunked with gzip passed 012AC7C6 000.02s Util function to launch HTTP_server passed 1381B3BC 000.02s HTTP_client fails to ask HTTP_server that required authentication passed 37943112 000.04s HTTP_client asks HTTP_server with NTLMSSP passed 97C1E744 000.04s HTTP_Server with native python client with Basic auth passed 8531C61E 000.01s HTTP_Server with native python client without auth Campaign CRC=C29A0479 in 000.39s SHA=F2CB759B15FA3F50DBE5C6B5CBC35A84EF631B90 PASSED=17 FAILED=0 ━ Loading: test/scapy/layers/inet.uts passed BD8995C6 000.01s IP options individual assembly passed 3B877B23 000.00s IP options individual dissection passed ABE7C3F9 000.01s IP assembly and dissection with options passed 17E9CA70 000.01s IPSession - dissect fragmented IP packets on-the-flow passed 5015935F 000.01s IPSession - contains non-IP packets passed 7F178101 000.00s StringBuffer passed 38D84225 000.01s fragment() passed 2CBDD00C 000.00s fragment() and overloaded_fields passed DFE594D6 000.01s fragment() already fragmented packets passed 185E3CD1 000.00s fragment() with non-multiple-of-8 MTU passed 496E9814 000.01s fragment() with fragsize lower than 8 passed 38AA62AA 000.01s defrag() passed 34E95DD5 000.01s defragment() passed 2D66B8BF 000.02s defragment() uses timestamp of last fragment passed CC47DF74 000.00s defragment() - Missing fragments passed 0389775F 000.06s defrag() / defragment() - Real DNS packets passed 0BDBA2DA 000.01s Packet().fragment() passed 5252347B 000.00s Packet().fragment() and overloaded_fields passed E15B30B3 000.01s Packet().fragment() already fragmented packets passed CF0C26C2 000.00s TCP options: UTO - basic build passed 5A0D5D8D 000.00s TCP options: UTO - basic dissection passed 20E9E9F9 000.00s TCP options: SAck - basic build passed BCDB92DF 000.00s TCP options: SAck - basic dissection passed 62A90792 000.00s TCP options: SAckOK - basic build passed 64193152 000.00s TCP options: SAckOK - basic dissection passed 62690F3F 000.00s TCP options: EOL - basic build passed 83D3D900 000.00s TCP options: EOL - basic dissection passed 96F1D377 000.00s TCP options: malformed - build passed 4A34058C 000.00s TCP options: malformed - dissection passed 2B2BCB4D 000.00s TCP options: wrong offset passed F9C9B67E 000.00s TCP options: MPTCP - basic build using bytes passed B68F0088 000.00s TCP options: MD5 build and parse passed A21D3F28 000.00s TCP options: MD5 IPv4 (depends on default values) passed 884A2F07 000.00s TCP options: MD5 IPv6 (depends on default values) passed 9623E054 000.00s TCP options: MD5 sign (depends on default values) passed 26E8A51B 000.00s TCP Authentication Option: build passed 4B8CC361 000.00s TCP Authentication Option: parse passed B7CF5FD2 000.00s TCP Authentication Option: parse from TCP passed 2EBCACBA 000.00s TCP Authentication Option: build TCP passed A3A21C0D 000.00s TCP options: invalid data offset passed 73389405 000.00s TCP options: build oversized packet passed 283CA8A2 000.01s TCP random options passed FD5AE5C3 000.00s TCP random options - MD5 (#GH3777) passed B2754988 000.04s IP, TCP & UDP checksums (these tests highly depend on default values) passed 6716D5EA 000.00s IP with forced-length 0 passed 6ADFBCF2 000.00s TCP payload with IP Total Length 0 passed 042C57DB 000.09s TCPSession: test tcp_reassemble with variable orders passed 6EC93368 000.01s Layer binding passed F9C26A11 000.01s Layer binding with show() passed 1DB8347A 000.02s GRE binding tests passed 35710318 000.00s IPv4 - ICMPTimeStampField passed C0285EC0 000.01s IPv4 - UDP null checksum passed B2B8B64F 000.02s IPv4 - (IP|UDP|TCP|ICMP)Error passed 5B035D25 000.00s IPv4 - TCPError parsing passed 9193D025 000.00s IPv4 - mDNS passed AF34E758 000.01s IPv4 - utilities passed 5BB1206E 000.55s IPv4 - ICMP hashret passed 3B24CE36 000.07s IPv4 - traceroute utilities passed 340EE4FC 000.02s IPv4 - reporting passed 2CB9E03F 000.01s IPv4 - Checksum computation with source routing passed 8EF377FD 000.01s Build ICMP extension from scratch passed 4D92C542 000.01s Check dissection and rebuild of MPLS ICMPv4 extension passed 23EFF953 000.00s ICMPv4 extension - Other dissection example passed 502D9D9C 000.01s ICMPv4 extension - RFC5837 Campaign CRC=940FD9A4 in 001.16s SHA=50B62C40D30BD68A7867477EE7C718C24042E384 PASSED=64 FAILED=0 ━ Loading: test/scapy/layers/inet6.uts passed D1CE7F15 000.00s IPv6 Class basic Instantiation passed 47FE251A 000.00s IPv6 Class basic build (default values) passed 2AFB2655 000.00s IPv6 Class basic dissection (default values) passed 116A1D05 000.00s IPv6 Class with basic TCP stacked - build passed E77B83DD 000.00s IPv6 Class with basic TCP stacked - dissection passed F1924BC2 000.00s IPv6 Class with TCP and TCP data - build passed BEE06332 000.00s IPv6 Class with TCP and TCP data - dissection passed F195E599 000.00s IPv6 Class binding with Ethernet - build passed A0974624 000.00s IPv6 Class binding with Ethernet - dissection passed FD44B31B 000.00s IPv6 Class - summary passed DB6C92E4 000.00s IPv6 Class binding with GRE - build passed FF2BFB92 000.00s IPv6 Class binding with GRE - dissection passed D18B79CA 000.00s IPv6 ma_addr coverage on hashret passed 11A76559 000.00s PseudoIPv6 passed 2757B308 000.00s in6_chksum is computed on UDP or TCP build passed 2D45AAC8 000.00s IPv6ExtHdrRouting Class - No address - build passed 2FB49298 000.00s IPv6ExtHdrRouting Class - One address - build passed 1398D3BC 000.00s IPv6ExtHdrRouting Class - Multiple Addresses - build passed BFE608B1 000.00s IPv6ExtHdrRouting Class - Specific segleft (2->1) - build passed 45FC49B8 000.00s IPv6ExtHdrRouting Class - Specific segleft (2->0) - build passed FC300EF1 000.00s IPv6ExtHdrSegmentRouting Class - default - build & dissect passed 1826D82B 000.00s IPv6ExtHdrSegmentRouting Class - addresses list - build & dissect passed D2708BF4 000.00s IPv6ExtHdrSegmentRouting Class - TLVs list - build & dissect passed C72CBD68 000.00s IPv6ExtHdrSegmentRouting Class - both lists - build & dissect passed 8236A245 000.00s IPv6ExtHdrSegmentRouting Class - UDP pseudo-header checksum - build & dissect passed 64FF945F 000.00s Test in6_get6to4Prefix() - 0.0.0.0 address passed D66F1EFB 000.00s Test in6_get6to4Prefix() - 255.255.255.255 address passed 89A19ABC 000.00s Test in6_get6to4Prefix() - 1.1.1.1 address passed C85A196A 000.00s Test in6_get6to4Prefix() - invalid address passed A5258DE8 000.00s Test in6_6to4ExtractAddr() - 2002:: address passed C1C5C579 000.00s Test in6_6to4ExtractAddr() - 255.255.255.255 address passed 1856D118 000.00s Test in6_6to4ExtractAddr() - "2002:101:101::" address passed FE84F001 000.00s Test in6_6to4ExtractAddr() - invalid address passed 116945D2 000.00s in6_getLinkScopedMcastAddr() : default generation passed 15A1164B 000.00s in6_getLinkScopedMcastAddr() : different valid scope values passed 1B46F9F2 000.00s in6_getLinkScopedMcastAddr() : grpid in different formats passed 9C7E1D83 000.00s in6_mactoifaceid() conversion function (test 1) passed 86460033 000.00s in6_mactoifaceid() conversion function (test 2) passed 18EDF6C2 000.00s in6_mactoifaceid() conversion function (test 3) passed E27E1DC5 000.00s in6_mactoifaceid() conversion function (test 4) passed 55DFF829 000.00s in6_mactoifaceid() conversion function (test 5) passed 4FE7E599 000.00s in6_mactoifaceid() conversion function (test 6) passed EC2EECAB 000.00s in6_mactoifaceid() conversion function (test 1) passed DF0FDAFB 000.00s in6_mactoifaceid() conversion function (test 2) passed B330D236 000.00s in6_mactoifaceid() conversion function (test 3) passed FE0E4D6C 000.00s in6_mactoifaceid() conversion function (test 4) passed 90033B9C 000.00s in6_mactoifaceid() conversion function (test 5) passed A3220DCC 000.01s in6_mactoifaceid() conversion function (test 6) passed 3089CFC8 000.00s in6_addrtomac() conversion function (test 1) passed 03A8F998 000.00s in6_addrtomac() conversion function (test 2) passed D7E362FE 000.00s in6_addrtomac() conversion function (test 3) passed 9ADDFDA4 000.00s in6_addrtomac() conversion function (test 4) passed 4CA418FF 000.00s in6_addrtomac() conversion function (test 5) passed 7F852EAF 000.00s in6_addrtomac() conversion function (test 6) passed 1F75EA78 000.00s Test in6_getRandomizedIfaceId passed 343ADC44 000.00s Test RFC 1924 function - in6_ctop() basic test passed 6AF7CDC0 000.00s Test RFC 1924 function - in6_ctop() with character outside charset passed C172E6F3 000.00s Test RFC 1924 function - in6_ctop() with bad length address passed C4342A8E 000.00s Test RFC 1924 function - in6_ptoc() basic test passed C4342A8E 000.00s Test RFC 1924 function - in6_ptoc() basic test passed A4701435 000.00s Test RFC 1924 function - in6_ptoc() with bad input passed FCEA333A 000.00s in6_getAddrType - 6to4 addresses passed 131734E3 000.00s in6_getAddrType - Assignable Unicast global address passed 8BDD9DB1 000.00s in6_getAddrType - Multicast global address passed 213FCF86 000.00s in6_getAddrType - Multicast local address passed 6CCACBE3 000.00s in6_getAddrType - Unicast Link-Local address passed A8F9859D 000.00s in6_getAddrType - Loopback address passed 1CC8CEFB 000.00s in6_getAddrType - Unspecified address passed 9E620BFF 000.00s in6_getAddrType - Unassigned Global Unicast address passed 2F5A3C1A 000.00s in6_getAddrType - Weird address (FE::1) passed 1FCBAF51 000.00s in6_getAddrType - Weird address (FE8::1) passed B929EB08 000.00s in6_getAddrType - Weird address (1::1) passed 573C88CB 000.00s in6_getAddrType - Weird address (1000::1) passed B0274B52 000.00s ICMPv6DestUnreach Class - Basic Build (no argument) passed 7C20B0AE 000.00s ICMPv6DestUnreach Class - Basic Build over IPv6 (for cksum and overload) passed 72B4D073 000.00s ICMPv6DestUnreach Class - Basic Build over IPv6 with some payload passed 5DCED31E 000.00s ICMPv6DestUnreach Class - Dissection with default values and some payload passed 61EBCF68 000.00s ICMPv6DestUnreach Class - Dissection with specific values passed 6A099C52 000.00s ICMPv6DestUnreach Class - checksum computation related stuff passed 92F17464 000.00s ICMPv6PacketTooBig Class - Basic Build (no argument) passed 60E87C3A 000.00s ICMPv6PacketTooBig Class - Basic Build over IPv6 (for cksum and overload) passed 0CA63B6C 000.01s ICMPv6PacketTooBig Class - Basic Build over IPv6 with some payload passed 12D4F0B8 000.00s ICMPv6PacketTooBig Class - Dissection with default values and some payload passed 03142868 000.00s ICMPv6PacketTooBig Class - Dissection with specific values passed 1BB988F8 000.00s ICMPv6PacketTooBig Class - checksum computation related stuff passed 8A3F901A 000.00s ICMPv6EchoRequest - Basic Instantiation passed 699B15EE 000.00s ICMPv6EchoRequest - Instantiation with specific values passed EA446DAE 000.00s ICMPv6EchoRequest - Basic dissection passed E198A309 000.00s ICMPv6EchoRequest - Dissection with specific values passed C8ABAED8 000.00s ICMPv6EchoRequest - Automatic checksum computation and field overloading (build) passed D5DA8869 000.00s ICMPv6EchoRequest - Automatic checksum computation and field overloading (dissection) passed 9B53C5BF 000.00s ICMPv6EchoReply - Basic Instantiation passed 731C7145 000.00s ICMPv6EchoReply - Instantiation with specific values passed 6D91D17E 000.00s ICMPv6EchoReply - Basic dissection passed F842CDB8 000.00s ICMPv6EchoReply - Dissection with specific values passed C7B5F6CD 000.00s ICMPv6EchoReply - Automatic checksum computation and field overloading (build) passed D5DA8869 000.00s ICMPv6EchoReply - Automatic checksum computation and field overloading (dissection) passed D877DBBC 000.00s ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 1 passed ED194425 000.00s ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 2 passed FCA0F5AC 000.00s ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 3 passed A74729F6 000.00s ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 4 passed 99E290FA 000.00s ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 5 passed 6C09EBC2 000.00s ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 6 passed 756FA625 000.00s ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 7 - IPv6ExtHdrDestOpt passed 71108418 000.00s ICMPv6MRD_Advertisement - Basic instantiation passed 8F8BA144 000.00s ICMPv6MRD_Advertisement - Instantiation with specific values passed 9E6E21C9 000.00s ICMPv6MRD_Advertisement - Basic Dissection and overloading mechanisms passed BE0C3CDF 000.00s ICMPv6MRD_Solicitation - Basic dissection passed EE2B5EA7 000.00s ICMPv6MRD_Solicitation - Instantiation with specific values passed 1547161E 000.00s ICMPv6MRD_Solicitation - Basic Dissection and overloading mechanisms passed 8751A716 000.00s ICMPv6MRD_Termination Basic instantiation passed F00B6415 000.00s ICMPv6MRD_Termination - Instantiation with specific values passed EE51AADC 000.00s ICMPv6MRD_Termination - Basic Dissection and overloading mechanisms passed B0AE1C85 000.00s HBHOptUnknown - Basic Instantiation passed ACAF4AE9 000.00s HBHOptUnknown - Basic Dissection passed 8BD4223D 000.00s HBHOptUnknown - Automatic optlen computation passed 1149AE15 000.00s HBHOptUnknown - Instantiation with specific values passed FEFDFEEE 000.00s HBHOptUnknown - Dissection with specific values passed 11565441 000.00s Pad1 - Basic Instantiation passed 518CEBB3 000.00s Pad1 - Basic Dissection passed 61AB67F0 000.00s PadN - Basic Instantiation passed 656980DD 000.00s PadN - Optlen Automatic computation passed 17FC8495 000.00s PadN - Basic Dissection passed C5CB0342 000.00s PadN - Dissection with specific values passed D503B731 000.00s PadN - Instantiation with forced optlen passed 1D8D7ADA 000.00s RouterAlert - Basic Instantiation passed A54FE28F 000.00s RouterAlert - Basic Dissection passed C7B9FB38 000.00s RouterAlert - Instantiation with specific values passed F7186483 000.00s RouterAlert - Instantiation with specific values passed 550615F1 000.00s RplOption - Basic Instantiation passed C0942131 000.00s RplOption - Basic Dissection passed 6504B3D5 000.00s RplOption - Instantiation with specific values passed 630BCEDA 000.00s RplOption - Instantiation with specific values passed F3FA9ADA 000.00s Jumbo - Basic Instantiation passed 99EED01B 000.00s Jumbo - Basic Dissection passed 91205FD6 000.00s Jumbo - Instantiation with specific values passed E5FC9898 000.00s Jumbo - Dissection with specific values passed 4CCEF5BF 000.00s HAO - Basic Instantiation passed 4E0F867C 000.00s HAO - Basic Dissection passed C418FF05 000.00s HAO - Instantiation with specific values passed E7DC6D56 000.00s HAO - Dissection with specific values passed EC3D2FE2 000.00s HAO - hashret passed 233C6301 000.00s IPv6ExtHdrHopByHop - Basic Instantiation passed 7B48FFB4 000.00s IPv6ExtHdrHopByHop - Instantiation with HAO option passed FADA6FBC 000.00s IPv6ExtHdrHopByHop - Instantiation with RouterAlert option passed DABA463D 000.00s IPv6ExtHdrHopByHop - Instantiation with RPL option passed 2C5CF83A 000.00s IPv6ExtHdrHopByHop - Instantiation with Jumbo option passed D695A953 000.00s IPv6ExtHdrHopByHop - Complete dissection with Jumbo option passed 4F45480A 000.00s IPv6ExtHdrHopByHop - Instantiation with Pad1 option passed 4F45480A 000.00s IPv6ExtHdrHopByHop - Instantiation with PadN option passed 5E80B26B 000.00s IPv6ExtHdrHopByHop - Instantiation with Jumbo, RouterAlert, HAO passed A0AB0063 000.00s IPv6ExtHdrHopByHop - Instantiation with HAO, Jumbo, RouterAlert passed 9B504E62 000.00s IPv6ExtHdrHopByHop - Instantiation with RouterAlert, HAO, Jumbo passed A69E2AD2 000.00s IPv6ExtHdrHopByHop - Hashret passed FECF1887 000.01s IPv6ExtHdrHopByHop - Basic Dissection passed 4DDF99AE 000.00s ICMPv6ND_RS - Basic instantiation passed D56894C6 000.00s ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer passed A90C1892 000.00s ICMPv6ND_RS - Basic dissection passed EAC3B7DA 000.00s ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer passed 988340A1 000.00s ICMPv6ND_RA - Basic Instantiation passed EAB9F5B1 000.00s ICMPv6ND_RA - Basic instantiation with empty dst in IPv6 underlayer passed 854A2794 000.00s ICMPv6ND_RA - Basic dissection passed 10B9F0CB 000.00s ICMPv6ND_RA - Basic instantiation with empty dst in IPv6 underlayer passed 5F315605 000.01s ICMPv6ND_RA - Answers passed 729ACF34 000.00s ICMPv6ND_RA - Summary Output passed 4107B846 000.00s ICMPv6ND_NS - Basic Instantiation passed BE7F71E1 000.00s ICMPv6ND_NS - Instantiation with specific values passed 0E54D262 000.00s ICMPv6ND_NS - Basic Dissection passed AE5264E2 000.00s ICMPv6ND_NS - Dissection with specific values passed B8ED22A7 000.00s ICMPv6ND_NS - IPv6 layer fields overloading passed 619885DF 000.00s ICMPv6ND_NA - Basic Instantiation passed 223DB4FA 000.00s ICMPv6ND_NA - Instantiation with specific values passed 4439E621 000.00s ICMPv6ND_NA - Basic Dissection passed A2CDB8CB 000.00s ICMPv6ND_NA - Dissection with specific values passed B8ED22A7 000.00s ICMPv6ND_NS - IPv6 layer fields overloading passed AB86627F 000.00s ICMPv6ND_ND/ICMPv6ND_ND matching - test 1 passed 5D1348F5 000.00s ICMPv6NDOptUnknown - Basic Instantiation passed 3202978B 000.00s ICMPv6NDOptUnknown - Instantiation with specific values passed 4407B938 000.00s ICMPv6NDOptUnknown - Basic Dissection passed 70470F72 000.00s ICMPv6NDOptUnknown - Dissection with specific values passed 3459AC84 000.00s ICMPv6NDOptUnknown - Instantiation/Dissection with unknown option in the middle passed F850E4BA 000.00s ICMPv6NDOptUnknown - fuzz passed 90AF5747 000.00s ICMPv6NDOptSrcLLAddr - Basic Instantiation passed E6828AEF 000.00s ICMPv6NDOptSrcLLAddr - Instantiation with specific values passed 17C13F23 000.00s ICMPv6NDOptSrcLLAddr - Basic Dissection passed 68952992 000.00s ICMPv6NDOptSrcLLAddr - Instantiation with specific values passed DC35A7E9 000.00s ICMPv6NDOptDstLLAddr - Basic Instantiation passed 6AF98091 000.00s ICMPv6NDOptDstLLAddr - Instantiation with specific values passed A222A5B1 000.00s ICMPv6NDOptDstLLAddr - Basic Dissection passed 4F1DECB4 000.00s ICMPv6NDOptDstLLAddr - Instantiation with specific values passed FF4E47BB 000.00s ICMPv6NDOptPrefixInfo - Basic Instantiation passed 48915433 000.00s ICMPv6NDOptPrefixInfo - Instantiation with specific values passed ACF9B9CF 000.00s ICMPv6NDOptPrefixInfo - Basic Dissection passed 5CFA5B35 000.00s ICMPv6NDOptPrefixInfo - Instantiation with specific values passed 406CE07A 000.00s ICMPv6NDOptRedirectedHdr - Basic Instantiation passed D0348B15 000.00s ICMPv6NDOptRedirectedHdr - Instantiation with specific values passed 2CEAD38E 000.00s ICMPv6NDOptRedirectedHdr - Instantiation with simple IPv6 packet (no upper layer) passed F123E716 000.00s ICMPv6NDOptRedirectedHdr - Basic Dissection passed 8D6AF3B5 000.00s ICMPv6NDOptRedirectedHdr - Disssection with specific values passed 2D605821 000.00s ICMPv6NDOptRedirectedHdr - Dissection with cut IPv6 Header passed 2C6A746E 000.00s ICMPv6NDOptRedirectedHdr - Complete dissection passed 12DB2C22 000.00s ICMPv6NDOptMTU - Basic Instantiation passed 65770798 000.00s ICMPv6NDOptMTU - Instantiation with specific values passed 83B871C6 000.00s ICMPv6NDOptMTU - Basic dissection passed 17C89A45 000.00s ICMPv6NDOptMTU - Dissection with specific values passed 23296DBD 000.00s ICMPv6NDOptMTU - Summary Output passed 136EA017 000.00s ICMPv6NDOptShortcutLimit - Basic Instantiation passed 559E7404 000.00s ICMPv6NDOptShortcutLimit - Instantiation with specific values passed 0F220EAF 000.00s ICMPv6NDOptShortcutLimit - Basic Dissection passed 73976BB0 000.00s ICMPv6NDOptShortcutLimit - Dissection with specific values passed BF81F813 000.00s ICMPv6NDOptAdvInterval - Basic Instantiation passed CA6C93CA 000.00s ICMPv6NDOptAdvInterval - Instantiation with specific values passed E94BFFAE 000.00s ICMPv6NDOptAdvInterval - Basic dissection passed BEF20018 000.00s ICMPv6NDOptAdvInterval - Dissection with specific values passed C231587A 000.00s ICMPv6NDOptHAInfo - Basic Instantiation passed 0B0C8DF5 000.00s ICMPv6NDOptHAInfo - Instantiation with specific values passed CF87AC62 000.00s ICMPv6NDOptHAInfo - Basic dissection passed 498F662C 000.00s ICMPv6NDOptHAInfo - Dissection with specific values passed B69122C3 000.00s ICMPv6NDOptSrcAddrList - Basic Instantiation passed DE7FE747 000.00s ICMPv6NDOptSrcAddrList - Instantiation with specific values (auto len) passed B5B76D1F 000.00s ICMPv6NDOptSrcAddrList - Instantiation with specific values passed 5267358D 000.00s ICMPv6NDOptSrcAddrList - Basic Dissection passed C13C47A5 000.00s ICMPv6NDOptSrcAddrList - Dissection with specific values (auto len) passed AF821F8C 000.00s ICMPv6NDOptSrcAddrList - Dissection with specific values passed C87ECDC7 000.00s ICMPv6NDOptTgtAddrList - Basic Instantiation passed 8686FB8C 000.00s ICMPv6NDOptTgtAddrList - Instantiation with specific values (auto len) passed 7E021A90 000.00s ICMPv6NDOptTgtAddrList - Instantiation with specific values passed DF694DCF 000.00s ICMPv6NDOptTgtAddrList - Basic Dissection passed 3B066EBB 000.00s ICMPv6NDOptTgtAddrList - Dissection with specific values (auto len) passed 50F81FC1 000.00s ICMPv6NDOptTgtAddrList - Instantiation with specific values passed 7D59A368 000.00s ICMPv6NDOptIPAddr - Basic Instantiation passed C1D1E7D5 000.00s ICMPv6NDOptIPAddr - Instantiation with specific values passed 1A2F5C7F 000.00s ICMPv6NDOptIPAddr - Basic Dissection passed 0B8C346B 000.00s ICMPv6NDOptIPAddr - Dissection with specific values passed EFC6686C 000.00s ICMPv6NDOptNewRtrPrefix - Basic Instantiation passed D9B46DE8 000.00s ICMPv6NDOptNewRtrPrefix - Instantiation with specific values passed E7373FCC 000.00s ICMPv6NDOptNewRtrPrefix - Basic Dissection passed 321A7BB0 000.00s ICMPv6NDOptNewRtrPrefix - Dissection with specific values passed 8CA3631C 000.00s ICMPv6NDOptLLA - Basic Instantiation passed 48526498 000.00s ICMPv6NDOptLLA - Instantiation with specific values passed C536C823 000.00s ICMPv6NDOptLLA - Basic Dissection passed 1DEC5413 000.00s ICMPv6NDOptLLA - Dissection with specific values passed 8C3E3751 000.00s ICMPv6NDOptRouteInfo - Basic Instantiation passed 44A42CE7 000.00s ICMPv6NDOptRouteInfo - Instantiation with forced prefix but no length passed D30C6789 000.00s ICMPv6NDOptRouteInfo - Instantiation with forced length values (1/4) passed 03213D9B 000.00s ICMPv6NDOptRouteInfo - Instantiation with forced length values (2/4) passed D2034B7A 000.00s ICMPv6NDOptRouteInfo - Instantiation with forced length values (3/4) passed 9B323128 000.00s ICMPv6NDOptRouteInfo - Instantiation with forced length values (4/4) passed 0E899A78 000.00s ICMPv6NDOptRouteInfo - Instantiation with specific values passed A9702412 000.00s ICMPv6NDOptRouteInfo - Basic dissection passed BA32308F 000.00s ICMPv6NDOptRouteInfo - Dissection with specific values passed 24C9726E 000.00s ICMPv6NDOptRouteInfo - Summary Output passed 77F8890C 000.00s ICMPv6NDOptMAP - Basic Instantiation passed 2FEE4C87 000.00s ICMPv6NDOptMAP - Instantiation with specific values passed C6AAF0A2 000.00s ICMPv6NDOptMAP - Basic Dissection passed 900763C7 000.00s ICMPv6NDOptMAP - Dissection with specific values passed 4F509225 000.00s ICMPv6NDOptRDNSS - Basic Instantiation passed 9CD0A8FB 000.00s ICMPv6NDOptRDNSS - Basic instantiation with 1 DNS address passed C58A2B38 000.00s ICMPv6NDOptRDNSS - Basic instantiation with 2 DNS addresses passed 43D6D077 000.00s ICMPv6NDOptRDNSS - Instantiation with specific values passed DC2BFF23 000.00s ICMPv6NDOptRDNSS - Basic Dissection passed 37BF7067 000.00s ICMPv6NDOptRDNSS - Dissection (with 1 DNS address) passed 9D964AF3 000.00s ICMPv6NDOptRDNSS - Dissection (with 2 DNS addresses) passed D07F3579 000.00s ICMPv6NDOptRDNSS - Summary Output passed 043EECBA 000.00s ICMPv6NDOptDNSSL - Basic Instantiation passed F6B0842F 000.00s ICMPv6NDOptDNSSL - Instantiation with 1 search domain, as seen in the wild passed E914C420 000.00s ICMPv6NDOptDNSSL - Basic instantiation with 2 search domains passed ECC9DE2E 000.01s ICMPv6NDOptDNSSL - Basic instantiation with 3 search domains passed B1DC63A2 000.00s ICMPv6NDOptDNSSL - Basic Dissection passed B96216D1 000.00s ICMPv6NDOptDNSSL - Basic Dissection with specific values passed 0EF80C89 000.00s ICMPv6NDOptDNSSL - Summary Output passed FB09A048 000.00s ICMPv6NDOptCaptivePortal - Basic Instantiation passed E1B26DD8 000.00s ICMPv6NDOptCaptivePortal - Instantiation with captive portal URI passed B08F8E08 000.00s ICMPv6NDOptCaptivePortal - Instantiation where total length is already a multiple of 8 bytes passed 9525D318 000.00s ICMPv6NDOptCaptivePortal - Basic Dissection passed BADB2774 000.00s ICMPv6NDOptCaptivePortal - Basic Dissection with captive portal URI passed 342AC0B0 000.00s ICMPv6NDOptCaptivePortal - Dissection with zero length passed 2D9ABF1B 000.00s ICMPv6NDOptCaptivePortal - Summary Output passed 3FDE1930 000.00s ICMPv6NDOptEFA - Basic Instantiation passed C66DCEC4 000.00s ICMPv6NDOptEFA - Basic Dissection passed 177C508A 000.00s ICMPv6NDOptPREF64 - Basic Instantiation passed 705B9F36 000.00s ICMPv6NDOptPREF64 - Basic Dissection passed D9F1C6F7 000.00s ICMPv6NDOptPREF64 - Instantiation/Dissection with specific values passed 3D7CF677 000.00s ICMPv6NDOptPREF64 - Summary Output passed 5A9CA3E4 000.00s ICMPv6NIQueryNOOP - Basic Instantiation passed E7B5CD0E 000.00s ICMPv6NIQueryNOOP - Basic Dissection passed 9E5885F0 000.00s ICMPv6NIQueryName - single label DNS name (internal) passed 09349544 000.00s ICMPv6NIQueryName - single label DNS name passed B5A1B89B 000.00s ICMPv6NIQueryName - fqdn (internal) passed 0A731407 000.00s ICMPv6NIQueryName - fqdn passed 700787CB 000.00s ICMPv6NIQueryName - IPv6 address (internal) passed 118B9433 000.00s ICMPv6NIQueryName - IPv6 address passed 646BF569 000.00s ICMPv6NIQueryName - IPv4 address (internal) passed 12166AC6 000.00s ICMPv6NIQueryName - IPv4 address passed 9E9ECE7E 000.00s ICMPv6NIQueryName - build & dissection passed F32AF9E2 000.00s ICMPv6NIQueryName - dissection passed DCE7145A 000.00s ICMPv6NIQueryIPv6 - single label DNS name (internal) passed E1691DBD 000.00s ICMPv6NIQueryIPv6 - single label DNS name passed EB6E8B1A 000.00s ICMPv6NIQueryIPv6 - fqdn (internal) passed E22E9CFE 000.00s ICMPv6NIQueryIPv6 - fqdn passed AB7F5D94 000.00s ICMPv6NIQueryIPv6 - IPv6 address (internal) passed C1C61F21 000.00s ICMPv6NIQueryIPv6 - IPv6 address passed FE8A89EC 000.00s ICMPv6NIQueryIPv6 - IPv4 address (internal) passed 9CAA8473 000.00s ICMPv6NIQueryIPv6 - IPv4 address passed 80D80DB7 000.00s ICMPv6NIQueryIPv4 - single label DNS name (internal) passed 10F9B2D6 000.00s ICMPv6NIQueryIPv4 - single label DNS name passed E9FA74CB 000.00s ICMPv6NIQueryIPv4 - fqdn (internal) passed 13BE3395 000.00s ICMPv6NIQueryIPv4 - fqdn passed 57710B44 000.00s ICMPv6NIQueryIPv4 - IPv6 address (internal) passed 4FE1F2D7 000.00s ICMPv6NIQueryIPv4 - IPv6 address passed 0F5CFF51 000.00s ICMPv6NIQueryIPv4 - IPv4 address (internal) passed D3A66514 000.00s ICMPv6NIQueryIPv4 - IPv4 address passed 90EE9B24 000.00s ICMPv6NIQueryIPv4 - dissection passed FB14D0BC 000.00s ICMPv6NIQueryIPv4 - hashret() passed 4FA1E638 000.00s ICMPv6NIQuery* - flags handling (Test 1) passed 9DA8440B 000.01s ICMPv6NIQuery* - flags handling (Test 2) passed 1DD2FCF9 000.00s ICMPv6NIReply* - flags handling (Test 1) passed 04A33787 000.01s ICMPv6NIReply* - flags handling (Test 2) passed 8ECA63FE 000.00s ICMPv6NIQuery* - Flags Default values passed 7043A408 000.00s ICMPv6NIReply* - Flags Default values passed 9DD5F86E 000.00s ICMPv6NIQueryIPv6 - dispatch with nothing in data passed F03359A7 000.00s ICMPv6NIQueryIPv6 - dispatch with IPv6 address in data passed A0C43FF6 000.00s ICMPv6NIQueryIPv6 - dispatch with IPv4 address in data passed FE817D4D 000.00s ICMPv6NIQueryIPv6 - dispatch with name in data passed 876BC56C 000.01s ICMPv6NIQueryName - dispatch with nothing in data passed E48D9A5D 000.00s ICMPv6NIQueryName - dispatch with IPv6 address in data passed 74621ABB 000.00s ICMPv6NIQueryName - dispatch with IPv4 address in data passed 2E1A4B52 000.00s ICMPv6NIQueryName - dispatch with name in data passed 9EB63E24 000.00s ICMPv6NIQueryIPv4 - dispatch with nothing in data passed 21D154E9 000.00s ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data passed B13ED40F 000.00s ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data passed 7E7B6F19 000.00s ICMPv6NIQueryIPv4 - dispatch with name in data passed CD3BE374 000.00s ICMPv6NIReplyName - dispatch passed D785DE76 000.00s ICMPv6NIReplyIPv6 - dispatch passed D4E6183C 000.00s ICMPv6NIReplyIPv4 - dispatch passed 5A60D811 000.00s ICMPv6NIReplyRefuse - dispatch passed D5BFCED9 000.00s ICMPv6NIReplyUnknown - dispatch passed 7C332597 000.00s ICMPv6NIReplyNOOP - single DNS name without hint => understood as string (internal) passed 3B9A395F 000.00s ICMPv6NIReplyNOOP - single DNS name without hint => understood as string passed 3788EEC1 000.00s ICMPv6NIReplyNOOP - fqdn without hint => understood as string (internal) passed A25145C0 000.00s ICMPv6NIReplyNOOP - fqdn without hint => understood as string passed 999B2E68 000.00s ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string (internal) passed 0969548F 000.00s ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string passed BFD5487C 000.00s ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string (internal) passed C13935F3 000.00s ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string passed 0D81A049 000.00s ICMPv6NIReplyName - single label DNS name as a rawing (without ttl) (internal) passed 3C53E327 000.00s ICMPv6NIReplyName - single label DNS name as a rawing (without ttl) passed 609A42C2 000.00s ICMPv6NIReplyName - fqdn name as a rawing (without ttl) (internal) passed 8A8C7EEE 000.00s ICMPv6NIReplyName - fqdn name as a rawing (without ttl) passed D3374243 000.00s ICMPv6NIReplyName - list of 2 single label DNS names (without ttl) (internal) passed 0D040755 000.00s ICMPv6NIReplyName - list of 2 single label DNS names (without ttl) passed 91AFC664 000.00s ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn] (internal) passed F1959693 000.00s ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn] passed A62F555E 000.00s ICMPv6NIReplyName - dissection passed 0327B8D1 000.00s ICMPv6NIReplyIPv6 - one IPv6 address without TTL (internal) passed 5BE7931B 000.00s ICMPv6NIReplyIPv6 - one IPv6 address without TTL passed F06FE01C 000.00s ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list) (internal) passed 48D51A67 000.00s ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list) passed DF725CF6 000.00s ICMPv6NIReplyIPv6 - one IPv6 address with TTL (internal) passed C1D13295 000.00s ICMPv6NIReplyIPv6 - one IPv6 address with TTL passed 5296D121 000.00s ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of rawings (without TTL) (internal) passed 888F2159 000.00s ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of rawings (without TTL) passed 92CA19B9 000.00s ICMPv6NIReplyIPv6 - two IPv6 addresses as a list (first with ttl, second without) (internal) passed 9237D0A0 000.00s ICMPv6NIReplyIPv6 - two IPv6 addresses as a list (first with ttl, second without) passed 9486E700 000.00s ICMPv6NIReplyIPv6 - build & dissection passed 5955F7E0 000.00s ICMPv6NIReplyIPv4 - one IPv4 address without TTL (internal) passed 0CAD9396 000.00s ICMPv6NIReplyIPv4 - one IPv4 address without TTL passed 34759FE1 000.00s ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list) (internal) passed 9BB55A35 000.00s ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list) passed DC268620 000.00s ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal) passed 6F083881 000.00s ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal) passed 0ED8BCE7 000.00s ICMPv6NIReplyIPv4 - two IPv4 addresses as a list of rawings (without TTL) passed 1D320704 000.00s ICMPv6NIReplyIPv4 - two IPv4 addresses as a list of rawings (without TTL) (internal) passed 31813DFC 000.00s ICMPv6NIReplyIPv4 - two IPv4 addresses as a list (first with ttl, second without) passed 2F24CF43 000.00s ICMPv6NIReplyIPv4 - two IPv4 addresses as a list (first with ttl, second without) (internal) passed 446E1292 000.00s ICMPv6NIReplyIPv4 - build & dissection passed 2E88C9E1 000.00s ICMPv6NIReplyRefuse - basic instantiation passed 7A08D0AB 000.00s ICMPv6NIReplyRefuse - basic dissection passed C18313EC 000.00s ICMPv6NIReplyUnknown - basic instantiation passed 1BA19182 000.00s ICMPv6NIReplyRefuse - basic dissection passed 25F69183 000.00s computeNIGroupAddr passed 810CA877 000.00s IPv6ExtHdrFragment - Basic Instantiation passed 3523504F 000.00s IPv6ExtHdrFragment - Instantiation with specific values passed 50251AD8 000.00s IPv6ExtHdrFragment - Basic Dissection passed D7C6213D 000.00s IPv6ExtHdrFragment - Instantiation with specific values passed 28BC4D04 000.00s IPv6 - IPv6ExtHdrFragment hashret passed 473F0D3F 000.02s fragment6 - test against a long TCP packet with a 1280 MTU passed C13258B5 000.02s fragment6 - test against a long TCP packet with a 1280 MTU without fragment header passed 4097E05C 000.03s defragment6 - test against a long TCP packet fragmented with a 1280 MTU passed D4BF84B5 000.01s defragment6 - test against packets with L2 header passed 14A8571E 000.03s defragment6 - test against a large TCP packet fragmented with a 1280 bytes MTU and missing fragments passed 5FC40359 000.01s defragment6 - test against a TCP packet fragmented with a 800 bytes MTU and missing fragments passed 22E57892 000.01s defragment6 - test the packet length passed E105A7D6 000.00s Fake interfaces passed E2FA358D 000.00s Route6 - Route6 flushing passed 3C829EE5 000.15s Route6 - Route6.route passed 90A8DA51 000.09s Route6 - Route6.make_route passed 249EDEFC 000.04s Route6 - Route6.add & Route6.delt passed 6C7F3CCC 000.00s Route6 - Route6.ifadd & Route6.ifdel passed 7AEF037C 000.01s IPv6 - utils passed 92EB7429 000.01s IPv6 - IPerror6 & UDPerror & _ICMPv6Error passed C85B6396 000.04s reset routes properly passed 6A54B998 000.00s ICMPv6MLQuery - build & dissection passed 8718938D 000.00s Check answers passed 52CBEBEA 000.00s ICMPv6MLQuery2 - build & dissection passed E2A0E7CE 000.00s ICMPv6MLReport2 - build & dissection passed 3C9829B9 000.00s ICMPv6MLReport2 and ICMPv6MLDMultAddrRec - dissection passed BEBE583F 000.00s Check answers passed E8030C5D 000.01s Define test utilities passed 6A1F7A15 000.01s Test NDP_Attack_DAD_DoS_via_NS passed 04CB506B 000.02s Test NDP_Attack_DAD_DoS_via_NA passed 2B24994F 000.01s Test NDP_Attack_NA_Spoofing passed FE484B43 000.01s Test NDP_Attack_Kill_Default_Router passed F96FBC83 000.02s Test NDP_Attack_Fake_Router passed A279F5A4 000.01s Test NDP_Attack_NS_Spoofing passed E44AE85E 000.00s in6_getha() passed 592778C9 000.00s ICMPv6HAADRequest - build/dissection passed 18E6F441 000.00s ICMPv6HAADReply - build/dissection passed 3B898003 000.00s ICMPv6HAADRequest / ICMPv6HAADReply - build/dissection passed 703155C7 000.00s ICMPv6MPSol - build (default values) passed 1F39B49A 000.00s ICMPv6MPSol - dissection (default values) passed D5807B21 000.00s ICMPv6MPSol - build passed 6C468680 000.00s ICMPv6MPSol - dissection passed FF26D9A7 000.00s ICMPv6MPAdv - build (default values) passed 9844767F 000.00s ICMPv6MPAdv - dissection (default values) passed C8446CFB 000.00s ICMPv6MPAdv - build passed A0A65698 000.00s ICMPv6MPAdv - dissection passed C2DC6F17 000.00s IPv6ExtHdrRouting - type 2 - build/dissection passed 693098A2 000.00s IPv6ExtHdrRouting - type 2 - hashret passed BE18A6D5 000.00s MIP6OptBRAdvice - build (default values) passed 1F838EDF 000.00s MIP6OptBRAdvice - dissection (default values) passed E0633312 000.00s MIP6OptBRAdvice - build passed D461A817 000.00s MIP6OptBRAdvice - dissection passed 2D3EA9D1 000.00s MIP6OptAltCoA - build (default values) passed B2D6DF37 000.00s MIP6OptAltCoA - dissection (default values) passed 3FDF4DEF 000.00s MIP6OptAltCoA - build passed A6FEC781 000.00s MIP6OptAltCoA - dissection passed 9F63513F 000.00s MIP6OptNonceIndices - build (default values) passed 62CFAA10 000.00s MIP6OptNonceIndices - dissection (default values) passed 29F89A20 000.00s MIP6OptNonceIndices - build passed 0A650149 000.00s MIP6OptNonceIndices - dissection passed D8650078 000.00s MIP6OptBindingAuthData - build (default values) passed D1DB4338 000.00s MIP6OptBindingAuthData - dissection (default values) passed AD44FCBE 000.00s MIP6OptBindingAuthData - build passed 626B98D7 000.00s MIP6OptBindingAuthData - dissection passed 899430EC 000.00s MIP6OptMobNetPrefix - build (default values) passed BF944CC7 000.00s MIP6OptMobNetPrefix - dissection (default values) passed 4100796A 000.00s MIP6OptMobNetPrefix - build passed CB86B6A7 000.00s MIP6OptMobNetPrefix - dissection passed FAA9B32E 000.00s MIP6OptLLAddr - basic build passed 57BD9C8D 000.00s MIP6OptLLAddr - basic dissection passed D2B9FFA2 000.00s MIP6OptLLAddr - build with specific values passed DED1F1CA 000.00s MIP6OptLLAddr - dissection with specific values passed 3EB82B5B 000.00s MIP6OptMNID - basic build passed 0BD909BB 000.00s MIP6OptMNID - basic dissection passed BC66CE7D 000.00s MIP6OptMNID - build with specific values passed 98E601DF 000.00s MIP6OptMNID - dissection with specific values passed 2EA8576B 000.00s MIP6OptMsgAuth - basic build passed 4E7DB72B 000.00s MIP6OptMsgAuth - basic dissection passed AF7CEF39 000.00s MIP6OptMsgAuth - build with specific values passed 8F9664D3 000.00s MIP6OptMsgAuth - dissection with specific values passed 1366CFF5 000.00s MIP6OptReplayProtection - basic build passed 4E5171DC 000.00s MIP6OptReplayProtection - basic dissection passed 2160C672 000.00s MIP6OptReplayProtection - build with specific values passed 808820E6 000.00s MIP6OptReplayProtection - dissection with specific values passed 00000000 000.00s MIP6OptCGAParams passed 00000000 000.01s MIP6OptSignature passed 00000000 000.00s MIP6OptHomeKeygenToken passed 00000000 000.00s MIP6OptCareOfTestInit passed 00000000 000.00s MIP6OptCareOfTest passed 6F90C841 000.01s Mobility Options - Automatic Padding - MIP6OptBRAdvice passed 81BCBF42 000.01s Mobility Options - Automatic Padding - MIP6OptAltCoA passed FB9089F0 000.01s Mobility Options - Automatic Padding - MIP6OptNonceIndices passed C2A7CFBF 000.01s Mobility Options - Automatic Padding - MIP6OptBindingAuthData passed 0099BB44 000.01s Mobility Options - Automatic Padding - MIP6OptMobNetPrefix passed 8144EF0D 000.01s Mobility Options - Automatic Padding - MIP6OptLLAddr passed 1907ADCE 000.01s Mobility Options - Automatic Padding - MIP6OptMNID passed 085C2EB2 000.01s Mobility Options - Automatic Padding - MIP6OptMsgAuth passed 0CFD6125 000.01s Mobility Options - Automatic Padding - MIP6OptReplayProtection passed 7B1D075B 000.01s Mobility Options - Automatic Padding - MIP6OptCGAParamsReq passed 0CB63ED5 000.01s Mobility Options - Automatic Padding - MIP6OptCGAParams passed 55703FC9 000.01s Mobility Options - Automatic Padding - MIP6OptSignature passed 8A64A6E7 000.01s Mobility Options - Automatic Padding - MIP6OptHomeKeygenToken passed 2EF8FA78 000.01s Mobility Options - Automatic Padding - MIP6OptCareOfTestInit passed EA424CA5 000.01s Mobility Options - Automatic Padding - MIP6OptCareOfTest passed 343D67A9 000.00s MIP6MH_BRR - Build (default values) passed FA10AAFE 000.00s MIP6MH_BRR - Build with specific values passed CC0997F9 000.00s MIP6MH_BRR - Basic dissection passed 3F85511F 000.00s MIP6MH_BRR - Dissection with specific values passed 972AC425 000.01s MIP6MH_BRR / MIP6MH_BU / MIP6MH_BA hashret() and answers() passed A074EB35 000.00s MIP6MH_HoTI - Build (default values) passed 16F24C0F 000.00s MIP6MH_HoTI - Dissection (default values) passed 008E3B60 000.00s MIP6MH_HoTI - Build (specific values) passed A0A512FE 000.00s MIP6MH_HoTI - Dissection (specific values) passed 1BB92C38 000.00s MIP6MH_CoTI - Build (default values) passed 6C3D4668 000.00s MIP6MH_CoTI - Dissection (default values) passed CBB62C95 000.00s MIP6MH_CoTI - Build (specific values) passed 90C87043 000.00s MIP6MH_CoTI - Dissection (specific values) passed 9805A2D8 000.00s MIP6MH_HoT - Build (default values) passed 91A2B934 000.00s MIP6MH_HoT - Dissection (default values) passed 527EC2C7 000.00s MIP6MH_HoT - Build (specific values) passed 9ECE0115 000.00s MIP6MH_HoT - Dissection (specific values) passed A78ACF94 000.00s MIP6MH_HoT answers passed 10CB707C 000.00s MIP6MH_CoT - Build (default values) passed 4103DE62 000.00s MIP6MH_CoT - Dissection (default values) passed D1E23B94 000.00s MIP6MH_CoT - Build (specific values) passed 9C96522A 000.00s MIP6MH_CoT - Dissection (specific values) passed 7AC66C5F 000.00s MIP6MH_BU - build (default values) passed CD3B0A32 000.00s MIP6MH_BU - dissection (default values) passed F03F99F5 000.00s MIP6MH_BU - build passed 48B7FAB6 000.00s MIP6MH_BU - dissection passed 4E3A1E0B 000.00s MIP6MH_BA - build passed B3EB0DA2 000.00s MIP6MH_BA - dissection passed F1A9E8C2 000.00s MIP6MH_BE - build passed 7760C958 000.00s MIP6MH_BE - dissection passed 4F7A0CFB 000.02s get_trace() passed 835F8157 000.01s show() passed 698AEC27 000.00s graph() Campaign CRC=FF551F8C in 001.54s SHA=B8A3D6C5ED3C0C6BA629D848C71C986345C214E3 PASSED=518 FAILED=0 ━ Loading: test/scapy/layers/ipsec.uts passed BE787E60 000.01s IPv4 / ESP - Transport - NULL - NULL passed 4BFD1475 000.02s IPv4 / ESP - Transport - DES - NULL passed 155233D5 000.02s IPv4 / ESP - Transport - 3DES - NULL passed A69D1594 000.02s IPv4 / ESP - Transport - AES-CBC - NULL passed 2B56C1E7 000.01s IPv4 / ESP - Transport - AES-CTR - NULL passed 4DFAD07B 000.02s IPv4 / ESP - Transport - Blowfish - NULL passed 98F92501 000.01s IPv4 / ESP - Transport - CAST - NULL passed 3BAEC1B7 000.01s IPv4 / ESP - Tunnel - NULL - NULL passed 5ABB7C32 000.01s IPv4 / ESP - Tunnel - DES - NULL passed 1A15D31C 000.01s IPv4 / ESP - Tunnel - 3DES - NULL passed E57F3DC8 000.01s IPv4 / ESP - Tunnel - AES-CBC - NULL passed FF95EAEE 000.01s IPv4 / ESP - Tunnel - AES-CTR - NULL passed 26D0946F 000.01s IPv4 / ESP - Tunnel - Blowfish - NULL passed DE8CCD12 000.01s IPv4 / ESP - Tunnel - CAST - NULL passed 721E4D4F 000.01s IPv4 / ESP - Transport - NULL - HMAC-SHA1-96 passed 64FE0475 000.01s IPv4 / ESP - Transport - NULL - HMAC-SHA1-96 - altered packet passed 0BDE7793 000.01s IPv4 / ESP - Transport - NULL - SHA2-256-128 passed A6571565 000.01s IPv4 / ESP - Transport - NULL - SHA2-256-128 - altered packet passed 8560553E 000.01s IPv4 / ESP - Transport - NULL - SHA2-384-192 passed DDA0FDA3 000.01s IPv4 / ESP - Transport - NULL - SHA2-384-192 - altered packet passed 34A2393C 000.01s IPv4 / ESP - Transport - NULL - SHA2-512-256 passed 6D26D606 000.01s IPv4 / ESP - Transport - NULL - SHA2-512-256 - altered packet passed 694EB733 000.01s IPv4 / ESP - Transport - NULL - HMAC-MD5-96 passed BF423759 000.01s IPv4 / ESP - Transport - NULL - HMAC-MD5-96 - altered packet passed 709B95B3 000.01s IPv4 / ESP - Transport - NULL - AES-CMAC-96 passed EEE91CF9 000.01s IPv4 / ESP - Transport - NULL - AES-CMAC-96 - altered packet passed 078AA3E2 000.01s IPv4 / ESP - Tunnel - NULL - HMAC-SHA1-96 passed 06FC4E82 000.01s IPv4 / ESP - Tunnel - NULL - HMAC-SHA1-96 - altered packet passed 98F2191A 000.01s IPv4 / ESP - Tunnel - NULL - SHA2-256-128 passed 408778B7 000.01s IPv4 / ESP - Tunnel - NULL - SHA2-256-128 - altered packet passed 4D54BFF9 000.01s IPv4 / ESP - Tunnel - NULL - SHA2-384-192 passed D29966C1 000.01s IPv4 / ESP - Tunnel - NULL - SHA2-384-192 - altered packet passed 5290C2AC 000.01s IPv4 / ESP - Tunnel - NULL - SHA2-512-256 passed 01C7445A 000.01s IPv4 / ESP - Tunnel - NULL - SHA2-512-256 - altered packet passed 20A3D05C 000.01s IPv4 / ESP - Tunnel - NULL - HMAC-MD5-96 passed 2EB5CC3F 000.01s IPv4 / ESP - Tunnel - NULL - HMAC-MD5-96 - altered packet passed 16E04BDA 000.01s IPv4 / ESP - Tunnel - NULL - AES-CMAC-96 passed 9317B172 000.01s IPv4 / ESP - Tunnel - NULL - AES-CMAC-96 - altered packet passed 4BE244FC 000.01s IPv4 / ESP - Transport - AES-CBC - HMAC-SHA1-96 passed 4609DBBA 000.01s IPv4 / ESP - Transport - AES-CBC - HMAC-SHA1-96 - altered packet passed F7B73A46 000.01s IPv4 / ESP - Transport - AES-CBC - HMAC-SHA2-256-128 -- ESN passed 60743572 000.02s IPv4 / ESP - Transport - AES-GCM - NULL passed B816950E 000.01s IPv4 / ESP - Transport - AES-GCM - NULL -- ESN passed EFF2AEC3 000.00s IPv4 / ESP - Transport - AES-GCM - NULL - altered packet passed 0F5682F6 000.01s IPv4 / ESP - Transport - AES-GCM - NULL - altered packet -- ESN passed 8302D117 000.01s IPv4 / ESP - Transport - AES-NULL-GMAC - NULL passed 2FA68526 000.02s IPv4 / ESP - Transport - AES-NULL-GMAC - NULL -- ESN passed 9615B34A 000.01s IPv4 / ESP - Transport - AES-NULL-GMAC - NULL - altered packet passed CDB6DA9C 000.01s IPv4 / ESP - Transport - AES-NULL-GMAC - NULL - altered packet -- ESN passed 73577967 000.02s IPv4 / ESP - Transport - AES-CCM - NULL passed D1252BD3 000.01s IPv4 / ESP - Transport - AES-CCM - NULL - altered packet passed 686304BF 000.01s IPv4 / ESP - Tunnel - AES-CBC - HMAC-SHA1-96 passed AB05FAD0 000.01s IPv4 / ESP - Tunnel - AES-CBC - HMAC-SHA1-96 - altered packet passed ECB1C0E0 000.01s IPv4 / ESP - Tunnel - AES-GCM - NULL passed 6F8AF28C 000.01s IPv4 / ESP - Tunnel - AES-GCM - NULL -- ESN passed BB0FFC78 000.01s IPv4 / ESP - Tunnel - AES-GCM - NULL - altered packet passed 6A6B97BB 000.01s IPv4 / ESP - Tunnel - AES-GCM - NULL - altered packet - ESN passed E96FBCF2 000.01s IPv4 / ESP - Tunnel - AES-CTR - NULL - verify no cipher align padding passed 7FA18A3D 000.01s IPv4 / ESP - Tunnel - AES-GCM - NULL - verify no cipher align padding passed 574F37C7 000.01s IPv4 / ESP - Tunnel - AES-CCM - NULL passed D1252BD3 000.01s IPv4 / ESP - Tunnel - AES-CCM - NULL passed 7BF5C43E 000.02s IPv4 / AH - Transport - HMAC-SHA1-96 passed 8FC8F7C3 000.01s IPv4 / AH - Transport - HMAC-SHA1-96 - altered packet passed DEAF6343 000.01s IPv4 / AH - Transport - SHA2-256-128 passed F07B1D6E 000.01s IPv4 / AH - Transport - SHA2-256-128 - altered packet passed 76DD92B4 000.02s IPv4 / AH - Transport - SHA2-384-192 passed 9A59C5D3 000.01s IPv4 / AH - Transport - SHA2-384-192 - altered packet passed 941180D1 000.01s IPv4 / AH - Transport - SHA2-512-256 passed 6966E0A6 000.01s IPv4 / AH - Transport - SHA2-512-256 - altered packet passed 501B87DD 000.01s IPv4 / AH - Transport - HMAC-MD5-96 passed 9137EE25 000.01s IPv4 / AH - Transport - HMAC-MD5-96 - altered packet passed B2B64BD5 000.01s IPv4 / AH - Transport - AES-CMAC-96 passed B23F77A5 000.01s IPv4 / AH - Transport - AES-CMAC-96 - altered packet passed AF01DEBB 000.01s IPv4 / AH - Transport - AES-CMAC-96 -- ESN passed 4F05F601 000.01s IPv4 / AH - Transport - AES-CMAC-96 - altered packet -- ESN passed 7FCBA758 000.01s IPv4 / AH - Tunnel - HMAC-SHA1-96 passed 018695A1 000.01s IPv4 / AH - Tunnel - HMAC-SHA1-96 - altered packet passed BB8D7092 000.02s IPv4 / AH - Tunnel - SHA2-256-128 passed 123FCDAA 000.01s IPv4 / AH - Tunnel - SHA2-256-128 - altered packet passed 579EC3B4 000.02s IPv4 / AH - Tunnel - SHA2-384-192 passed 31BB6007 000.01s IPv4 / AH - Tunnel - SHA2-384-192 - altered packet passed C7B6B9F7 000.01s IPv4 / AH - Tunnel - SHA2-512-256 passed 7FC9D985 000.01s IPv4 / AH - Tunnel - SHA2-512-256 - altered packet passed F3253BC3 000.03s IPv4 / AH - Tunnel - HMAC-MD5-96 passed E1C72CDF 000.02s IPv4 / AH - Tunnel - HMAC-MD5-96 - altered packet passed 6CFC870B 000.01s IPv4 / AH - Tunnel - AES-CMAC-96 passed A811BE4C 000.02s IPv4 / AH - Tunnel - AES-CMAC-96 - altered packet passed EE3732E8 000.02s IPv4 / AH - Tunnel - AES-CMAC-96 -- ESN passed 2A318FFA 000.02s IPv4 / AH - Tunnel - AES-CMAC-96 - altered packet -- ESN passed E7481782 000.02s IPv4 / UDP / ESP - NAT-Traversal - Tunnel passed 9C458FCA 000.01s IPv4 / UDP / ESP - NAT-Traversal - Transport passed 5082BF75 000.01s IPv6 / ESP - NAT-Traversal - Transport passed EE75EC62 000.01s IPv6 / ESP - Transport - NULL - NULL passed 197F8DB9 000.01s IPv6 / ESP - Transport - AES-CBC - NULL passed E315218B 000.01s IPv6 / ESP - Transport - NULL - HMAC-SHA1-96 passed DB146065 000.01s IPv6 / ESP - Transport - NULL - HMAC-SHA1-96 - altered packet passed D6437C81 000.01s IPv6 / ESP - Transport - AES-CBC - HMAC-SHA1-96 passed 2CB4D6C9 000.01s IPv6 / ESP - Transport - AES-CBC - HMAC-SHA1-96 - altered packet passed FB103C68 000.01s IPv6 / ESP - Transport - AES-GCM - NULL passed DDBFA505 000.01s IPv6 / ESP - Transport - AES-GCM - NULL - altered packet passed CED8FFAD 000.01s IPv6 / ESP - Transport - AES-CCM - NULL passed 890E77A4 000.01s IPv6 / ESP - Transport - AES-CCM - NULL - altered packet passed 927AD276 000.01s IPv6 / ESP - Tunnel - NULL - NULL passed 54B635F6 000.01s IPv6 / ESP - Tunnel - AES-CBC - NULL passed B3C286B5 000.01s IPv6 / ESP - Tunnel - NULL - HMAC-SHA1-96 passed B62FB7B2 000.01s IPv6 / ESP - Tunnel - NULL - HMAC-SHA1-96 - altered packet passed 90A551A2 000.01s IPv6 / ESP - Tunnel - AES-CBC - HMAC-SHA1-96 passed 76ED653B 000.01s IPv6 / ESP - Tunnel - AES-CBC - HMAC-SHA1-96 - altered packet passed 467BD474 000.01s IPv6 / ESP - Tunnel - AES-GCM - NULL passed E168D060 000.01s IPv6 / ESP - Tunnel - AES-GCM - NULL - altered packet passed 7BF3BE38 000.01s IPv6 / ESP - Tunnel - AES-CCM - NULL passed 0BF1F1B8 000.02s IPv6 / ESP - Tunnel - AES-CCM - NULL - altered packet passed 02D509E0 000.01s IPv6 / AH - Transport - HMAC-SHA1-96 passed 8BDBC8D2 000.01s IPv6 / AH - Transport - HMAC-SHA1-96 - altered packet passed 63E63CDF 000.01s IPv6 / AH - Transport - SHA2-256-128 passed 4997ABA2 000.01s IPv6 / AH - Transport - SHA2-256-128 - altered packet passed E1A95B92 000.01s IPv6 / AH - Tunnel - HMAC-SHA1-96 passed 72FCFD4D 000.01s IPv6 / AH - Tunnel - HMAC-SHA1-96 - altered packet passed 74533187 000.01s IPv6 / AH - Tunnel - SHA2-256-128 passed 5BAE868B 000.02s IPv6 / AH - Tunnel - SHA2-256-128 - altered packet passed 629BA203 000.02s IPv6 + Extensions / AH - Transport passed 2CED8A9F 000.02s IPv6 + Routing Header / AH - Transport Campaign CRC=99AACA59 in 001.49s SHA=6D0D04C55881A6BC8B5BCD927FB980B497AF1793 PASSED=122 FAILED=0 ━ Loading: test/scapy/layers/isakmp.uts passed 971541D5 000.01s ISAKMP - Phase 1 - Aggressive Security Association dissection passed 73120E2E 000.00s ISAKMP - Over NAT-Transversal - dissection passed F28B31C6 000.00s ISAKMP - Phase 2 - Security Association dissection passed C7A26A33 000.00s ISAKMP_payload_Transform passed F32DF800 000.01s ISAKMP_payload_Transform build passed AAE066B0 000.01s ISAKMP_payload_Transform dissection passed 1282F975 000.00s ISAKMP_payload_Notify passed DE39CB8B 000.00s ISAKMP_payload_delete Campaign CRC=30DA2388 in 000.04s SHA=8C1CA569FFAC4DAF4FC95E4416E09D54A71A4868 PASSED=8 FAILED=0 ━ Loading: test/scapy/layers/kerberos.uts passed B0D82850 000.00s Parse AS-REQ passed EB84AB16 000.01s Parse KRB-ERROR passed 7E952D53 000.00s Parse AS-REP passed CB82F105 000.01s Parse TGS-REQ passed 43B593A8 000.00s Parse TGS-REP passed C0620561 000.00s Create Key (RC4_HMAC) passed BF0CB69A 000.00s Parse AS-REQ (no preauth) passed 04B28AAD 000.01s Parse and decrypt AS-REP (no preauth, RC4) passed 814BCAA9 000.00s Parse and decrypt TGS-REQ (DES-CBC-MD5) passed A5017D27 000.01s Parse and decrypt TGS-REP (DES-CBC-MD5) passed 630685B3 000.01s FAST - Parse FAST AS-Req passed 00E72D58 000.06s FAST - Decrypt fast ticket in AS-REQ passed BEBD6796 000.00s FAST - Decrypt authenticator in AS-REQ passed 5B6B7548 000.01s FAST - Compute the armor key passed 250EEB18 000.00s FAST - Decrypt KDC REQ BODY from AS-REQ passed 3AE67EF6 000.00s FAST - Check Fast Armor checksum passed EACEBCCC 000.01s Test Kerberos InnerToken wrapping (ancient RFC1964) passed 675FCC94 000.05s MSPAC - Parse WIN2K-PAC (real life) passed 01FF33A9 000.06s MSPAC - Parse WIN2K-PAC (MS-PAC sect 3) passed 5D96DC90 000.93s MSPAC - Build WIN2K-PAC (MS-PAC sect 3) passed E1A0E6A4 000.01s MSPAC - Dissect and rebuild UPN_DNS_INFO passed 5568A621 000.01s MSPAC - Construct a CLAIMS_SET object passed 47D54995 000.01s MSPAC - Check that Pointers, Arrays, etc. were inferred passed 1173A923 000.01s MSPAC - Build the packet passed 18B93418 000.01s MSPAC - Dissect the packet passed 21AE2D38 000.00s Ticketer++ - Load ticketer module passed 079E184A 000.00s Ticketer++ - Write ccache to disk passed B98968CE 000.01s Ticketer++ - Create and load Ticketer object passed CE915728 000.09s Ticketer++ - Get ticket 0, change it, resign it and set it back passed E794303D 000.00s Ticketer++ - Call show() passed E4F9E31D 000.00s Ticketer++ - Save to disk passed 2554A757 000.00s Ticketer++ - Read and check written ccache passed 907CB22D 002.93s Ticketer++ - Import ticket passed F3C0C4EC 000.04s RFC3691 - Test vectors for KRB-FX-CF2 passed 050B7DA0 000.00s RFC3691 - Test vectors for _n_fold passed F56AA631 000.01s RFC3691 - Test vectors for mit_des_string_to_key passed 70160FD4 000.01s RFC3691 - Test vectors for DES3 passed 4EF5B63D 000.01s RFC3692 - Test vectors for AES passed B7D6BE3F 000.09s RFC8009 - Test vectors for AES-CTS HMAC-SHA2 - Sample results for string-to-key conversion passed 5AC01D24 000.00s RFC8009 - Test vectors for AES-CTS HMAC-SHA2 - Sample results for key derivation passed 92138F88 000.01s RFC8009 - Test vectors for AES-CTS HMAC-SHA2 - Sample encryptions and decryptions passed 674A10F2 000.00s RFC8009 - Test vectors for AES-CTS HMAC-SHA2 - Sample checksums passed 8F0224F5 000.00s RFC8009 - Test vectors for AES-CTS HMAC-SHA2 - Sample pseudorandom function (PRF) invocations passed CA4ED12B 000.00s Decrypt PA-ENC-TIMESTAMP passed DBB7D7C1 000.01s [MS-KILE] RC4 GSS_WrapEx (RFC4757) test vectors (sect 4.5) passed BED47B30 000.00s [MS-KILE] RC4 GSS_UnwrapEx (RFC4757) test vectors (sect 4.5) passed 5E7F9DF5 000.00s Create randomness-mock context manager passed 69D2899C 000.00s Create client and server SPNEGOSSP[KerberosSSP] passed C38095B1 000.03s GSS_Init_sec_context (negTokenInit: KRB_AP_REQ) passed DB08291F 000.05s GSS_Accept_sec_context (SPNEGO_negTokenResp: KRB_AP_REQ->KRB_AP_REP) passed 9371F051 000.00s GSS_Init_sec_context (SPNEGO_negToken: KRB_AP_REP->OK) passed 3A1D403E 000.00s GSS_GetMICEx/GSS_VerifyMICEx: client sends a signed payload passed 71476F8D 000.00s GSS_GetMICEx/GSS_VerifyMICEx: server answers back passed 64BE6B2A 000.00s GSS_GetMICEx/GSS_VerifyMICEx: inject fault passed 5DCF4E81 000.01s Create client and server KerberosSSP (raw) passed B5A34F99 000.02s GSS_Init_sec_context (KRB_AP_REQ) - DCE_STYLE passed DC7BBDE9 000.05s GSS_Accept_sec_context (KRB_AP_REQ->KRB_AP_REP) - DCE_STYLE passed 44A1F973 000.01s GSS_Init_sec_context (SPNEGO_negToken: KRB_AP_REP->KRB_AP_REP) - DCE_STYLE passed 3604AD4D 000.01s GSS_Accept_sec_context (KRB_AP_REP->OK) - DCE_STYLE passed B7818504 000.01s GSS_Wrap/GSS_Unwrap: client sends wrapped payload without confidentiality passed 09B2D54F 000.00s GSS_Wrap/GSS_Unwrap: server answers back without confidentiality passed DC61C9C4 000.01s GSS_WrapEx/GSS_UnwrapEx: client sends wrapped payload with confidentiality passed 7A7B8137 000.01s GSS_WrapEx/GSS_UnwrapEx: server answers back confidentiality Campaign CRC=3A01D440 in 004.63s SHA=8C051DCED0826315A07F086E8457E1A6A54F8749 PASSED=63 FAILED=0 ━ Loading: test/scapy/layers/l2.uts passed 9198E99F 000.00s Test ARPingResult output passed 470D7569 000.02s arp_mitm - IP to IP passed B1A8DF28 000.04s arp_mitm - IP to range passed 8D22216F 000.00s STP - Basic Instantiation passed AA3BE87F 000.00s STP - Basic Dissection passed 21257BAD 000.00s Simple Ether() / ARP() show passed AFE513E9 000.00s ARP for IPv4 passed A8F2D976 000.00s ARP for IPv6 passed 5EEB24C2 000.00s Dummy ARP passed C41B04AB 000.00s 802.1Q VLAN passed ABEE4F93 000.00s 802.1ad Q-in-Q passed F03DE515 000.01s 802.1ah PBB mac-in-mac passed F1C2D997 000.01s 802.1ah PBB mac-in-mac - answer passed 6EF46D45 000.00s CookedLinux - Basic Dissection passed 2B4AFD82 000.00s CookedLinuxV2 - Basic Dissection Campaign CRC=75825EA5 in 000.11s SHA=CAEC4260D0B9627AFEE4C6B0741E9AAEE3053314 PASSED=15 FAILED=0 ━ Loading: test/scapy/layers/l2tp.uts passed 2CF8D04B 000.00s L2TP - build passed A230380E 000.00s L2TP - build with computed length passed 6BDF4376 000.00s L2TP - dissection Campaign CRC=AF6A5704 in 000.01s SHA=E073D3FFB3DF99157254F90BBBF5B967C8CABA6F PASSED=3 FAILED=0 ━ Loading: test/scapy/layers/ldap.uts passed D8C5FC33 000.00s Load LDAP passed 02DBB16C 000.01s LDAP_UnbindRequest passed 31CF6E74 000.01s LDAP_BindRequest passed B63B357B 000.01s LDAP_BindResponse passed E8463FE4 000.01s LDAP_SearchRequest passed 317D8080 000.04s LDAP_SearchResponse passed 175EC7B5 000.01s Basic CLDAP dissection & build test passed C345924B 000.01s More advanced CLDAP dissection & build test passed 328F22F1 000.00s Test dissection of Microsoft LDAP passed 1957209B 000.01s Test re-build of Microsoft LDAP passed 7EB0E3D7 000.01s Craft new Microsoft LDAP Search Request with Controls passed 21E2E4BB 000.00s Dissect NETLOGON_SAM_LOGON_RESPONSE_EX - V1+V5EX+V5EXWITH_IP passed 5BAC9392 000.00s Dissect NETLOGON_SAM_LOGON_RESPONSE_EX - V1+V5EX passed 04FF1BE1 000.00s Dissect NETLOGON_SAM_LOGON_RESPONSE - V1+V5 passed 8F387767 000.00s Dissect NETLOGON_SAM_LOGON_RESPONSE_NT40 - V1 Campaign CRC=A6B504DE in 000.11s SHA=29AC6D3E570C3C4FBC6B0BCA119A9F00F95DB175 PASSED=15 FAILED=0 ━ Loading: test/scapy/layers/ldapopenldap.uts Campaign CRC=0722B3A6 in 000.00s SHA=1A2EE97DE16A011A8A6D0ED2CF64C4D1C0365E29 PASSED=0 FAILED=0 ━ Loading: test/scapy/layers/llmnr.uts passed 6C984879 000.00s Simple packet dissection passed 1770C0CD 000.00s Dissection with the "T"entative bit set and the "TrunCation" bit unset passed 42099687 000.00s Packet build / dissection passed 38C132CD 000.00s Answers - building passed F1258B96 000.00s Answers - dissecting passed 4F7286DF 000.01s Summary Campaign CRC=2435930C in 000.02s SHA=755CACEE3E96A520852395A267A3B4FD76AC80F8 PASSED=6 FAILED=0 ━ Loading: test/scapy/layers/lltd.uts passed 99984E6C 000.00s Simple packet dissection passed FBB44224 000.00s Packet build / dissection passed 4D757290 000.05s Attribute build / dissection passed 8512CA50 000.01s Large TLV passed 7A47CDD6 000.00s Summary Campaign CRC=87208042 in 000.07s SHA=E627381FCCCD25937427253733BEE3011F5AC4DD PASSED=5 FAILED=0 ━ Loading: test/scapy/layers/mgcp.uts passed 5B4119BB 000.00s MGCP - build passed A0ED03AF 000.00s MGCP - dissect Campaign CRC=12D768A8 in 000.00s SHA=FFE6B99B6805F15DD4D36F390A3922C99BCFE604 PASSED=2 FAILED=0 ━ Loading: test/scapy/layers/mobileip.uts passed E653E518 000.01s MobileIP - build passed A735736A 000.00s MobileIP - dissect Campaign CRC=84239F45 in 000.01s SHA=89D0098ABA1598654C50D3ACA3D0630C08B2C950 PASSED=2 FAILED=0 ━ Loading: test/scapy/layers/msdrsr.uts passed 4D914143 000.07s [EXCH] - Load MSDRSR exchange and decrypt (SPNEGOSSP/NTLMSSP) passed 233A7676 000.00s [EXCH] - Check IDL_DRSBind_Request passed 4E657460 000.00s [EXCH] - Check IDL_DRSBind_Response passed 5BBCD645 000.00s [EXCH] - Check IDL_DRSCrackNames_Request passed 19951D03 000.00s [EXCH] - Check IDL_DRSCrackNames_Response Campaign CRC=2BABE088 in 000.09s SHA=9EFE8F35946992E307DA5D68EEB370DAB4947090 PASSED=5 FAILED=0 ━ Loading: test/scapy/layers/msnrpc.uts passed 330D6ACA 000.00s [MS-NRPC] test vectors - sect 4.2 passed A6917201 000.00s [MS-NRPC] test vectors - sect 4.3 passed FDB677E9 000.00s [MS-NRPC] test vectors - sect 4.3.1 passed 7AE1E08C 000.00s [EXCH] - Load MSRPCE and bind passed BA209B56 000.03s [EXCH] - Parse NRPC exchange (pcap) passed B0F13903 000.00s [EXCH] - Check ept_map_Request passed F1E97FD9 000.01s [EXCH] - Re-build ept_map_Request from scratch passed AD59EA9A 000.00s [EXCH] - Check ept_map_Response passed F5EBF4ED 000.01s [EXCH] - Re-build ept_map_Response from scratch passed FB87BC18 000.00s [EXCH] - Check NetrServerReqChallenge_Request passed 4FC98B71 000.01s [EXCH] - Re-build NetrServerReqChallenge_Request from scratch passed 3543ABF0 000.00s [EXCH] - Check NetrServerReqChallenge_Response passed DED2F6E6 000.00s [EXCH] - Re-build NetrServerReqChallenge_Response from scratch passed AB148ECB 000.00s [EXCH] - Check NetrServerAuthenticate3_Request passed 62E5D792 000.00s [EXCH] - Re-build NetrServerAuthenticate3_Request from scratch passed C874C6D7 000.00s [EXCH] - Check NetrServerAuthenticate3_Response passed 1250AE04 000.00s [EXCH] - Re-build NetrServerAuthenticate3_Response from scratch passed 9EE08EDC 000.00s [NetlogonSSP] - Create randomness-mock context manager passed AEB88361 000.00s [NetlogonSSP] - RC4 - Create client and server NetlogonSSP passed 6E19D682 000.00s [NetlogonSSP] - RC4 - GSS_Init_sec_context (NL_AUTH_MESSAGE) passed 5D8EC78C 000.00s [NetlogonSSP] - RC4 - GSS_Accept_sec_context (NL_AUTH_MESSAGE->NL_AUTH_MESSAGE) passed E1EDC873 000.00s [NetlogonSSP] - RC4 - GSS_Init_sec_context (NL_AUTH_MESSAGE->OK) passed 4F68D876 000.01s [NetlogonSSP] - RC4 - GSS_WrapEx/GSS_UnwrapEx: client sends a encrypted payload passed A2E6D9D9 000.00s [NetlogonSSP] - RC4 - GSS_WrapEx/GSS_UnwrapEx: server answers back passed 27457AA7 000.00s [NetlogonSSP] - RC4 - GSS_WrapEx/GSS_UnwrapEx: inject fault passed AEA3D9EA 000.00s [NetlogonSSP] - AES - Create client and server NetlogonSSP passed 6E19D682 000.00s [NetlogonSSP] - AES - GSS_Init_sec_context (NL_AUTH_MESSAGE) passed 5D8EC78C 000.00s [NetlogonSSP] - AES - GSS_Accept_sec_context (NL_AUTH_MESSAGE->NL_AUTH_MESSAGE) passed E1EDC873 000.00s [NetlogonSSP] - AES - GSS_Init_sec_context (NL_AUTH_MESSAGE->OK) passed 651E76B1 000.00s [NetlogonSSP] - AES - GSS_WrapEx/GSS_UnwrapEx: client sends a encrypted payload passed EFBCE375 000.01s [NetlogonSSP] - AES - GSS_WrapEx/GSS_UnwrapEx: server answers back passed 27457AA7 000.01s [NetlogonSSP] - AES - GSS_WrapEx/GSS_UnwrapEx: inject fault Campaign CRC=11A858CC in 000.13s SHA=8A6D14633EC822C61BCDD1405B763691209E2F73 PASSED=32 FAILED=0 ━ Loading: test/scapy/layers/netbios.uts passed 962C167D 000.00s NBNSQueryRequest - build & dissect passed DC633542 000.01s NBNSQueryResponse - build & dissect passed 7841468E 000.00s NBNSQueryResponse answers NBNSQueryRequest passed 900E1AFE 000.00s NBNSQueryResponse answers long NBNSQueryRequest passed 175FD436 000.00s NBNSNodeStatusResponse - build & dissect passed 728B2806 000.00s NBNSNodeStatusRequest - build and answers passed BE88B471 000.00s NBNSWackResponse - build & dissect passed 741E538B 000.00s NBTSession Campaign CRC=2115CC0D in 000.03s SHA=2D3BA6152546B9D038E9D0DBCFE64ED6D1B8FDFB PASSED=8 FAILED=0 ━ Loading: test/scapy/layers/netflow.uts passed FAA2CA0C 000.00s NetflowHeaderV5 - basic building passed AA93666E 000.00s NetflowHeaderV5 - UDP bindings passed 4C3D693B 000.00s NetflowHeaderV5 - basic dissection passed 86E34794 000.02s NetflowV9 - advanced dissection passed E3C15092 000.01s NetflowV9 - Multiple FlowSets in one packet passed FE5EF859 000.02s NetflowV9 - build and dissection passed 9FC287A9 000.02s NetflowV9 - advanced build passed DC95D31B 000.00s NetflowV9 - padding #GH2257 passed D19D866C 000.00s NetflowV9 - Options Template build passed EC671098 000.04s NetflowV9 - Advanced build, multiple flowsets and multiple records by flowset passed AB23921C 000.01s NetflowV9 - Advanced dissection, complete example passed 18BDF888 000.02s IPFix dissection passed F0F3B7D8 000.01s NetflowV10/IPFIX - dissection without padding (GH3101) passed 9B964405 000.01s NetflowV10/IPFIX - build passed CF54A5E0 000.02s NetflowSession - dissect packet NetflowV9 packets on-the-flow Campaign CRC=7297834E in 000.18s SHA=C839AA93C032E3BA6B061428BFD30B98ED936B04 PASSED=15 FAILED=0 ━ Loading: test/scapy/layers/ntlm.uts passed 6AF74FDB 000.00s [MS-NLMP] 4.2.1 - Common Values passed 82DAAA5E 000.00s [MS-NLMP] 4.2.4 passed 00A71206 000.00s [MS-NLMP] 4.2.4.1.1 NTOWFv2() passed B629E3B1 000.00s Build NTLMv2_RESPONSE passed C3A9AE1B 000.00s [MS-NLMP] 4.2.4.2.2 NTLMv2 Response passed BA4F35F3 000.00s [MS-NLMP] 4.2.4.1.2 Session Base Key passed E411B70D 000.00s [MS-NLMP] 4.2.4.2.3 Encrypted Session Key passed 45622E3A 000.00s [MS-NLMP] 4.2.4.3 Messages passed 67DF9467 000.00s [MS-NLMP] 4.2.4.4 GSS_WrapEx passed C7DF1FDC 000.00s Create randomness-mock context manager passed 43804612 000.00s Create client and server SPNEGOSSPs passed 0D2B51EF 000.01s GSS_Init_sec_context (negTokenInit: NTLM_NEGOTIATE) passed 5028BA67 000.01s GSS_Accept_sec_context (SPNEGO_negTokenResp: NTLM_NEGOTIATE->NTLM_CHALLENGE) passed CF5F42E9 000.02s GSS_Init_sec_context (SPNEGO_negToken: NTLM_CHALLENGE->NTLM_AUTHENTICATE) passed 33BD4628 000.01s GSS_Accept_sec_context (SPNEGO_negToken: NTLM_AUTHENTICATE->OK) passed 18801F1F 000.00s GSS_WrapEx/GSS_UnwrapEx: client sends a encrypted payload passed 9BFC6831 000.01s GSS_WrapEx/GSS_UnwrapEx: server answers back passed 02C19E48 000.00s GSS_WrapEx/GSS_UnwrapEx: client continues with seqnum 2 passed 27457AA7 000.00s GSS_WrapEx/GSS_UnwrapEx: inject fault passed 68104229 000.00s Real exchange - Parse token 0 from server passed 6BB04B8A 000.00s Real exchange - Create server SPNEGOSSP passed 3F58C493 000.00s Real exchange - Parse token 1 from client passed E22CA884 000.01s Real exchange - Inject token 2 from server passed 14D5160A 000.01s Real exchange - Parse token 3 from client passed 57141913 000.00s Real exchange - Check mechListMIC against token 4 from server passed 4379BACC 000.01s MISC - Dissect legacy formed NTLM messages Campaign CRC=B99463DB in 000.13s SHA=4803446DB37683EF6FB475410FF5AF239169EDD2 PASSED=26 FAILED=0 ━ Loading: test/scapy/layers/ntp.uts passed B1C374EB 000.00s specific haslayer and getlayer implementations for NTP passed F5C8DE7F 000.01s NTP - Layers (1) passed CAA67885 000.00s NTP - Layers (2) passed 54C8D404 000.00s NTP - sessions (1) passed FC3E08F7 000.00s NTP - sessions (2) passed D9DAEC57 000.00s NTPHeader - Basic checks passed 012A5DF1 000.00s NTPHeader - Dissection passed D936F900 000.00s NTPHeader - High precision passed 17A42957 000.00s NTPHeader - KoD passed 5D4004E1 000.00s NTPHeader - Extension dissection test passed 9BDAC2CB 000.00s NTPAuthenticator passed 44E26A0E 000.00s NTP Control (mode 6) - CTL_OP_READSTAT (1) - request passed FC751FED 000.01s NTP Control (mode 6) - CTL_OP_READSTAT (2) - response passed 32CF63AE 000.00s NTP Control (mode 6) - CTL_OP_READVAR (1) - request passed D37A6E69 000.00s NTP Control (mode 6) - CTL_OP_READVAR (2) - response (1st packet) passed 4F5E18DA 000.00s NTP Control (mode 6) - CTL_OP_READVAR (3) - response (2nd packet) passed A8481FFB 000.00s NTP Control (mode 6) - CTL_OP_READVAR (4) - request passed 60ABEC03 000.00s NTP Control (mode 6) - CTL_OP_READVAR (5) - response passed A0584020 000.00s NTP Control (mode 6) - CTL_OP_WRITEVAR (1) - request passed DC7C29C6 000.01s NTP Control (mode 6) - CTL_OP_WRITEVAR (2) - response passed DD703F75 000.00s NTP Control (mode 6) - CTL_OP_CONFIGURE (1) - request passed 457AD654 000.00s NTP Control (mode 6) - CTL_OP_CONFIGURE (2) - response passed 6DB7FF4F 000.00s NTP Control (mode 6) - CTL_OP_SAVECONFIG (1) - request passed A37D44B9 000.00s NTP Control (mode 6) - CTL_OP_SAVECONFIG (2) - response passed D81246B2 000.00s NTP Control (mode 6) - CTL_OP_REQ_NONCE (1) - request passed F0DDA4FB 000.00s NTP Control (mode 6) - CTL_OP_REQ_NONCE (2) - response passed 8F2C78BA 000.00s NTP Control (mode 6) - CTL_OP_READ_MRU (1) - request passed EF916C0A 000.00s NTP Control (mode 6) - CTL_OP_READ_MRU (2) - response passed 4CF8154E 000.00s NTP Private (mode 7) - error - Dissection passed 8DED59A7 000.00s NTP Private (mode 7) - REQ_PEER_LIST (1) - request passed B5B89436 000.00s NTP Private (mode 7) - REQ_PEER_LIST (2) - response passed A82A4A4E 000.00s NTP Private (mode 7) - REQ_PEER_INFO (1) - request passed ABDF6258 000.00s NTP Private (mode 7) - REQ_PEER_INFO (2) - response passed 562B4C04 000.00s NTP Private (mode 7) - REQ_PEER_LIST_SUM (1) - request passed 154172E1 000.00s NTP Private (mode 7) - REQ_PEER_LIST_SUM (2) - response (1st packet) passed A11D2B73 000.00s NTP Private (mode 7) - REQ_PEER_LIST_SUM (3) - response (2nd packet) passed 0F736CE9 000.00s NTP Private (mode 7) - REQ_PEER_LIST_SUM (3) - response (3rd packet) passed 8D5CCC16 000.00s NTP Private (mode 7) - REQ_PEER_STATS (1) - request passed 96F88621 000.00s NTP Private (mode 7) - REQ_PEER_STATS (2) - response passed EC26D7D1 000.00s NTP Private (mode 7) - REQ_SYS_INFO (1) - request passed 8E0352E3 000.00s NTP Private (mode 7) - REQ_SYS_INFO (2) - response passed E79BDEEF 000.00s NTP Private (mode 7) - REQ_SYS_STATS (1) - request passed 0EF15231 000.00s NTP Private (mode 7) - REQ_SYS_STATS (2) - response passed E84EC19E 000.00s NTP Private (mode 7) - REQ_IO_STATS (1) - request passed 860BFB5B 000.00s NTP Private (mode 7) - REQ_IO_STATS (2) - response passed ED0234B1 000.00s NTP Private (mode 7) - REQ_MEM_STATS (1) - request passed FD8763D3 000.00s NTP Private (mode 7) - REQ_MEM_STATS (2) - response passed DD835604 000.00s NTP Private (mode 7) - REQ_LOOP_INFO (1) - request passed D00EE28E 000.00s NTP Private (mode 7) - REQ_LOOP_INFO (2) - response passed 1225CF9D 000.00s NTP Private (mode 7) - REQ_TIMER_STATS (1) - request passed 6A3AE8FB 000.00s NTP Private (mode 7) - REQ_TIMER_STATS (2) - response passed 0C44BB13 000.00s NTP Private (mode 7) - REQ_CONFIG (1) - request passed 67EA4136 000.00s NTP Private (mode 7) - REQ_CONFIG (2) - response passed 61ABB1C2 000.00s NTP Private (mode 7) - REQ_UNCONFIG (1) - request passed 3394EC2E 000.00s NTP Private (mode 7) - REQ_UNCONFIG (2) - response passed 691947CA 000.00s NTP Private (mode 7) - REQ_RESADDFLAGS (1) - request passed F4FB6611 000.00s NTP Private (mode 7) - REQ_RESSUBFLAGS (1) - request passed E186C328 000.00s NTP Private (mode 7) - REQ_RESET_PEER (1) - request passed 14F095AD 000.00s NTP Private (mode 7) - REQ_AUTHINFO (1) - response passed 47F3B8E8 000.00s NTP Private (mode 7) - REQ_ADD_TRAP (1) - request passed 2440687E 000.00s NTP Private (mode 7) - REQ_ADD_TRAP (2) - response passed 7661BDB5 000.00s NTP Private (mode 7) - REQ_CLR_TRAP (1) - request passed 63BDCDA1 000.00s NTP Private (mode 7) - REQ_CLR_TRAP (2) - response passed FCCAE19C 000.00s NTP Private (mode 7) - REQ_GET_CTLSTATS - response passed 45B59D08 000.00s NTP Private (mode 7) - REQ_GET_KERNEL (1) - request passed FA987B6E 000.00s NTP Private (mode 7) - REQ_GET_KERNEL (2) - response passed 5E40EC36 000.00s NTP Private (mode 7) - REQ_MON_GETLIST_1 (1) - request passed C420FEA9 000.01s NTP Private (mode 7) - REQ_MON_GETLIST_1 (2) - response passed 7DDACBD6 000.00s NTP Private (mode 7) - REQ_IF_STATS (1) - request passed 9C837A0C 000.00s NTP Private (mode 7) - REQ_IF_STATS (2) - response passed 0B01775D 000.00s NTP Private (mode 7) - REQ_IF_STATS (3) - response passed DA9022B8 000.00s NTP Private (mode 7) - REQ_IF_RELOAD (1) - request passed B6E83CEE 000.00s NTP Private (mode 7) - REQ_IF_RELOAD (2) - response passed 5969E1EC 000.01s Build an NTP packet using RawVal Campaign CRC=744498A6 in 000.18s SHA=1FF9C2CD66C1C9B9CDB1FAC54FCC45147F7EF9C4 PASSED=74 FAILED=0 ━ Loading: test/scapy/layers/pflog.uts passed 70336DF9 000.00s Load module passed 0732D6A0 000.00s Dissect PFLog packet of a IP()/TCP() dropped packet passed 02CFE070 000.00s Dissect PFLog packet of a IP()/UDP() dropped packet passed 8DE73CBE 000.00s Dissect PFLog packet of a IP()/ICMP() echo-request dropped packet passed 1FFCF54E 000.00s Dissect PFLog packet of a IPv6()/TCP() dropped packet passed D956AB2B 000.00s Dissect PFLog packet of a IPv6()/TCP() passed packet passed 4D0D9924 000.00s Dissect PFLog packet of a IPv6()/UDP() dropped packet passed E8E8A910 000.00s Dissect PFLog packet of a IPv6()/ICMP6() dropped packet passed BBA64F63 000.00s Dissect PFLog packet of a IPv6()/ICMP6() passed packet Campaign CRC=885A30E9 in 000.03s SHA=B414BC6A90B3FF72B9A753ECE93D46F08B1F2793 PASSED=9 FAILED=0 ━ Loading: test/scapy/layers/ppp.uts passed CC23140E 000.00s PPPoE passed 41DF45A2 000.00s PPPoE with tags (appended) passed B6A5A382 000.00s PPPoE with padding passed FEEB02E2 000.00s PPP/HDLC passed 6A6A4CAD 000.01s PPP IPCP passed EDA01755 000.01s PPP ECP passed 855B6AC8 000.00s PPP IP check that default protocol length is 2 bytes passed 8B5571D1 000.00s PPP check parsing with only one byte for protocol Campaign CRC=826DCFF3 in 000.03s SHA=D0D5C6270BB0805A3E62D4B31BD97E3D7EB35DF6 PASSED=8 FAILED=0 ━ Loading: test/scapy/layers/pptp.uts passed 6EFF2540 000.00s Test IP/GRE v0 decoding passed 9E2D0288 000.00s Test IP/GRE v1 decoding with PPP LCP passed 1D85559C 000.01s Test IP/GRE v1 encoding/decoding with PPP LCP Echo passed A9CFFD76 000.00s Test LCP Echo Request / Reply passed 6755A821 000.00s Test LCP Configure Request passed 625ED6EB 000.00s Test LCP Configure Ack passed 51549E14 000.00s Test LCP Configure Nak passed 94552902 000.00s Test LCP Configure Reject passed 140D790A 000.01s Test LCP Configure options passed 376EC727 000.00s Test LCP Auth option passed D8825501 000.00s Test LCP Code-Reject passed 78DFBBA4 000.00s Test LCP Protocol-Reject passed 870294C7 000.00s Test LCP Discard Request passed 584C7AE1 000.01s Test LCP Terminate-Request/Terminate-Ack passed D9FED231 000.00s Test PPP PAP Request passed 36B756A4 000.00s Test PPP PAP Authenticate-Ack passed C0AFFCCE 000.00s Test PPP PAP Authenticate-Nak passed D8483E17 000.00s Test PPP CHAP Challenge passed 0F6EEE34 000.00s Test PPP CHAP Response passed 0B028577 000.00s Test PPP CHAP Success passed 2594D84E 000.00s Test PPP CHAP Failure passed B44E36D2 000.00s Test PPTP Start-Control-Connection-Request passed ADA50819 000.00s Test PPTP Start-Control-Connection-Reply passed DE3D1768 000.00s Test PPTP Stop-Control-Connection-Request passed 0CD7142B 000.00s Test PPTP Stop-Control-Connection-Reply passed 06FAA0BD 000.00s Test PPTP Echo-Request passed 80AF2CB5 000.00s Test PPTP Echo-Reply passed 4AD76384 000.00s Test PPTP Outgoing-Call-Request passed 71E948C8 000.00s Test PPTP Outgoing-Call-Reply passed B2E32729 000.00s Test PPTP Incoming-Call-Request passed 5E58E216 000.00s Test PPTP Incoming-Call-Reply passed 81441A17 000.00s Test PPTP Incoming-Call-Connected passed 13FF9ECF 000.00s Test PPTP Call-Clear-Request passed DE4636EE 000.00s Test PPTP Call-Disconnect-Notify passed 2018BB75 000.00s Test PPTP WAN-Error-Notify passed 27E04195 000.00s Test PPTP Set-Link-Info Campaign CRC=B7F64895 in 000.11s SHA=44CEAEE04634AEBB37F103F83BC9BD30FEAE09CB PASSED=36 FAILED=0 ━ Loading: test/scapy/layers/radius.uts passed 124121DB 000.00s IP/UDP/RADIUS - Build passed 5444466F 000.00s IP/UDP/RADIUS - Dissection passed CF9DE413 000.01s RADIUS - Access-Request - Dissection (1) passed 9550873D 000.00s RADIUS - compute_message_authenticator() passed 12FBC275 000.00s RADIUS - Access-Challenge - Dissection (2) passed 5EF55AC7 000.01s RADIUS - Access-Request - Dissection (3) passed D0B0142B 000.00s RADIUS - Access-Challenge - Dissection (4) passed E5F41CCF 000.00s RADIUS - Response Authenticator computation passed E0BDFCC9 000.00s RADIUS - Layers (1) passed DE55C66A 000.00s RADIUS - sessions (1) passed 11C5BF97 000.01s RADIUS - sessions (2) passed F08473B8 000.00s Issue GH#1407 passed D4D6BA76 000.00s RADIUS - attributes with IPv4 addresses passed A7229BDA 000.01s Radius - fragmented EAP - GH2832 passed A6A57568 000.00s RadiusAttr_User_Password Campaign CRC=91DE6F24 in 000.06s SHA=BFC79518E522285E9A119E2C88EA70A6A464AD19 PASSED=15 FAILED=0 ━ Loading: test/scapy/layers/rip.uts passed 3A6A3B66 000.00s RIP - build passed 34293B14 000.00s RIP - UDP bindings passed E6AB8522 000.00s RIP - dissection Campaign CRC=37F63DB6 in 000.01s SHA=2FF376083CD35FF6304A39EF36883E7F6A138E87 PASSED=3 FAILED=0 ━ Loading: test/scapy/layers/rtp.uts passed 324C5C42 000.00s test rtp with extension header passed 909F8468 000.01s test layer creation passed 1FF3ADC0 000.00s test RTP without extension Campaign CRC=BB198A8B in 000.01s SHA=BCB203F54B868CDF9727AF5FF0A1A2C849F966CA PASSED=3 FAILED=0 ━ Loading: test/scapy/layers/sctp.uts passed D987AE51 000.00s SCTP - Chunk Init - build passed 1F806BCF 000.00s SCTP - Chunk Init - dissection passed 56F2812B 000.00s SCTP - SCTPChunkSACK - build passed B85A0B9D 000.00s SCTP - SCTPChunkSACK - dissection passed 6FDB8476 000.00s SCTP - answers passed 05142461 000.00s SCTP basic header - Dissection passed 54DA06CB 000.00s basic SCTPChunkData - Dissection passed D2E586CA 000.00s basic SCTPChunkIData - Dissection passed A16D55B8 000.00s basic SCTPChunkForwardTSN - Dissection passed A0A94CBA 000.00s basic SCTPChunkIForwardTSN - Dissection passed D0DF0840 000.00s basic SCTPChunkInit - Dissection passed A72AD685 000.01s SCTPChunkInit multiple valid parameters - Dissection passed A9BB177A 000.00s basic SCTPChunkInitAck - Dissection passed 766DFE36 000.00s SCTPChunkInitAck with state cookie - Dissection passed 8F044F08 000.00s basic SCTPChunkSACK - Dissection passed 00A71D9B 000.00s basic SCTPChunkHeartbeatReq - Dissection passed 09DDEAC5 000.00s basic SCTPChunkHeartbeatAck - Dissection passed BAF0BB5C 000.00s basic SCTPChunkAbort - Dissection passed E1B1E71D 000.00s basic SCTPChunkShutDown - Dissection passed 34DC1D47 000.00s basic SCTPChunkShutDownAck - Dissection passed D9702DA0 000.00s basic SCTPChunkError - Dissection passed D0C7C437 000.00s basic SCTPChunkCookieEcho - Dissection passed AABA658F 000.00s basic SCTPChunkCookieAck - Dissection passed 8D89C618 000.00s basic SCTPChunkShutdownComplete - Dissection passed 0C98967E 000.00s basic SCTPChunkAuthentication - Dissection passed FA28403E 000.00s basic SCTPChunkAddressConf - Dissection passed 870BCF04 000.00s basic SCTPChunkAddressConfAck - Dissection passed 1192E830 000.00s basic SCTPChunkPad - Dissection passed E941D206 000.00s basic SCTPChunkReConfig - Dissection passed 725C81A7 000.00s SCTPChunkParamRandom - Consecutive calls passed 9C2102DE 000.00s SCTP in ICMP Campaign CRC=77261598 in 000.05s SHA=FB965BF91DB212736D9A91198D82EEBAE6E86F6D PASSED=31 FAILED=0 ━ Loading: test/scapy/layers/skinny.uts passed 385F025C 000.00s Skinny - build & dissection Campaign CRC=E78E7A9C in 000.00s SHA=C31E75483864D629BF18B199608D0681784E1A43 PASSED=1 FAILED=0 ━ Loading: test/scapy/layers/smb.uts passed 5C8041A4 000.00s Import passed 5A393D55 000.00s test SMB Generic Header - dissect passed E9C5A9D3 000.01s test SMB Negociate Header - assemble passed 3A069BCC 000.00s SMB Negotiate Request passed 7B556A01 000.01s SMB Negotiate Response Extended Security passed 43C12D97 000.00s SMB Setup AndX Request (ES) passed B9D2D5A5 000.01s SMB Setup AndX Response (ES) passed 6D99F794 000.01s SMB Setup AndX Request - accept incomplete (ES) passed 9F99FA5D 000.00s SMB Setup AndX Response - accept complete (ES) passed DF51F5FF 000.01s BRWS BecomeBackup - build passed FBD440B3 000.00s BRWS BecomeBackup - dissection passed 3078C513 000.01s BRWS HostAnnouncement - build passed A5D73736 000.00s BRWS HostAnnouncement - dissection passed DF0564E1 000.00s OSS-Fuzz Findings Campaign CRC=FADF1BC8 in 000.08s SHA=7417F391EB93644F77267C6D70C8C64393471800 PASSED=14 FAILED=0 ━ Loading: test/scapy/layers/smb2.uts passed 0E002AFB 000.01s SMB2 Header dissecting passed 52B9C30B 000.00s SMB2 Header assembling passed E0DF5CBA 000.01s Common fields in header passed 6FBF8DCE 000.00s SMB2 Negotiate Context in Request - type PREAUTH - disassemble passed 943A2FBE 000.00s SMB2 Negotiate Context in Request - type ENCRYPTION disassemble passed 91C4C51A 000.00s SMB2 Negotiate Context in Request - type COMPRESSION passed BEF52211 000.00s SMB2 Negotiate Context in Request - type NETNAME NEGOCIATE passed D504D49F 000.00s test SMB2 Negotiate Protocol Request Header - assembling passed 51BB0FE5 000.00s Request with no 0x0311 in dialects passed 3ADE3D71 000.00s Common fields in header passed 582ED60C 000.00s SMB2 Negotiate Context in Response - Type PREAUTH passed FED4301A 000.00s SMB2 Negotiate Context in Response - Type ENCRYPTION passed 4023C12C 000.00s SMB2 Negotiate Context in Response - Type COMPRESSION passed B3385EB3 000.00s SMB2 Negotiate Protocol Response Header assembling passed F6CE7142 000.00s Common fields in header passed 6FBF8DCE 000.00s SMB2 Negotiate Context in Request - type PREAUTH - disassemble passed 943A2FBE 000.00s SMB2 Negotiate Context in Request - type ENCRYPTION disassemble passed 91C4C51A 000.00s SMB2 Negotiate Context in Request - type COMPRESSION passed BEF52211 000.00s SMB2 Negotiate Context in Request - type NETNAME NEGOCIATE passed 5865979B 000.00s Default DialectCount passed 6E3636F2 000.00s Default NegotiateContextsCount passed 255C7115 000.00s SMB2 Negotiate Context in Request - type PREAUTH - disassemble passed C911B62E 000.00s SMB2 Negotiate Context in Request - type ENCRYPTION disassemble passed 4247490C 000.00s SMB2 Negotiate Context in Request - type COMPRESSION passed 7AC4A6A0 000.00s SMB2 Negotiate Context in Request - type NETNAME NEGOCIATE passed 75F40FFB 000.00s SMB2 Tree connect request passed DDF9AA67 000.00s SMB2 Tree connect response passed D18D6FA0 000.00s Setup Session Request passed F3FCAA93 000.01s Setup Session Response passed 0B30B25B 000.01s SMB2 IOCTL Request - Validate negotiate info passed 0ED2D4A4 000.01s SMB2 IOCTL Request - DFS referral (TargetSetBoundary) passed C3FFD514 000.01s SMB2 IOCTL Response - DFS referral (TargetSetBoundary) passed 89B092F5 000.00s SMB2 IOCTL Request - DFS referral (NameListReferral) passed C8EC5697 000.01s SMB2 IOCTL Response - DFS referral (NameListReferral) passed E169165D 000.01s SMB2 Create Request with Contexts passed 105B25A6 000.01s SMB2 Query Info Response with Security Descriptor passed E569CFCE 000.00s SMB2 Set Info Request with Rename Campaign CRC=7BE758D2 in 000.13s SHA=53B78B8223FC230F064423154CCE9CE8E58E2BA5 PASSED=37 FAILED=0 ━ Loading: test/scapy/layers/smbclientserver.uts passed E1CF89F7 000.02s Define samba server passed 35EB3C3C 001.08s smbclient: SMB 2.0.2 - connect then list shares passed 7F7FCCB3 000.62s smbclient: SMB 2.0.2 - connect to test share and list files passed F9CD39AE 000.60s smbclient: SMB 2.0.2 - connect to test share and get file passed 726B7843 000.63s smbclient: SMB 2.0.2 - connect to test share, cd, put file and cat it passed 38E095D1 000.65s smbclient: SMB 2.0.2 - connect to test share and recursive get passed 01CCD05A 000.77s smbclient: SMB 3.1.1 - connect to test share and recursive get passed FF27A921 000.04s Define Scapy smb server passed F01323B1 000.14s smbserver: SMB 3.1.1 - connect then list shares passed FA160B24 000.12s smbserver: SMB 3.1.1 - connect then ls passed 26394D9F 000.14s smbserver: SMB 2.0.2 - connect then ls passed 965B2D88 000.16s smbserver: SMB 3.1.1 - connect then get file passed 33C6E024 000.12s smbserver: SMB 3.1.1 - connect then put file Campaign CRC=12635761 in 005.08s SHA=ACDA75301FA93BC377EA8B8EE3FF56AC27094596 PASSED=13 FAILED=0 ━ Loading: test/scapy/layers/snmp.uts passed 0A234C99 000.00s SNMP assembling passed A9D92740 000.00s SNMP disassembling passed F7F25C3B 000.01s Basic UDP/SNMP bindings passed 8056B27B 000.00s Basic SNMPvarbind build passed 9A02426B 000.00s SNMPvarbind noSuchInstance dissection passed 7E434C51 000.00s Failing SNMPvarbind dissection Campaign CRC=C0514C91 in 000.02s SHA=59DE3F9A16648DFA505ED24FA7C26B2DC71497BF PASSED=6 FAILED=0 ━ Loading: test/scapy/layers/ssh.uts passed D69F0EB3 000.03s Load SSH and SSH pcap passed 03868325 000.00s Check for SSHVersionExchange passed F032961C 000.00s Check for SSH KexInit passed D361044A 000.00s Check for SSH Kex DH Init passed 0389FC59 000.00s Check for SSH Kex DH Reply passed B2AB9E61 000.00s Check for the 2 SSH New Msgs Campaign CRC=B3E747E2 in 000.04s SHA=857B0FF123118BAFE0EF217B947B067157DECE18 PASSED=6 FAILED=0 ━ Loading: test/scapy/layers/tftp.uts passed 48A1FFC1 000.01s TFTP Options Campaign CRC=FDE1F085 in 000.01s SHA=90C64ABDEE399D5378B1450799F44E18C7B2F0ED PASSED=1 FAILED=0 ━ Loading: test/scapy/layers/usb.uts passed C6F5BE0E 000.00s load module passed 0B58C015 000.00s linklayer test passed 8988CA4B 000.00s USBpcapTransferIsochronous passed BDD15E91 000.00s USBpcapTransferInterrupt passed C71FC4AD 000.00s USBpcapTransferControl Campaign CRC=AB7A5C20 in 000.01s SHA=8412652E3C9DFE364A5FEF85A0A4FDA427E1DB3C PASSED=5 FAILED=0 ━ Loading: test/scapy/layers/vrrp.uts passed 06543355 000.00s VRRP - build passed A6C6FAE1 000.00s VRRP - dissection passed 3C60EE28 000.00s VRRP IPv6 - build passed 2F81CF0A 000.00s VRRP IPv6 - dissection passed BFEBF0CA 000.00s VRRP - chksums passed 084C98E6 000.00s VRRP IPv6 - chksums Campaign CRC=D9FC87DC in 000.01s SHA=65DAD9483920530B092948C25FF3853DA3B1B2C9 PASSED=6 FAILED=0 ━ Loading: test/scapy/layers/vxlan.uts passed 1DB45413 000.00s Build a VXLAN packet with VNI of 42 passed 4D21BD51 000.00s Verify VXLAN Ethernet Binding passed AD8F8915 000.01s Verify UDP dport overloading passed F9832B7B 000.01s Build a VXLAN packet with next protocol field passed 8DBE85D1 000.01s Build a VXLAN packet with no group policy ID passed 97DAAC03 000.00s Build a VXLAN packet with group policy ID = 42 passed 6D36BD19 000.01s Build a VXLAN packet followed by and IP or IPv6 layer passed EFED39DA 000.00s Dissect VXLAN with no NextProtocol Campaign CRC=CFDDE2E7 in 000.04s SHA=4AF3A67661B4EE076109057B0D783D1634653B9A PASSED=8 FAILED=0 ━ Loading: test/scapy/layers/x509.uts passed 815A2A6F 000.00s Decoding an ASN.1 SEQUENCE with an unknown, high-tag identifier passed C44CCCD8 000.00s Key class : Importing DER encoded RSA private key passed 156EF5A0 000.00s Key class : key version passed 6FB0E92E 000.00s Key class : key modulus passed 04D67681 000.00s Key class : key public exponent passed CE3F420E 000.00s Key class : key private exponent passed 9C1E1F5D 000.00s Key class : key prime1 passed ADA3892D 000.00s Key class : key prime2 passed 061180BE 000.00s Key class : key exponent1 passed 4C22B5AF 000.00s Key class : key exponent2 passed 2A1EAC96 000.00s Key class : key coefficient passed 3F1BB1AA 000.02s Cert class : Importing DER encoded X.509 Certificate with RSA public key passed 1C954526 000.02s Cert class : Rebuild certificate passed 6519AA69 000.00s Cert class : Version passed 5F89792E 000.00s Cert class : Serial passed 5C6C7729 000.00s Cert class : Signature algorithm (as advertised by TBSCertificate) passed ECEAE947 000.00s Cert class : Issuer structure passed 9A359EB2 000.00s Cert class : Issuer first attribute passed BCD8E63C 000.00s Cert class : Issuer string passed DB986116 000.00s Cert class : Validity passed D5ACFBD3 000.00s Cert class : Subject structure passed 67529256 000.00s Cert class : Subject last attribute passed B8A26A10 000.00s Cert class : Subject string passed 149F6BFE 000.00s Cert class : SubjectPublicKey algorithm passed 8F95CE6F 000.00s Cert class : SubjectPublicKey value passed A51152DA 000.00s Cert class : Extensions structure passed 250F2288 000.00s Cert class : Subject key identifier extension info passed A5DA5700 000.00s Cert class : Subject key identifier extension value passed 2B2062CE 000.00s Cert class : Signature algorithm passed 78AD39E7 000.00s Cert class : Signature value passed 68047BAF 000.05s Cert class : Default X509_Cert from scratch passed FB1213A9 000.00s Cert class : Error passed 44905AC5 000.02s Cert class: Import Windows AD certificate passed A20C9F62 000.00s Cert class: Check some Windows-specific extensions passed F65143C4 000.01s CRL class : Importing DER encoded X.509 CRL passed 1C954526 000.01s CRL class : Rebuild crl passed B1A3384E 000.00s CRL class : Version passed 58565688 000.00s CRL class : Signature algorithm (as advertised by TBSCertList) passed FEFAFE0F 000.00s CRL class : Issuer structure passed D95B0CF4 000.00s CRL class : Issuer first attribute passed 16D18A47 000.00s CRL class : Issuer string passed 29C49A61 000.00s CRL class : This update passed D4495358 000.00s CRL class : Optional next update passed 40944AAA 000.00s CRL class : Optional revoked_certificates structure passed D77CB718 000.00s CRL class : Revoked_certificates first attribute passed C42F3BD5 000.00s CRL class : Extensions structure passed D8172B15 000.00s CRL class : Signature algorithm passed 44713053 000.00s CRL class : Signature value passed 77266656 000.02s CRL class : Default X509_CRL from scratch passed D4B86199 000.00s Randval tests : ASN1F_SEQUENCE_OF passed D4B1DE6E 000.00s Randval tests : ASN1F_PACKET passed CB31C001 000.01s OCSP class : OCSP Response import passed 1CF80C8B 000.00s OCSP class : OCSP Response global checks passed 02125AD1 000.00s OCSP class : OCSP ResponseData checks passed 00946CC4 000.00s OCSP class : OCSP ResponseData dissection with RecokedInfo passed 7C46507E 000.00s OCSP class : OCSP SingleResponse checks passed 5318D377 000.01s OCSP class : OCSP Response reconstruction passed 93FE6938 000.01s OSCP class : OSCP Response with ECDSA Campaign CRC=6BAE7AA9 in 000.21s SHA=EF10AE45EA34F444DE7B4C7C18245C7FF8BB0117 PASSED=58 FAILED=0 ━ Loading: test/scapy/layers/tls/cert.uts passed 7467C9D5 000.00s PKCS os2ip basic tests passed 7CDE63E1 000.00s PKCS i2osp basic tests passed B28AF781 000.00s PubKey class : Importing PEM-encoded RSA public key passed DEB7954B 000.00s PubKey class : Verifying PEM key format passed 1C9EB2F5 000.00s PubKey class : Importing DER-encoded RSA Key passed 756D80F5 000.00s PubKey class : Verifying DER key format passed D99A77ED 000.00s PubKey class : Checking modulus value passed B1A9D1E6 000.00s PubKey class : Checking public exponent value passed 74A3AA7E 000.00s PubKey class : Importing PEM-encoded ECDSA public key passed 712AE41F 000.00s PubKey class : Checking curve passed AC355F33 000.00s PubKey class : Checking point value passed 4E636BE1 000.07s PubKeyRSA class : Generate without modulus passed 8C0EE682 000.09s PrivKey class : Importing PEM-encoded RSA private key passed 22B9EE88 000.00s PrivKey class : Checking public attributes passed FB658832 000.00s PrivKey class : Checking private attributes passed 59BEC5F0 000.01s PrivKey class : Importing PEM-encoded ECDSA private key passed 0FE61925 000.00s PrivKey class : Checking public attributes passed AC272088 000.00s PrivKey class : Checking private attributes passed 048DABDC 000.00s PrivKeyECDSA sign & verify passed 574B1FA6 000.00s PubKeyECDSA verify passed 26F0CC42 000.09s PrivKey class : Importing DER-encoded RSA private key passed 0AB6326B 000.00s PrivKey class: Importing PEM-encoded EdDSA private key passed 8DF11F96 000.10s PrivKey class : sign tbs cert passed 170E860B 000.02s PrivKey class : resign cert passed AB5283E1 000.01s PrivKey/PubKey classes : Signing/Verifying with MD5_SHA1 hash passed DBD4E17F 000.05s PrivKey/PubKey classes : Signing/Verifying with MD5_SHA1 hash with legacy support passed 3F2C417F 000.02s Cert class : Importing PEM-encoded X.509 Certificate passed D5B0F293 000.00s Cert class : Checking version passed FC12B8BB 000.00s Cert class : Checking certificate serial number extraction passed AFA16673 000.00s Cert class : Checking signature algorithm passed 9B8F7229 000.00s Cert class : Checking issuer extraction in basic format (/C=FR ...) passed 2ADF05A7 000.00s Cert class : Checking subject extraction in basic format (/C=FR ...) passed 5DF77734 000.00s Cert class : Checking start date extraction in simple and tuple formats passed 399F8D6A 000.00s Cert class : Checking end date extraction in simple and tuple formats passed 5F4A083B 000.00s Cert class : test remainingDays passed 02EE7F34 000.00s Cert class : Checking RSA public key passed 9544E2C7 000.01s Cert class : Checking extensions passed 1173B95C 000.00s Cert class : encrypt passed 3FD1B423 000.00s Cert class : export passed 57C7A0AD 000.01s Cert class : isIssuerCert passed DA1699AD 000.02s Cert class : Importing another PEM-encoded X.509 Certificate passed 9E7A0AAD 000.00s Cert class : Checking ECDSA public key passed A77D322B 000.00s Cert class : Checking ECDSA signature passed C7650354 000.00s Cert class : Test show passed 3B08B684 000.00s Cert: Check split_pem on chained certs with missing end \n passed 981AB93D 000.01s Import PEM-encoded certificate with ed25519 signature passed F710A869 000.01s CRL class : Importing PEM-encoded CRL passed 3BBE93BF 000.00s CRL class : Checking version passed 9FEEDBE5 000.00s CRL class : Checking issuer extraction in basic format (/C=FR ...) passed 9C7206C7 000.00s CRL class : Checking lastUpdate date extraction in tuple format passed AFB28660 000.00s CRL class : Checking nextUpdate date extraction in tuple format passed 3148A0F7 000.00s CRL class : Checking number of revoked certificates passed F5F73161 000.00s CRL class : Checking presence of one revoked certificate passed 4BBE171F 000.02s Cert/CRL class : Checking isRevoked passed 1F2AFF67 000.00s CRL class : Test show passed 29ED0F21 000.11s Cert class : Checking isIssuerCert() passed ECE33A81 000.01s Cert class : Checking isSelfSigned() passed ADD2C36B 000.03s PubKey class : Checking verifyCert() passed F4B26FC9 000.09s Chain class : Checking chain construction passed 676CE307 000.07s Chain class : repr passed B1F3828F 000.06s Chain class : Checking chain verification passed A4A6ED7D 000.12s Chain class: Checking chain verification with file passed B95F31AC 000.00s Clear files passed 4D9EB4B7 000.00s Test __repr__ passed 249C4366 000.09s Test GeneralizedTime Campaign CRC=41DF990A in 001.15s SHA=337EA36DF8E0A0BCC470C2E593AD65515FA727C8 PASSED=65 FAILED=0 ━ Loading: test/scapy/layers/tls/sslv2.uts passed 8A6657FE 000.00s Reading SSLv2 session - Loading unparsed SSLv2 records passed 146D9669 000.00s Reading SSLv2 session - SSLv2 parsing does not raise any error passed AB520746 000.00s Reading SSLv2 session - Record with cleartext passed 6802D577 000.00s Reading SSLv2 session - Record __getitem__ passed D5ACD1D7 000.00s Reading SSLv2 session - ClientHello passed CA22B3C0 000.02s Reading SSLv2 session - ServerHello passed A0BF50CD 000.00s Reading SSLv2 session - ClientMasterKey with unknown server key passed A6DC1334 000.08s Reading SSLv2 session - Importing server compromised key passed 2BAB5F81 000.01s Reading SSLv2 session - ClientMasterKey with compromised server key passed 0B60FA27 000.00s Reading SSLv2 session - Checking session secrets passed 67686729 000.00s Reading SSLv2 session - Record with ciphertext passed 4E3E621E 000.00s Reading SSLv2 session - ServerVerify passed A83D25F7 000.00s Reading SSLv2 session - ClientFinished passed 2C329910 000.00s Reading SSLv2 session - RequestCertificate passed 9631F1EC 000.02s Reading SSLv2 session - ClientCertificate passed D5ED8A04 000.00s Reading SSLv2 session - ServerFinished passed D02475DD 000.00s Reading SSLv2 session - Application data passed C64B02EC 000.00s Reading SSLv2 session - Checking final sequence numbers passed FE71629E 000.00s Check TLS-related scapy internals - Checking raw() harmlessness (with RC4) passed 0FB716FC 000.00s Check TLS-related scapy internals - Checking show2() harmlessness (with RC4) passed CF10E3CF 000.05s Check TLS-related scapy internals - Checking show2() harmlessness (with 3DES) passed C92A29DD 000.00s Check TLS-related scapy internals - Checking tls_session freeze during show2() passed E6816CBA 000.00s Check TLS-related scapy internals - Checking SSLv2 cast from TLS class passed 6F807B3A 000.01s Building SSLv2 packets - Various default messages passed 3C3264EF 000.00s Building SSLv2 packets - Error within clear record passed 3B4095F3 000.00s Building SSLv2 packets - ClientHello with automatic length computation passed 3650E001 000.00s Building SSLv2 packets - ClientMasterKey context linking passed 5741BA13 000.00s Dissect invalid payload Campaign CRC=4E15EB92 in 000.23s SHA=EDBC26B6720DA0BE0CA2D04B6A9BED3CB8195DBD PASSED=28 FAILED=0 ━ Loading: test/scapy/layers/tls/tls.uts passed B0887572 000.00s Crypto - Hmac_MD5 instantiation, parameter check passed 6AED9608 000.00s Crypto - Hmac_MD5 behavior on test vectors from RFC 2202 (+ errata) passed 0297B3F0 000.00s Crypto - Hmac_SHA instantiation, parameter check passed 23EB1663 000.00s Crypto - Hmac_SHA behavior on test vectors from RFC 2202 (+ errata) passed C1256CD4 000.04s Crypto - Hmac_SHA2 behavior on test vectors from RFC 4231 passed 28378727 000.00s Crypto - _tls_P_MD5 behavior on test vectors borrowed from RFC 2202 (+ errata) passed 37B323C2 000.00s Crypto - _tls_P_SHA1 behavior on test vectors borrowed from RFC 2202 (+ errata) passed 127C32D6 000.00s Crypto - _tls_PRF behavior on test vectors borrowed from RFC 2202 (+ errata) passed A2CBB7AF 000.00s Crypto - _ssl_PRF behavior on test vectors passed 9A46A7F3 000.00s Crypto - _tls12_*_PRF behavior, using SHA-256, SHA-384 and SHA-512 passed F292F15D 000.00s Crypto - compute_master_secret() in SSL mode passed B776A9FB 000.00s Crypto - derive_key_block() in SSL mode passed B48D9F3D 000.00s Crypto - compute_master_secret() in TLS 1.0 mode passed 425B2666 000.00s Crypto - derive_key_block() in TLS 1.0 mode passed CB4B0C0B 000.01s Crypto - RC4 stream cipher, encryption/decryption checks from RFC 6229 passed E2591B36 000.00s Crypto - RC2 block cipher, encryption/decryption checks from RFC 2268 passed 4ADC4444 000.00s Crypto - DES cipher in CBC mode, check from FIPS PUB 81 passed 3EBDCB1A 000.01s Crypto - AES cipher in CBC mode, checks from RFC 3602 passed ECF05A71 000.02s Crypto - AES cipher in GCM mode, auth_encrypt() and auth_decrypt() checks passed B3BA9046 000.01s Crypto - AES cipher in CCM mode, checks from IEEE P1619.1 passed 8E786ED9 000.01s Crypto - ChaCha20POly1305 test (test vector A.5 from RFC 7539) passed 302EEB44 000.01s Crypto - Camellia cipher, encryption/decryption checks passed E4AAFE42 000.00s Reading test session - Loading unparsed TLS records passed A7134BD9 000.06s Reading TLS test session - TLS parsing (no encryption) does not throw any error passed 3A354AFD 000.00s Reading TLS test session - TLS Record header passed 49773585 000.00s Reading TLS test session - TLS Record __getitem__ passed 157A5DE3 000.00s Reading TLS test session - ClientHello passed BA311CC2 000.00s Reading TLS test session - ClientHello extensions passed 941A9417 000.00s Reading TLS test session - ServerHello passed 6B815351 000.00s Reading TLS test session - Certificate passed F6B2FD5D 000.00s Reading TLS test session - Multiple TLS layers passed 8CF19304 000.00s Reading TLS test session - CertificateStatus passed 89E4C379 000.00s Reading TLS test session - ServerKeyExchange passed 43942FE6 000.00s Reading TLS test session - ServerHelloDone passed FCB90299 000.00s Reading TLS test session - Context checks after 1st RTT passed 01CE4161 000.00s Reading TLS test session - TLS parsing (with encryption) does not throw any error passed C0000B57 000.00s Reading TLS test session - ClientKeyExchange passed 07A2017B 000.00s Reading TLS test session - ChangeCipherSpec passed 0DB4C7E2 000.00s Reading TLS test session - Finished passed 4618890E 000.00s Reading TLS test session - Ticket, CCS & Finished passed 922A478F 000.04s Building x25519 ecdh_Yc passed 43D4CDB1 000.11s Reading TLS test session - Extended master secret passed 5B4D0C31 000.02s Reading TLS test session - Encrypt-then-MAC extension passed 523B0943 000.02s Reading TLS test session - Full TLSNewSessionTicket captured passed 1E2BC2D9 000.00s Reading TLS test session - ApplicationData passed E16C3CFB 000.00s Reading TLS msg dissect - Packet too small passed 7869BDE6 000.00s Reading TLS msg dissect - Wrong data passed 1186A8BE 000.00s Test x25519 dissection in ServerKeyExchange passed 5AC0E4EC 000.00s Reading test session - Loading unparsed TLS records passed 5F629369 000.03s Reading TLS test session passed ED9B3F77 000.00s Verify TLSClientKeyExchange passed 4315CF82 000.00s Verify TLSChangeCipherSpec passed 0987A23C 000.00s Verify TLSFinished passed 7129D1EC 000.00s Verify MAC - TLSFinished record passed FE6B5E5A 000.07s Reading TLS vulnerable session - Decrypt data from using a compromised server key passed 25B28A6F 000.06s Auto-provide the session: use TCPSession with conf.tls_session_enable passed F2E4303D 000.01s Building packets - Various default records passed E1D73B3A 000.02s Building packets - ClientHello with automatic length computation passed 5F9959B8 000.00s Building packets - application data with Encrypt-then-MAC passed 27DA8668 000.00s Building packets - ServerHello context linking passed E267D1AA 000.00s Building packets - ChangeCipherSpec with forged, forbidden field values passed 432509F2 000.00s Building packets - TLS record with bad data passed 2F9A29BF 000.00s Building packets - _CipherSuitesField with no cipher passed DDE4A240 000.00s Building packets - TLSClientKeyExchange with bad data passed 6D689D9A 000.00s Building packets - Perform dummy session update passed 4141EA44 000.01s Cryptography module is unavailable passed F8144424 000.00s Truncated TCP segment passed 92FED23E 000.00s Test tlsSession passed F3D78A5B 000.00s Test connState passed 968E928A 000.08s Test tls.tools passed 2CDF5401 000.00s Dissect TLSCertificateVerify passed 47862E1B 000.05s Test complex TLSServerKeyExchange dissection & build passed F124D0F6 000.00s Issue 2763 passed E6A80745 000.05s Test TLS TCP defragmentation passed 0BBC7C36 000.02s Issue 2527 passed 05A72F45 000.02s Issue 2778 passed 15531646 000.00s PR/Issue 3295 passed ACECD5D1 000.01s Issue 3324 - FFDH support passed 780739C5 000.00s Issue 4418 - TLSFinished passed E3A3666C 000.17s OCSP: payload after OCSP - GH3291 passed F6A3715E 000.01s Issue 3853 passed 4AD94D0E 000.04s pcap file & external TLS Key Log file passed D987F2E7 000.03s pcapng file with a Decryption Secrets Block passed 2769356E 000.00s pcapng file with a non-UTF-8 Decryption Secrets Block passed D07C00BF 000.09s pcap file & external TLS Key Log file with TCPSession (without extms) Campaign CRC=377E9360 in 001.23s SHA=3FF6D7BF89C1CC3A1351B25BA3FCEA224EFD6538 PASSED=85 FAILED=0 ━ Loading: test/scapy/layers/tls/tls13.uts passed 7BE14281 000.01s Reading test session - Loading unparsed TLS 1.3 records passed BDAF6302 000.00s Reading TLS 1.3 session - TLS parsing (no encryption) does not throw any error passed FBEE8F07 000.00s Reading TLS 1.3 session - TLS Record header passed 49773585 000.00s Reading TLS 1.3 session - TLS Record __getitem__ passed 53CB3DDA 000.00s Reading TLS 1.3 session - ClientHello passed 284EDEA9 000.01s Reading TLS 1.3 session - ClientHello extensions passed C69F6A31 000.00s Reading TLS 1.3 session - ServerHello passed 134D533F 000.00s Reading TLS 1.3 session - TLS parsing (with encryption) does not throw any error passed 1C5D6F98 000.00s Reading TLS 1.3 session - TLS13 Record header passed 38EC62C5 000.00s Reading TLS 1.3 session - TLS13 Record __getitem__ passed DB0B6822 000.00s Reading TLS 1.3 session - TLS13 ApplicationData passed 7648A400 000.01s Decrypt a TLS 1.3 session - Parse client Hello passed 69A0EA27 000.00s Decrypt a TLS 1.3 session - Parse server Hello passed DD7ECFB1 000.00s Decrypt a TLS 1.3 session - Handshake traffic secret derivation passed F7D7BD06 000.00s Decrypt a TLS 1.3 session - Server handshake traffic key calculation passed 5A1DD106 000.02s Decrypt a TLS 1.3 session - Decrypt and parse server encrypted handshake passed 81A33359 000.00s Decrypt a TLS 1.3 session - Parse decrypted EncryptedExtension passed 4B9D442F 000.01s Decrypt a TLS 1.3 session - Parse decrypted TLS13Certificate passed 22533F5F 000.00s Decrypt a TLS 1.3 session - Parse decrypted TLSCertificateVerify passed A033098B 000.00s Decrypt a TLS 1.3 session - Parse decrypted TLSFinished passed A82B59AC 000.00s Decrypt a TLS 1.3 session - Client handshake traffic key calculation passed 059F549E 000.00s Decrypt a TLS 1.3 session - Decrypt and parse client encrypted handshake passed FEAF6F96 000.00s Decrypt a TLS 1.3 session - Application traffic secret derivation passed EE21A0A2 000.00s Decrypt a TLS 1.3 session - Application traffic keys calculation passed 2FC269C7 000.01s Decrypt a TLS 1.3 session - Decrypt and parse server NewSessionTicket passed E93AA8CA 000.00s Decrypt a TLS 1.3 session - Compute the PSK associated with the ticket passed 5683B508 000.01s Decrypt a TLS 1.3 session - Decrypt and parse client Application Data passed 082AACCA 000.00s Decrypt a TLS 1.3 session - Decrypt and parse server Application Data passed 431796E4 000.00s Decrypt a TLS 1.3 session - Decrypt client Alert passed 27E1053D 000.00s Decrypt a TLS 1.3 session - Decrypt server Alert passed 2A4308AB 000.01s Decrypt a TLS 1.3 session with a retry - Parse first ClientHello passed 59EC8E79 000.00s Decrypt a TLS 1.3 session with a retry - Parse ServerHelloRetryRequest passed 3514F339 000.01s Decrypt a TLS 1.3 session with a retry - Parse second ClientHello passed 094EF073 000.01s Decrypt a TLS 1.3 session with a retry - Parse ServerHello passed E21772DC 000.00s Decrypt a TLS 1.3 session with a retry - Handshake traffic secret derivation passed 7B02578E 000.00s Decrypt a TLS 1.3 session with a retry - Server handshake traffic key calculation passed 6B095A95 000.02s Decrypt a TLS 1.3 session with a retry - Decrypt and parse server handshake passed 12729F8A 000.00s Decrypt a TLS 1.3 session with a retry - Client handshake traffic key calculation passed 26CC4147 000.00s Decrypt a TLS 1.3 session with a retry - Decrypt and parse client finished passed 924A6FCC 000.00s Decrypt a TLS 1.3 session with a retry - Application traffic secret derivation passed 3DFCFDD8 000.00s Decrypt a TLS 1.3 session with a retry - Application traffic keys calculation passed 62ED8B21 000.00s Decrypt a TLS 1.3 session with a retry - Decrypt and parse client Alert passed 2ACC4EF3 000.00s Decrypt a TLS 1.3 session with a retry - Decrypt and parse server Alert passed FD52122C 000.00s TLS_Ext_EncryptedServerName(), dissect passed F66D3BE4 000.00s TLS_Ext_EncryptedServerName(), basic instantiation passed E91D03F6 000.01s Create TLS_Ext_KeyShare_CH: compute several algorithms passed 930044BD 000.01s Parse TLS 1.3 Client Hello with non-rfc 5077 ticket Campaign CRC=17B71AC0 in 000.18s SHA=4C38925C3C8F8C580C13263164B12343D2AB66EE PASSED=47 FAILED=0 ━ Loading: test/scapy/layers/tls/tlsclientserver.uts passed 8D2C26B0 000.06s Load server util functions passed BC1939CC 000.04s Load client utils functions passed 30A3F0ED 000.23s Testing TLS server and client with SSLv2 and SSL_CK_DES_192_EDE3_CBC_WITH_MD5 passed 6C376496 000.23s Testing TLS server and client with SSLv2 and SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5 passed 67E82586 000.20s Testing TLS client with SSLv3 and TLS_RSA_EXPORT_WITH_RC4_40_MD5 passed 4307BE0B 000.15s Testing TLS client with TLS 1.0 and TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA passed 177DE3F3 000.20s Testing TLS client with TLS 1.0 and TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 passed A4A353C1 000.14s Testing TLS client with TLS 1.1 and TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA passed 680CB629 000.18s Testing TLS client with TLS 1.2 and TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 passed D43695B4 000.11s Testing TLS client with TLS 1.2 and TLS_ECDH_anon_WITH_RC4_128_SHA passed 1848B923 000.20s Testing TLS server and client with TLS 1.3 and TLS_AES_128_GCM_SHA256 passed 402400E2 000.19s Testing TLS server and client with TLS 1.3 and TLS_CHACHA20_POLY1305_SHA256 passed A891CAA1 000.22s Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 passed 660AEE2F 000.21s Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 and x448 passed 216A2AA1 000.20s Testing TLS server and client with TLS 1.3 and a retry passed 47B2F725 000.13s Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 with Ed25519-signed cert passed C2174B67 000.28s Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 and client auth passed BCB72E58 000.19s Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 and key update passed 3A711F49 000.50s Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 and session resumption passed 92BD1D8F 000.00s Clear session file passed F74C7018 000.05s Load native server util functions passed 1EA53099 000.18s Testing TLS client against ssl.SSLContext server with TLS 1.3 and a post-handshake authentication passed 78713BCC 000.53s Testing TLS client against ssl.SSLContext server with TLS 1.3 and a Hello-Retry request Campaign CRC=4AF17EE4 in 004.43s SHA=7C92AE1C13A2137BE603E22B60E0575124B7BCEE PASSED=23 FAILED=0 ━ Loading: test/contrib/altbeacon.uts passed 926B11EA 000.00s Setup passed 22A5CF54 000.00s Presence check passed AC58CE7B 000.00s AltBeaconParserTest.testRecognizeBeacon passed 158A8B84 000.00s AltBeaconParserTest.testDetectsDaveMHardwareBeacon passed 2EDFFF30 000.00s AltBeaconParserTest.testParseWrongFormatReturnsNothing passed 9B2F4F51 000.00s AltBeaconParserTest.testParsesBeaconMissingDataField passed 3B802940 000.00s Build EIR Campaign CRC=D7C58309 in 000.02s SHA=C4B462CDA469C88108018EC4507E166AA17D9062 PASSED=7 FAILED=0 ━ Loading: test/contrib/aoe.uts passed 2F345B05 000.00s Build - Check Ethertype passed 54E919D1 000.00s Build - Check default passed 92C3967F 000.00s Build - Check Issue ATA command passed 28128097 000.00s Build - Check Query Config Information passed 71A50825 000.00s Build - Check Mac Mask List passed 0490D5A3 000.00s Build - Check ReserveRelease Campaign CRC=DE272EB2 in 000.01s SHA=FB2B582737FC23507E84FE7B4921C03C4883B9AB PASSED=6 FAILED=0 ━ Loading: test/contrib/avs.uts passed 72BCD676 000.01s Default build, storage and dissection Campaign CRC=53E97EF6 in 000.01s SHA=DCC4C84EFB41726311A6F926B86AC0605DD8C652 PASSED=1 FAILED=0 ━ Loading: test/contrib/bfd.uts passed 8E596653 000.00s BFD, basic instantiation passed 4CC71667 000.01s BFD - dissection passed C05073AE 000.00s BFD with OptionalAuth [Simple Password Auth] [dissection] passed 36F77124 000.00s BFD with OptionalAuth [Keyed MD5 Auth] [dissection] passed A0F61EE1 000.00s BFD with OptionalAuth [Meticulous Keyed SHA1 Auth] [dissection] passed 065C8A29 000.00s BFD with OptionalAuth [Simple Password Auth] [Build] passed E0A1F57F 000.00s BFD with OptionalAuth [Keyed MD5 Auth] [Build] passed 73C784CC 000.00s BFD with OptionalAuth [Meticulous Keyed SHA1 Auth] [Build] Campaign CRC=2D2B6888 in 000.02s SHA=E0B8679F28197FFB764AD5380C7A30F1951B2ABE PASSED=8 FAILED=0 ━ Loading: test/contrib/bgp.uts passed 07BFF945 000.00s OLD speaker (see RFC 6793) passed 0229FEEF 000.00s BGPNLRI_IPv4 - Instantiation passed 29E43CFF 000.00s BGPNLRI_IPv4 - Instantiation with specific values (1) passed 082A88BB 000.01s BGPNLRI_IPv4 - Instantiation with specific values (2) passed 41BB2952 000.00s BGPNLRI_IPv4 - Instantiation with specific values (3) passed 0A43D94D 000.00s BGPNLRI_IPv4 - Basic dissection passed B45FD533 000.00s BGPNLRI_IPv4 - Dissection with specific values passed AAAF4F7E 000.00s BGPNLRI_IPv6 - Instantiation passed 62CCF2AB 000.01s BGPNLRI_IPv6 - Instantiation with specific values (1) passed 299621DF 000.00s BGPNLRI_IPv6 - Instantiation with specific values (2) passed 21AD29D7 000.00s BGPNLRI_IPv6 - Basic dissection passed D9C4B77F 000.00s BGPNLRI_IPv6 - Dissection with specific values passed 6558129B 000.00s BGP - Instantiation (Should be a KEEPALIVE) passed 76C8E862 000.00s BGP - Instantiation with specific values (1) passed F567EB49 000.00s BGP - Instantiation with specific values (2) passed AAE7E875 000.00s BGP - Instantiation with specific values (3) passed 2948EB5E 000.00s BGP - Instantiation with specific values (4) passed 15E7EE0D 000.00s BGP - Instantiation with specific values (5) passed 9648ED26 000.00s BGP - Instantiation with specific values (6) passed 172CB6AC 000.00s BGP - Basic dissection passed CEC02D29 000.00s BGP - Dissection with specific values passed 60A52550 000.00s BGPKeepAlive - Instantiation (by default, should be a "generic" capability) passed D3477ECF 000.00s BGPKeepAlive - Swallowing tests: combined BGPKeepAlive passed 64EBE4C1 000.00s BGPCapability - Instantiation (by default, should be a "generic" capability) passed C85B06E1 000.00s BGPCapability - Instantiation with specific values (1) passed 31134FB2 000.00s BGPCapability - Check exception passed 88058EA7 000.00s BGPCapability - Test haslayer() passed DDFDA567 000.00s BGPCapability - Test getlayer() passed 50A4B026 000.00s BGPCapability - sessions (1) passed 14ACB555 000.00s BGPCapability - sessions (2) passed 86E0B07D 000.01s BGPCapMultiprotocol - Inheritance passed 42CDA112 000.00s BGPCapMultiprotocol - Instantiation passed 476FB63E 000.00s BGPCapMultiprotocol - Instantiation with specific values (1) passed D220459B 000.00s BGPCapMultiprotocol - Instantiation with specific values (2) passed C6C40FB0 000.00s BGPCapMultiprotocol - Dissection with specific values passed 01EF1D8E 000.00s BGPCapORFBlock - Instantiation passed C751ECD7 000.00s BGPCapORFBlock - Instantiation with specific values (1) passed 918C7984 000.00s BGPCapORFBlock - Instantiation with specific values (2) passed 61364530 000.00s BGPCapORFBlock - Basic dissection passed 129854A6 000.00s BGPCapORFBlock - Dissection with specific values passed 1B4E2F73 000.00s BGPCapORFBlock.ORF - Instantiation passed 8D1AFE28 000.00s BGPCapORFBlock.ORF - Instantiation with specific values (1) passed 205F3379 000.00s BGPCapORFBlock.ORF - Basic dissection passed C70B7C0B 000.00s BGPCapORFBlock.ORF - Dissection with specific values passed 038653E5 000.00s BGPCapORF - Inheritance passed 2CA9FCE5 000.00s BGPCapORF - Instantiation passed 47A53510 000.00s BGPCapORF - Instantiation with specific values (1) passed D60E2926 000.00s BGPCapORF - Instantiation with specific values (2) passed 07C12A5A 000.00s BGPCapORF - Basic dissection passed 24CEF50D 000.00s BGPCapORF - Dissection with specific values passed 5B71860B 000.00s BGPCapORF - Dissection passed 0ABB001C 000.00s BGPCapGracefulRestart.GRTuple - Instantiation passed 41E8E696 000.00s BGPCapGracefulRestart.GRTuple - Instantiation with specific values passed 1C972EA5 000.00s BGPCapGracefulRestart.GRTuple - Basic dissection passed E6049A2B 000.00s BGPCapGracefulRestart.GRTuple - Dissection with specific values passed D8E3C1CD 000.00s BGPCapGracefulRestart - Inheritance passed 99542362 000.00s BGPCapGracefulRestart - Instantiation passed 497F3315 000.00s BGPCapGracefulRestart - Instantiation with specific values (1) passed 497F3315 000.01s BGPCapGracefulRestart - Instantiation with specific values (2) passed 459A6615 000.00s BGPCapGracefulRestart - Instantiation with specific values (3) passed E8D413AF 000.00s BGPCapGracefulRestart - Instantiation with specific values (4) passed 38D93AA6 000.00s BGPCapGracefulRestart - Basic dissection passed F18ADBA4 000.00s BGPCapGracefulRestart - Dissection with specific values passed 6A8B04D7 000.01s BGPCapFourBytesASN - Inheritance passed 46FF9C1A 000.00s BGPCapFourBytesASN - Instantiation passed C14EFBFB 000.00s BGPCapFourBytesASN - Instantiation with specific values (1) passed 3121ECD5 000.01s BGPCapFourBytesASN - Instantiation with specific values (2) passed 098AC2F5 000.00s BGPCapFourBytesASN - Basic dissection passed FBDB56E6 000.00s BGPCapFourBytesASN - Dissection with specific values passed FF88C5E7 000.00s BGPAuthenticationInformation - Instantiation passed 70D0F21A 000.00s BGPAuthenticationInformation - Basic dissection passed 05EA8A12 000.00s BGPOptParam - Instantiation passed D386D9DF 000.00s BGPOptParam - Instantiation with specific values (1) passed 1A641406 000.00s BGPOptParam - Instantiation with specific values (2) passed 6D95491A 000.00s BGPOptParam - Instantiation with specific values (3) passed B6F52980 000.00s BGPOptParam - Instantiation with specific values (4) passed 4F4E653E 000.00s BGPOptParam - Instantiation with specific values (5) passed E56A5E37 000.00s BGPOptParam - Basic dissection passed E50D663F 000.00s BGPOptParam - Dissection with specific values passed 83239751 000.00s BGPOpen - Instantiation passed C836D805 000.00s BGPOpen - Instantiation with specific values (1) passed 5CF74E6A 000.00s BGPOpen - Instantiation with specific values (2) passed D09D6275 000.00s BGPOpen - Instantiation with specific values (3) passed E17071F6 000.00s BGPOpen - Dissection with specific values (1) passed 52870FB9 000.00s BGPOpen - Dissection with specific values (2) (followed by a KEEPALIVE) passed E8142369 000.00s BGPOpen - Dissection with specific values (3) passed 48DEDBBF 000.01s BGPOpen - Dissection with specific values (4) passed F2D8F7BA 000.00s BGPPAOrigin - Instantiation passed 68537B70 000.00s BGPPAOrigin - Instantiation with specific values passed 11183844 000.01s BGPPAOrigin - Dissection passed EED71F8B 000.00s BGPPAASPath - Instantiation passed A3305EF3 000.00s BGPPAASPath - Instantiation with specific values (1) passed ED1106E9 000.00s BGPPAASPath - Instantiation with specific values (2) passed F3BD198D 000.00s BGPPAASPath - Instantiation with specific values (3) passed A21B6BF6 000.00s BGPPAASPath - Dissection (1) passed 9A86FE81 000.00s BGPPAASPath - Dissection (2) passed 03D97582 000.00s BGPPANextHop - Instantiation passed C26055D0 000.00s BGPPANextHop - Instantiation with specific values passed DAD41E11 000.00s BGPPANextHop - Basic dissection passed 556C05B0 000.00s BGPPANextHop - Dissection with specific values passed 9F45F93B 000.00s BGPPAMultiExitDisc - Instantiation passed 48224459 000.00s BGPPAMultiExitDisc - Instantiation with specific values (1) passed 77DCD29D 000.00s BGPPAMultiExitDisc - Basic dissection passed 87FFD4F4 000.00s BGPPALocalPref - Instantiation passed 7A55497B 000.00s BGPPALocalPref - Instantiation with specific values (1) passed 05E27331 000.00s BGPPALocalPref - Basic dissection passed FB012004 000.00s BGPPAAggregator - Instantiation passed 2950DB38 000.00s BGPPAAggregator - Instantiation with specific values (1) passed 5BD7C6C5 000.00s BGPPAAggregator - Dissection passed 68D4D2E6 000.00s BGPPACommunity - Basic instantiation passed 7F7A17FA 000.00s BGPPACommunity - Instantiation with specific value passed 32C58406 000.00s BGPPACommunity - Dissection passed A266901E 000.00s BGPPAOriginatorID - Basic instantiation passed D73AEF2D 000.01s BGPPAOriginatorID - Instantiation with specific value passed 509395F0 000.00s BGPPAOriginatorID - Dissection passed 11A478B5 000.00s BGPPAClusterList - Basic instantiation passed 8212CFC0 000.00s BGPPAClusterList - Instantiation with specific values passed 5B3E8545 000.00s BGPPAClusterList - Dissection passed 6EA947E7 000.00s BGPPAMPReachNLRI - Instantiation passed A88197FD 000.00s BGPPAMPReachNLRI - Instantiation with specific values (1) passed 653E29AD 000.00s BGPPAMPReachNLRI - Dissection (1) passed 56C5AE58 000.01s BGPPAMPReachNLRI - Dissection (2) passed 7DEB0C24 000.00s BGPPAMPUnreachNLRI - Instantiation passed 4599F738 000.00s BGPPAMPUnreachNLRI - Instantiation with specific values (1) passed 0B9322D2 000.00s BGPPAMPUnreachNLRI - Instantiation with specific values (2) passed 74F2B8C8 000.00s BGPPAMPUnreachNLRI - Dissection (1) passed A4A58112 000.01s BGPPAMPUnreachNLRI - Dissection (2) passed DB4F77B6 000.00s BGPPAAS4Aggregator - Instantiation passed B2B5DC38 000.00s BGPPAAS4Aggregator - Instantiation with specific values passed EB7D67FC 000.00s BGPPAAS4Aggregator - Dissection passed 98CC14AC 000.00s BGPPALargeCommunity - Instantiation passed F3CA2B0F 000.00s BGPPALargeCommunity - Instantiation with specific values passed 9919A537 000.00s BGPPALargeCommunity - Dissection passed 1FC9CE93 000.00s BGPPathAttr - Instantiation passed 67E21AB6 000.00s BGPPathAttr - Instantiation with specific values (1) passed 45F50955 000.00s BGPPathAttr - Instantiation with specific values (2) passed 4F19949B 000.00s BGPPathAttr - Instantiation with specific values (3) passed A86275A9 000.01s BGPPathAttr - Dissection (1) passed 4EC9D25B 000.01s BGPPathAttr - advanced passed 0759C998 000.00s BGPUpdate - Instantiation passed A3822C8F 000.00s BGPUpdate - Dissection (1) passed 046C223E 000.01s BGPUpdate - Behave like a NEW speaker (RFC 6793) - Dissection (2) passed C650AEAB 000.01s BGPUpdate - Dissection (MP_REACH_NLRI) passed F54BB15D 000.01s BGPUpdate - Dissection (MP_UNREACH_NLRI) passed F2B10FFC 000.01s BGPUpdate - Dissection (with BGP Additional Path) passed 00718EF0 000.00s BGPUpdate - with BGPHeader passed C21E3DC0 000.00s BGPNotification - Instantiation passed BDF81469 000.00s BGPNotification - Dissection (Administratively Reset) passed 1257F644 000.00s BGPNotification - Dissection (Bad Peer AS) passed 9AD30AE2 000.00s BGPNotification - Dissection (Attribute Flags Error) passed 7E73D740 000.00s BGPRouteRefresh - Instantiation passed 30082B60 000.00s BGPRouteRefresh - Instantiation with specific values passed 72B1BB61 000.00s BGPRouteRefresh - Dissection (1) passed F1147ACF 000.00s BGPRouteRefresh - Dissection (2) - With ORFs passed 1CB6F65E 000.00s BGPRouteRefresh - Dissection (3) - bad ORFS (GH3345) passed E589A6C8 000.01s BGPCapGeneric fuzz() Campaign CRC=DBA18012 in 000.35s SHA=4BAB9941E4702E94E8237E30202A1E9254E67222 PASSED=156 FAILED=0 ━ Loading: test/contrib/bier.uts passed 87B1A973 000.01s BIER - build/dissection Campaign CRC=28E1A79D in 000.01s SHA=DF6E7F96F03BA87CD0EC15753D685E955A6D7540 PASSED=1 FAILED=0 ━ Loading: test/contrib/bp.uts passed 0500B6C5 000.01s Build packets & dissect Campaign CRC=8E924623 in 000.01s SHA=4740F127FD09D6DA41EBFB5E387E9E2E06994C98 PASSED=1 FAILED=0 ━ Loading: test/contrib/canfdsocket_native.uts Campaign CRC=32ED4690 in 000.00s SHA=C7386D32F9682552E4AC7D413AD8A80843EB1B00 PASSED=0 FAILED=0 ━ Loading: test/contrib/canfdsocket_python_can.uts Campaign CRC=A69731DC in 000.00s SHA=F4B4FF024D4526DB5930C119557ECF6572E9100C PASSED=0 FAILED=0 ━ Loading: test/contrib/cansocket.uts Campaign CRC=D2D14014 in 000.00s SHA=79BB599402AB9290CCC512DB4EE5CEAB235B1AFA PASSED=0 FAILED=0 ━ Loading: test/contrib/cansocket_native.uts Campaign CRC=54046041 in 000.00s SHA=C3BA7013AEB71BE83D88F62E4D8BC807016AAF51 PASSED=0 FAILED=0 ━ Loading: test/contrib/cansocket_python_can.uts Campaign CRC=52255DA8 in 000.00s SHA=35AA548E7E1674B291BD312CA49DA855D9B772A9 PASSED=0 FAILED=0 ━ Loading: test/contrib/carp.uts passed 2DDCDC64 000.00s Build Campaign CRC=F0A45F01 in 000.00s SHA=7029CC4050D66575932CBB17BD4BAF6C47388FA6 PASSED=1 FAILED=0 ━ Loading: test/contrib/cdp.uts passed D40A2D03 000.01s CDPv2 - Dissection (1) passed 5896E63B 000.00s CDPv2 - Rebuild (1) passed 34C65FE3 000.00s CDPv2 - Dissection (2) passed F8FE3D06 000.00s CDPv2 - Rebuild (2) passed 42955EC8 000.00s CDPv2 - Complex Packet passed DCDF175D 000.00s CDPChecksum - packet with odd length passed 2860D95A 000.00s CDPv2 - CDPMsgAddr Packet passed 53541D66 000.01s CDPv2 - CDPMsgPowerRequest and CDPMsgPowerAvailable Packet Campaign CRC=47CD7E3F in 000.03s SHA=E0F5E5224616A0CBC3129102B910019440EE3F01 PASSED=8 FAILED=0 ━ Loading: test/contrib/chdlc.uts passed DBBEE11D 000.01s Default build, storage and dissection passed 898D52EA 000.00s Build request passed D2D3DF2C 000.00s Build keepalive Campaign CRC=45717F20 in 000.01s SHA=CB08CB6476F7D7F6C187D990E414DC641E8E94CD PASSED=3 FAILED=0 ━ Loading: test/contrib/coap.uts passed 2A01A5DD 000.00s Import the CoAP layer passed 3E59DC18 000.00s CoAP default values passed 0EBA67DF 000.00s Token length calculation passed 287B4E9A 000.01s CON GET dissect passed 5BF0C455 000.00s Extended option delta passed 4C31487E 000.00s Extended option length passed 2FA9CC65 000.00s Options should be ordered by option number passed 6F8C4825 000.00s Options of the same type should not be reordered passed E03B5943 000.00s Destination port passed F0EAB40B 000.00s Source port passed C22B5A9C 000.00s building with a text/plain payload passed DA01D188 000.00s dissection with a text/plain payload Campaign CRC=919E8935 in 000.04s SHA=A369EEEDBE80233A02CA7636D3CE22E88E056427 PASSED=12 FAILED=0 ━ Loading: test/contrib/concox.uts passed 8AFBFC0A 000.01s Basic tests Campaign CRC=A90E25CF in 000.01s SHA=F37F73E687CE02951DE7D512CA1095A2E69E8FBB PASSED=1 FAILED=0 ━ Loading: test/contrib/diameter.uts passed 15B2973F 000.00s AVP identified by full name passed 3DFE6124 000.00s Same AVP identified by the beginning of the name passed 52D158E2 000.00s Same AVP identified by its code passed 454AFB4E 000.00s The Session-Id AVP (with some padding added) passed A626FBBA 000.00s An enumerated AVP passed 812ACDC4 000.00s An address AVP passed 3A08DACF 000.00s A time AVP passed 9832FFA4 000.00s An empty Auth App ID AVP passed 89807E0C 000.00s An ISDN AVP passed 11CED972 000.00s Some OctetString AVPs passed A3E7CAD1 000.00s Unknown AVP identifier passed A6E75EC2 000.00s Vendor AVP identified by full name passed 6CF51C41 000.00s Same AVP identified by its code and vendor ID passed FFD46D3C 000.00s Altering the flags of the Origin-Host AVP passed 61803652 000.00s Altering the length of the Destination-Realm AVP passed 4D429E79 000.00s Altering the vendor of the Public-Identity AVP, and hence the flags ... passed 623E1F2A 000.00s The Supported-Features AVP (with vendor) passed 53CBCF82 000.00s The same AVP created more simply passed 13737913 000.01s (re)Building the previous AVP from scratch passed 5FE274AE 000.00s Another (dummy) grouped AVP passed B7718836 000.01s A grouped AVP inside another grouped AVP passed 6924C8F6 000.01s A big grouped AVP passed 109BBBCF 000.00s Dissect grouped AVP passed EB7943C8 000.01s A simple request identified by its name passed D0CD98F9 000.00s Unknown request by its name passed 893DDEA5 000.00s The same one identified by its code passed BB89C6D5 000.00s Unknown request by its code passed 88882CF0 000.00s The same one identified by its abbreviation passed 7E16A921 000.00s Altering the request default fields passed 0A6DF884 000.00s Altering the default request fields with string passed 503F45A2 000.00s Altering the default request fields with invalid string passed B4710BF6 000.00s A simple answer identified by its name passed 7A6B57AF 000.00s Same answer identified by its code or abbreviation passed 3C704AEA 000.00s Altering the answer default fields passed 5A516C3B 000.02s A dummy Multimedia-Auth request (identified by only a portion of its name) passed 3D84D971 000.04s The same request built from scratch Campaign CRC=1F80F4E8 in 000.17s SHA=903CD50307C07BD4636F466CDC2FD1CB6DD30104 PASSED=36 FAILED=0 ━ Loading: test/contrib/dtp.uts passed D979EB4F 000.00s Basic DTP build passed F3CC7A19 000.01s Basic DTP dissection passed A30D12BE 000.01s Test negotiate_trunk Campaign CRC=DE25DAC0 in 000.02s SHA=51DD3B85DA27FC3C735CB36C97B5F697059F491F PASSED=3 FAILED=0 ━ Loading: test/contrib/eddystone.uts passed DA599690 000.00s Setup passed B6F4E7AF 000.00s Eddystone URL (decode EIR) passed 0AC00106 000.00s Eddystone URL (decode LE Set Advertising Data) passed FDCE20FD 000.00s Eddystone URL (encode frames) passed 7E692BA9 000.00s Eddystone URL (encode unsupported scheme) passed 9D81C503 000.01s Eddystone URL (encode advertising report) Campaign CRC=8D21C6CD in 000.02s SHA=2E14CD21D6A935A37381C541F54521920510AF67 PASSED=6 FAILED=0 ━ Loading: test/contrib/eigrp.uts passed 78FA3B53 000.00s EIGRP IPv4 Binding passed 67878E5F 000.00s EIGRP IPv6 Binding passed B4FCE0EC 000.00s EIGRP checksum field passed 12A5766B 000.00s ShortVersionField nice representation passed FEE00658 000.00s ShortVersionField h2i function passed 5578EDC6 000.00s ShortVersionField error passed 10C647EB 000.00s EigrpIPField length with prefix length of 8 bit passed 8A6461F8 000.00s EigrpIPField length with prefix length of 12 bit passed 237D0CF7 000.00s EigrpIPField length with prefix length of 24 bit passed 715FAA89 000.00s EigrpIPField length with prefix length of 28 bit passed 81C42B2C 000.00s EigrpIPField randval passed 1B6EC14B 000.00s EigrpIP6Field length with prefix length of 8 bit passed F3EDDA80 000.00s EigrpIP6Field length with prefix length of 99 bit passed 01FCB71F 000.00s EigrpIP6Field length with prefix length of 128 bit passed 73845B1C 000.00s EigrpIP6Field randval passed 87282761 000.00s EIGRPGuessPayloadClass function: Return Parameters TLV passed AB70B1F5 000.00s EIGRPGuessPayloadClass function: Return Authentication Data TLV passed 5E6D52BB 000.00s EIGRPGuessPayloadClass function: Return Sequence TLV passed EAC435D7 000.00s EIGRPGuessPayloadClass function: Return Software Version TLV passed 515A3E5A 000.00s EIGRPGuessPayloadClass function: Return Next Multicast Sequence TLV passed FD9F1177 000.00s EIGRPGuessPayloadClass function: Return Stub Router TLV passed 1416FC60 000.00s EIGRPGuessPayloadClass function: Return Internal Route TLV passed 6C7466EE 000.00s EIGRPGuessPayloadClass function: Return External Route TLV passed F5A2ACEB 000.00s EIGRPGuessPayloadClass function: Return IPv6 Internal Route TLV passed B8D2C6B8 000.00s EIGRPGuessPayloadClass function: Return IPv6 External Route TLV passed FB5591E9 000.00s EIGRPGuessPayloadClass function: Return EIGRPGeneric passed 3C51BAD4 000.01s EIGRP parameters and software version passed F16ABBD0 000.00s EIGRP Sequence passed 5252C2A0 000.00s EIGRP Generic passed 411A85A1 000.00s EIGRP internal route length field passed 2ED5A7C0 000.00s EIGRP external route length field passed 870DB3D0 000.00s EIGRPv6 internal route length field passed 1484F8DF 000.00s EIGRPv6 external route length field passed 4896B499 000.00s Receive-Only passed 33F0B308 000.00s Connected passed D054D189 000.00s Static passed 4B6029AC 000.00s Summary passed B45D1F34 000.00s Connected, Summary passed 6491FAB3 000.00s Static, Summary passed CF5286B4 000.00s Redistributed, Connected passed CAECAE79 000.00s Redistributed, Static passed 621116E6 000.00s Redistributed, Static, Connected passed EE1E38B9 000.00s Redistributed, Summary passed E09601EF 000.00s Redistributed, Connected, Summary passed E6378EC7 000.00s Connected, Redistributed, Static, Summary passed 5872906A 000.00s Leak-Map passed 9E1F107B 000.00s Connected, Leak-Map passed F6E7F059 000.00s External route flag external passed 3C4BE7CE 000.00s External route flag candidate-default route passed 08F27350 000.00s Multiple internal routing updates passed F95592D8 000.00s Multiple external routing updates passed A6294872 000.00s Verify keysize calculation passed 10EEAB89 000.00s Verify length calculation Campaign CRC=EDB3241D in 000.14s SHA=A769DCC309B3D01F71E8942DAB89EEEAA1EB03D2 PASSED=53 FAILED=0 ━ Loading: test/contrib/enipTCP.uts passed AEC1ECE6 000.00s Import the enip layer passed A37616D1 000.00s Encapsulation Header Default Values passed 9A88BD31 000.00s ENIP List Services Reply Command ID passed 7F8C5645 000.00s ENIP List Services Default Values passed 197A7436 000.00s ENIP List Services Custom Values passed 927BF7A6 000.00s ENIP List Identity Reply Command ID passed 8FC66B29 000.00s ENIP List Identity Default Values passed BE08EF67 000.00s ENIP List Identity Custom Values passed BDE87534 000.00s ENIP List Interfaces Reply Command ID passed 70820BCE 000.00s ENIP List Interfaces Reply Default Values passed 558B52A4 000.00s ENIP List Interfaces Reply Items Default Values passed F68FA6AA 000.00s ENIP Register Session Command ID passed E6EFD61E 000.00s ENIP Register Session Default Values passed E6AD00FC 000.00s ENIP Register Session Request passed 664E2806 000.00s ENIP Register Session Reply passed 286149B7 000.00s ENIP Send RR Data Command ID passed B76885AE 000.00s ENIP Send RR Data Default Values passed 7EAF2D21 000.00s ENIP Send RR Data Request passed 8E58F604 000.00s ENIP Send RR Data Reply passed 5CFAE49D 000.00s ENIP Send Unit Data Command ID passed 534B63EE 000.00s ENIP Send Unit Data Default Values passed BB95A3FD 000.00s ENIP Send Unit Data Campaign CRC=528AB1FA in 000.05s SHA=99FD6B44099B21632A4E4809E67D17A1951986BE PASSED=22 FAILED=0 ━ Loading: test/contrib/erspan.uts passed 496221D2 000.00s Build & dissect ERSPAN 1 passed 4C61EAB1 000.00s Build ERSPAN II passed 9166B3D8 000.00s Dissect ERSPAN II passed 8301BF27 000.00s Build & dissect ERSPAN III with platform specific passed 5AC3D4BA 000.00s Build & dissect ERSPAN III without platform specific Campaign CRC=225BBD78 in 000.02s SHA=F44334910A7F8250854D94F08551D1AAE34542DF PASSED=5 FAILED=0 ━ Loading: test/contrib/esmc.uts passed CA8A76BB 000.00s Build & dissect ESMC and QLTLV passed A0B4C7B3 000.01s Build & dissect ESMC and EQLTLV Campaign CRC=FCE56BB6 in 000.01s SHA=71C901AF1156801B29674B1369AEBB9BBC13FDE3 PASSED=2 FAILED=0 ━ Loading: test/contrib/ethercat.uts passed 9702090B 000.02s regression test passed 61A99FE8 000.01s Avoid mix of LEBitFields and BitFields passed 4476A2F5 000.01s EtherCat and padding passed 665D4E8F 000.01s EtherCat and RawPayload passed 899A1CE0 000.03s EtherCat - test invalid length detection passed 711D5DF9 000.04s EtherCat and Type12 DLPDU layers passed 61CEABEB 000.01s EtherCat and Type12 DLPDU layer using structure used for physical and broadcast addressing passed A363BE31 000.01s EtherCat and Type12 DLPDU layer using structure used for logical addressing passed 0B899A13 000.09s EtherCat and randomly stacked Type12 DLPDU layers Campaign CRC=CA209677 in 000.22s SHA=52A856DD294774E4BDAA3E0CADEE6D81DB9681AE PASSED=9 FAILED=0 ━ Loading: test/contrib/etherip.uts passed 4C61684B 000.00s Basic EtherIP test Campaign CRC=EE8184BE in 000.00s SHA=888260DB9DEAC82D4AE223663755A8264C0E6FC8 PASSED=1 FAILED=0 ━ Loading: test/contrib/exposure_notification.uts passed 926B11EA 000.00s Setup passed E6FEE8FE 000.00s Presence check passed 452E240E 000.00s Raw payload copied from BluetoothExplorer.app passed 442049EB 000.00s Raw captured payload Campaign CRC=9E782A77 in 000.01s SHA=C608CF534C76F4AF7CF15041004ECF9F5D6941DC PASSED=4 FAILED=0 ━ Loading: test/contrib/geneve.uts passed D08BE1CF 000.00s Build & dissect - GENEVE encapsulates Ether passed 67E883B7 000.00s Build & dissect - GENEVE with options encapsulates Ether passed 6836936B 000.01s Build & dissect - GENEVE with metadata options encapsulates Ether passed F2BD60BF 000.00s Build & dissect - GENEVE with multiple options passed 8B0E7D15 000.01s Build & dissect - GENEVE encapsulates IPv4 passed 120D363A 000.00s Build & dissect - GENEVE encapsulates IPv6 passed F6A7525C 000.01s GENEVE - Answers passed 035999B0 000.00s GENEVE - Summary passed 837C5F63 000.01s GENEVE - Optionlen Campaign CRC=FB4BDB07 in 000.05s SHA=C542C609BF30C5F932589FF9253281DB3C73EA4B PASSED=9 FAILED=0 ━ Loading: test/contrib/gtp.uts passed 3D059091 000.00s GTPHeader, basic instantiation passed 912A0032 000.00s GTP_U_Header detection passed 6278375B 000.00s GTP_U_Header with PDU Session Container passed 05308339 000.00s GTP_U_Header with PDU Session Container with QFI/PPI passed 10FB55CF 000.02s GTP_U_Header sub layers passed 3F93127C 000.01s GTPPDUSessionContainer(), dissect passed 954DF898 000.00s GTPPDUSessionContainer with padding passed 60522119 000.00s GTPEchoResponse matches GTPEchoRequest by seq passed 478FC514 000.00s GTPCreatePDPContextRequest(), basic instantiation passed 31D513AD 000.01s GTPCreatePDPContextRequest(), basic dissection passed C653E88F 000.01s GTPV1UpdatePDPContextRequest(), dissect passed 3E9021BC 000.00s GTPV1UpdatePDPContextResponse(), dissect passed 8556D319 000.00s IE_Cause(), dissect passed 368F2ABB 000.00s IE_Cause(), basic instantiation passed AE66E195 000.01s IE_IMSI(), dissect passed A1535328 000.00s IE_IMSI(), basic instantiation passed A1C1CE8E 000.01s IE_Routing(), dissect passed 2B37B2B9 000.00s IE_Routing(), basic instantiation passed DDA4A54D 000.00s IE_Recovery(), dissect passed 29AFEDB6 000.00s IE_Recovery(), basic instantiation passed 48095B23 000.01s IE_SelectionMode(), dissect passed 2C1E956E 000.00s IE_SelectionMode(), basic instantiation passed DD6B1417 000.00s IE_TEIDI(), dissect passed F27515FA 000.00s IE_TEIDI(), basic instantiation passed 34F95BAC 000.01s IE_TEICP(), dissect passed 275BDFF4 000.00s IE_TEICP(), basic instantiation passed AFCABAFA 000.01s IE_Teardown(), dissect passed 24D46469 000.00s IE_Teardown(), basic instantiation passed 86600E86 000.00s IE_NSAPI(), dissect passed 6C60D96F 000.00s IE_NSAPI(), basic instantiation passed 2B78370E 000.01s IE_ChargingCharacteristics(), dissect passed D63BB6F1 000.00s IE_ChargingCharacteristics(), basic instantiation passed 95F7A62E 000.00s IE_TraceReference(), basic instantiation passed 00049528 000.00s IE_TraceType(), basic instantiation passed B7F158BD 000.00s IE_ChargingId(), dissect passed CBA1A6E5 000.00s IE_ChargingId(), basic instantiation passed C39051A0 000.01s IE_EndUserAddress(), dissect passed C8050E2C 000.00s IE_EndUserAddress(), IPv4/IPv6 dissect passed 80F42488 000.00s IE_EndUserAddress(), basic instantiation IPv4 passed BCFDA151 000.00s IE_EndUserAddress(), basic instantiation IPv6 passed 44082C08 000.00s IE_EndUserAddress(), basic instantiation IPv4/IPv6 passed 606AB699 000.00s IE_AccessPointName(), dissect passed 725C4839 000.00s IE_AccessPointName(), basic instantiation passed 677396CC 000.00s IE_ProtocolConfigurationOptions(), dissect passed 8E99F144 000.00s IE_ProtocolConfigurationOptions(), basic instantiation passed EB356BEF 000.00s IE_GSNAddress(), simple build/dissect IPv4 passed D098E676 000.00s IE_GSNAddress(), simple build/dissect IPv6 passed 69494BE7 000.00s IE_GSNAddress(), dissect IPv4 passed 57FB23F0 000.00s IE_GSNAddress(), dissect IPv6 passed 7F8A6F3E 000.00s IE_GSNAddress(), basic instantiation IPv4 passed 4387C3EF 000.00s IE_GSNAddress(), basic instantiation IPv6 passed 0E17D08D 000.01s IE_MSInternationalNumber(), dissect passed 2A4B0903 000.00s IE_MSInternationalNumber(), basic instantiation passed 4AB81EF1 000.01s IE_QoS(), dissect passed 9B09660B 000.01s IE_QoS(), basic instantiation passed 2CCD1282 000.00s IE_CommonFlags(), dissect passed F3F3A428 000.00s IE_CommonFlags(), basic instantiation passed 08E68797 000.00s IE_APNRestriction(), basic instantiation passed 030E0728 000.00s IE_RATType(), dissect passed C0F48FD4 000.00s IE_RATType(), basic instantiation passed A72CCB60 000.00s IE_UserLocationInformation(), dissect passed 4225880F 000.00s IE_UserLocationInformation(), basic instantiation passed 709A5518 000.01s IE_MSTimeZone(), dissect passed 24638A44 000.00s IE_MSTimeZone(), basic instantiation passed 5D87975F 000.01s IE_IMEI(), dissect passed AD8D5C2A 000.00s IE_IMEI(), basic instantiation passed 5CC0EDE2 000.00s IE_MSInfoChangeReportingAction(), basic instantiation passed F2BE9E37 000.00s IE_DirectTunnelFlags(), dissect passed CE3A9C36 000.01s IE_DirectTunnelFlags(), basic instantiation passed 1DF96849 000.00s IE_BearerControlMode(), basic instantiation passed CD92FCDD 000.00s IE_EvolvedAllocationRetentionPriority(), basic instantiation passed 639DC57B 000.00s IE_CharginGatewayAddress(), basic instantiation passed 02B19167 000.00s IE_PrivateExtension(), basic instantiation Campaign CRC=9492B448 in 000.27s SHA=4313B8C8CC4F5674F3F52A627AD26CF3BAA2D5DE PASSED=73 FAILED=0 ━ Loading: test/contrib/gtp_v2.uts passed 5CCFC8E4 000.00s GTPHeader v2, basic instantiation passed 65EBE70E 000.00s GTPV2EchoRequest, basic instantiation passed A86290E3 000.00s GTPV2CreateSessionRequest, basic instantiation passed F9C6810E 000.00s GTPV2EchoRequest, dissection passed 429B7CBE 000.00s GTPV2EchoResponse, dissection passed 9CFECF19 000.00s GTPV2ModifyBearerRequest, dissection passed 4A51BF5A 000.01s IE_IMSI, dissection passed D4FEA35D 000.00s IE_IMSI, basic instantiation passed E52DB4DC 000.00s IE_Cause, dissection passed 0F5CA9D1 000.00s IE_Cause, basic instantiation passed EBD4DDA0 000.00s IE_Cause, basic instantiation 2 passed 50F8C5D1 000.00s IE_Cause, basic instantiation 3 passed 19654406 000.00s IE_RecoveryRestart, dissection passed 7A57FDB7 000.00s IE_RecoveryRestart, basic instantiation passed 94FE45CE 000.01s IE_APN, dissection passed 1EAA5031 000.01s IE_APN, basic instantiation passed DD2D2887 000.01s IE_AMBR, dissection passed 45FA5ED0 000.00s IE_AMBR, basic instantiation passed FCEB3271 000.00s IE_EPSBearerID, dissection passed 53FF4499 000.00s IE_EPSBearerID, basic instantiation passed 58247B94 000.00s IE_IP_Address, dissection passed 55B60F96 000.00s IE_IP_Address, basic instantiation passed 79564039 000.01s IE_MEI, dissection passed 02F592A8 000.00s IE_MEI, basic instantiation passed EA549337 000.00s IE_MSISDN, dissection passed 167FBE48 000.00s IE_MSISDN, basic instantiation passed C296EE54 000.01s IE_Indication, dissection passed 752AF271 000.00s IE_Indication, basic instantiation passed 5F4A2709 000.00s IE_Indication, basic instantiation 2 passed E5AD13E3 000.00s IE_PCO, dissection passed 087BE85E 000.00s IE_PCO, basic instantiation passed 3F8EFB99 000.00s IE_EPCO, dissection passed 80FD0022 000.00s IE_EPCO, basic instantiation passed 907E8EA6 000.00s IE_APCO, dissection passed F2B3BFA4 000.00s IE_APCO, basic instantiation passed EBB152A7 000.01s IE_MMContext_EPS, dissection passed 4D4DDF00 000.00s IE_MMContext_EPS, basic instantiation passed DCB9BC71 000.00s IE_PDNConnection, IE_FQDN, dissection passed BABB7FE6 000.00s IE_PDNConnection, IE_FQDN, basic instantiation passed 60740CB5 000.01s IE_PAA, dissection passed 90342883 000.00s IE_PAA, basic instantiation passed CD8834C2 000.01s IE_Bearer_QoS, dissection passed 2668574E 000.00s IE_Bearer_QoS, basic instantiation passed 0551DF73 000.01s IE_RAT, dissection passed 0B681092 000.00s IE_RAT, basic instantiation passed 0AE4B86B 000.01s IE_ServingNetwork, dissection passed 4DD7450E 000.00s IE_ServingNetwork, basic instantiation passed DFB109BF 000.01s IE_ULI, dissection passed A6A6BEEB 000.00s IE_ULI, basic instantiation passed 57C935DB 000.00s IE_UCI, dissection passed D16659BC 000.00s IE_UCI, basic instantiation passed 70288695 000.00s IE_BearerFlags, dissection passed 9147A6DC 000.01s IE_BearerFlags, basic instantiation passed EE2DE0CC 000.00s IE_UPF_SelInd_Flags, dissection passed E8EB2AB8 000.00s IE_UPF_SelInd_Flags, basic instantiation passed 639E1D21 000.00s IE_Ran_Nas_Cause, dissection passed 53A513C0 000.00s IE_Ran_Nas_Cause, basic instantiation passed 389D0AF5 000.00s IE_FQCSID, dissection passed 6C94DDB9 000.00s IE_FQCSID, basic instantiation passed AB6DF1DB 000.01s IE_FTEID, dissection passed 90D049F4 000.00s IE_FTEID, basic instantiation passed 112E74BF 000.01s IE_BearerContext, dissection passed CEF65F3B 000.00s IE_BearerContext, basic instantiation passed 667A4D73 000.00s IE_ChargingID, dissection passed A1535DB0 000.00s IE_ChargingID, basic instantiation passed 8B36C593 000.01s IE_ChargingCharacteristics, dissection passed 209F2F02 000.00s IE_ChargingCharacteristics, basic instantiation passed CF5A04A3 000.01s IE_PDN_type, dissection passed F69821FB 000.00s IE_PDN_type, basic instantiation passed A65C02FB 000.01s IE_UE_Timezone, dissection passed 8CDCCEFC 000.00s IE_UE_Timezone, basic instantiation passed E3712C0E 000.00s IE_UE_Timezone, basic instantiation passed F03C04DA 000.00s IE_Port_Number, dissection passed 2B7EC740 000.00s IE_Port_Number, basic instantiation passed 0C09C023 000.00s IE_APN_Restriction, dissection passed 46E822D5 000.00s IE_APN_Restriction, basic instantiation passed 59382080 000.01s IE_SelectionMode, dissection passed 56548512 000.00s IE_SelectionMode, basic instantiation passed 896BAB27 000.01s IE_MMBR, dissection passed AFF3EE0B 000.00s IE_MMBR, basic instantiation passed 713402DB 000.00s GTPHeader isn't an answer to not GTPHeader instance passed ED69846D 000.00s GTPHeader is an answer to a message with the same sequence number passed C40F65BD 000.00s GTPHeader isn't an answer to a message with a different sequence number passed 062A35E1 000.00s GTPV2EchoResponse answers passed B553F724 000.00s GTPHeader post_build passed 78FDCD32 000.00s GTPHeader length calculation passed 041FCA99 000.00s GTPHeader hashret passed 1A5D25DB 000.00s IE_NotImplementedTLV passed 93FE8D3D 000.00s IE_PrivateExtension, dissection passed 4F4A99C0 000.00s IE_PrivateExtension, basic instantiation Campaign CRC=9A4FACF5 in 000.30s SHA=E5DDEFF9CAACD8C450164C5A5B06739CBECBC59A PASSED=90 FAILED=0 ━ Loading: test/contrib/gxrp.uts passed EEB2DAD7 000.00s Construction test passed 265EAE94 000.00s GMRP_GROUP Construction test passed 425AA3EF 000.00s GMRP_SERVICE Construction test passed 7A4E952C 000.01s GMRP_GROUP Construction test passed 88BEDD85 000.01s GVRP Stacking test passed 674C430E 000.01s GMRP Stacking test passed 10E33254 000.01s GARP from pcap passed A49CA3DC 000.23s GARP tshark check passed C6DB9C41 000.20s GARP tshark check Campaign CRC=F55073B6 in 000.48s SHA=20C38F01EB3256F38DAB3B2A8BCEE514C4E55500 PASSED=9 FAILED=0 ━ Loading: test/contrib/hicp.uts passed 7A99065F 000.00s Import the HICP layer passed 554FF091 000.00s Build and dissect module scan passed EB5B32BC 000.00s Build and dissect device description passed 9D93E957 000.00s Build and dissect Winks passed 8FA903C1 000.00s Build and dissect new network settings passed 0B623CE1 000.00s Build and dissect successful response to configure request passed 9CD6DCAC 000.00s Build and dissect error response to configure request passed 78AE1396 000.00s Build and dissect invalid password response to configure request Campaign CRC=6F5F6B30 in 000.02s SHA=7B353A761E56BF3A99BB5DF3EAF6BD292BCBBB3D PASSED=8 FAILED=0 ━ Loading: test/contrib/homeplugav.uts passed 1A00500C 000.00s Import the homeplugav layer passed E23A002D 000.02s Building packets packet passed 9FE0C04A 000.01s Some important manipulations passed AEE5B61F 000.01s Some important fields parsing passed 695F7898 000.00s Testing length and checksum on a generated Write Module Data Request Campaign CRC=A3924A8E in 000.04s SHA=41D382EF5080D9543B8317817DA464661CAD82BF PASSED=5 FAILED=0 ━ Loading: test/contrib/homepluggp.uts passed A12E0547 000.00s Import the homeplugg layer passed C2E5546D 000.00s Most important packet to intrude a HPGP network passed F5E6FD82 000.01s Some other important parsing tests passed 2373DC0F 000.00s Some important manipulations Campaign CRC=3D3F2009 in 000.02s SHA=ABC6953DAA11A7D760B915D1F4A408A028F284CA PASSED=4 FAILED=0 ━ Loading: test/contrib/homeplugsg.uts passed EC8AE509 000.00s Import the homepluggq layer passed 3DFAADF8 000.00s Some important manipulations Campaign CRC=AD6BFBF2 in 000.00s SHA=C92EC446E21CBDC84E5EB2973C88286AED826382 PASSED=2 FAILED=0 ━ Loading: test/contrib/http2.uts passed 6B7BBCB3 000.00s Configuring Scapy passed 14392EC8 000.00s HTTP/2 UVarIntField.any2i passed 3F338E95 000.00s HTTP/2 UVarIntField.m2i on full byte passed 7932C59D 000.00s HTTP/2 UVarIntField.m2i on partial byte passed 4D166F91 000.00s HTTP/2 UVarIntField.getfield on full byte passed A32ED7B9 000.00s HTTP/2 UVarIntField.getfield on partial byte passed 28279C65 000.00s HTTP/2 UVarIntField.i2m on full byte passed 31C00DAA 000.00s HTTP/2 UVarIntField.i2m on partial byte passed 9EA4A536 000.00s HTTP/2 UVarIntField.addfield on full byte passed 5D2ECC61 000.00s HTTP/2 UVarIntField.addfield on partial byte passed EB40C2D5 000.00s HTTP/2 UVarIntField.i2len on full byte passed 4A261908 000.00s HTTP/2 UVarIntField.i2len on partial byte passed A76D6C47 000.00s HTTP/2 FieldUVarLenField.i2m without adjustment passed BC7DBD47 000.00s HTTP/2 FieldUVarLenField.i2m with adjustment passed B99CF100 001.38s HTTP/2 HPackZString Compression passed 787DFB02 002.85s HTTP/2 HPackZString Decompression passed B09647F6 000.01s HTTP/2 HPackStrLenField.m2i passed C754849F 000.01s HTTP/2 HPackStrLenField.any2i passed F878C4D1 000.00s HTTP/2 HPackStrLenField.i2m passed 8391817F 000.00s HTTP/2 HPackStrLenField.addfield passed 70BA621F 000.00s HTTP/2 HPackStrLenField.getfield passed 66EF7A64 000.00s HTTP/2 HPackStrLenField.i2h / i2repr passed 3251C216 000.00s HTTP/2 HPackStrLenField.i2len passed 73FFBA78 000.00s HTTP/2 HPackMagicBitField.addfield passed 93249BF7 000.00s HTTP/2 HPackMagicBitField.getfield passed D06D5E22 000.00s HTTP/2 HPackMagicBitField.h2i passed 7E74CEA4 000.00s HTTP/2 HPackMagicBitField.m2i passed D78EAE34 000.00s HTTP/2 HPackMagicBitField.i2m passed 22DA7F0D 000.00s HTTP/2 HPackMagicBitField.any2i passed F425FBB9 000.00s HTTP/2 Dissect HPackHdrString passed A273223E 000.00s HTTP/2 Build HPackHdrString passed 0D44A55C 000.00s HTTP/2 Dissect HPackIndexedHdr passed A9A30DC2 000.00s HTTP/2 Build HPackIndexedHdr passed C78298A8 000.00s HTTP/2 Dissect HPackLitHdrFldWithIncrIndexing without indexed name passed DEF26643 000.00s HTTP/2 Dissect HPackLitHdrFldWithIncrIndexing with indexed name passed A2AA76E4 000.00s HTTP/2 Build HPackLitHdrFldWithIncrIndexing without indexed name passed 183979EC 000.00s HTTP/2 Build HPackLitHdrFldWithIncrIndexing with indexed name passed 0999B8B1 000.00s HTTP/2 Dissect HPackLitHdrFldWithoutIndexing : don't index and no index passed FC685B50 000.00s HTTP/2 Dissect HPackLitHdrFldWithoutIndexing : never index index and no index passed 513EF457 000.00s HTTP/2 Dissect HPackLitHdrFldWithoutIndexing : never index and indexed name passed 506E8174 000.00s HTTP/2 Build HPackLitHdrFldWithoutIndexing : don't index and no index passed D7D782FF 000.00s HTTP/2 Build HPackLitHdrFldWithoutIndexing : never index index and no index passed D9363562 000.00s HTTP/2 Build HPackLitHdrFldWithoutIndexing : never index and indexed name passed 8707403B 000.00s HTTP/2 Dissect HPackDynamicSizeUpdate passed 4694A0D7 000.00s HTTP/2 Build HPackDynamicSizeUpdate passed 28B1ADF1 000.00s HTTP/2 Dissect Data Frame: Simple data frame passed 0E96CCC1 000.00s HTTP/2 Build Data Frame: Simple data frame passed 52635CFA 000.00s HTTP/2 Dissect Data Frame: Simple data frame with padding passed 0EDB0116 000.00s HTTP/2 Build Data Frame: Simple data frame with padding passed 2C3A259B 000.00s HTTP/2 Dissect Data Frame: Simple data frame with padding and end stream flag passed 7BF20D01 000.00s HTTP/2 Build Data Frame: Simple data frame with padding and end stream flag passed A6907957 000.00s HTTP/2 Dissect Headers Frame: Simple header frame passed 45A5E13C 000.00s HTTP/2 Build Headers Frame: Simple header frame passed E9F327E6 000.01s HTTP/2 Dissect Headers Frame: Header frame with padding passed A494191E 000.00s HTTP/2 Build Headers Frame: Header frame with padding passed B8D3C5AB 000.01s HTTP/2 Dissect Headers Frame: Header frame with priority passed 2547C0E9 000.00s HTTP/2 Build Headers Frame: Header frame with priority passed BAD6C69D 000.01s HTTP/2 Dissect Headers Frame: Header frame with priority and padding and flags passed 3219C62B 000.00s HTTP/2 Build Headers Frame: Header frame with priority and padding and flags passed 4D148C4C 000.00s HTTP/2 Dissect Priority Frame passed EF586054 000.00s HTTP/2 Build Priority Frame passed E27C15DF 000.00s HTTP/2 Dissect Reset Stream Frame: Protocol Error passed 192B572D 000.00s HTTP/2 Build Reset Stream Frame: Protocol Error passed 78C264FC 000.00s HTTP/2 Dissect Reset Stream Frame: Raw 123456 error passed 611FA7F3 000.00s HTTP/2 Dissect Reset Stream Frame: Raw 123456 error passed FED73C95 000.00s HTTP/2 Dissect Settings Frame: Settings Frame passed 8E388871 000.00s HTTP/2 Build Settings Frame: Settings Frame passed 85706269 000.00s HTTP/2 Dissect Settings Frame: Incomplete Settings Frame passed A759F89D 000.00s HTTP/2 Dissect Settings Frame: Settings Frame acknowledgement passed A3A2A530 000.00s HTTP/2 Build Settings Frame: Settings Frame acknowledgement passed 5708C79D 000.01s HTTP/2 Dissect Push Promise Frame: no flag & headers with compression and hdr_name passed 07B35A89 000.00s HTTP/2 Build Push Promise Frame: no flag & headers with compression and hdr_name passed A11E353B 000.00s HTTP/2 Dissect Push Promise Frame: with padding, the flag END_Header & headers with compression and hdr_name passed 832689A1 000.00s HTTP/2 Build Push Promise Frame: with padding, the flag END_Header & headers with compression and hdr_name passed 1282534B 000.00s HTTP/2 Dissect Ping Frame: Ping frame passed C3EC4C29 000.00s HTTP/2 Build Ping Frame: Ping frame passed 07EBC878 000.00s HTTP/2 Dissect Ping Frame: Pong frame passed D0C2C231 000.00s HTTP/2 Dissect Ping Frame: Pong frame passed 5E42DF50 000.00s HTTP/2 Dissect Go Away Frame: No error passed E515C17A 000.00s HTTP/2 Build Go Away Frame: No error passed A6A73656 000.00s HTTP/2 Dissect Go Away Frame: Arbitrary error with additional data passed A6CA4600 000.00s HTTP/2 Build Go Away Frame: Arbitrary error with additional data passed A681E72D 000.00s HTTP/2 Dissect Window Update Frame: global passed 6410464C 000.00s HTTP/2 Build Window Update Frame: global passed 0064A270 000.00s HTTP/2 Dissect Window Update Frame: a stream passed 1D9A4B63 000.00s HTTP/2 Build Window Update Frame: a stream passed 78957E02 000.00s HTTP/2 Dissect Continuation Frame: no flag & headers with compression and hdr_name passed 690A0971 000.00s HTTP/2 Build Continuation Frame: no flag & headers with compression and hdr_name passed 6C11564F 000.00s HTTP/2 Dissect Continuation Frame: flag END_Header & headers with compression, sensitive flag and hdr_name passed AC758B05 000.00s HTTP/2 Build Continuation Frame: flag END_Header & headers with compression, sensitive flag and hdr_name passed 8466EBA1 000.00s HTTP/2 HPackHdrEntry Tests passed 8291192C 000.00s HTTP/2 HPackHdrTable : Querying Static Entries passed 1EE9F5CB 000.00s HTTP/2 HPackHdrTable : Addind Dynamic Entries without overflowing the table passed C7009494 000.00s HTTP/2 HPackHdrTable : Querying Dynamic Entries passed 55CACFB0 000.00s HTTP/2 HPackHdrTable : Addind already registered Dynamic Entries without overflowing the table passed 57B4EB3F 000.00s HTTP/2 HPackHdrTable : Addind Dynamic Entries and overflowing the table passed 676F3B59 000.01s HTTP/2 HPackHdrTable : Resizing passed 8C7250A8 000.01s HTTP/2 HPackHdrTable : Recapping passed 1762CCA9 000.01s HTTP/2 HPackHdrTable : Generating Textual Representation passed A7A973EB 000.03s HTTP/2 HPackHdrTable : Parsing Textual Representation passed 2BB12804 000.01s HTTP/2 HPackHdrTable : Parsing Textual Representation without body passed BB422161 000.00s HTTP/2 HPackHdrTable : Parsing Textual Representation with too small max frame passed 8363B423 000.04s HTTP/2 HPackHdrTable : Parsing Textual Representation with very large header and a large authorized frame size passed 87EA1536 000.07s HTTP/2 HPackHdrTable : Parsing Textual Representation with two very large headers and a large authorized frame size passed B9DDA39B 000.07s HTTP/2 HPackHdrTable : Parsing Textual Representation with two very large headers, a large authorized frame size and a "small" max header list size passed 4E5439F9 000.02s HTTP/2 HPackHdrTable : Parsing Textual Representation with sensitive headers and non-indexable ones Campaign CRC=13D29CFD in 004.74s SHA=0BAD32635D598279DE8AA689EA8EFE24D5DF5D38 PASSED=106 FAILED=0 ━ Loading: test/contrib/ibeacon.uts passed EBEB2C8D 000.00s Presence check passed E7B72D0B 000.01s Apple multiple submessages passed B938C12B 000.00s iBeacon (decode LE Set Advertising Data) passed 129046D6 000.01s iBeacon (encode LE Set Advertising Data) passed 3F3C166E 000.00s iBeacon (decode advertising frame) passed 02432768 000.00s Basic overflow area packet Campaign CRC=5DDDAEDD in 000.03s SHA=008D0B340628E36FC5B6E420D4EA7852F72D741F PASSED=6 FAILED=0 ━ Loading: test/contrib/iec104.uts passed 68FECEC8 000.04s load the iec104 layer passed 19E08ADA 000.00s class attribute generator passed C5CA0B83 000.00s IEC60870_5_4_NormalizedFixPoint passed 45918979 000.00s Iec104SequenceNumber field passed BB0CE05A 000.00s IEC104_U_Message passed 761A5D7F 000.00s IEC104_S_Message passed ED5619BA 000.00s IEC104_I_Message_SeqIOA passed 20710EB8 000.00s IEC104_I_Message_SingleIOA passed 95F7A3F4 000.00s single IEC104 S Message passed 744A21F8 000.00s double IEC104 S Message (test layer binding) passed 3354287A 000.00s single IEC104 U Message passed 28305851 000.01s double IEC104 U Message passed 10C4134E 000.16s Sequence IOA, single IO - information object types dissection passed F6FD84AA 000.16s Single IOA, single IO - information object types dissection passed 7FBD81EC 000.01s Sequence IOA, multiple IOs - information object types dissection passed D213C5FA 000.01s Single IOA, multiple IOs - information object types dissection passed 69386983 000.01s Sequence IOA, multiple APDUs passed B63B5824 000.01s Single IOA, multiple APDUs passed 57281B7A 000.02s Mixed Single and Sequence IOA, multiple APDU passed 26F4BC3E 000.01s I/U/S Message sequence (mixed APDUs) passed DF61664D 000.00s ASDU allowed in given standard (examples) passed 5FBFC7D4 000.01s BCR - binary counter reading / IEC104_IO_M_IT_NA_1 - integrated totals passed 6DBB2D6A 000.00s DIQ - double-point information with quality descriptor / IEC104_IO_M_DP_NA_1 - double-point information without time tag passed 9A35BD31 000.01s VTI - value with transient state indication / IEC104_IO_M_ST_NA_1 - step position information passed 74E730A0 000.01s IEC104_IO_C_RD_NA_1 - read command (zero byte field) Campaign CRC=560B4E30 in 000.49s SHA=D57EBFF25411D8098F8684CA5C502CAC168B2963 PASSED=25 FAILED=0 ━ Loading: test/contrib/ife.uts passed DC8A509C 000.01s build basic IFE frames passed CBE88239 000.01s add padding if required passed 4904C70B 000.00s variable payload Campaign CRC=FD9F3432 in 000.01s SHA=CFF7B1D3355B8CC3E955D616D434D164D33C4E05 PASSED=3 FAILED=0 ━ Loading: test/contrib/igmp.uts passed 3F4B46C6 000.00s Build IGMP - Basic passed 9C7AB618 000.00s Build IGMP - Custom membership passed D3B41484 000.00s Build IGMP - LG passed 132D95F2 000.01s Change IGMP params passed C5A19B8E 000.00s Test mysummary passed 28057230 000.01s IGMP - misc Campaign CRC=F33D0F47 in 000.03s SHA=B394C86F609BA29AC67A8D4B99562DD2E9C67F31 PASSED=6 FAILED=0 ━ Loading: test/contrib/igmpv3.uts passed 004129E3 000.00s Build IGMPv3 - Basic passed D737EF7B 000.01s Build IGMPv3 - igmpize passed 9A9846E5 000.00s Dissect IGMPv3 - IGMPv3mq passed 6C1A57EC 000.00s Dissect IGMPv3 - IGMPv3mr passed 51FD4FC3 000.00s Dissect IGMPv3 - IGMPv3mra passed 8256AC81 000.00s IGMP vs IVMPv3 tests passed D087DB52 000.00s IGMPv3 - summaries Campaign CRC=FFFC55B4 in 000.03s SHA=B6A3553EECDA3171CE1F2975E917FD437E791199 PASSED=7 FAILED=0 ━ Loading: test/contrib/ikev2.uts passed 8BF05290 000.00s Ikev2 build passed 6F279756 000.00s Ikev2 dissection passed 3F53A000 000.00s Build Ikev2 SA request packet passed A5F27E5A 000.02s Build advanced IKEv2 passed BAD6C21A 000.01s Dissect Initiator Request passed 4971092D 000.00s Dissect Responder Response passed 380B71FF 000.00s Dissect Encrypted Initiator Request passed 78C9EF5E 000.00s Dissect Encrypted Responder Response passed 7E4EBA12 000.03s Test Certs detection passed 1F33D3B2 000.02s Test Certs length calculations passed 430ECD13 000.00s Test TrafficSelector detection passed E7D8A6BE 000.00s Test TSi with multiple TrafficSelector dissection passed 2272E446 000.00s Test automatic calculation of number_of_TSs field passed B2D7483A 000.00s IKEv2_Encrypted_Fragment, simple tests passed 28C47EF5 000.01s Build and dissect UDP encapsulated IKEv1 packets passed EC632CA3 000.01s Build and dissect UDP encapsulated IKEv2 packets passed 99761E0E 000.01s Build and dissect UDP encapsulated ESP packets passed B1A47485 000.00s Build and dissect UDP encapsulated NAT-keepalive packets passed F8DED0CC 004.00s IKEv2 key exchange with NAT-traversal passed 3D1B620E 000.28s IKEv2 key exchange with REDIRECT Campaign CRC=0F3AE92F in 004.41s SHA=EE4E608E5838B89352C176C7C4E0BA9D806B34DB PASSED=20 FAILED=0 ━ Loading: test/contrib/isis.uts passed 48B839C0 000.00s Import the isis layer passed 13999C90 000.00s Layer Binding passed 8FEB0640 000.01s P2P Hello passed 21B55ABE 000.03s LSP passed 882DEA7F 000.10s LSP with Sub-TLVs Campaign CRC=61565104 in 000.15s SHA=96714671E30146BB98E75317A4EF0B07851182BF PASSED=5 FAILED=0 ━ Loading: test/contrib/isotp_message_builder.uts passed 90EFAC30 000.00s Definition of utility functions passed 488D7E38 000.01s Import isotp passed F6960BC4 000.01s Create ISOTPMessageBuilder passed 58CA1293 000.00s Feed packets to machine passed 8027C158 000.00s Verify there is a ready message in the machine passed 50CA3D65 000.00s Extract the message from the machine passed 992ABFFC 000.00s Verify that no error happens when there is not enough data passed 26492A84 000.00s Verify that no error happens when there is no data passed 6D70E5FD 000.00s Verify a single frame without EA passed 6E60B723 000.00s Single frame without EA, with excessive bytes in CAN frame passed 094B6FBB 000.00s Verify a single frame with EA passed 4AC0C7F6 000.00s Single CAN frame that has 2 valid interpretations passed 04DB67CE 000.00s Verify multiple frames with EA passed 75E65E70 000.00s Verify multiple frames with EA 2 passed EE73DFB7 000.00s Verify that an EA starting with 1 will still work passed BE792A4E 000.00s Verify that an EA of 07 will still work passed C757E975 000.01s Verify that three interleaved messages can be sniffed simultaneously on the same identifier and extended address (very unrealistic) passed EFB9D8AE 000.01s Verify multiple frames with EA from list passed B94765D4 000.01s Verify multiple frames with EA from list and iterator passed D758F8A0 000.00s Verify a single frame without EA and different basecls Campaign CRC=73D8E523 in 000.08s SHA=11EA59FDB02BC45740A245430E548178D45FEB07 PASSED=20 FAILED=0 ━ Loading: test/contrib/isotp_native_socket.uts Campaign CRC=702E477A in 000.00s SHA=A6FA9FF42358D547732BCD780EE8C80184ED2F99 PASSED=0 FAILED=0 ━ Loading: test/contrib/isotp_packet.uts passed E7099BD6 000.00s Import isotp passed 90EFAC30 000.00s Define helpers passed A63830A6 000.01s Creation of an empty ISOTP packet passed FD7B4424 000.00s Creation of a simple ISOTP packet with tx_id passed C629C93D 000.00s Creation of a simple ISOTP packet with ext_address passed 807D0426 000.00s Creation of a simple ISOTP packet with rx_id passed DF637BC9 000.00s Creation of a simple ISOTP packet with rx_ext_address passed CAAB1D41 000.00s Creation of a simple ISOTP packet with tx_id, rx_id, ext_address, rx_ext_address passed F538C9A6 000.00s ISOTP answers test passed 00A75466 000.00s Creation of a simple ISOTP packet with tx_id validation error passed D603ED0A 000.00s Creation of a simple ISOTP packet with rx_id validation error passed 80923917 000.00s Creation of a simple ISOTP packet with ext_address validation error passed 6A02A9B9 000.00s Creation of a simple ISOTP packet with rx_ext_address validation error passed 5EBA19ED 000.00s Build a packet with extended addressing passed B46092B7 000.00s Build a packet with normal addressing passed 6012C4EB 000.00s Compare both isotp payloads passed 95CC7D91 000.01s Dissect multiple packets passed 764A6E01 000.00s Build SF frame with constructor, check for correct length assignments passed 8C40E1BB 000.00s Build SF frame EA with constructor, check for correct length assignments passed 02018F8B 000.01s Build FF frame with constructor, check for correct length assignments passed D4CB2403 000.00s Build FF frame EA with constructor, check for correct length assignments passed 82948A9D 000.01s Build FF frame EA, extended size, with constructor, check for correct length assignments passed 6E80371B 000.00s Build FF frame, extended size, with constructor, check for correct length assignments passed 04C6EA77 000.01s Build CF frame with constructor, check for correct length assignments passed 05F26F2B 000.00s Build CF frame EA with constructor, check for correct length assignments passed 05C19FBE 000.00s Build FC frame EA with constructor, check for correct length assignments passed 5840B99C 000.00s Build FC frame with constructor, check for correct length assignments passed 96D41A3E 000.01s Construct some single frames passed 159FE614 000.00s Construct some single frames EA passed 072033A4 000.01s Construct ISOTP_packet with extended can frame passed DE26FD4E 000.00s Construct ISOTPEA_Packet with extended can frame passed 0823E644 000.00s Fragment an empty ISOTP message passed 160D9437 000.01s Fragment another empty ISOTP message passed 8CBC619E 000.00s Fragment a 4 bytes long ISOTP message passed 68F1F6FA 000.00s Fragment a 4 bytes long ISOTP message extended passed 2FCAE552 000.00s Fragment a 8 bytes long ISOTP message extended passed 009D1050 000.00s Fragment a 7 bytes long ISOTP message passed DA345EB4 000.00s Fragment a 8 bytes long ISOTP message passed AC083DBD 000.00s Fragment an ISOTP message with extended addressing passed 47ACE9FE 000.00s Fragment a 7 bytes ISOTP message with destination identifier passed 49AE982E 000.00s Fragment a 16 bytes ISOTP message with extended addressing passed 8DACAE19 000.03s Fragment a huge ISOTP message, 4997 bytes long passed 6A54E31A 000.00s Defragment a single-frame ISOTP message passed 2A854F8A 000.00s Defragment non ISOTP message passed 7ED11355 000.00s Defragment ISOTP message with warning passed F9959005 000.00s Defragment exception passed 90677CBA 000.00s Defragment an ISOTP message composed of multiple CAN frames passed CC432E7B 000.05s Check if fragmenting a message and defragmenting it back yields the original message passed F50F681B 000.00s Defragment an ambiguous CAN frame passed 9A9794A0 000.00s Build ISOTP_FF_FD passed AD2C830F 000.00s Build ISOTP_SF_FD passed B1CEBAD4 000.00s Build ISOTP_FF_FD 2 passed 8860E0E0 000.00s Build ISOTP_SF_FD 2 passed 77C52E7C 000.00s Build ISOTP_FF_FD 3 passed 53C1F3FD 000.00s Build ISOTP_SF_FD 3 passed 58BF0BB8 000.00s Dissect ISOTPFD 1 passed E03E59B7 000.00s Dissect ISOTPFD 2 passed 2BBFE900 000.00s Dissect ISOTPFD 3 passed 4C4D0128 000.00s Dissect ISOTPFD 4 Campaign CRC=2847C675 in 000.27s SHA=191F68139F62A39BBEB3BFD28B1169949A806B76 PASSED=59 FAILED=0 ━ Loading: test/contrib/isotp_soft_socket.uts Campaign CRC=32A08D92 in 000.00s SHA=F92BBD5B435ED7D5C3F004FD484C5CB17721D01C PASSED=0 FAILED=0 ━ Loading: test/contrib/isotpscan.uts Campaign CRC=CEF23E17 in 000.00s SHA=254388509FC185148D8A70B4A5D957C159C8B142 PASSED=0 FAILED=0 ━ Loading: test/contrib/knx.uts passed 081615E0 000.00s Import the knx layer passed BE291BFB 000.00s Header default values passed 05C0DC6D 000.00s KNX Header payload length calculation passed 8AA24B20 000.00s KNX Header Guess Payload KNXSearchRequest passed 73195E8D 000.00s KNX Header Guess Payload KNXSearchResponse passed BA2D5EF9 000.00s KNX Header Guess Payload KNXDescriptionRequest passed 5F66D817 000.00s KNX Header Guess Payload KNXDescriptionResponse passed 2617215E 000.00s KNX Header Guess Payload KNXConnectRequest passed A0C9152F 000.00s KNX Header Guess Payload KNXConnectResponse passed 771F75A1 000.00s KNX Header Guess Payload KNXConnectionstateRequest passed 04D46D34 000.00s KNX Header Guess Payload KNXConnectionstateResponse passed 74C5BB89 000.00s KNX Header Guess Payload KNXDisconnectRequest passed 775003B8 000.00s KNX Header Guess Payload KNXDisconnectResponse passed 73E53A40 000.00s KNX Header Guess Payload KNXConfigurationRequest passed 91D19C73 000.00s KNX Header Guess Payload KNXConfigurationACK passed AADCE54D 000.00s KNX Header Guess Payload KNXTunnelingRequest passed C80306F5 000.00s KNX Header Guess Payload KNXTunnelingACK passed 00000000 000.00s Destination port Campaign CRC=D410D71F in 000.03s SHA=4E20AC63440D404333D9691F8CCCBFFF31219B6C PASSED=18 FAILED=0 ━ Loading: test/contrib/lacp.uts passed F5965E6B 000.01s Build & dissect LACP passed 31C0E078 000.00s Marker sanity Campaign CRC=6BC2618D in 000.01s SHA=F089B9654882A5DE4DD7D8624D0FA9AC488FAA3B PASSED=2 FAILED=0 ━ Loading: test/contrib/ldp.uts passed 8FD77C79 000.02s Default build passed 3EBF265F 000.00s Basic dissection passed 81543C2A 000.00s Build advanced LDPInit() passed BCFE6B24 000.00s Build advanced LDPAddress() with LDPLabelMM() passed 07CF2585 000.00s Advanced dissection - complex LDP Campaign CRC=8BF38955 in 000.03s SHA=A4F7E61651B0F4124EF9E130DDCCADFB7DB5A20D PASSED=5 FAILED=0 ━ Loading: test/contrib/lldp.uts passed A39ADFC2 000.01s build basic LLDP frames passed 9540793D 000.00s build: check length calculation (#GH3107) passed 09163EF8 000.01s add padding if required passed F921276E 000.00s Dissection: PtopoChassisIdType == chasIdPtopoGenAddr(5) passed C9184D02 000.01s Advanced test: check definitions and length of complex IDs passed 5D85B68A 000.02s Network families / addresses in IDs passed 983B526E 000.01s basic frame structure passed DE7F62CC 000.02s basic frame structure passed BFA091E9 000.02s length fields / value sizes checks passed 73A58140 000.02s test attribute values passed F6064D2F 000.00s ThreeBytesEnumField tests passed 6E4CC6D7 000.01s LLDPDUGenericOrganisationSpecific tests passed A1F4080C 000.01s Define check_tshark function passed 93F3C6D9 001.48s Power via MDI tests passed 068AC467 002.59s Power via MDI with DDL classification extension tests passed 54051CC6 005.82s Power via MDI with DDL classification and Type 3 and 4 extensions tests passed 17659385 000.05s Power via MDI measurements tests Campaign CRC=ED1AA77D in 010.09s SHA=F94636DC37730150CD24901BA8F7005CF5BFE8DF PASSED=17 FAILED=0 ━ Loading: test/contrib/loraphy2wan.uts passed 5894C60C 000.00s Import the loraphy2wan layer passed 68D39E3B 000.01s Packet decoding passed 61C8C460 000.00s Decoding an encrypted JA packet passed C6C1A38B 000.00s Packet crafting: generating an unencrypted JA frame passed E4E49337 000.00s Generating an unencrypted LoRa JA packet passed EA188F0E 000.00s Parsing Piggy back commands Campaign CRC=43B7CC6F in 000.02s SHA=A28A99A05118E894171521FA1A85DEC7553E268A PASSED=6 FAILED=0 ━ Loading: test/contrib/ltp.uts passed 03233B00 000.01s Build packets & dissect Campaign CRC=A3340398 in 000.01s SHA=8287C0969F0DB08AF6F59BC2873E88CD4172796D PASSED=1 FAILED=0 ━ Loading: test/contrib/mac_control.uts passed 657F6B7A 000.00s pause frame passed C763619E 000.00s gate frame passed 3005912B 000.00s report frame passed 35BD37EB 000.01s report frame flags (generic for all other register frame types) passed 700C24B4 000.00s register_req frame passed 02A1E68C 000.00s register frame passed 41F7098A 000.00s register_ack frame passed BE6C2F51 000.00s class based flow control frame passed 58BEB338 000.00s naked frame passed 794E15C8 000.00s single vlan tag passed 247C9FD3 000.00s QinQ passed 5361AC5D 000.00s hand craftet payload (disabled auto padding) Campaign CRC=7111E181 in 000.05s SHA=8665276239E8BD9E07745A239B32AD59B0EED049 PASSED=12 FAILED=0 ━ Loading: test/contrib/macsec.uts passed 4BC6B114 000.01s MACsec - basic encap - encrypted passed 2AFDB196 000.01s MACsec - basic encryption - encrypted passed BFA77CFB 000.01s MACsec - basic decryption - encrypted passed 56258E1D 000.01s MACsec - basic decap - decrypted passed D33A151F 000.01s MACsec - basic encap - integrity only passed C8F2577D 000.01s MACsec - basic encryption - integrity only passed 133EBF44 000.01s MACsec - basic decryption - integrity only passed A4C965B0 000.01s MACsec - basic decap - integrity only passed 707F4CA4 000.00s MACsec - encap - shortlen 2 passed E83BB452 000.00s MACsec - encap - shortlen 10 passed D16A3FEE 000.00s MACsec - encap - shortlen 18 passed 749805CA 000.00s MACsec - encap - shortlen 32 passed D8ADB382 000.00s MACsec - encap - shortlen 40 passed 25F44980 000.00s MACsec - encap - shortlen 47 passed 4045D823 000.00s MACsec - encap - shortlen 0 (48) passed 5F0128BD 000.00s MACsec - encap - shortlen 2/nosci passed F94EB965 000.00s MACsec - encap - shortlen 32/nosci passed A822F52F 000.01s MACsec - encap - shortlen 47/nosci passed 6D81CEE4 000.01s MACsec - authenticate passed 74E2F491 000.00s MACsec - authenticate - invalid packet passed 4783C82C 000.01s MACsec - decrypt passed 2F82DAF6 000.00s MACsec - decrypt - invalid packet passed E26E5E1D 000.00s MACsec - decap - non-Ethernet passed 04696426 000.00s MACsec - decap - non-MACsec passed 2C96E969 000.00s MACsec - encap - non-Ethernet passed 28A0D43F 000.01s MACsec - Standard Test Vectors - C.1.1 GCM-AES-128 (54-octet frame integrity protection) passed 6373BE4A 000.01s MACsec - Standard Test Vectors - C.1.2 GCM-AES-256 (54-octet frame integrity protection) passed 8D57BC64 000.02s MACsec - Standard Test Vectors - C.1.3 GCM-AES-XPN-128 (54-octet frame integrity protection) passed B3484D5D 000.01s MACsec - Standard Test Vectors - C.1.4 GCM-AES-XPN-256 (54-octet frame integrity protection) passed 6676C155 000.01s MACsec - Standard Test Vectors - C.5.1 GCM-AES-128 (54-octet frame confidentiality protection) passed C5117136 000.01s MACsec - Standard Test Vectors - C.5.2 GCM-AES-256 (54-octet frame confidentiality protection) passed 5F35B666 000.01s MACsec - Standard Test Vectors - C.5.3 GCM-AES-XPN-128 (54-octet frame confidentiality protection) passed C1D033FA 000.01s MACsec - Standard Test Vectors - C.5.4 GCM-AES-XPN-256 (54-octet frame confidentiality protection) Campaign CRC=94636D24 in 000.25s SHA=D0FB56BFCBE9C542206C6B9B8B7BB5DD5C647A18 PASSED=33 FAILED=0 ━ Loading: test/contrib/metawatch.uts passed 47F6D6C3 000.00s MetawatchEther, basic instantiation passed 685D610D 000.00s MetawatchEther, build & dissect Campaign CRC=4B81C4AE in 000.01s SHA=86FB45334F711178AE73DCDF31E701DDB00AE5FE PASSED=2 FAILED=0 ━ Loading: test/contrib/modbus.uts passed 32BE9D8F 000.00s Import the modbus layer passed B1B57563 000.00s MBAP default values passed 78F0EDAC 000.00s MBAP payload length calculation passed 5116A630 000.00s MBAP Guess Payload ModbusPDU01ReadCoilsRequest (simple case) passed F5F52E3B 000.00s MBAP Guess Payload ModbusPDU01ReadCoilsResponse passed 6431C5B9 000.00s MBAP Guess Payload ModbusPDU01ReadCoilsError passed 8E65E1D6 000.00s MBAP Guess Payload ModbusPDU02ReadDiscreteInputsRequest passed DA58C02E 000.00s MBAP Guess Payload ModbusPDU02ReadDiscreteInputsResponse passed D7D77E12 000.00s MBAP Guess Payload ModbusPDU02ReadDiscreteInputsError passed 65DC2209 000.00s MBAP Guess Payload ModbusPDU03ReadHoldingRegistersRequest passed C3284699 000.00s MBAP Guess Payload ModbusPDU03ReadHoldingRegistersResponse passed 795A6ECC 000.00s MBAP Guess Payload ModbusPDU03ReadHoldingRegistersError passed 080873FC 000.00s MBAP Guess Payload ModbusPDU04ReadInputRegistersRequest passed EDA727F1 000.00s MBAP Guess Payload ModbusPDU04ReadInputRegistersResponse passed C9989F79 000.00s MBAP Guess Payload ModbusPDU04ReadInputRegistersError passed 03B77313 000.00s MBAP Guess Payload ModbusPDU05WriteSingleCoilRequest passed 0494226E 000.00s MBAP Guess Payload ModbusPDU05WriteSingleCoilResponse passed 1C7BD644 000.00s MBAP Guess Payload ModbusPDU05WriteSingleCoilError passed 02C09C59 000.00s MBAP Guess Payload ModbusPDU06WriteSingleRegisterRequest passed E9CED21B 000.00s MBAP Guess Payload ModbusPDU06WriteSingleRegisterResponse passed E1308E59 000.01s MBAP Guess Payload ModbusPDU06WriteSingleRegisterError passed 7EDBED13 000.00s MBAP Guess Payload ModbusPDU07ReadExceptionStatusRequest passed 2CFE9C80 000.00s MBAP Guess Payload ModbusPDU07ReadExceptionStatusResponse passed E053E01B 000.00s MBAP Guess Payload ModbusPDU07ReadExceptionStatusError passed A851649E 000.00s MBAP Guess Payload ModbusPDU08DiagnosticsRequest passed 03E74DB0 000.00s MBAP Guess Payload ModbusPDU08DiagnosticsResponse passed 506D5A84 000.00s MBAP Guess Payload ModbusPDU08DiagnosticsError passed 887DB45C 000.00s MBAP Guess Payload ModbusPDU0BGetCommEventCounterRequest passed F1B41767 000.00s MBAP Guess Payload ModbusPDU0BGetCommEventCounterResponse passed 725DC65C 000.00s MBAP Guess Payload ModbusPDU0BGetCommEventCounterError passed 686CAFC7 000.00s MBAP Guess Payload ModbusPDU0CGetCommEventLogRequest passed 7E21DBA9 000.00s MBAP Guess Payload ModbusPDU0CGetCommEventLogResponse passed EA9AC09C 000.00s MBAP Guess Payload ModbusPDU0CGetCommEventLogError passed 57E6EC1C 000.00s MBAP Guess Payload ModbusPDU0FWriteMultipleCoilsRequest passed 90D88A72 000.00s MBAP Guess Payload ModbusPDU0FWriteMultipleCoilsResponse passed 82F2F51C 000.00s MBAP Guess Payload ModbusPDU0FWriteMultipleCoilsError passed EC1EB3C8 000.00s MBAP Guess Payload ModbusPDU10WriteMultipleRegistersRequest passed 7C4B7D39 000.00s MBAP Guess Payload ModbusPDU10WriteMultipleRegistersResponse passed 9DC03BB8 000.00s MBAP Guess Payload ModbusPDU10WriteMultipleRegistersError passed C559AE9F 000.00s MBAP Guess Payload ModbusPDU11ReportSlaveIdRequest passed AAB5E013 000.00s MBAP Guess Payload ModbusPDU11ReportSlaveIdResponse passed 16D3DD3B 000.00s MBAP Guess Payload ModbusPDU11ReportSlaveIdError passed 12D1F77E 000.00s MBAP Guess Payload ModbusPDU14ReadFileRecordRequest passed 668C5794 000.00s MBAP Guess Payload ModbusPDU14ReadFileRecordResponse passed 16D3DD3B 000.00s MBAP Guess Payload ModbusPDU14ReadFileRecordError passed 5F63CB6A 000.00s MBAP Guess Payload ModbusPDU15WriteFileRecordRequest passed 34C7118E 000.00s MBAP Guess Payload ModbusPDU15WriteFileRecordResponse passed 63591345 000.00s MBAP Guess Payload ModbusPDU15WriteFileRecordError passed 7BD298BF 000.00s MBAP Guess Payload ModbusPDU16MaskWriteRegisterRequest passed 2CAFD498 000.00s MBAP Guess Payload ModbusPDU16MaskWriteRegisterResponse passed 987A0271 000.00s MBAP Guess Payload ModbusPDU16MaskWriteRegisterError passed 7BD298BF 000.00s MBAP Guess Payload ModbusPDU16MaskWriteRegisterRequest passed 2CAFD498 000.01s MBAP Guess Payload ModbusPDU16MaskWriteRegisterResponse passed 987A0271 000.00s MBAP Guess Payload ModbusPDU16MaskWriteRegisterError passed C2AE3343 000.00s MBAP Guess Payload ModbusPDU17ReadWriteMultipleRegistersRequest passed 331630E8 000.00s MBAP Guess Payload ModbusPDU17ReadWriteMultipleRegistersResponse passed 03583D65 000.00s MBAP Guess Payload ModbusPDU17ReadWriteMultipleRegistersError passed 072812A5 000.00s MBAP Guess Payload ModbusPDU18ReadFIFOQueueRequest passed 9B92FC4B 000.00s MBAP Guess Payload ModbusPDU18ReadFIFOQueueResponse passed 3313CB57 000.00s MBAP Guess Payload ModbusPDU18ReadFIFOQueueError passed B030B535 000.00s MBAP Guess Payload ModbusPDU2B0EReadDeviceIdentificationRequest (2 level test) passed F03AEC6E 000.00s MBAP Guess Payload ModbusPDU2B0EReadDeviceIdentificationResponse passed 31E1A6F0 000.00s MBAP Guess Payload ModbusPDU2B0EReadDeviceIdentificationError passed EEDD90B3 000.00s MBAP Guess Payload Reserved Function Request (Invalid payload) passed FD679E5A 000.00s MBAP Guess Payload Reserved Function Response (Invalid payload) passed 952A10FB 000.00s MBAP Guess Payload Reserved Function Error (Invalid payload) passed 2483B7E0 000.00s MBAP Guess Payload ModbusPDU02ReadDiscreteInputsResponse passed 0E664921 000.00s MBAP Guess Payload ModbusPDU02ReadDiscreteInputsResponse minimal parameters passed AE03A9C9 000.00s MBAP Guess Payload ModbusPDU02ReadDiscreteInputsRequest dissection passed 91E4F659 000.00s ModbusPDU02ReadDiscreteInputsError passed A79B9D7F 000.01s MBAP Guess Payload User-Defined Function Request (Invalid payload) passed FD679E5A 000.00s MBAP Guess Payload User-Defined Function Response (Invalid payload) passed 952A10FB 000.00s MBAP Guess Payload User-Defined Function Error (Invalid payload) passed 482FD5FE 000.00s Destination port passed 721D2226 000.00s Source port passed 4A483178 000.00s ModbusPDU01ReadCoilsRequest passed BB8921B2 000.00s ModbusPDU01ReadCoilsRequest minimal parameters passed 47A8059A 000.00s ModbusPDU01ReadCoilsRequest dissection passed 9D9C7E63 000.00s ModbusPDU01ReadCoilsResponse passed 5E0C08F6 000.00s ModbusPDU01ReadCoilsResponse minimal parameters passed 594ACA02 000.00s ModbusPDU01ReadCoilsResponse dissection passed 7B4F222E 000.00s ModbusPDU01ReadCoilsError passed D8F18522 000.00s ModbusPDU81ReadCoilsError minimal parameters passed 660851CE 000.00s ModbusPDU81ReadCoilsError dissection passed 25622B90 000.00s ModbusPDU02ReadDiscreteInputsRequest passed A01E957B 000.00s ModbusPDU02ReadDiscreteInputsRequest minimal parameters passed D53416E9 000.00s ModbusPDU02ReadDiscreteInputsResponse passed BA1B4A4A 000.00s ModbusPDU02ReadDiscreteInputsResponse minimal parameters passed 3B8D8312 000.00s ModbusPDU02ReadDiscreteInputsRequest dissection passed 91E4F659 000.00s ModbusPDU02ReadDiscreteInputsError passed AC130A38 000.00s ModbusPDU03ReadHoldingRegistersRequest passed 4EBCCD40 000.00s ModbusPDU03ReadHoldingRegistersRequest minimal parameters passed 8A69ADED 000.00s ModbusPDU03ReadHoldingRegistersResponse passed 7E567E9F 000.00s ModbusPDU03ReadHoldingRegistersResponse minimal parameters passed 519C0576 000.00s ModbusPDU03ReadHoldingRegistersResponse dissection passed 839F15C6 000.00s ModbusPDU03ReadHoldingRegistersError passed B8F8749E 000.00s ModbusPDU04ReadInputRegistersRequest passed B8D7D1A3 000.00s ModbusPDU04ReadInputRegistersResponse passed C913DEA2 000.00s ModbusPDU04ReadInputRegistersResponse minimal parameters passed FAA41DCF 000.00s ModbusPDU04ReadInputRegistersError passed AB7F35DC 000.00s ModbusPDU05WriteSingleCoilRequest passed C7615EED 000.00s ModbusPDU05WriteSingleCoilResponse passed 6C3944EF 000.00s ModbusPDU05WriteSingleCoilError passed BB64897F 000.00s ModbusPDU06WriteSingleRegisterRequest passed C17EECC8 000.00s ModbusPDU06WriteSingleRegisterResponse passed 365A2997 000.00s ModbusPDU06WriteSingleRegisterError passed 26600BBC 000.00s ModbusPDU07ReadExceptionStatusRequest passed 009378D8 000.00s ModbusPDU07ReadExceptionStatusResponse passed 40F48DBE 000.00s ModbusPDU07ReadExceptionStatusError passed 645A5188 000.00s ModbusPDU08DiagnosticsRequest passed 66252494 000.00s ModbusPDU08DiagnosticsRequest minimal parameters passed F6225DF1 000.00s ModbusPDU08DiagnosticsResponse passed 280C5A48 000.00s ModbusPDU08DiagnosticsResponse minimal parameters passed D9A12BD4 000.00s ModbusPDU08DiagnosticsError passed 7B2F46E1 000.00s ModbusPDU0BGetCommEventCounterRequest passed 4576CE8F 000.00s ModbusPDU0BGetCommEventCounterResponse passed E71CA811 000.00s ModbusPDU0BGetCommEventCounterError passed 0652C55C 000.00s ModbusPDU0CGetCommEventLogRequest passed A8CDCD0A 000.00s ModbusPDU0CGetCommEventLogResponse passed B12663C3 000.00s ModbusPDU0CGetCommEventLogError passed 3EAA5D20 000.00s ModbusPDU0FWriteMultipleCoilsRequest passed 82778E64 000.00s ModbusPDU0FWriteMultipleCoilsRequest minimal parameters passed CCD867D6 000.00s ModbusPDU0FWriteMultipleCoilsResponse passed 84CDC3B0 000.00s ModbusPDU0FWriteMultipleCoilsError passed 30A10866 000.00s ModbusPDU10WriteMultipleRegistersRequest passed 975FDCB2 000.00s ModbusPDU10WriteMultipleRegistersRequest minimal parameters passed 849F09B1 000.00s ModbusPDU10WriteMultipleRegistersResponse passed 959E349D 000.00s ModbusPDU10WriteMultipleRegistersError passed BA1E1F4B 000.00s ModbusPDU11ReportSlaveIdRequest passed B659D6E2 000.00s ModbusPDU11ReportSlaveIdResponse minimal parameters passed 69F62C02 000.00s ModbusPDU11ReportSlaveIdError passed 979A3211 000.00s ModbusPDU14ReadFileRecordRequest len parameters passed D55FCBDB 000.00s ModbusPDU14ReadFileRecordRequest minimal parameters passed 4CC07225 000.00s ModbusPDU14ReadFileRecordRequest dissection passed F758F52D 000.00s ModbusPDU14ReadFileRecordResponse minimal parameters passed 462A2EC9 000.00s ModbusPDU14ReadFileRecordResponse dissection passed 2207F055 000.00s ModbusPDU14ReadFileRecordError passed FCC974B1 000.00s ModbusPDU15WriteFileRecordRequest minimal parameters passed B529BAC6 000.00s ModbusPDU15WriteFileRecordRequest dissection passed E1D2EB0D 000.00s ModbusPDU15WriteFileRecordResponse minimal parameters passed 54C13743 000.00s ModbusPDU15WriteFileRecordResponse dissection passed 7477F6C8 000.00s ModbusPDU15WriteFileRecordError passed 6DCF542E 000.00s ModbusPDU16MaskWriteRegisterRequest passed 5D609073 000.00s ModbusPDU16MaskWriteRegisterResponse passed AF78D1CF 000.00s ModbusPDU16MaskWriteRegisterError passed F465E947 000.00s ModbusPDU17ReadWriteMultipleRegistersRequest passed 037AA11B 000.00s ModbusPDU17ReadWriteMultipleRegistersRequest minimal parameters passed D7F70F1B 000.00s ModbusPDU17ReadWriteMultipleRegistersRequest dissection passed 8B6C5B87 000.00s ModbusPDU17ReadWriteMultipleRegistersResponse passed 51556AFA 000.00s ModbusPDU17ReadWriteMultipleRegistersResponse minimal parameters passed 87E68255 000.00s ModbusPDU17ReadWriteMultipleRegistersResponse dissection passed 714F5721 000.00s ModbusPDU17ReadWriteMultipleRegistersError passed 0EFA2E1B 000.00s ModbusPDU18ReadFIFOQueueRequest passed 00000000 000.00s ModbusPDU18ReadFIFOQueueResponse passed E22EFD87 000.00s ModbusPDU18ReadFIFOQueueResponse passed 4CA603B3 000.00s ModbusPDU18ReadFIFOQueueResponse minimal parameters passed C83F7F32 000.00s ModbusPDU18ReadFIFOQueueResponse dissection passed 378424E8 000.00s ModbusPDU18ReadFIFOQueueError passed 2D2C2945 000.00s ModbusPDU2B0EReadDeviceIdentificationRequest passed 4CF42812 000.00s ModbusPDU2B0EReadDeviceIdentificationResponse passed 5CA7F188 000.00s ModbusPDU2B0EReadDeviceIdentificationResponse complete response passed 8634F600 000.00s ModbusPDU2B0EReadDeviceIdentificationResponse dissection passed 3FC872EC 000.00s ModbusPDU2B0EReadDeviceIdentificationError passed 4F9AC796 000.00s Modbus test for payload subfield Campaign CRC=6EE2423E in 000.37s SHA=B07014DBABEBE7CBE38B3D0A9FE25BEADFCAD0A4 PASSED=164 FAILED=0 ━ Loading: test/contrib/mount.uts passed 60C96CF4 000.00s Create subpackets passed DE44A0ED 000.00s Create Mount Calls passed 2D0E8CA2 000.00s Create Successful Mount Replies passed 3415BDE3 000.00s Create Failed Mount Replies passed 500E57E9 000.02s Layer Bindings for Mount Calls passed 45BE829B 000.01s Layer Bindings for Mount Replies passed 936582FF 000.00s Mount calls vs Raw strings passed 7EC99D5B 000.00s Mount replies vs Raw Strings Campaign CRC=1B4F6727 in 000.04s SHA=0B801A144886EC261A8757C71872ED72F20BF297 PASSED=8 FAILED=0 ━ Loading: test/contrib/mpls.uts passed 2B19F7E2 000.00s Build & dissect - IPv4 passed C25E8EDD 000.00s Build & dissect - IPv6 passed 9D054B8B 000.00s Association on IP and IPv6 Campaign CRC=04648D81 in 000.01s SHA=340BF159ECF946B6B7A8BEA33D63D441CC427D13 PASSED=3 FAILED=0 ━ Loading: test/contrib/mqtt.uts passed E3845F7C 000.00s Import the MQTT layer passed D5D71CCB 000.00s MQTTPublish, packet instantiation passed 2A557BA2 000.00s Fixed header and MQTTPublish, packet dissection passed F4B061C8 000.01s MQTTPublish passed 6670930A 000.00s MQTTConnect, packet instantiation passed 4BCFFB49 000.00s MQTTConnect, packet dissection passed 9FE8B0D1 000.00s MQTTDisconnect passed F49F6B27 000.00s MQTTConnack, packet instantiation passed AFAB1DE8 000.00s MQTTConnack, packet dissection passed A1249A66 000.00s MQTTSubscribe, packet instantiation passed 3AFF6D45 000.00s MQTTSubscribe, packet dissection passed 9457DDCA 000.00s MQTTSuback, packet instantiation passed BF4E1EE6 000.00s MQTTSuback, packet dissection passed 238ECC22 000.00s MQTTUnsubscribe, packet instantiation passed 0A27DC53 000.00s MQTTUnsubscribe, packet dissection passed 6C7AE113 000.00s MQTTUnsuback, packet instantiation passed 83BD1AC5 000.00s MQTTUnsuback, packet dissection passed DABF48AB 000.00s MQTTPubrec, packet instantiation passed 65A89810 000.00s MQTTPubrec packet dissection passed B1D5A547 000.00s MQTTPublish, long value passed AF2F2B0C 000.00s MQTT without payload passed 439A5272 000.00s MQTT RandVariableFieldLen passed 15774812 000.00s MQTTUnsubscribe passed 4CA8B2AB 000.00s MQTTSubscribe Campaign CRC=A615C1C8 in 000.05s SHA=C826E4D5E9AB044FB6B1654D098B326C10249A0B PASSED=24 FAILED=0 ━ Loading: test/contrib/mqttsn.uts passed F250DABE 000.00s Import the MQTT-SN layer passed D3022D2C 000.00s MQTTSN + MQTTSNAdvertise, packet instantiation and len field adjust passed 1C7B4B54 000.00s MQTTSNAdvertise, packet dissection passed 2FDF474D 000.00s MQTTSNSearchGW, packet instantiation passed FF682F91 000.00s MQTTSNSearchGW, packet dissection passed C0EBC887 000.00s MQTTSNGwInfo, packet instantiation passed ABFB947A 000.00s MQTTSN + MQTTSNGwInfo, packet instantiation and len field adjust passed 5C25B52F 000.00s MQTTSNGwInfo, packet dissection passed C774191D 000.00s MQTTSNGwInfo, packet dissection - invalid length passed 9B6FC50E 000.00s MQTTSNConnect, packet instantiation passed 89701047 000.00s MQTTSNConnect, packet dissection passed 86808A7E 000.00s MQTTSNConnack, packet instantiation passed 3581A384 000.00s MQTTSNConnack, packet dissection passed BA1DF8C5 000.00s MQTTSNWillTopicReq, packet instantiation passed 2E71D2D8 000.00s MQTTSNWillTopicReq, packet dissection passed 6D3B0FEF 000.00s MQTTSNWillTopic, packet instantiation passed 47F7F922 000.00s MQTTSNWillTopic, packet dissection passed BC1565D9 000.00s MQTTSNWillMsgReq, packet instantiation passed 2194512C 000.00s MQTTSNWillMsgReq, packet dissection passed 43FADA03 000.00s MQTTSNWillMsg, packet instantiation passed CFA0AB01 000.00s MQTTSNWillMsg, packet dissection passed 0A802316 000.00s MQTTSNRegister, packet instantiation passed 051ACC71 000.00s MQTTSNRegister, packet dissection passed A941F579 000.00s MQTTSNRegack, packet instantiation passed BCC82EAD 000.00s MQTTSNRegack, packet dissection passed ED2A6E97 000.00s MQTTSNPublish, packet instantiation passed F47C70F0 000.00s MQTTSNPublish, packet instantiation - long data passed 8D698D98 000.00s MQTTSNPublish, packet dissection passed FF5B7C12 000.00s MQTTSNPublish, packet dissection - long data passed 68873341 000.00s MQTTSNPuback, packet instantiation passed 0E9C0776 000.00s MQTTSNPuback, packet dissection passed D9FE066B 000.00s MQTTSNPubcomp, packet instantiation passed 449D0C6D 000.00s MQTTSNPubcomp, packet dissection passed C1E6953E 000.00s MQTTSNPubrec, packet instantiation passed 29739270 000.00s MQTTSNPubrec, packet dissection passed E7E4D552 000.01s MQTTSNPubrel, packet instantiation passed 53ADF49F 000.00s MQTTSNPubrel, packet dissection passed 435E8700 000.00s MQTTSNSubscribe, packet instantiation - topic name passed 8B05B65E 000.00s MQTTSNSubscribe, packet instantiation - predefined topic ID passed 8381B387 000.00s MQTTSNSubscribe, packet instantiation - short topic passed BC40725B 000.00s MQTTSNSubscribe, packet dissection - topic name passed FE013D00 000.00s MQTTSNSubscribe, packet dissection - short topic passed 4C29B267 000.00s MQTTSNSubscribe, packet dissection - predefined topic ID passed DE35563A 000.00s MQTTSNSuback, packet instantiation passed B9FEB304 000.00s MQTTSNSuback, packet dissection passed 51A7F80C 000.00s MQTTSNUnsubscribe, packet instantiation - topic name passed 7E15D043 000.00s MQTTSNUnsubscribe, packet instantiation - predefined topic ID passed 7C416C40 000.00s MQTTSNUnsubscribe, packet instantiation - short topic passed 3FC198C6 000.00s MQTTSNUnsubscribe, packet dissection - topic name passed 16DDA911 000.00s MQTTSNUnsubscribe, packet dissection - short topic passed 7058717A 000.00s MQTTSNUnsubscribe, packet dissection - predefined topic ID passed 39AA9FE6 000.00s MQTTSNUnsuback, packet instantiation passed 477240CE 000.00s MQTTSNUnsuback, packet dissection passed 3C165855 000.00s MQTTSNPingReq, packet instantiation - no client ID passed EBFF8117 000.00s MQTTSNPingReq, packet instantiation - with client ID passed ED2F5F2B 000.00s MQTTSNPingReq, packet dissection passed 20D2595B 000.00s MQTTSNPingResp, packet instantiation passed CB1E8642 000.00s MQTTSNPingResp, packet dissection passed D2E77CBA 000.00s MQTTSNDisconnect, packet instantiation and len field adjust - w/o duration passed 2BB625AD 000.00s MQTTSNDisconnect, packet instantiation and len field adjust - w duration passed 7984093B 000.00s MQTTSNDisconnect, packet dissection - w/o duration passed 662A4C5F 000.00s MQTTSNDisconnect, packet dissection - w duration passed EC244345 000.00s MQTTSNWillTopicUpd, packet instantiation passed BF931796 000.00s MQTTSNWillTopicUpd, packet dissection passed AB935B9A 000.00s MQTTSNWillTopicResp, packet instantiation passed 9861FADD 000.00s MQTTSNWillTopicResp, packet dissection passed 3F363EC5 000.00s MQTTSNWillMsgUpd, packet instantiation passed 40FB19D0 000.00s MQTTSNWillMsgUpd, packet dissection passed 78242D07 000.00s MQTTSNWillMsgResp, packet instantiation passed 19A47237 000.00s MQTTSNWillMsgResp, packet dissection passed 92D880D0 000.01s MQTTSNEncaps, packet instantiation passed 9424AD47 000.00s MQTTSNEncaps, packet dissection passed 965841FD 000.00s MQTTSNEncaps, packet dissection -- long payload passed 4BD4DEEF 000.00s MQTTSN without payload passed 1483CB2A 000.01s MQTTSN without payload -- invalid lengths passed BB6E042C 000.00s MQTT-SN RandVariableFieldLen passed CD9F57F7 000.00s Disect full IPv6 packages passed 6C88BAFF 000.01s UDP packet instantiation Campaign CRC=53CC4F26 in 000.24s SHA=0B27D229B0FC8DC7889E77AD817EDF8B1A347ACF PASSED=78 FAILED=0 ━ Loading: test/contrib/nfs.uts passed 459DE1A4 000.00s Create subpackets passed 33528A2D 000.01s Create NFS Calls passed 99511DDD 000.01s Create NFS Successful replies passed 162DA228 000.01s Create NFS Failed replies passed 44D01D7F 000.25s Layer Bindings for NFS Calls passed C9FA67F1 000.06s Layer Bindings for NFS Replies passed 9BF1D735 000.05s Built NFS Calls vs Raw Strings passed DF54C926 000.14s Built NFS Replies vs Raw Strings Campaign CRC=3B804CBB in 000.54s SHA=4C8255CAA4FC9F740889D4D3F5B98FBA1632DEB6 PASSED=8 FAILED=0 ━ Loading: test/contrib/nlm.uts passed 7C8F99D8 000.00s Create subpackets passed 9F310C0E 000.01s Create nlm Calls passed D69E10A3 000.00s Create nlm Replies passed F56B404F 000.06s RPC Layer Bindings for NLM Calls passed A9991254 000.02s RPC Layer Bindings for NLM Replies passed 93B4FF93 000.05s Built NLM Calls vs Raw Strings passed 28123A2E 000.01s NLM Replies vs Raw Strings Campaign CRC=0D9B568A in 000.16s SHA=65617E334A5290CE502B06652C75D36285C1CEF3 PASSED=7 FAILED=0 ━ Loading: test/contrib/nsh.uts passed AD690F56 000.00s Build a NSH over NSH packet with SPI=42, and SI=1 passed 64BB8051 000.00s Build a NSH with Fixed context headers passed FAC78318 000.00s Build a Ethernet over NSH over Ethernet packet (NSH over Ethernet encapsulating the original packet) and verify Ethernet Bindings passed 7499C9BF 000.00s Build a NSH over GRE packet, and verify GRE Bindings passed F80F9EF0 000.00s 0 length variable length context header NSH passed EE65831F 000.01s Build a NSH over VXLAN packet and verify bindings Campaign CRC=D74F457D in 000.03s SHA=6D8CD467BAD0A203EB1CF2294F960DBE808189E6 PASSED=6 FAILED=0 ━ Loading: test/contrib/oam.uts passed 56B1E99C 000.00s Generic TLV passed 66FAE8A1 000.00s Data TLV passed 202845CF 000.01s Test TLV passed 401C6182 000.00s LTM TLV passed 4F649902 000.00s LTR TLV passed D39C21D6 000.00s LTR IG TLV passed EEBF0A2B 000.00s LTR EG TLV passed BF85A26A 000.00s TEST ID TLV passed 458170DB 000.00s PTP TIMESTAMP passed DE136991 000.00s APS passed 47B4130B 000.00s RAPS passed D63FDD16 000.00s MEG ID passed D8C5220D 000.00s MEG ICC ID passed E1B2ED0C 000.00s MEG ICC and CC ID passed 2C9DAB9F 000.00s Define check_tshark function passed FB0CA0E3 000.23s CCM passed 6B7BFC39 000.23s LBM passed 341FE8C9 000.24s LTM passed 8395F864 000.25s LTR passed A0DAF824 000.23s AIS passed 3BCD5FDD 000.23s LCK passed A77166BD 000.25s TST passed F8A81A99 000.23s APS passed CE15F6EB 000.23s RAPS passed E5873D44 000.22s MCC passed 4FD439A4 000.23s LMM passed EAFEA947 000.21s LMR passed CD6811E4 000.23s 1DM passed 3236A2CF 000.23s DMM passed 2FB14A55 000.23s EXM passed 3253E5DF 000.23s EXR passed 2B3BD9B8 000.23s VSM passed 9C7F39D4 000.23s CSF passed 4CB5050C 000.23s SLM passed 842CF3C1 000.24s SLR passed A7056A5F 000.23s 1SL passed 78C46716 000.23s GNM Campaign CRC=47D196BD in 005.13s SHA=44DEA4A43E75518167E6D17178C611A92594FC7E PASSED=37 FAILED=0 ━ Loading: test/contrib/oncrpc.uts passed AAD283E1 000.00s Create subpackets passed C3E79625 000.00s Create ONC RPC Packets passed 7714CD5C 000.00s RPC Message type passed 4F70B5F3 000.02s Test Built Packets vs Raw Strings Campaign CRC=FAF30D24 in 000.03s SHA=BB158EECE74A1BB0FB3FBCA5A3BB6CFD7F9646BD PASSED=4 FAILED=0 ━ Loading: test/contrib/opc_da.uts passed 7B0C32C0 000.01s OpcDaRequest passed 098B21F0 000.01s OpcDaRequestLE passed E343DD03 000.01s OpcDaPing passed 4331910E 000.01s OpcDaResponse passed 472FC0A0 000.00s OpcDaResponseLE passed A98BC079 000.01s OpcDaAlter_context passed 6A2108AE 000.01s OpcDaAlter_contextLE passed 00000000 000.00s OpcDaAlter_Context_Resp passed 00000000 000.00s OpcDaAlter_Context_RespLE Campaign CRC=43882341 in 000.06s SHA=88D7ADAB672E3379F6ACC3B90C05BAA0B5A7C491 PASSED=9 FAILED=0 ━ Loading: test/contrib/openflow.uts passed 38F59B18 000.00s Be sure we have loaded OpenFlow v1 passed 09089A41 000.00s OFPTHello(), simple hello message passed E934B3E1 000.00s OFPTEchoRequest(), echo request passed 557BD4B4 000.00s OFPMatch(), check wildcard completion passed C1D4D70D 000.00s OpenFlow(), generic method test with OFPTEchoRequest() passed 70D61AA7 000.00s OFPTFlowMod(), check codes and defaults values passed A9990DBC 000.01s OFPTFlowMod(), complex flow_mod passed E0F434BF 000.00s OFPETBadRequest() containing a flow_mod with wrong table_id passed 5F8A9813 000.01s OFPTPacketIn() containing an Ethernet frame passed D9DBCA8A 000.00s OFPTStatsReplyFlow() passed 51E50F0F 000.00s OFPTQueueGetConfigReply() passed 03DC3BDD 000.00s OFPETHelloFailed() passed 7FE6AAEE 000.00s TCP()/OFPTStatsRequestDesc(), check default sport passed AD9BFE50 000.00s TCP()/OFPETHelloFailed(), check default dport passed BB313B6A 000.01s TCP()/OFPTHello() dissection, check new TCP.guess_payload_class passed DBAE272B 000.01s complete Ether()/IP()/TCP()/OFPTFeaturesRequest() Campaign CRC=897D3D53 in 000.06s SHA=C5777B0E51DC0495B413D2AADB32908949A996C5 PASSED=16 FAILED=0 ━ Loading: test/contrib/openflow3.uts passed 7DF40AA0 000.00s Be sure we have loaded OpenFlow v3 passed C4EBF569 000.00s OFPTHello(), hello without version bitmap passed 24D7DCC9 000.00s OFPTEchoRequest(), echo request passed 3BB3625D 000.00s OFPMatch(), check padding passed 894B8B11 000.00s OpenFlow3(), generic method test with OFPTEchoRequest() passed B7352C0C 000.00s OFPTFlowMod(), check codes and defaults values passed 8924B542 000.00s OFBIPv6ExtHdrHMID(), check creation of last OXM classes passed 796168B6 000.01s OFPTFlowMod(), complex flow_mod passed 94C163FD 000.01s OFPTFlowMod(), complex flow_mod - Dissection passed FF10CD36 000.00s OFPFlowStats() passed 0FBFA4E2 000.01s OFPETBadRequest() containing a flow_mod with wrong table_id passed 2CB45BAE 000.00s OFPTFPTInstructions() passed 5F8A9813 000.01s OFPTPacketIn() containing an Ethernet frame passed 446E1A4E 000.00s OFPTGroupMod() passed 749F7B44 000.00s OFPTQueueGetConfigReply() passed BBB1183C 000.00s OFPMPReplyMeter() passed 51006E68 000.01s OFPMPReplyMeterConfig() passed 1F32C3B7 000.00s TCP()/OFPMPRequestDesc(), check default sport passed AD9BFE50 000.00s TCP()/OFPETHelloFailed(), check default dport passed F96A838F 000.00s TCP()/OFPTHello() dissection, check new TCP.guess_payload_class passed CAD92DD3 000.01s Advanced TCP()/OFPTHello() built, with OFPHETVersionBitmap passed D7BB43CA 000.01s complete Ether()/IP()/TCP()/OFPTFeaturesRequest() passed 9DA56895 000.01s OFPMPRequestTableFeatures() with OFPTFPTMatch() OXMIDPacketListField tests passed C7A73B48 000.01s Test OFBTCPSrc Autocompletion Campaign CRC=62B6D493 in 000.11s SHA=10049D21ED0619176D3E801970ABEA93A7DD35F5 PASSED=24 FAILED=0 ━ Loading: test/contrib/ospf.uts passed 7200AD67 000.01s OSPF, basic instantiation passed C300B5AC 000.01s OSPF - build passed CD86E34A 000.01s OSPF - answers passed 6DFBA085 000.01s OSPFv3 - build passed 74D95569 000.01s OSPFv2 Opaque lsa Campaign CRC=8E511AC7 in 000.04s SHA=B89032A4554203C4ABE4B8DD7815017AC602784C PASSED=5 FAILED=0 ━ Loading: test/contrib/pcom.uts passed 4A63DE6E 000.01s Import the pcom layer passed C8239D59 000.00s PCOM/TCP Default values passed 68EEB390 000.00s PCOM/TCP Len passed 7E90A628 000.01s PCOM/TCP Guess Payload Class passed BD79F7A4 000.00s PCOM/ASCII Default values passed D481B6A3 000.00s PCOM/ASCII Checksum passed 6F559386 000.00s PCOM/ASCII Known Codes passed 5FAD638C 000.00s PCOM/Binary Default values passed 6825B648 000.00s PCOM/Binary Checksum passed D4CD5DB5 000.00s PCOM/Binary Known Codes Campaign CRC=61974194 in 000.04s SHA=38A0399A94DD1760881E92B6CC848AC6760FD8A0 PASSED=10 FAILED=0 ━ Loading: test/contrib/pfcp.uts passed CAEAB396 000.05s Verify IEs passed F3B50130 001.43s Verify PCAPs passed 026ED2E3 000.01s Build and dissect PFCP Association Setup Request passed 8B912A8E 000.25s Build and dissect PFCP Association Setup Response passed EC0B31BD 000.01s Build and dissect PFCP Session Establishment Response passed C15FB1AE 000.02s Build and dissect PFCP Heartbeat Request passed 2907CA1C 000.01s Build and dissect PFCP Session Report Response passed 2A3A160B 000.00s Build and dissect PFCP Session Modification Request passed B68ADF1B 000.01s Build and dissect PFCP Session Modification Response passed 542930A5 000.02s Verify IEs Campaign CRC=021FF8FD in 001.81s SHA=F82AC8D9FE550B86F0AF7A13E8988897BF5CC38B PASSED=10 FAILED=0 ━ Loading: test/contrib/pim.uts passed 16E59B97 000.01s PIMv2 Hello - instantiation passed 5DCF1417 000.01s PIMv2 Join/Prune - instantiation passed 33C6A838 000.01s PIMv2 Hello - build passed 03077209 000.01s PIMv2 Join/Prune - build passed 465851BC 000.01s IPv6 PIMv2 Hello - instantiation passed D54BAB4B 000.02s IPv6 PIMv2 Join/Prune - instantiation passed 070A820A 000.01s IPv6 PIMv2 Hello - build passed 76DC939D 000.01s IPv6 PIMv2 Join/Prune - build Campaign CRC=0C9A9CC9 in 000.10s SHA=721ACC560964F29D3BDB7BB9E659DD257CCA213E PASSED=8 FAILED=0 ━ Loading: test/contrib/pnio.uts passed 41E2EF04 000.00s Import the ProfinetIO layer passed 01540E9D 000.00s ProfinetIO default values passed 4C4287D4 000.00s ProfinetIO overloads Ethertype passed B1E30FC3 000.00s ProfinetIO overloads UDP dport passed B6D3A0AA 000.00s Ether guesses ProfinetIO as payload class passed 5255596B 000.00s UDP guesses ProfinetIO as payload class passed E1B97532 000.00s ProfinetIO PNIORealTime_IOxS parsing of a single status passed 1C9C6EE1 000.00s ProfinetIO PNIORealTime_IOxS building of a single status passed 8F874A49 000.01s ProfinetIO PNIORealTime_IOxS parsing with multiple statuses passed 81AD94C2 000.00s ProfinetIO RTC PDU parsing without configuration passed 73AAB4A5 000.01s ProfinetIO RTC PDU building passed 756FB7A7 000.01s ProfinetIO RTC PDU parsing with config passed 795019B9 000.00s PROFIsafe parsing (query with F_CRC_SEED=0) passed 328D69DF 000.00s PROFIsafe parsing (query with F_CRC_SEED=1) passed BCC041ED 000.00s PROFIsafe parsing (response with F_CRC_SEED=0) passed 134259EB 000.00s PROFIsafe parsing (response with F_CRC_SEED=1) passed 16E2DE7B 000.00s PROFIsafe building (query with F_CRC_SEED=0) passed FEB7C7AD 000.00s PROFIsafe building (query with F_CRC_SEED=1) passed 23B86BD1 000.00s PROFIsafe building (response with F_CRC_SEED=0) passed 7497146C 000.00s PROFIsafe building (response with F_CRC_SEED=1) Campaign CRC=1F083FFC in 000.07s SHA=F15C5B1B372CA2667921D15E6B544FCD37CA783E PASSED=20 FAILED=0 ━ Loading: test/contrib/pnio_dcp.uts passed 0441052D 000.00s Import the ProfinetIO layer passed 759FE98D 000.00s DCP Identify All Request parsing passed 6D752C65 000.00s DCP Set Request parsing passed D49A698A 000.01s DCP Identify Response parsing passed 51D00D12 000.01s DCP Identify Response parsing with new DCP packages (DCPOEMIDBlock, DCPDeviceInitiativeBlock) passed 19F4054C 000.00s DCP Set Request parsing passed 9283328B 000.00s DCP Set Full IP Suite Request parsing passed 4ED5726F 000.00s DCP Identify All Request crafting passed B7C338BE 000.00s DCP Set Name Request with specified name crafting passed 8812C6E5 000.00s DCP Identify Response crafting passed A75FB1F2 000.01s DCP Set Full IP Suite Request crafting Campaign CRC=62F27123 in 000.06s SHA=C19BAF9ABDF558726970C1F44FC9F7DD89452C76 PASSED=11 FAILED=0 ━ Loading: test/contrib/pnio_rpc.uts passed 7D69555C 000.00s Import the PNIO RPC layer passed 814F0CC1 000.00s Check that we have UUIDs passed 37273DA1 000.00s Block default values passed 4723B00E 000.00s Block basic example passed 3AAA60BA 000.00s Block has no payload (only padding) passed A0A1EB5A 000.00s IODControlReq default values passed 405DDD2F 000.00s IODControlReq basic example (IODControlReq PrmEnd control) passed BD8ECAAC 000.00s IODControlReq dissection passed B0B37950 000.00s IODControlReq response passed 1DD38C47 000.00s IODControlRes default values passed 285842AE 000.00s IODControlRes basic example (IODControlRes PrmEnd control) passed 91129611 000.00s IODControlRes dissection passed 5F9A45BD 000.00s IODWriteReq default values passed D2FA6368 000.00s IODWriteReq basic example passed D0D77079 000.00s IODWriteReq dissection passed 76F22EC9 000.00s IODWriteReq response passed AA507192 000.00s IODWriteRes default values passed 74785215 000.00s IODWriteRes basic example passed 8F2302B3 000.00s IODWriteRes dissection passed 0EF727C9 000.00s IODWriteMultipleReq default values passed D384B63C 000.01s IODWriteMultipleReq basic example passed 12765E4B 000.01s IODWriteMultipleReq dissection passed 4D3C5823 000.00s IODWriteMultipleReq response passed FB3D13E6 000.00s IODWriteMultipleRes default values passed AEA91BD8 000.01s IODWriteMultipleRes basic example passed F267BAAA 000.01s IODWriteMultipleRes dissection passed C723F916 000.01s IODReadReq default values passed E979092A 000.00s IODReadReq basic example passed 468F54F6 000.00s IODReadReq dissection passed 1922FF24 000.00s IODReadReq response passed 32E9CD39 000.00s IODReadRes default values passed 6CF25802 000.00s IODReadRes basic example passed 5AB012E9 000.00s IODReadRes dissection passed B27FCC5C 000.00s IM0Block default values passed E214B85E 000.00s IM0Block basic example passed 3E1413D0 000.00s IM1Block default values passed 5360F960 000.00s IM2Block default values passed FDDEEC44 000.00s IM3Block default values passed 03159573 000.01s IM4Block default values passed B67FB6F3 000.00s ARBlockReq default values passed E6A827AC 000.00s ARBlockReq basic example passed 28DD4874 000.00s ARBlockReq dissection passed 23C192CD 000.00s ARBlockReq response passed 758652F8 000.01s ARBlockRes default values passed 61F5C03B 000.00s ARBlockRes basic example passed 0DCE1E48 000.00s ARBlockRes dissection passed F0792407 000.00s IOCRBlockReq default values passed 6E9E299C 000.00s IOCRAPI default values passed 6786E049 000.00s IOCRAPIObject default values passed 84040401 000.01s IOCRBlockReq basic example passed 9276F521 000.01s IOCRBlockReq dissection passed F2906F33 000.00s IOCRBlockReq response passed B0A2519C 000.00s IOCRBlockRes default values passed 0E505CD4 000.01s IOCRBlockRes basic example passed 180F2289 000.00s IOCRBlockRes dissection passed 83C4268C 000.00s ExpectedSubmoduleBlockReq default values passed 3A5C3BE1 000.00s ExpectedSubmoduleAPI default values passed 872F0837 000.00s ExpectedSubmodule default values passed A78AAB69 000.00s ExpectedSubmoduleDataDescription default values passed 5E5B4840 000.01s ExpectedSubmoduleBlockReq basic example passed B9911D1A 000.01s ExpectedSubmoduleBlockReq dissection passed 00CE5DE0 000.00s AlarmCRBlockReq default values passed 5A4F19EA 000.00s AlarmCRBlockReq with transport passed 69527F4B 000.00s AlarmCRBlockReq dissection passed 4C8A23D4 000.00s AlarmCRBlockReq response passed 5A05CE23 000.00s AlarmCRBlockRes default values passed 498D9AAD 000.00s AlarmCRBlockRes dissection passed C40555B0 000.00s PNIOServiceReqPDU basic example passed 69371E1A 000.00s PNIOServiceReqPDU dissection passed C607E503 000.01s PNIOServiceResPDU basic example passed 1B802B92 000.01s PNIOServiceResPDU dissection passed 9CCEBC40 000.07s A PNIO RPC Connect Request passed 8EB9921C 000.03s A PNIO RPC Write Request passed DAC438D4 000.00s A PNIO RPC PrmEnd Control Request passed 07F912C0 000.01s A PNIO RPC PrmEnd Control Request passed 1ADFD3E7 000.01s PNIO Alarm decoding (Alarm_Low) passed 9EA014A9 000.00s PNIO Alarm decoding (Alarm_High) passed 4D688F93 000.00s PNIO Alarm DiagnosisItem passed CFAE54FB 000.00s PNIO Alarm UploadRetrievalItem passed 302BCA71 000.00s PNIO Alarm iParameterItem passed 08A0B379 000.00s PNIO Alarm RS_AlarmItem passed 8E08E8EE 000.00s PNIO Alarm PRAL_AlarmItem passed 4B9114C6 000.00s PNIO PDPortDataAdjust Decoding Campaign CRC=80FFE658 in 000.39s SHA=BC2FB4A8EB5EFD6FDBC1D22878DB64FCB363FC17 PASSED=83 FAILED=0 ━ Loading: test/contrib/portmap.uts passed 99BDD700 000.00s Create subpackets passed F149786B 000.00s Create Portmap Packets passed F9A09BB1 000.02s RPC Layer Bindings for Portmap calls passed FEF6B9AB 000.02s RPC Layer Bindings for Portmap replies passed E6755A5F 000.00s Portmap calls vs Raw Strings passed CBB44E6C 000.00s Portmap replies vs Raw Strings Campaign CRC=D3F407CD in 000.05s SHA=A09BDBB73AA5DC56F5402240CAD4931D319C3D6B PASSED=6 FAILED=0 ━ Loading: test/contrib/postgres.uts passed EDBDD598 000.01s postgres initialization passed 5F3903C2 000.01s postgres backend sequence passed 8052EC2B 000.01s simple queries passed A5E7BF0A 000.01s row data response passed 13780925 000.00s errors passed 0C9977F5 000.01s copy data response and request passed F4111392 000.01s Check example request packet passed 963A9F61 000.00s Check parse decoding passed B69AA801 000.00s Check bind decoding passed C4D74C68 000.00s Check describe decoding passed 875D94DA 000.00s Check execute decoding passed E2D79A32 000.00s Check sync decoding Campaign CRC=43E90505 in 000.07s SHA=F0A2319E48FB8B2AC33B993C859B56D85C2D7F8F PASSED=12 FAILED=0 ━ Loading: test/contrib/ppi_cace.uts passed 6EDC347A 000.05s Define test suite passed F364CECB 000.01s Pkt_10_1 passed 605C6D34 000.02s Pkt_10_2 passed BA3ED86E 000.02s Pkt_10_3 passed CE5D1D05 000.04s Pkt_10_4 passed 94E89A66 000.02s Pkt_10_5 passed E7B3C0FA 000.02s Pkt_10_6 passed 0F1BA25D 000.02s Pkt_10_7 passed 7DF4AE9D 000.04s Pkt_10_8 passed 2B124076 000.02s Pkt_10_9 passed D86C63ED 000.02s Pkt_10_10 passed 17A20932 000.01s All-in-one packet passed F56EA2C6 000.02s All-wrong-data packet Campaign CRC=A1BC686C in 000.30s SHA=EB033ECB43C222EDCD74CEE78F1EF20E3AD57ED5 PASSED=13 FAILED=0 ━ Loading: test/contrib/ppi_geotag.uts passed E21B2CC0 000.00s Import PPI Geotag passed 0A4E973C 000.00s Test GPS dissection passed 02AD4A2A 000.00s Test Vector dissection passed DF6E6057 000.00s Test Sensor dissection passed CE7DB03B 000.00s Test Antenna dissection passed 13719EF7 000.01s Test GPSTime_Field time handling Campaign CRC=DBC51777 in 000.01s SHA=36547F14F76B7DB87740277116A95F972B2D6AAC PASSED=6 FAILED=0 ━ Loading: test/contrib/ripng.uts passed 321BA0AB 000.01s Basic RIPng build Campaign CRC=9489CFC3 in 000.01s SHA=AF5EDFF6B2B085C95304A2DA1E3CEF4438573E3F PASSED=1 FAILED=0 ━ Loading: test/contrib/roce.uts passed A8D115E7 000.01s RoCE layer passed EC0E25D0 000.01s RoCE CNP packet passed D130951A 000.01s RoCE CNP captured on ConnectX-4 Lx passed E06AD740 000.01s RoCE v1 RC RDMA WRITE ONLY passed BF01FEFA 000.00s RoCE v1 RC ACKNOWLEDGE passed 5CE07B27 000.01s RoCE over IPv6 Campaign CRC=3151D1ED in 000.04s SHA=4E7C0577657C304593D50F2C0F8A28127048A98D PASSED=6 FAILED=0 ━ Loading: test/contrib/rpl.uts passed BC46C220 000.01s Import the RPL layer passed C80E80E2 000.04s RPL Base Objects construction passed 9E05AE4F 000.00s RPL Base Objects dissection passed F503DBE3 000.02s RPL Control Options construction Campaign CRC=1618CD14 in 000.07s SHA=37EC64BB96F6BB929BB2238D612C8C0E44C8880D PASSED=4 FAILED=0 ━ Loading: test/contrib/rsvp.uts passed 9505AC9E 000.01s Default build passed 785C0CC5 000.00s Master dissection Campaign CRC=05745A6E in 000.01s SHA=75BEC13CE035AA4E07C01AAE17F5EF2F7B296491 PASSED=2 FAILED=0 ━ Loading: test/contrib/rtcp.uts passed E0ACAFFF 000.00s test sender report parse passed 709782AB 000.00s test receiver report parse passed DE715DBB 000.01s test source description report parse passed 1AF9FCC6 000.00s test parse SR and SDES stacked passed 702C76AD 000.01s format SR + 2xRR and parse back Campaign CRC=BFF838DF in 000.02s SHA=3C9C62DB86D1C23518E0D6CE98DAF0F9C49ED70D PASSED=5 FAILED=0 ━ Loading: test/contrib/rtps.uts passed 74FB6A4E 000.00s Import the RTPS layer passed CC136559 000.00s PID_BUILTIN_ENDPOINT_QOS endianness passed D43B0114 000.01s RTPS default header values passed 802B1C6E 000.08s RTPS packet declaration passed 02C585A2 000.01s RTPS header dissect passed 9541738C 000.13s Test dissection passed F88AE5EB 000.02s RTPS Heartbeat SequenceNumber_t packing and dissection passed 41F2B0C7 000.01s RTPS ACKNACK count packing and dissection Campaign CRC=5901A102 in 000.25s SHA=3B01BCCC464A9329DDB4A9DEEE2F3D11AFBDAD28 PASSED=8 FAILED=0 ━ Loading: test/contrib/rtr.uts passed 8754D4E8 000.00s default instantiation passed 70508ABF 000.00s default values build passed CCBE4003 000.00s filled values build passed 1126113D 000.00s dissection passed 26161311 000.00s default instantiation passed B62E5E04 000.00s default values build passed 2B913C64 000.00s filled values build passed EAC9A283 000.00s dissection passed 58720595 000.00s default instantiation passed 232AA1C5 000.00s default values build passed 3C22E6E3 000.00s dissection passed 9CE218B8 000.00s default instantiation passed 6220307F 000.00s default values build passed A9EBBAD4 000.01s filled values build passed 536B46BD 000.00s dissection passed 5257E1A4 000.00s default instantiation passed 78B3C912 000.00s default values build passed E4B7C7F5 000.00s filled values build passed 4AA022EB 000.00s dissection passed 30F19569 000.00s default instantiation passed 8FDA3D3C 000.00s default value build passed 55F9A0FA 000.00s filled values build passed 192EF04D 000.00s dissection passed 3E5E466A 000.00s default instantiation passed 2B3C391B 000.00s default values build passed 773C950F 000.00s filled values build passed 0C8A02FB 000.00s dissection passed 099CB01B 000.00s default instantiation passed 90FD3F7C 000.00s default values build passed 8FE15847 000.00s filled values build passed BD38DC7F 000.00s dissection passed D6CBDEE9 000.00s default instantiation passed CDF64D7F 000.00s default values build passed 1A5A7AD3 000.00s dissection passed 4B04F49D 000.00s default instantiation passed 14CC05CA 000.00s default values build passed EEF4F14C 000.00s filled values build passed 185DE318 000.00s dissection passed CDF25908 000.00s default instantiation passed C7C955B6 000.00s default values build passed 819D0E5F 000.00s filled values build passed CC63170F 000.00s dissection Campaign CRC=0F8F9BAF in 000.10s SHA=C0A33A5B61E6735A9D3BAB37A55B2C77ED2DF744 PASSED=42 FAILED=0 ━ Loading: test/contrib/rtsp.uts passed 6CCA87B9 000.00s RTSP request - dissection passed C73EF4B7 000.00s RTSP request - build passed 19CEA428 000.00s RTSP response - dissection passed 8EA8C49C 000.00s RTSP response - build Campaign CRC=2606F777 in 000.01s SHA=10A03A068B3FB9302B633CB4C9355E788AA40CE1 PASSED=4 FAILED=0 ━ Loading: test/contrib/sdnv.uts passed CB795B07 000.00s Load SDNVUtil passed C76A0037 000.01s Define utils passed 742A6435 000.00s Vector tests: small ints passed 4D5A593E 000.00s Vector tests: big ints passed 42A58814 000.00s 100 random vector tests passed E6DC3580 000.00s SDVN tests Campaign CRC=BABF4761 in 000.02s SHA=3D7710F2AA0B0D60751806C9B8AFA489B288943A PASSED=6 FAILED=0 ━ Loading: test/contrib/sebek.uts passed 439FCB16 000.00s Layer binding 1 passed 82547110 000.00s Packet dissection 1 passed A8B015BA 000.00s Layer binding 2 passed 8E7EDB2F 000.00s Packet dissection 2 passed C487A0BD 000.00s Layer binding 3 passed 952B87E1 000.00s Packet dissection 3 passed EDA14C19 000.00s Nonsense summaries Campaign CRC=F8F03D80 in 000.02s SHA=AA8BC4F5114BE3D515B7C7343F88CE97948F284A PASSED=7 FAILED=0 ━ Loading: test/contrib/send.uts passed 878CEAEB 000.00s ICMPv6NDOptRsaSig build and dissection passed 8E4AD660 000.01s ICMPv6NDOptCGA build and dissection passed E0159ADE 000.00s ICMPv6NDOptTmstp build and dissection passed 9185CAFD 000.00s ICMPv6NDOptNonce build and dissection Campaign CRC=06722B7D in 000.02s SHA=F356DADC8E4A48DF616A3B938375F6206FCBB5A8 PASSED=4 FAILED=0 ━ Loading: test/contrib/socks.uts passed CBDF4CAE 000.02s Basic build and dissection - test version dispatch passed 4E191715 000.01s SOCKS5Request build and dissection passed 8AD93DD1 000.01s Test SOCKSv5 over UDP Campaign CRC=07A94E58 in 000.03s SHA=7414E397D9F7E3C6592C8E405A3AFB6488A0BCAD PASSED=3 FAILED=0 ━ Loading: test/contrib/stamp.uts passed 844DFDD8 000.00s Load module passed 12F1D844 000.01s Test STAMP Session-Sender Test (Unauthenticated) passed 4115F5A7 000.01s Test STAMP Session-Reflector Test (Unauthenticated) Campaign CRC=7810F5C7 in 000.02s SHA=C675960454988FE8CA6527DFD8BB6ED9E8BB9B6E PASSED=3 FAILED=0 ━ Loading: test/contrib/stun.uts passed 78024D2A 000.01s test STUN binding request 1 passed EA6F55B1 000.01s test STUN binding request 2 passed 1E1B23D0 000.01s test STUN binding success response 1 passed 1A80FA1D 000.00s test STUN binding success response 2 passed 18F7E950 000.00s test STUN binding indication 1 passed E473FE18 000.00s test STUN binding indication 2 passed 7BDCB1FE 000.00s test STUN packet build Campaign CRC=2CCEF984 in 000.03s SHA=24E1552DED10E0E1DC388E2D11277D5134B868EA PASSED=7 FAILED=0 ━ Loading: test/contrib/tacacs.uts passed 75EB00FD 000.00s default instantiation passed 0943AD4E 000.00s default values build passed AD68E9A7 000.01s filled values build passed 5AF9DD09 000.00s dissection passed 1E866A37 000.00s default instantiation passed 85B4E84B 000.00s default values build passed 3635289B 000.00s filled values build -- SSH connection sample use scapy, secret = test passed 09C0E2C4 000.00s dissection passed 5F709645 000.00s default instantiation passed 320D7FF9 000.00s default values build passed 459F1222 000.00s filled values build -- SSH connection sample use scapy, secret = test passed 004C9B89 000.00s dissection passed 6A3D48EC 000.00s default instantiation passed 230DBAE9 000.01s default values build passed 30EE0DF8 000.00s filled values build -- SSH connection sample secret = test, password = pass passed 8041A0A9 000.00s dissection passed 4EEF9F5F 000.00s default instantiation passed 3F5AAE02 000.00s default values build passed 624503E4 000.01s filled values build -- SSH connection sample secret = test passed BEF43CF5 000.00s dissection passed 1A9BC264 000.00s default instantiation passed B04D9EB1 000.00s default values build passed C9A6C6C1 000.00s filled values build -- SSH connection sample secret = test passed 00D74EBC 000.00s dissection passed 8879699E 000.00s default instantiation passed 4CB86C87 000.00s default value build passed 1BAF4C3E 000.01s filled values build -- SSH connection sample secret = test passed C8946887 000.00s dissection passed 0DE37339 000.00s default instantiation passed 4B162CFE 000.00s default values build passed 42E888C6 000.00s filled values build -- SSH connection sample secret = test passed 09E59968 000.00s dissection passed CB046580 000.00s instantiation passed 75DD83FF 000.00s dissection passed 5E7D7118 000.00s instantiation passed B370918B 000.00s dissection Campaign CRC=D07E47D1 in 000.11s SHA=F622224CE7F4D716CFC8AADF85FA278C53B48749 PASSED=36 FAILED=0 ━ Loading: test/contrib/tcpao.uts passed BE8C15E0 000.00s Test Utilities passed 3F399A5E 000.03s TCP-AO Test Vectors Utilities passed 107588D1 000.01s TCP-AO Test Vector 4.1.1: SHA-1 Send Syn passed E1AB8C0E 000.00s TCP-AO Test Vector 4.1.2 SHA-1 Recv Syn-Ack passed E040B2E7 000.01s TCP-AO Test Vector 4.1.3 SHA-1 Send Other passed 22734BC6 000.01s TCP-AO Test Vector 4.1.4 SHA-1 Recv Other passed 64BAD964 000.00s TCP-AO Test Vector 4.2.1 passed 829A4969 000.00s TCP-AO Test Vector 4.2.2 passed 2EFD6450 000.01s TCP-AO Test Vector 4.2.3 passed 8C7E7BFD 000.01s TCP-AO Test Vector 4.2.4 passed FD67FE2A 000.00s TCP-AO Test Vector 5.1.1 passed 89F22766 000.00s TCP-AO Test Vector 6.1.1 passed B5E722BA 000.00s TCP-AO Test Vector 6.1.2 passed CC8C25EC 000.00s TCP-AO Test Vector 6.2.2 passed 898833E0 000.01s TCP-AO Test Vector 6.2.4 passed ED8DA9BB 000.00s TCP-AO Test Vector 7.1.2 passed EC6CC83F 000.00s TCP-AO Test Vector 7.1.4 passed 02BAA02A 000.01s TCP-AO sign SYN packet build from scratch Campaign CRC=B009C8ED in 000.11s SHA=1CB889C307B35639F3E48A329E24015BF797B450 PASSED=18 FAILED=0 ━ Loading: test/contrib/tcpros.uts passed FC5F557A 000.00s Import the RTPS layer passed E47D5F77 000.00s Test basic package composition passed 803F1536 000.00s Test HTTPRequest within TCPROS passed 139F1AF6 000.00s Test XMLRPCCall within TCPROS Campaign CRC=00D99C98 in 000.01s SHA=861EE7C094BDA25FC6C3FBD20EC30F02DEF5A8FE PASSED=4 FAILED=0 ━ Loading: test/contrib/tzsp.uts passed 00000000 000.00s build basic TZSP frames passed AAD46BA0 000.00s = basic TZSP header - keepalive passed 2513F94A 000.01s = basic TZSP header - keepalive + ignored end tag passed F5B4CDF6 000.01s = basic TZSP header with RX Packet and EndTag passed 8846B45B 000.01s = basic TZSP header with RX Packet and Padding passed 8C644001 000.01s = basic TZSP header with RX Packet and RAWRSSI (byte, short) passed 5458357D 000.01s = basic TZSP header with RX Packet and SNR (byte, short) passed 6A1817D0 000.01s = basic TZSP header with RX Packet and DATA Rate passed DBF1BCAA 000.01s = basic TZSP header with RX Packet and Timestamp passed 03F81C98 000.01s = basic TZSP header with RX Packet and ContentionFree passed 8EEB1447 000.01s = basic TZSP header with RX Packet and Decrypted passed BAFB9C9B 000.01s = basic TZSP header with RX Packet and FCS error passed 96479C10 000.01s = basic TZSP header with RX Packet and RXChannel passed A88A12A9 000.01s = basic TZSP header with RX Packet and Packet count passed 8069FD98 000.01s = basic TZSP header with RX Packet and RXFrameLength passed 905B4FC5 000.01s = basic TZSP header with RX Packet and WLAN RADIO HDR SERIAL passed FF80ED1F 000.01s = handling of unknown tag passed 4B08A939 000.04s all layers stacked passed 00000000 000.00s state tags value range passed 8F89D53C 000.01s = TZSPTagContentionFree passed 2BFA8B4D 000.01s = TZSPTagError passed 184E7B78 000.01s = missing TZSP header before end tag passed 68EFD4B6 000.01s = invalid length field for given tag passed 4843234F 000.01s = handling of unknown tag - payload to short passed 7ECE06B4 000.01s = handling of unknown tag - no payload after tag type Campaign CRC=51F9E48A in 000.25s SHA=4FB2BD5A99FC60357FAD80A720A41FAE473B6237 PASSED=25 FAILED=0 ━ Loading: test/contrib/vqp.uts passed 7C39558A 000.00s Build VQP passed 2F8C1252 000.00s Dissect VQP Campaign CRC=244CE7E2 in 000.00s SHA=771D39B82984D237C674EF3A5F8729A9920F6C98 PASSED=2 FAILED=0 ━ Loading: test/contrib/vtp.uts passed 4AE022D0 000.00s VTP, basic instantiation Campaign CRC=FA6F7035 in 000.00s SHA=16702CB0A2404E9328FB2F41D29489124A791D92 PASSED=1 FAILED=0 ━ Loading: test/contrib/wireguard.uts passed 9581C596 000.00s Build and dissect Transport passed 03D99456 000.00s Build and dissect Init passed 1E37F451 000.00s Build and dissect Response passed B97863E3 000.00s Build and dissect Cookie Response Campaign CRC=ECB2C085 in 000.01s SHA=5D8CB067E83BB4C8A33EA68C45166C7BA69D3BAB PASSED=4 FAILED=0 ━ Loading: test/tools/isotpscanner.uts Campaign CRC=2548EBEC in 000.00s SHA=3F256C91089EA11D55DDDE6D7AE3AEBC12DEE017 PASSED=0 FAILED=0 ━ Loading: test/tools/obdscanner.uts Campaign CRC=0C4E8B9A in 000.00s SHA=C2C3A3E5094BB338655CF4B504A2604E96D229C7 PASSED=0 FAILED=0 ━ Loading: test/tools/xcpscanner.uts Campaign CRC=BF33674E in 000.00s SHA=12E09DD529910FCB62E975F1D6E7FFADE87B91D0 PASSED=0 FAILED=0 ━ Loading: test/contrib/automotive/ccp.uts passed BF957852 000.00s Imports passed 6E7FD8EF 000.01s Load module passed 01ACCD17 000.00s Build CRO CONNECT passed 2723B0E1 000.00s Dissect DTO CONNECT passed BDE7D3AF 000.00s Build CRO EXCHANGE_ID passed A5AAA275 000.00s Dissect DTO EXCHANGE_ID passed 5073C77B 000.00s Build CRO GET_SEED passed 4ED49A77 000.00s Dissect DTO GET_SEED passed A2961640 000.00s Build CRO UNLOCK passed CEC63166 000.00s Dissect DTO UNLOCK passed 43FE4B94 000.00s Build CRO SET_MTA passed 69A9DBFF 000.00s Dissect DTO SET_MTA passed EC4963C8 000.00s Build CRO DNLOAD passed AE3AFDC2 000.00s Dissect DTO DNLOAD passed FE93D8D5 000.00s Build CRO DNLOAD_6 passed AD0C9387 000.00s Dissect DTO DNLOAD_6 passed 34D2904A 000.00s Build CRO UPLOAD passed DA87703B 000.00s Dissect DTO UPLOAD passed 6693B5D7 000.00s Build CRO SHORT_UP passed 4A26ED2F 000.00s Dissect DTO SHORT_UP passed 1A82DCFF 000.00s Build CRO SELECT_CAL_PAGE passed C888133D 000.00s Dissect DTO SELECT_CAL_PAGE passed EE28D247 000.00s Build CRO GET_DAQ_SIZE passed 644CD9D4 000.00s Dissect DTO GET_DAQ_SIZE passed B3C3CA60 000.00s Build CRO SET_DAQ_PTR passed CF0622CF 000.00s Dissect DTO SET_DAQ_PTR passed AE492DCC 000.00s Build CRO WRITE_DAQ passed 34F2C1A6 000.01s Dissect DTO WRITE_DAQ passed E431CBB9 000.00s Build CRO START_STOP passed 3E8D42A3 000.00s Dissect DTO START_STOP passed FF631624 000.00s Build CRO DISCONNECT passed B66D7442 000.00s Dissect DTO DISCONNECT passed 0CF965D6 000.00s Build CRO SET_S_STATUS passed BC12F747 000.00s Dissect DTO SET_S_STATUS passed 9B5C796F 000.00s Build CRO GET_S_STATUS passed F2B489DD 000.00s Dissect DTO GET_S_STATUS passed 6F135ED7 000.00s Build CRO BUILD_CHKSUM passed B7028478 000.00s Dissect DTO BUILD_CHKSUM passed 490E780B 000.00s Dissect DTO BUILD_CHKSUM2 passed B8D9348A 000.00s Build CRO CLEAR_MEMORY passed 93A365BD 000.00s Dissect DTO CLEAR_MEMORY passed DEF52552 000.00s Build CRO PROGRAM passed 2CE179CC 000.00s Dissect DTO PROGRAM passed BFEC674A 000.00s Build CRO PROGRAM_6 passed C1695B8D 000.00s Dissect DTO PROGRAM_6 passed F207C003 000.00s Build CRO MOVE passed 65AD84BD 000.00s Dissect DTO MOVE passed EDD8EECA 000.00s Build CRO DIAG_SERVICE passed 44D6F227 000.00s Dissect DTO DIAG_SERVICE passed 6E4365D9 000.00s Build CRO ACTION_SERVICE passed D9E9F267 000.00s Dissect DTO ACTION_SERVICE passed 76BFFD16 000.00s Build CRO TEST passed 81030CFF 000.00s Dissect DTO TEST passed 288A263D 000.00s Build CRO START_STOP_ALL passed 8B7C8FFA 000.00s Dissect DTO START_STOP_ALL passed D97CE162 000.00s Build CRO GET_ACTIVE_CAL_PAGE passed B40AD718 000.00s Dissect DTO GET_ACTIVE_CAL_PAGE passed ABDE4FED 000.00s Build CRO GET_CCP_VERSION passed 590B3C64 000.00s Dissect DTO GET_CCP_VERSION passed F0F047E9 000.01s CAN Socket sr1 with dto.answers(cro) == True passed C5358F08 000.11s CAN Socket sr1 with dto.answers(cro) == False passed 1D7A86D4 000.01s CAN Socket sr1 with error code passed AE223815 000.00s Delete TestSockets Campaign CRC=DAACC357 in 000.30s SHA=46C347D75F9F551501AB7425A8D2658D0AB6B726 PASSED=63 FAILED=0 ━ Loading: test/contrib/automotive/doip.uts passed 437D80A3 000.02s Load Contrib Layer passed FCC821F0 000.00s Defaults test passed C01319D3 000.01s Build test 0 passed 10585C8E 000.00s Build test 1 passed 341DE1EB 000.00s Build test 2 passed 262743CF 000.00s Build test 3 passed 8E7078C3 000.00s Build test 4 passed A3494EE0 000.00s Build test 5 passed A32A8EAC 000.00s Build test 5.1 passed 3E6E2F0B 000.00s Build test 5.2 passed 0120EDD2 000.01s Build test 6 passed 513BC711 000.00s Build test 7 passed A546C7A2 000.01s Build test 8 passed 8DFA8109 000.00s Build test 4001 passed 9E14BA38 000.00s Build test 4002 passed 58600A19 000.00s Build test 4003 passed 8BC8D4B1 000.00s Build test 4004 passed 7CD90A8D 000.00s Build test 8001 passed E0102221 000.01s Build test 8002 passed 0C4AF824 000.01s Build test 8003 passed 492009AE 000.00s read diag_ack pcap file passed D54DAE1D 000.00s dissect test of diag ACK with previous_msg field filled passed 28ABCBB0 000.10s read main pcap file passed 6AF7C649 000.00s dissect test of routing activation pkts req passed 21D2B028 000.00s dissect test of routing activation pkts resp passed A26E986C 000.00s answers test of routing activation pkts passed EF791612 000.01s dissect diagnostic message passed 38DD1E21 000.01s TCPSession Test passed 02549A04 000.01s TCPSession Test multiple DoIP messages passed BA2D2EE8 000.12s Doip logical addressing passed 5AFE44B4 000.00s Load libraries passed B9A1AD8D 000.01s Test DoIPSocket passed 984BB50F 000.32s Test DoIPSocket 2 passed 0FC4BCF0 000.04s Test DoIPSocket 3 passed C6BBC664 000.02s Test DoIPSocket6 passed 7F4BB8AF 000.04s Test DoIPSslSocket passed B402D552 000.02s Test DoIPSslSocket6 passed 05291DA7 000.03s Test UDS_DoIPSslSocket6 passed 4765406C 001.04s Test UDS_DualDoIPSslSocket6 Campaign CRC=C535D8BD in 001.87s SHA=67CEAE57DF8C7E1BAFBA212D6B7E52CA3F0064EC PASSED=39 FAILED=0 ━ Loading: test/contrib/automotive/ecu.uts passed 97256202 000.01s Load modules passed 92D193FF 000.01s Load Ecu module passed 52B1B986 000.00s Check EcuState basic functionality passed C40E072F 000.00s More complex tests passed 6FE6FE4A 000.00s Even more complex tests passed 77D2454B 000.00s Delete Attribute Test passed 189316FA 000.00s Copy tests passed A50DEA07 000.00s Move tests passed E13D1E66 000.00s equal tests passed 52ACD926 000.00s hash tests passed 8C1DCDD8 000.00s command tests passed 0A0042C2 000.00s less than tests passed 59157FBD 000.00s less than tests 2 passed A10F49C5 000.00s less than tests 3 passed 477A16ED 000.00s less than tests 4 passed 0F66CEBE 000.00s less than tests 5 passed 6A056E04 000.00s less than tests 6 passed CC853DA3 000.04s contains test passed 65C448FC 000.01s Basic definitions for tests passed D6767FE8 000.00s Basic checks passed 199FEF57 000.00s Command checks passed DF81228B 000.01s Command checks 2 passed 4D8CF3D3 000.01s Compare check passed 724132E3 000.00s Key response check passed 600E00ED 000.01s Log all commands applied to an Ecu passed 7C72DF5F 000.00s Trace all commands applied to an Ecu passed 5B9C2046 000.01s Generate supported responses of an Ecu passed BD290B6E 000.06s Analyze multiple UDS messages passed 46221B18 000.06s Analyze on the fly with EcuSession passed 686082F4 000.06s Analyze on the fly with EcuSession GMLAN1 passed E398A733 000.15s Analyze on the fly with EcuSession GMLAN logging test Campaign CRC=DEB22BB9 in 000.48s SHA=614D7BA5F336CA65EAFFBC2ECD6B611608D9A3BB PASSED=31 FAILED=0 ━ Loading: test/contrib/automotive/ecu_am.uts passed BF957852 000.00s Imports passed 97D487E8 000.00s Load contribution layer passed D2D3C534 000.03s Simple check with RDBI and Negative Response passed 86000BD2 000.05s Simple check with different Sessions passed 8263A7BD 000.11s Simple check with different Sessions and diagnosticSessionControl passed A93C9EDD 000.10s Simple check with different Sessions and diagnosticSessionControl and answers hook passed B12D5794 000.05s Simple check with security access and answers hook passed F0EF20A5 001.02s Simple check with security access and answers hook and request-correctly-received message passed 724037B1 001.17s Simple check with security access and answers hook and request-correctly-received message 2 passed AE223815 000.00s Delete TestSockets Campaign CRC=91288878 in 002.53s SHA=E44B5D34AD61C8FF6E7B4A5F179F01A35D2B842B PASSED=10 FAILED=0 ━ Loading: test/contrib/automotive/kwp.uts passed DD2B38E9 000.01s Load module passed B7A8A0F2 000.00s Check if positive response answers passed 4FF2C0C6 000.00s Check hashret passed BDEEDFD9 000.00s Check if negative response answers passed 94EBFE4D 000.00s CHECK hashret NEG passed 855A269C 000.00s Check if negative response answers passed 94EBFE4D 000.00s CHECK hashret NEG passed 27430AD9 000.00s Check if negative response answers not passed 171C8A52 000.00s Check if positive response answers not passed 757FFD7A 000.00s Check KWP_SDS passed 9A8F6308 000.00s Check KWP_SDS passed 81306650 000.00s Check KWP_SDSPR passed 78CA8729 000.00s Check KWP_SDSPR passed 9A8F6308 000.00s Check KWP_SDS passed 78CA8729 000.00s Check KWP_SDSPR passed 950DED2B 000.00s Check KWP_ER passed 52E9868B 000.00s Check KWP_ER passed B74CE32D 000.00s Check KWP_ERPR passed 80886A28 000.00s Check KWP_SA passed F856E57B 000.00s Check KWP_SAPR passed F9BAC9C3 000.01s Check KWP_SA passed FFE9B30C 000.00s Check KWP_SAPR passed 80886A28 000.00s Check KWP_SA passed 9237BD4F 000.00s Check KWP_SA passed 13889602 000.00s Check KWP_SAPR passed 340BA94F 000.01s Check KWP_DNT passed 30F05E53 000.00s Check KWP_DNMTPR passed 88FBE546 000.00s Check KWP_DNMTPR passed 51C91A0A 000.00s Check KWP_TP passed 7A4C0604 000.00s Check KWP_TPPR passed 39D1C80E 000.01s Check KWP_CDTCS passed 8F022E4B 000.00s Check KWP_CDTCSPR passed FD7C3D91 000.00s Check KWP_ROE passed A6676627 000.00s Check KWP_ROEPR passed A31E3853 000.00s Check KWP_RDBI passed EF900EA2 000.00s Build KWP_RDBI passed F3A82B1C 000.00s Check KWP_RDBI2 passed DDA85DC5 000.00s Build KWP_RDBI2 passed F93737A2 000.00s Test observable dict used in KWP_RDBI, setter passed F6033BB1 000.00s Test observable dict used in KWP_RDBI, deleter passed CF27B844 000.00s Check KWP_RDBIPR passed F9C99843 000.00s Check KWP_RMBA passed 034F81E3 000.00s Check KWP_RMBAPR passed 8F700FF5 000.00s Check KWP_DDLI passed E6A345C4 000.00s Check KWP_DDLIPR passed FDAA7D04 000.00s Check KWP_WDBI passed 5B4F1973 000.00s Build KWP_WDBI passed 57A528B7 000.00s Check KWP_WDBI passed 3BFC1047 000.00s Check KWP_WDBIPR passed C51ACE49 000.00s Check KWP_WMBA passed EE0E9818 000.00s Check KWP_WMBAPR passed E3FE2EFA 000.00s Check KWP_CDI passed E7021100 000.00s Check KWP_RC passed E7021100 000.00s Check KWP_RC passed 4F0D28F1 000.00s Check KWP_RCPR passed 2B4FBBAE 000.00s Check KWP_RD passed 47747A7E 000.00s Check KWP_RDPR passed 8D3AEDFE 000.00s Check KWP_RU passed F09D26C0 000.00s Check KWP_RUPR passed 1DB4FE15 000.00s Check KWP_TD passed 890E798A 000.00s Check KWP_TDPR passed 1E14D304 000.00s Check KWP_RTE passed 8F36BA62 000.00s Check KWP_RTEPR passed 49BCFD2D 000.00s Check KWP_IOCBI passed 023F9058 000.00s Check KWP_IOCBIPR passed 49B5091D 000.00s Check KWP_NRC Campaign CRC=956BDA4F in 000.20s SHA=3D0240FDED2B6D69E8D22A7181034B9ACD942927 PASSED=66 FAILED=0 ━ Loading: test/contrib/automotive/someip.uts passed D3DDC383 000.01s Load module passed 001AF1CE 000.00s Basic build passed 670399DA 000.00s Build with empty payload passed 75CD9EE4 000.00s Build with non-empty payload passed 8371D498 000.00s Dissect EVENT_ID packet passed 68D13E49 000.00s Dissect METHOD_ID packet passed 9C8926FB 000.01s Build TP passed C1C059FC 000.00s Dissect TP passed 2BE5C2B7 000.00s Build TP fragmented passed 06B15714 000.00s Check packet length on empty build passed 017C6714 000.00s Build 1 passed D4E65713 000.01s Build 2 passed BD40FA07 000.00s Dissect passed 04A61261 000.01s Check packet length on empty build passed 02543CE6 000.00s Build passed A6CE6954 000.00s Dissect passed 1A6C4B15 000.00s Build and check flags passed EF0A42AA 000.00s Build empty passed 0881530C 000.00s Verify constants against spec TR_SOMEIP_00250 passed 2742E34E 000.00s check that values are bound passed D1AECB23 000.00s Check length of package without entries nor options passed 156FB2EF 000.01s Check entries to array and size check passed 7DF7D145 000.00s Check Options to array and size check passed B49C2B1F 000.01s Check Entries & Options to array and size check passed 7A30ECD4 000.01s Single SD entry passed BC9F5243 000.00s Double SD entry passed 31E54F96 000.00s Flipped double SD entry passed 6A1652DA 000.00s Verifying constants against spec passed D93E98FF 000.00s SDOption_Config: Verify make_string() method from dict passed BC54E41F 000.00s SDOption_Config: Verify make_string() method from list passed 7739E3C4 000.00s SDOption_Config: Build and dissect empty passed 941A41B8 000.00s SDOption_Config: Build and dissect spec example passed 0C496D9E 000.00s SDOption_Config: Build and dissect fully populated passed 5D90D021 000.00s SDOption_LoadBalance: Build and dissect empty passed C10CBB81 000.00s SDOption_LoadBalance: Build and dissect example passed B8CE04B8 000.00s SDOption_LoadBalance: Build and dissect fully populated passed 82358F6B 000.00s SDOption_IP4_EndPoint: Build and dissect empty passed EAC3E0D8 000.01s SDOption_IP4_EndPoint: Build and dissect example passed A2F0DD58 000.00s SDOption_IP4_EndPoint: Build and dissect fully populated passed BCD35C6D 000.00s SDOption_IP4_Multicast: Build and dissect empty passed 4120291E 000.00s SDOption_IP4_Multicast: Build and dissect example passed 25BE3326 000.00s SDOption_IP4_Multicast: Build and dissect fully populated passed 0E146553 000.00s SDOption_IP4_SD_EndPoint: Build and dissect empty passed 0E2B4F1D 000.00s SDOption_IP4_SD_EndPoint: Build and dissect example passed 17FF2870 000.01s SDOption_IP4_SD_EndPoint: Build and dissect fully populated passed 1E6827F2 000.00s SDOption_IP6_EndPoint: Build and dissect empty passed 4771AF05 000.00s SDOption_IP6_EndPoint: Build and dissect example passed E64E3C03 000.00s SDOption_IP6_EndPoint: Build and dissect fully populated passed A4C21554 000.00s SDOption_IP6_Multicast: Build and dissect empty passed FB1F167B 000.00s SDOption_IP6_Multicast: Build and dissect example passed 03A5E0EE 000.00s SDOption_IP6_Multicast: Build and dissect fully populated passed 15F1D8B0 000.00s SDOption_IP6_SD_EndPoint: Build and dissect empty passed FDE4C037 000.00s SDOption_IP6_SD_EndPoint: Build and dissect example passed 96047172 000.00s SDOption_IP6_SD_EndPoint: Build and dissect fully populated passed 8313D743 000.05s verify building and parsing of multiple SDOptions passed 19E7AE68 000.00s build test SOMEIP/TP Campaign CRC=C62A9AAA in 000.26s SHA=1A912E73753E2B2F9E2B18C42B3A1FA499FA6C17 PASSED=56 FAILED=0 ━ Loading: test/contrib/automotive/testsocket.uts passed BF957852 000.00s Imports passed E0324C0D 000.01s Create Dummy Packet passed 4C3D063D 000.00s Create Sockets passed FDD6F60D 000.84s Simple ping pong passed 11C2B631 000.27s Simple ping pong with sr with packet generator 500 passed CC06CAB8 000.64s Simple ping pong with sr with generated packets passed AE223815 000.00s Delete TestSockets Campaign CRC=F0CF66D5 in 001.76s SHA=01BA4BD2248677E1DF0BCB747C4FF4C41BCC1776 PASSED=7 FAILED=0 ━ Loading: test/contrib/automotive/uds.uts passed ACD47BA2 000.00s Load module passed C7D2AC0C 000.00s Check if positive response answers passed 340037BC 000.00s Check hashret passed 43DCB04B 000.00s Check if negative response answers passed 3ED43E1F 000.00s CHECK hashret NEG passed 4C398BF3 000.00s Check if negative response answers not passed FAC3603E 000.00s Check if positive response answers not passed 372D2CC3 000.00s Check UDS_DSC passed 87E8A7A5 000.00s Check UDS_DSC passed 8DA1C985 000.00s Check UDS_DSCPR passed 9F718B9E 000.00s Check UDS_DSCPR passed 87E8A7A5 000.00s Check UDS_DSC passed 9F718B9E 000.00s Check UDS_DSCPR passed EE48C792 000.00s Check UDS_DSC modifies ecu state passed 0071A548 000.00s Check UDS_DSCPR modifies ecu state passed 660C0D62 000.00s Check UDS_ER passed 7D2A53B6 000.00s Check UDS_ER passed 6EA462B3 000.00s Check UDS_ERPR passed 78D15F31 000.00s Check UDS_ERPR passed 7C40B3A1 000.00s Check UDS_ERPR modifies ecu state passed 1D333CB9 000.00s Check UDS_SA passed 05D89D30 000.00s Check UDS_SAPR passed 532C308A 000.00s Check UDS_SA passed DFA23D54 000.00s Check UDS_SAPR passed 2C3B44E6 000.00s Check UDS_SA passed 4A098C15 000.00s Check UDS_SAPR modifies ecu state passed 532C308A 000.00s Check UDS_SA passed B8E69FD0 000.00s Check UDS_SAPR passed 3997C1BD 000.00s Check UDS_CC passed E2B733EB 000.00s Check UDS_CCPR passed 969D0D4B 000.00s Check UDS_CCPR modifies ecu state passed 92248607 000.00s Check UDS_AUTH passed 2F27C96A 000.00s Build UDS_AUTH passed 2B06843E 000.00s Check UDS_AUTHPR passed 65A024C2 000.00s Build UDS_AUTHPR passed F5F146A2 000.00s Check UDS_AUTH passed 57BEB85C 000.00s Build UDS_AUTH passed F7DA5182 000.00s Check UDS_AUTHPR passed 3F4A5CD5 000.00s Build UDS_AUTHPR passed 5E808F4E 000.00s Check UDS_AUTH passed 4A17C2D0 000.00s Build UDS_AUTH passed D4CC6314 000.00s Check UDS_AUTHPR passed 720B7D53 000.00s Build UDS_AUTHPR passed 18E95B16 000.00s Check UDS_AUTH passed 7C2D9304 000.00s Build UDS_AUTH passed 58AAB578 000.00s Check UDS_AUTHPR passed B80AB61C 000.00s Build UDS_AUTHPR passed B6031973 000.00s Check UDS_AUTH passed 4A77E05F 000.00s Build UDS_AUTH passed 9C5EC70E 000.00s Check UDS_AUTHPR passed FC1C89F3 000.01s Build UDS_AUTHPR passed FA8D340B 000.00s Check UDS_AUTH passed 092DF1CC 000.00s Build UDS_AUTH passed AAADDAD3 000.00s Check UDS_AUTHPR passed A498F9AF 000.00s Build UDS_AUTHPR passed 5EB6CB48 000.00s Check UDS_AUTH passed 85370993 000.00s Build UDS_AUTH passed AC0748F2 000.00s Check UDS_AUTHPR passed 3FCDAD93 000.00s Build UDS_AUTHPR passed E2C96FDB 000.00s Check UDS_AUTH passed 581F431F 000.00s Build UDS_AUTH passed AC086813 000.00s Check UDS_AUTHPR passed 8A49B5D1 000.00s Build UDS_AUTHPR passed 2C771E72 000.00s Check UDS_AUTH passed 26BCFDDD 000.00s Build UDS_AUTH passed 9EC7041F 000.00s Check UDS_AUTHPR passed 596B1E97 000.00s Build UDS_AUTHPR passed DDD94981 000.00s Check UDS_TP passed F07B90A6 000.00s Check UDS_TPPR passed 97F78D2C 000.00s Check UDS_ATP passed 85E3F3A1 000.00s Check UDS_ATPPR passed B54B225A 000.00s Check UDS_ATP passed 21F8D3E8 000.00s Check UDS_ATPPR passed 544E32BE 000.01s Check UDS_SDT passed E4DB7501 000.00s Build UDS_SDT passed 12B13532 000.00s Check UDS_SDTPR passed E2420EAF 000.00s Check UDS_CDTCS passed 4E7460D1 000.00s Check UDS_CDTCSPR passed 6A13F6E2 000.00s Check UDS_ROE passed 8D73CF44 000.00s Check UDS_ROEPR passed 8878F8B9 000.00s Check UDS_LC passed 14D50855 000.00s Check UDS_LCPR passed 2D869102 000.00s Check UDS_LC passed B7D682C6 000.00s Check UDS_RDBI passed 818A9F12 000.00s Build UDS_RDBI passed 172207C8 000.00s Check UDS_RDBI2 passed DD2B8093 000.00s Build UDS_RDBI2 passed 4CA6FC9B 000.00s Test observable dict used in UDS_RDBI, setter passed 443FFCD7 000.00s Test observable dict used in UDS_RDBI, deleter passed E5814EC8 000.00s Check UDS_RDBIPR passed 9DD68265 000.00s Check UDS_RMBA passed F1907B0D 000.00s Check UDS_RMBA passed 84F6FA60 000.00s Check UDS_RMBA passed 0D2479F2 000.00s Check UDS_RMBA passed B441AEC5 000.00s Check UDS_RMBAPR passed 4846774A 000.00s Check UDS_RSDBI passed 704CCE5E 000.00s Check UDS_RSDBIPR passed 3B1AE612 000.00s Check UDS_RSDBPI passed CECD6BC7 000.00s Check UDS_RSDBPIPR passed DD7FF8CE 000.00s Check UDS_RSDBPIPR passed 7AD6277D 000.00s Check UDS_DDDI passed B9494CED 000.00s Check UDS_DDDIPR passed F85A34AA 000.00s Check UDS_WDBI passed 2115A330 000.00s Build UDS_WDBI passed 5CD87E17 000.00s Check UDS_WDBI passed AE3CBFCE 000.00s Check UDS_WDBIPR passed 636A651D 000.00s Check UDS_WMBA passed 8697B783 000.00s Check UDS_WMBAPR passed B346F7D4 000.00s Check UDS_WMBA passed E5C1AB9D 000.00s Check UDS_WMBAPR passed 05B27007 000.00s Check UDS_WMBA passed 910979C5 000.00s Check UDS_WMBA passed 86E7BBC9 000.00s Check UDS_WMBAPR passed 69F5D3CE 000.00s Check UDS_WMBAPR passed A48F6457 000.00s Check UDS_CDTCI passed C5B2900D 000.00s Check UDS_RDTCI passed 444B5FE2 000.00s Check UDS_RDTCI passed 48EA25F1 000.01s Check UDS_RDTCIPR passed 39C75A41 000.00s Check UDS_RDTCI passed 268596E7 000.00s Check UDS_RDTCI passed C8058810 000.00s Check UDS_RDTCI passed B5898DB3 000.00s Check UDS_RDTCI passed 28228CED 000.00s Check UDS_RDTCI passed A7184E03 000.01s Check UDS_RDTCI passed 9D39ABB9 000.00s Check UDS_RDTCI passed 9FDA439B 000.00s Check UDS_RDTCI passed 47E44206 000.01s Check UDS_RDTCI passed A5A8E72E 000.00s Check UDS_RDTCI passed C334C3A9 000.00s Check UDS_RDTCI passed E203DB5E 000.00s Check UDS_RDTCI passed 9EDBE5DE 000.00s Check UDS_RDTCI passed 18281FBF 000.00s Check UDS_RDTCIPR passed 6A7CAADB 000.00s Check UDS_RDTCIPR passed A9620E76 000.03s Check UDS_RDTCIPR 2 passed CA677F72 000.00s Check UDS_RC passed CA677F72 000.00s Check UDS_RC passed E07A4854 000.00s Check UDS_RCPR passed A0E9FD10 000.00s Check UDS_RD passed 8BD92731 000.00s Check UDS_RD passed 1585E341 000.00s Check UDS_RD passed C9371D4B 000.00s Check UDS_RD passed 76505115 000.00s Check UDS_RDPR passed 44842A6C 000.00s Check UDS_RU passed CA8C839D 000.00s Check UDS_RU passed 164DFDDB 000.00s Check UDS_RU passed C7160390 000.00s Check UDS_RU passed 01E9A645 000.00s Check UDS_RUPR passed 802F6373 000.00s Check UDS_TD passed 802F6373 000.00s Check UDS_TD passed 40A5D5FF 000.00s Check UDS_TDPR passed B53AFA45 000.00s Check UDS_RTE passed 1E26FA61 000.00s Check UDS_RTEPR passed 2B1F1387 000.00s Check UDS_IOCBI passed EF0034A3 000.00s Check UDS_RFT passed 9B9A78F4 000.00s Build UDS_RFT passed F2DE154C 000.00s Check UDS_RFTPR passed F22BC6DC 000.00s Build UDS_RFTPR passed FD1AD14A 000.00s Check (invalid) UDS_NRC, no reply-to service passed 347BF383 000.00s Check UDS_NRC Campaign CRC=74386925 in 000.39s SHA=17599CB968F1B8D873BAD4D5C92C93CBFFFB1095 PASSED=159 FAILED=0 ━ Loading: test/contrib/automotive/obd/obd.uts passed 86B3692B 000.04s Load module passed 09631DE9 000.00s Check if positive response answers passed 99E8D9F9 000.00s Check hashret passed C86B7A3A 000.00s Check if negative response answers passed E06C458E 000.00s Check if negative response request_correctly_received_response_pending answers not passed 08F48011 000.00s Check if negative response request_correctly_received_response_pending answers passed 99E8D9F9 000.00s Check hashret passed EFA2CB3C 000.00s Check hashret for Service 0x40 passed 2215B603 000.00s Check hashret for Service 0x51 passed 028A2E01 000.00s Check dissecting a request for Service 01 PID 00 passed 8B5551B7 000.00s Check dissecting a request for Service 01 PID 75 passed 18EFCB98 000.00s Check dissecting a request for Service 01 PID 78 passed 2F686BCD 000.00s Check dissecting a request for Service 01 PID 7F passed 62E182C0 000.00s Check dissecting a request for Service 01 PID 89 passed 70BB9AA7 000.00s Check dissecting a request for Service 02 PID 00 passed 29D68AD8 000.00s Check dissecting a request for Service 02 PID 75 passed F2BBD2A0 000.00s Check dissecting a request for Service 02 PID 78 passed 6FF03E8E 000.00s Check dissecting a request for Service 02 PID 7F passed 76693B81 000.00s Check dissecting a request for Service 02 PID 89 passed 2F992FEB 000.00s Check dissecting a request for Service 03 passed 53B22920 000.00s Check dissecting a request for Service 06 passed 4D79E5BB 000.00s Check dissecting a request for Service 06 MID 00 passed 544688DB 000.00s Check dissecting a request for Service 06 MID 00,01,02,03,04 passed 416D7934 000.00s Check dissecting a response for Service 06 MID 00 passed 2D22B64B 000.00s Check dissecting a response for Service 06 MID 00 and MID 20 passed 5E82023D 000.01s Check dissecting a response for Service 06 MID 00, 20, 40, 60, 80, A0 passed 4F23256B 000.01s Check dissecting a response for Service 06 MID 01 passed E13A3385 000.01s Check dissecting a response for Service 06 MID 21 passed 0ACDE022 000.00s Check dissecting a request for Service 09 IID 00 passed 375A7914 000.00s Check dissecting a request for Service 09 IID 02 passed 71E2D24E 000.00s Check dissecting a request for Service 09 IID 04 passed FFCD39F1 000.00s Check dissecting a request for Service 09 IID 00 and IID 02 and IID 04 passed 9367436E 000.00s Check dissecting a request for Service 09 IID 0A passed 30090832 000.01s Check dissecting a response for Service 01 PID 75 passed 12A9A014 000.00s Check dissecting a response for Service 01 PID 00 and PID 20 passed 35060A7A 000.01s Check dissecting a response for Service 01 PID 05,01,15,0C,03 passed 3A660814 000.00s Check dissecting a response for Service 01 PID 78 passed 6D79E9B2 000.00s Check dissecting a response for Service 01 PID 7F passed AA5662FA 000.00s Check dissecting a response for Service 01 PID 89 passed CEF02CD7 000.00s Check dissecting a response for Service 02 PID 75 passed 55A36096 000.00s Check dissecting a response for Service 02 PID 78 passed B0AAE196 000.00s Check dissecting a response for Service 02 PID 7F passed 7A2584DE 000.00s Check dissecting a response for Service 02 PID 89 passed 3D21C643 000.00s Check dissecting a response for Service 02 PID 0C, 05, 04 passed E3BFFB8D 000.00s Check dissecting a response for Service 03 passed 29E7ACFA 000.00s Check dissecting a response for Service 07 passed 7E4975EA 000.00s Check dissecting a response for Service 08 Tid 00 passed 9991DC14 000.00s Check dissecting a response for Service 08 Tid 01 passed 66EA0DD4 000.00s Check dissecting a response for Service 08 Tid 05 passed 1BB19F97 000.00s Check dissecting a response for Service 08 Tid 09 passed 098B43D5 000.00s Check dissecting a response for Service 09 IID 00 passed 00068ABA 000.00s Check dissecting a response for Service 09 IID 02 with one VIN passed 29317CB3 000.00s Check dissecting a response for Service 09 IID 02 with two VINs passed B2393F06 000.00s Check dissecting a response for Service 09 IID 04 with one CID passed A5656F3E 000.00s Check dissecting a response for Service 09 IID 04 with two CID passed 10FA3EF2 000.00s Check dissecting a response for Service 09 IID 06 passed 3BF4C16B 000.00s Check dissecting a response for Service 09 IID 08 passed A1025ABB 000.00s Check dissecting a response for Service 09 IID 0A passed 0F7E79AC 000.00s Check dissecting a response for Service 09 IID 0B passed 900FC324 000.00s Check dissecting a response for Service 09 IID 02 and IID 04 passed 33F470F1 000.00s Check building a request for Service 01 PID 00 passed 83F1C490 000.00s Check building a request for Service 01 PID 75 passed 04FB2BD6 000.00s Check building a request for Service 01 PID 78 passed 2C15104C 000.00s Check building a request for Service 01 PID 7F passed 9265286B 000.00s Check building a request for Service 01 PID 89 passed EA4A98EC 000.00s Check building a request for Service 02 PID 00 passed 5AE576C3 000.00s Check building a request for Service 02 PID 75 passed 4FFDAFCD 000.00s Check building a request for Service 02 PID 78 passed F0871DD4 000.00s Check building a request for Service 02 PID 7F passed D44AF663 000.00s Check building a request for Service 02 PID 89 passed 103D9166 000.00s Check building a request for Service 03 passed F0871DD4 000.00s Check building a request for Service 02 PID 7F passed 98D0779A 000.00s Check building a request for Service 09 IID 00 passed 7043B695 000.00s Check building a request for Service 09 IID 02 passed 9286F3C5 000.00s Check building a request for Service 09 IID 04 passed 7C644169 000.00s Check building a request for Service 09 IID 00 and IID 02 and IID 04 passed DFA76249 000.00s Check building a request for Service 09 IID 0A passed 9057F79F 000.00s Check building a response for Service 03 passed 24983FA6 000.00s Check building a default response for Service 03 passed B809EBAA 000.00s Check building a response for Service 07 passed 2DF1F17D 000.00s Check building a default response for Service 07 passed 4B6D2A63 000.00s Check building a response for Service 0A passed 3704F777 000.01s Check building a default response for Service 0A passed 1191C579 000.00s Check building a response for Service 09 IID 00 passed EAB7FC32 000.01s Check building a response for Service 09 IID 02 with one VIN passed 0AE26D94 000.00s Check building a response for Service 09 IID 02 with two VINs passed B46615E7 000.00s Check building a response for Service 09 IID 04 with one CID passed 694755B4 000.01s Check building a response for Service 09 IID 04 with two CID passed 8A260EFB 000.00s Check building a response for Service 09 IID 0A passed 0B4324F3 000.00s Check building a response for Service 09 IID 02 and IID 04 Campaign CRC=CCEA840D in 000.31s SHA=F8B895F9F80A34674E7A0E01916179B3542B243F PASSED=90 FAILED=0 ━ Loading: test/contrib/automotive/obd/scanner.uts Campaign CRC=206C5E5D in 000.00s SHA=14D1D6C5A498B0189C5C24FDA01E523201FC53A1 PASSED=0 FAILED=0 ━ Loading: test/contrib/automotive/scanner/configuration.uts passed 09267931 000.00s Load contribution layer passed 60ABD021 000.00s Definition of Test classes passed 9F723DD0 000.00s creation of config with classes passed 8AFD9038 000.00s creation of config with instances passed B468D37E 000.00s creation of config with instances and classes passed C3DD28F1 000.00s creation of config with instances and classes and global configuration and local configuration passed C0F660F6 000.00s creation of config with stages passed DDE0A351 000.00s creation of config with stages class Campaign CRC=FD22C99B in 000.02s SHA=FD5A6097B821A5E8B02403A886F3BC49326775CA PASSED=8 FAILED=0 ━ Loading: test/contrib/automotive/scanner/enumerator.uts passed F28BDAD7 000.00s Load contribution layer passed 071FB019 000.02s ServiceEnumerator basecls checks passed C9D0A14B 000.00s ServiceEnumerator not completed check passed F8EBACA1 000.00s ServiceEnumerator completed passed 01F4D2F4 000.00s ServiceEnumerator stats check passed CEB1EC55 000.00s ServiceEnumerator scanned states passed 67CE1DDE 000.00s ServiceEnumerator scanned results passed 57330AE1 000.00s ServiceEnumerator get_label passed 0563CC73 000.01s ServiceEnumerator show passed A953C35E 000.00s ServiceEnumerator filtered results before show passed 58DB2D48 000.01s ServiceEnumerator show filtered passed E7659DBF 000.00s ServiceEnumerator filtered results after show passed E8C489BD 000.00s ServiceEnumerator supported responses passed 7D7ADB54 000.01s ServiceEnumerator evaluate response passed A69A582D 000.16s ServiceEnumerator execute passed A7D8147E 000.01s Test negative response code service not supported passed AE2BBC67 000.10s Test negative response code retry if busy passed 7C777AC4 000.10s Test negative response code don't retry if busy passed DC5B668B 000.01s Test execution time passed 083DE3A7 000.00s Definitions passed 2B91344F 000.01s Basic tests passed F807C382 000.00s Basic tests with default values passed 3100F2C4 000.00s Basic test with stages passed 75D9FE7F 000.01s Basic tests with two stages passed 30B776C3 000.00s Reset Handler tests passed 0E74913D 000.00s Reset Handler tests 2 passed D4AE2482 000.01s Reconnect Handler tests passed 8BB67759 000.00s Reconnect Handler tests 2 passed 4716493D 000.01s TestCase execute passed 09E11BD7 000.01s TestCase execute StateGenerator passed EAC6CF3A 000.00s TestCase execute StateGenerator no edge passed C8F7EA09 000.01s TestCase execute StateGenerator with cleanupfunc passed 8B94E799 000.01s TestCase execute StateGenerator with not callable cleanupfunc passed 6DEC725C 000.01s TestCase execute StateGenerator with cleanupfunc negative return passed 02AECA94 000.02s TestCase execute StateGenerator with cleanupfunc and path passed 060AECAF 000.01s Test downrate edge passed 23C3F1AE 000.02s TestCase execute TestCaseGenerator passed BA959E75 000.01s TestCase scan timeout passed CEFE4823 000.01s TestCase scan passed D60A8D7F 000.02s Test supported responses passed B6AAF471 000.00s Test show testcases passed 921B020F 000.01s Test StateGeneratingServiceEnumerator Campaign CRC=6A04A130 in 000.67s SHA=40AA56D097BF610773367C706D2CA44F7B683C02 PASSED=42 FAILED=0 ━ Loading: test/contrib/automotive/scanner/graph.uts passed 8A70A10D 000.00s Load contribution layer passed 656E2A91 000.00s Basic test passed 8B545210 000.00s Shortest path test passed 283DF909 000.00s graph add transition function passed 39D6684B 000.00s graph pickle Campaign CRC=5809081D in 000.02s SHA=CA81534DAD431B57C43DAB947137F4C4C37E9221 PASSED=5 FAILED=0 ━ Loading: test/contrib/automotive/scanner/staged_test_case.uts passed 8524E5AE 000.00s Load contribution layer passed B8CA1B31 000.01s Definition of Test classes passed 965F3D5B 000.00s Create instance of stage test passed DA7DE0BE 000.01s Check completion passed 6211ADC8 000.01s Check completion 2 passed 0C8DA98B 000.01s Check supported responses passed CE10140E 000.01s Check connector passed BA45360F 000.00s Check show passed 930865F9 000.00s Check len passed A32FAA08 000.00s Check generator functions Campaign CRC=F67EAA6D in 000.05s SHA=B30E4175582797B7436F14A56A33E8991824FB8D PASSED=10 FAILED=0 ━ Loading: test/contrib/automotive/scanner/test_case.uts passed A7876863 000.00s Load contribution layer passed A08A483F 000.00s Definition of Test class passed 01FFDA36 000.00s Check supported kwargs passed 7E43CEFF 000.00s Create instance of test class passed E00C367A 000.00s Tests of has_completed passed E903E00B 000.00s Tests of has_completed with new state passed 420DE033 000.00s Tests of completed passed 75E17155 000.00s Test of show Campaign CRC=70F78977 in 000.01s SHA=A8562E06702D73F2E2963204E10D1EE4B7500E05 PASSED=8 FAILED=0 ━ Loading: test/contrib/automotive/scanner/uds_scanner.uts Campaign CRC=8478E23D in 000.00s SHA=1F1A843711D018E8244795B9AD6EDF0CED4852D5 PASSED=0 FAILED=0 ━ Loading: test/contrib/automotive/gm/gmlan.uts passed F2394054 000.00s Load gmlan layer passed 4D1A1B99 000.00s Set GMLAN ECU AddressingScheme passed 58F0CBC4 000.00s Craft Packet passed D92AF7EC 000.00s Craft VIN Packet passed C8931BD6 000.00s Test Packet with ECU AddressingScheme2 passed E5D4D950 000.00s Test Packet GMLAN_RMBAPR with ECU AddressingScheme2 passed C375A45A 000.00s Craft Packet with ECU AddressingScheme2 passed 21ACA3EA 000.00s Test Packet with ECU AddressingScheme3 passed E810E48C 000.00s Test Packet GMLAN_RMBAPR with ECU AddressingScheme3 passed 54A48BFE 000.00s Craft Packet with ECU AddressingScheme3 passed 82D1A4EE 000.00s Test Packet with ECU AddressingScheme4 passed F800B37E 000.00s Test Packet GMLAN_RMBAPR with ECU AddressingScheme4 passed 15E9D55D 000.01s Craft Packet with ECU AddressingScheme4 passed EA7690DA 000.00s Craft Packet for RequestDownload2 passed F94CF433 000.01s Craft Packet for RequestDownload3 passed C2F663A2 000.00s Craft Packet for RequestDownload4 passed 1858C378 000.00s Craft Packet for RFRD1 passed 582B5F1C 000.00s Craft Packet for RFRD2 passed 52510EA6 000.01s Craft Packet for RFRDPR_RFRI passed 674C2FDB 000.01s Craft Packet for RFRDPR_RFRI passed A274DB37 000.00s Craft Packet for RFRDPR_RFRP passed CF6A5524 000.00s Craft Packet for RDBI passed 99982932 000.00s Craft Packet for RDBIPR passed 11EA7370 000.00s Craft Packet for RDBPI passed 4C9F050E 000.00s Craft Packet for RDBPIPR passed E6A9A0C7 000.00s Craft Packet for GMLAN_RDBPKTI1 passed FD51D8D0 000.00s Craft Packet for GMLAN_RDBPKTI3 passed 42D6F2E2 000.01s Craft Packet for GMLAN_RDBPKTI4 passed 3EC8A404 000.00s Craft Packet for GMLAN_RDBPKTI2 passed F7D21E89 000.00s Build GMLAN_RDBPKTI1 passed F58F36FB 000.00s Craft Packet for GMLAN_SA1 passed 6D5011C4 000.00s Craft Packet for GMLAN_SA2 passed 4877ED60 000.00s Craft Packet for GMLAN_SAPR1 passed D4C21FEB 000.00s Craft Packet for GMLAN_SAPR2 passed CEAE6C69 000.00s Craft Packet for GMLAN_DDM passed F62D03B2 000.00s Craft Packet for GMLAN_DDMPR passed 12265B47 000.01s Craft Packet for GMLAN_DPBA1 passed 905A8B6A 000.00s Craft Packet for GMLAN_DPBA2 passed AB9D1930 000.00s Craft Packet for GMLAN_DPBA3 passed 8ACD8C5B 000.00s Craft Packet for GMLAN_DPBAPR passed 25A90E0D 000.00s Craft Packet for GMLAN_RD1 passed 5335EE99 000.00s Craft Packet for GMLAN_RD2 passed DEDA4E18 000.00s Craft Packet for GMLAN_RD3 passed 267CDEFC 000.00s Craft Packet for GMLAN_TD1 passed 9956234D 000.00s Craft Packet for GMLAN_TD2 passed CA3253DF 000.00s Craft Packet for GMLAN_TD3 passed 362FCE5A 000.00s Craft Packet for WDBI passed E95808D4 000.00s Craft Packet for WDBIPR passed 6944176B 000.00s Craft Packet for RPSPR passed 98AAF4AF 000.00s Craft Packet for PM passed 1BF06A65 000.00s Craft Packet for RDI passed E3E3E68B 000.00s Craft Packet for RDI_BN passed DCAF0B43 000.00s Craft Packet for RDI_BM1 passed 5C79D869 000.00s Craft Packet for RDI_BM2 passed 8A3A66FD 000.00s Craft Packet for NR passed A5641895 000.00s Check not answers passed 4B65CCE6 000.00s Check answers 1 passed 68DFC885 000.00s Set treat-response-pending-as-answer passed 6AF7A292 000.00s Check response-pending is not considered as answer passed 78C00978 000.00s Check response-pending is considered as answer passed F8517E36 000.00s Check hashret 1 passed 315E92A3 000.00s Check answers 2 passed 4140D313 000.00s Check hashret 2 passed 096744DC 000.01s Check modifies ecu state passed D8735CF1 000.01s Craft GMLAN_DC passed 1658184D 000.00s Dissect test GMLAN_DC passed 982D5430 000.02s Logging tests Campaign CRC=BF7EAC87 in 000.17s SHA=89682F3970D9BABBFCA137D2A3EECBDF18AA2987 PASSED=67 FAILED=0 ━ Loading: test/contrib/automotive/gm/gmlanutils.uts Campaign CRC=E53E94DD in 000.00s SHA=6285EF81DE79F30422BFF858BE1AD196F0F71E56 PASSED=0 FAILED=0 ━ Loading: test/contrib/automotive/gm/scanner.uts Campaign CRC=3EFBE137 in 000.00s SHA=7DCAD467BCABE140D8C5CE9F0459B3F0020CF3FD PASSED=0 FAILED=0 ━ Loading: test/contrib/automotive/bmw/hsfz.uts passed C56FF620 000.00s Load Contrib Layer passed A440F4A6 000.00s Basic Test 1 passed D7747233 000.00s Basic Test 2 passed 6E772CB4 000.00s Basic Dissect Test passed 2ACA6F28 000.00s Build Test passed 5C665B2A 000.00s Dissect Test passed 433C53FB 000.00s Dissect Test with padding passed 29DF489E 000.00s Dissect Test to short packet passed 4CF7CEB7 000.00s Dissect Test very long packet passed 7B32E338 000.00s Dissect identification passed 51ED98C3 000.11s Test HSFZSocket Campaign CRC=52AA7B32 in 000.15s SHA=00BD356F2CD969FAFC85D159CDC869CE37591B1D PASSED=11 FAILED=0 ━ Loading: test/contrib/automotive/xcp/xcp.uts passed 0B97782B 000.02s Load module passed DBB392DA 000.00s Test padding passed 45448FEE 000.01s test_get_com_mode_info passed EDF7DB7F 000.01s test_get_status passed FE341520 000.01s test_get_seed passed D3B7DB05 000.01s test_unlock passed FAB931CD 000.01s test_get_id passed E5981158 000.01s test_upload passed 8CD1E8E0 000.01s test_cal_page passed 20706642 000.00s test_set_mta passed 1D7538F5 000.01s test_build_checksum passed 165AF40F 000.00s test_download passed 03986164 000.01s test_short_upload passed CA56518F 000.00s test_copy_cal_page passed A3F18ED4 000.01s test_get_daq_processor_info passed 3445BBF8 000.00s test_daq_resolution_info passed 27B66598 000.01s test_daq_event_info passed 7B83627E 000.00s test_daq_list_info passed 4C749C30 000.00s test_clear_daq_list passed C04ADA41 000.00s test_alloc_daq passed 1DDCFCBF 000.00s test_alloc_odt passed 73768A65 000.00s test_alloc_odt_entry passed 8B8CAFFA 000.00s test_set_daq_ptr passed A730FB8F 000.00s test_write_daq passed 253EF870 000.00s test_set_daq_list_mode(self): passed BDEC536D 000.00s test_start_stop_daq_list passed 16B49412 000.01s test_get_daq_clock passed 695AF59B 000.01s Test negative response passed 41EBF4BE 000.00s test_start_stop_synch passed 9BA5999E 000.01s test_program_start passed 03269835 000.00s test_program_clear(self): passed 2ED18FDC 000.00s test_program passed CF332C97 000.01s CONNECT passed 92A14FDF 000.01s CONNECT 2 passed 16C06A7F 000.01s XCPOnUDP post build length passed 1DCFE9DE 000.01s CONNECT passed 957B3F9A 000.00s XCPOnTCP post build length Campaign CRC=BA6962F1 in 000.21s SHA=DEA4819A236C13BA1AABBC3D66BAE1DB85BA5E56 PASSED=37 FAILED=0 ━ Loading: test/contrib/automotive/xcp/xcp_comm.uts passed BF957852 000.00s Imports passed 5F32A26A 000.00s Load module passed 13E4C18D 000.02s Connect passed 4E9238B9 000.00s Endianness test for ConnectPositiveResponse passed D51AEF60 000.00s Wrong answer passed AE223815 000.00s Delete TestSockets Campaign CRC=772EC1BB in 000.03s SHA=0A4E911D382CBA327A9CF58E351213997ECB62E4 PASSED=6 FAILED=0 ━ Loading: test/contrib/automotive/autosar/pdu.uts passed 495CB76A 000.00s Load Contrib Layer passed DD5A4CF2 000.00s Defaults test passed 74CF0153 000.00s Build test pdu_id passed F04E0972 000.00s Build test pdu_payload_len passed CF97199B 000.00s Build test id and payload len with data passed E0B2FBF4 000.01s Build PDUTransport with multiple PDU packets passed 52A30A83 000.00s Build PDUTransport with one PDU packet Campaign CRC=9E3D2515 in 000.02s SHA=5E68082BBBB3B60CDB80DF6461CD8E59A7D1D528 PASSED=7 FAILED=0 ━ Loading: test/contrib/automotive/autosar/secoc.uts passed 15E12486 000.00s Load Contrib Layer passed 3E89F9FC 000.01s Prepare SecOC keys passed 63EA0181 000.00s Defaults test passed 1551E2A2 000.00s Build test pdu_id passed 6890B2AB 000.00s Build test pdu_payload_len passed 97A01FFE 000.01s Build test pdu_payload_len2 passed 5B75B5B1 000.00s Build test id and payload len with data passed A1A41329 000.01s Build SecOC_PDUTransport with multiple SecOC_PDU packets passed E7D858C2 000.00s Build SecOC_PDUTransport with one SecOC_PDU packet passed B8A4DB7A 000.00s Build SecOC_PDUTransport with one SecOC_PDU packet and custom class passed 84BA53B0 000.01s Build SecOC_PDUTransport with multiple SecOC_PDU packets Campaign CRC=7AEE3E31 in 000.06s SHA=C0B31629DA26E6828C075D64EBE5EC19741A5F59 PASSED=11 FAILED=0 ✓ All campaigns executed. Writing output... Regression tests for Scapy Answering Machines ━ Run at 01:40:39 from [test/answering_machines.uts] by UTscapy in 0.30167174339294434 └ Passed=11 └ Failed=0 ###### ## Answering Machines ###### ###(000)=[passed] Generic answering machine mocker >>> from unittest import mock >>> @mock.patch("scapy.ansmachine.sniff") ... def test_am(cls_name, packet_query, check_reply, mock_sniff, **kargs): ... packet_query = packet_query.__class__(bytes(packet_query)) ... def sniff(*args,**kargs): ... kargs["prn"](packet_query) ... mock_sniff.side_effect = sniff ... am = cls_name(**kargs) ... called = [False] ... def _sndrpl(x): ... called[0] = True ... check_reply(x.__class__(bytes(x))) ... am.send_reply = _sndrpl ... am() ... assert called[0], "Filter never passed for AnsweringMachine !" ... ###(001)=[passed] BOOT_am >>> def check_BOOTP_am_reply(packet): ... assert BOOTP in packet and packet[BOOTP].op == 2 ... assert packet[BOOTP].yiaddr == "192.168.1.128" and packet[BOOTP].giaddr == "192.168.1.1" ... >>> test_am(BOOTP_am, ... Ether()/IP()/UDP()/BOOTP(op=1), ... check_BOOTP_am_reply) Reply 192.168.1.128 to 00:00:00:00:00:00 ###(002)=[passed] DHCP_am >>> def check_DHCP_am_reply(packet): ... assert DHCP in packet and len(packet[DHCP].options) ... assert ("domain", b"localnet") in packet[DHCP].options ... >>> test_am(DHCP_am, ... Ether()/IP()/UDP()/BOOTP(op=1)/DHCP(options=[('message-type', 'request')]), ... check_DHCP_am_reply, ... domain="localnet") Reply 192.168.1.128 to 00:00:00:00:00:00 ###(003)=[passed] ARP_am >>> def check_ARP_am_reply(packet): ... assert ARP in packet and packet[ARP].psrc == "10.28.7.1" ... assert packet[ARP].hwsrc == "00:01:02:03:04:05" ... >>> test_am(ARP_am, ... Ether()/ARP(pdst="10.28.7.1"), ... check_ARP_am_reply, ... IP_addr="10.28.7.1", ... ARP_addr="00:01:02:03:04:05") Ether / ARP who has 10.28.7.1 says 192.168.122.109 ==> Ether / ARP is at 00:01:02:03:04:05 says 10.28.7.1 on eth0 ###(004)=[passed] ICMPEcho_am >>> def check_ICMP_am_reply(packet): ... packet.show() ... assert packet[Ether].src != "ff:ff:ff:ff:ff:ff" ... assert packet[Ether].dst == "aa:aa:aa:aa:aa:aa" ... assert IP in packet and ICMP in packet ... assert packet[IP].dst == "1.1.1.1" ... assert packet[IP].src == "2.2.2.2" ... assert packet[ICMP].seq == 12 ... >>> test_am(ICMPEcho_am, ... Ether(src="aa:aa:aa:aa:aa:aa", dst="ff:ff:ff:ff:ff:ff")/IP(src="1.1.1.1", dst="2.2.2.2")/ICMP(seq=12), ... check_ICMP_am_reply) ###[ Ethernet ]### dst = aa:aa:aa:aa:aa:aa src = 52:54:00:a3:0b:7c type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 28 id = 1 flags = frag = 0 ttl = 64 proto = icmp chksum = 0x74db src = 2.2.2.2 dst = 1.1.1.1 \options \ ###[ ICMP ]### type = echo-reply code = 0 chksum = 0xfff3 id = 0x0 seq = 0xc unused = b'' Replying 1.1.1.1 to 2.2.2.2 ###(005)=[passed] DNS_am >>> def check_DNS_am_reply(packet): ... assert packet[Ether].src == "bb:bb:bb:bb:bb:bb" ... assert packet[Ether].dst == "aa:aa:aa:aa:aa:aa" ... assert packet[IP].src == "127.0.0.2" ... assert packet[IP].dst == "127.0.0.1" ... assert DNS in packet and packet[DNS].ancount == 1 ... assert packet[DNS].an[0].rdata == "192.168.1.1" ... assert packet[DNS].qd[0].qname == b"www.secdev.org." ... >>> test_am(DNS_am, ... Ether(src="aa:aa:aa:aa:aa:aa", dst="bb:bb:bb:bb:bb:bb")/IP(src="127.0.0.1", dst="127.0.0.2")/UDP()/DNS(qd=DNSQR(qname="www.secdev.org")), ... check_DNS_am_reply, ... joker="192.168.1.1") Ether / IP / UDP / DNS Qry b'www.secdev.org.' ==> Ether / IP / UDP / DNS Ans 192.168.1.1 >>> >>> def check_DNS_am_reply_srvmatch(packet): ... assert DNS in packet and packet[DNS].ancount == 1 ... assert isinstance(packet[DNS].an[0], DNSRRSRV) ... assert packet[DNS].an[0].rrname == b'_ldap._tcp.dc._msdcs.scapy.fr.' ... assert packet[DNS].an[0].port == 389 ... assert packet[DNS].an[0].target == b'dc.scapy.fr.' ... >>> test_am(DNS_am, ... Ether()/IP()/UDP()/DNS(qd=DNSQR(qname=b'_ldap._tcp.dc._msdcs.scapy.fr.', qtype="SRV")), ... check_DNS_am_reply_srvmatch, ... srvmatch={"_ldap._tcp.dc._msdcs.scapy.fr": (389, "dc.scapy.fr")}) Ether / IP / UDP / DNS Qry b'_ldap._tcp.dc._msdcs.scapy.fr.' ==> Ether / IP / UDP / DNS Ans >>> >>> def check_DNS_am_reply_arpa(packet): ... assert DNS in packet and packet[DNS].ancount == 1 ... assert packet[DNS].an[0].rdata == b"scapy." ... assert packet[DNS].an[0].rrname == b"1.0.16.172.in-addr.arpa." ... >>> test_am(DNS_am, ... Ether()/IP()/UDP()/DNS(qd=DNSQR(qname=b"1.0.16.172.in-addr.arpa.", qtype="PTR")), ... check_DNS_am_reply_arpa, ... jokerarpa="scapy") Ether / IP / UDP / DNS Qry b'1.0.16.172.in-addr.arpa.' ==> Ether / IP / UDP / DNS Ans b'scapy.' >>> >>> def check_DNS_am_reply2(packet): ... assert DNS in packet and packet[DNS].ancount == 2 ... assert packet[DNS].an[0].rdata == "128.0.0.1" ... assert packet[DNS].an[1].rdata == "::1" ... >>> test_am(DNS_am, ... Ether()/IP(b'E\x00\x00H\x00\x01\x00\x00@\x11|\xa2\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x004\xe8\x9a\x00\x00\x01\x00\x00\x02\x00\x00\x00\x00\x00\x00\x06gaagle\x03com\x00\x00\x01\x00\x01\x06google\x03com\x00\x00\x1c\x00\x01'), ... check_DNS_am_reply2, ... match={"google.com": ("127.0.0.1", "::1"), "gaagle.com": "128.0.0.1"}, ... joker=False) Ether / IP / UDP / DNS Qry b'gaagle.com.' ==> Ether / IP / UDP / DNS Ans 128.0.0.1 >>> >>> assert DNS_am().make_reply(Ether()) is None No IP or IPv6 layer in Ether() >>> assert DNS_am().make_reply(Ether()/IP()) is None No UDP layer in Ether()/IP() Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/dns.py", line 1703, in make_reply resp /= UDP(sport=req[UDP].dport, dport=req[UDP].sport) ~~~^^^^^ File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/packet.py", line 1384, in __getitem__ raise IndexError("Layer [%s] not found" % name) IndexError: Layer [UDP] not found >>> assert DNS_am().make_reply(Ether()/IP()/UDP()) is None No DNS layer in Ether()/IP()/UDP() Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/dns.py", line 1708, in make_reply req = req[self.cls] ~~~^^^^^^^^^^ File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/packet.py", line 1384, in __getitem__ raise IndexError("Layer [%s] not found" % name) IndexError: Layer [DNS] not found >>> assert DNS_am().make_reply( ... Ether()/IP()/UDP()/DNS(b'q\xa04\x00\x00\xa0\x01\x00\xf3\x00\x01\x04\x01y') ... ) is None Cannot parse qd element Raw(load=b'\x01y') NoneType: None ###(006)=[passed] LLMNR_am >>> def check_LLMNR_am_am_reply(packet): ... # assert packet[Ether].src == get_if_hwaddr(conf.iface) ... assert packet[Ether].dst == "aa:aa:aa:aa:aa:aa" ... # assert packet[IP].src == get_if_addr(conf.iface) ... assert packet[IP].dst == "192.168.0.1" ... assert packet[UDP].dport == 51938 ... assert packet[UDP].sport == 5355 ... assert LLMNRResponse in packet and packet[LLMNRResponse].ancount == 1 and packet[LLMNRResponse].qdcount == 1 ... assert packet[LLMNRResponse].qd[0].qname == b"TEST." ... assert packet[LLMNRResponse].an[0].rdata == "192.168.1.1" ... assert packet[LLMNRResponse].an[0].rrname == b"TEST." ... assert packet[LLMNRResponse].an[0].ttl == 60 ... >>> test_am(LLMNR_am, ... Ether(src="aa:aa:aa:aa:aa:aa", dst="01:00:5e:00:00:fc")/IP(src="192.168.0.1", dst="224.0.0.252")/UDP(dport=5355, sport=51938)/LLMNRQuery(qd=DNSQR(qname=b"TEST.", qtype="A")), ... check_LLMNR_am_am_reply, ... ttl=60, ... match={"TEST": "192.168.1.1"}) Ether / IP / UDP 192.168.0.1:51938 > 224.0.0.252:llmnr / LLMNRQuery who has 'TEST.' ==> Ether / IP / UDP 192.168.122.109:llmnr > 192.168.0.1:51938 / LLMNRQuery 'TEST.' is at '192.168.1.1' ###(007)=[passed] mDNS_am >>> def check_mDNS_am_reply(packet): ... packet.show() ... # assert packet[Ether].src == get_if_hwaddr(conf.iface) ... assert packet[Ether].dst == "01:00:5e:00:00:fb" ... # assert packet[IP].src == get_if_addr(conf.iface) ... assert packet[IP].dst == "224.0.0.251" ... assert packet[IP].ttl == 255 ... assert packet[UDP].dport == 5353 ... assert packet[UDP].sport == 5353 ... assert DNS in packet and packet[DNS].ancount == 1 and packet[DNS].qdcount == 0 ... assert packet[DNS].an[0].rdata == "192.168.1.1" ... assert packet[DNS].an[0].rrname == b"TEST.local." ... assert packet[DNS].an[0].ttl == 10 ... >>> test_am(mDNS_am, ... Ether(src="aa:aa:aa:aa:aa:aa", dst="01:00:5e:00:00:fb")/IP(src="192.168.0.1", dst="224.0.0.251", ttl=1)/UDP(dport=5353, sport=5353)/DNS(qd=DNSQR(qname=b"TEST.local.", qtype="A")), ... check_mDNS_am_reply, ... joker="192.168.1.1") ###[ Ethernet ]### dst = 01:00:5e:00:00:fb src = 52:54:00:a3:0b:7c type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 89 id = 1 flags = frag = 0 ttl = 255 proto = udp chksum = 0x18ee src = 192.168.1.1 dst = 224.0.0.251 \options \ ###[ UDP ]### sport = mdns dport = mdns len = 69 chksum = 0x4b32 ###[ DNS ]### id = 0 qr = 1 opcode = QUERY aa = 1 tc = 0 rd = 0 ra = 0 z = 0 ad = 0 cd = 0 rcode = ok qdcount = 0 ancount = 1 nscount = 0 arcount = 1 \qd \ \an \ |###[ DNS Resource Record ]### | rrname = b'TEST.local.' | type = A | cacheflush= 1 | rclass = IN | ttl = 10 | rdlen = None | rdata = 192.168.1.1 \ns \ \ar \ |###[ DNS OPT Resource Record ]### | rrname = b'.' | type = OPT | rclass = 4096 | extrcode = 0 | version = 0 | z = 4500 | rdlen = None | \rdata \ | |###[ EDNS0 Owner (OWN) ]### | | optcode = Owner | | optlen = 8 | | v = 0 | | s = 0 | | primary_mac= 52:54:00:a3:0b:7c Ether / IP / UDP / mDNS Qry b'TEST.local.' ==> Ether / IP / UDP / mDNS Ans 192.168.1.1 >>> >>> >>> def check_mDNS_am_reply2(packet): ... # $ avahi-resolve -n bonjour.local ... packet.show() ... # assert packet[Ether].src == get_if_hwaddr(conf.iface) ... assert packet[Ether].dst == "01:00:5e:00:00:fb" ... # assert packet[IP].src == get_if_addr(conf.iface) ... assert packet[IP].dst == "224.0.0.251" ... assert packet[IP].ttl == 255 ... assert packet[UDP].dport == 5353 ... assert packet[UDP].sport == 5353 ... assert DNS in packet and packet[DNS].ancount == 2 and packet[DNS].qdcount == 0 ... assert packet[DNS].an[0].rdata == "192.168.1.1" ... assert packet[DNS].an[0].rrname == b"bonjour.local." ... assert packet[DNS].an[0].ttl == 120 ... assert packet[DNS].an[1].type == 47 ... assert packet[DNS].an[1].rrname == b"bonjour.local." ... assert packet[DNS].an[1].ttl == 120 ... >>> test_am(mDNS_am, ... Ether(b'\x01\x00^\x00\x00\xfb\xaa\xaa\xaa\xaa\xaa\xaa\x08\x00E\x00\x00A\xce}@\x00\xff\x11\x0b\x89\xc0\xa8\x00\x01\xe0\x00\x00\xfb\x14\xe9\x14\xe9\x00-\xdbl\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x07bonjour\x05local\x00\x00\x01\x00\x01\xc0\x0c\x00\x1c\x00\x01'), ... check_mDNS_am_reply2, ... joker="192.168.1.1", ... ttl=120) ###[ Ethernet ]### dst = 01:00:5e:00:00:fb src = 52:54:00:a3:0b:7c type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 112 id = 52861 flags = frag = 0 ttl = 255 proto = udp chksum = 0x4a5a src = 192.168.1.1 dst = 224.0.0.251 \options \ ###[ UDP ]### sport = mdns dport = mdns len = 92 chksum = 0x3c2 ###[ DNS ]### id = 0 qr = 1 opcode = QUERY aa = 1 tc = 0 rd = 0 ra = 0 z = 0 ad = 0 cd = 0 rcode = ok qdcount = 0 ancount = 2 nscount = 0 arcount = 1 \qd \ \an \ |###[ DNS Resource Record ]### | rrname = b'bonjour.local.' | type = A | cacheflush= 1 | rclass = IN | ttl = 120 | rdlen = None | rdata = 192.168.1.1 |###[ DNS NSEC Resource Record ]### | rrname = b'bonjour.local.' | type = NSEC | cacheflush= 0 | rclass = IN | ttl = 120 | rdlen = None | nextname = b'bonjour.local.' | typebitmaps= ['AAAA'] \ns \ \ar \ |###[ DNS OPT Resource Record ]### | rrname = b'.' | type = OPT | rclass = 4096 | extrcode = 0 | version = 0 | z = 4500 | rdlen = None | \rdata \ | |###[ EDNS0 Owner (OWN) ]### | | optcode = Owner | | optlen = 8 | | v = 0 | | s = 0 | | primary_mac= 52:54:00:a3:0b:7c Ether / IP / UDP / mDNS Qry b'bonjour.local.' ==> Ether / IP / UDP / mDNS Ans 192.168.1.1 ###(012)=[passed] WiFi_am >>> from unittest import mock >>> @mock.patch("scapy.layers.dot11.sniff") ... def test_WiFi_am(packet_query, check_reply, mock_sniff, **kargs): ... def sniff(*args,**kargs): ... kargs["prn"](packet_query) ... mock_sniff.side_effect = sniff ... am = WiFi_am(**kargs) ... am.send_reply = check_reply ... am() ... >>> def check_WiFi_am_reply(packet): ... assert isinstance(packet, list) and len(packet) == 2 ... assert TCP in packet[0] and Raw in packet[0] and raw(packet[0][Raw]) == b"5c4pY" ... >>> test_WiFi_am(Dot11(FCfield="to-DS")/IP()/TCP()/"Scapy", ... check_WiFi_am_reply, ... iffrom="scapy0", ifto="scapy1", replace="5c4pY", pattern="Scapy") Sent 127.0.0.1:80 > 127.0.0.1:ftp_data ###(013)=[passed] NBNS_am >>> def check_NBNS_am_reply(name): ... def check(packet): ... packet.show() ... assert packet[Ether].src != "ff:ff:ff:ff:ff:ff" ... assert packet[Ether].dst == "aa:aa:aa:aa:aa:aa" ... assert NBNSQueryResponse in packet and packet[NBNSQueryResponse].RR_NAME == name ... return check ... >>> for server_name in (None, "", b"test", "test"): ... test_am(NBNS_am, ... Ether(src="aa:aa:aa:aa:aa:aa", dst="ff:ff:ff:ff:ff:ff")/IP()/UDP()/NBNSHeader()/NBNSQueryRequest(QUESTION_NAME="test"), ... check_NBNS_am_reply(b"test"), ... server_name=server_name) ... ###[ Ethernet ]### dst = aa:aa:aa:aa:aa:aa src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 90 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7c90 src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = netbios_ns dport = netbios_ns len = 70 chksum = 0x67e5 ###[ NBNS Header ]### NAME_TRN_ID= 0 RESPONSE = 1 OPCODE = 0 NM_FLAGS = RD+AA RCODE = 0 QDCOUNT = 0 ANCOUNT = 1 NSCOUNT = 0 ARCOUNT = 0 ###[ NBNS query response ]### RR_NAME = b'test' SUFFIX = workstation NULL = 0 QUESTION_TYPE= NB QUESTION_CLASS= INTERNET TTL = 300000 RDLENGTH = 6 \ADDR_ENTRY\ |###[ NBNS_ADD_ENTRY ]### | G = Unique name | OWNER_NODE_TYPE= B node | UNUSED = Unused | NB_ADDRESS= 192.168.122.109 Ether / IP / UDP / NBNSHeader / NBNSQueryRequest who has '\\test' ==> Ether / IP / UDP / NBNSHeader / NBNSQueryResponse '\\test' is at 192.168.122.109 ###[ Ethernet ]### dst = aa:aa:aa:aa:aa:aa src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 90 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7c90 src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = netbios_ns dport = netbios_ns len = 70 chksum = 0x67e5 ###[ NBNS Header ]### NAME_TRN_ID= 0 RESPONSE = 1 OPCODE = 0 NM_FLAGS = RD+AA RCODE = 0 QDCOUNT = 0 ANCOUNT = 1 NSCOUNT = 0 ARCOUNT = 0 ###[ NBNS query response ]### RR_NAME = b'test' SUFFIX = workstation NULL = 0 QUESTION_TYPE= NB QUESTION_CLASS= INTERNET TTL = 300000 RDLENGTH = 6 \ADDR_ENTRY\ |###[ NBNS_ADD_ENTRY ]### | G = Unique name | OWNER_NODE_TYPE= B node | UNUSED = Unused | NB_ADDRESS= 192.168.122.109 Ether / IP / UDP / NBNSHeader / NBNSQueryRequest who has '\\test' ==> Ether / IP / UDP / NBNSHeader / NBNSQueryResponse '\\test' is at 192.168.122.109 ###[ Ethernet ]### dst = aa:aa:aa:aa:aa:aa src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 90 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7c90 src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = netbios_ns dport = netbios_ns len = 70 chksum = 0x67e5 ###[ NBNS Header ]### NAME_TRN_ID= 0 RESPONSE = 1 OPCODE = 0 NM_FLAGS = RD+AA RCODE = 0 QDCOUNT = 0 ANCOUNT = 1 NSCOUNT = 0 ARCOUNT = 0 ###[ NBNS query response ]### RR_NAME = b'test' SUFFIX = workstation NULL = 0 QUESTION_TYPE= NB QUESTION_CLASS= INTERNET TTL = 300000 RDLENGTH = 6 \ADDR_ENTRY\ |###[ NBNS_ADD_ENTRY ]### | G = Unique name | OWNER_NODE_TYPE= B node | UNUSED = Unused | NB_ADDRESS= 192.168.122.109 Ether / IP / UDP / NBNSHeader / NBNSQueryRequest who has '\\test' ==> Ether / IP / UDP / NBNSHeader / NBNSQueryResponse '\\test' is at 192.168.122.109 ###[ Ethernet ]### dst = aa:aa:aa:aa:aa:aa src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 90 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7c90 src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = netbios_ns dport = netbios_ns len = 70 chksum = 0x67e5 ###[ NBNS Header ]### NAME_TRN_ID= 0 RESPONSE = 1 OPCODE = 0 NM_FLAGS = RD+AA RCODE = 0 QDCOUNT = 0 ANCOUNT = 1 NSCOUNT = 0 ARCOUNT = 0 ###[ NBNS query response ]### RR_NAME = b'test' SUFFIX = workstation NULL = 0 QUESTION_TYPE= NB QUESTION_CLASS= INTERNET TTL = 300000 RDLENGTH = 6 \ADDR_ENTRY\ |###[ NBNS_ADD_ENTRY ]### | G = Unique name | OWNER_NODE_TYPE= B node | UNUSED = Unused | NB_ADDRESS= 192.168.122.109 Ether / IP / UDP / NBNSHeader / NBNSQueryRequest who has '\\test' ==> Ether / IP / UDP / NBNSHeader / NBNSQueryResponse '\\test' is at 192.168.122.109 >>> test_am(NBNS_am, ... Ether(src="aa:aa:aa:aa:aa:aa", dst="ff:ff:ff:ff:ff:ff")/IP()/UDP()/NBNSHeader()/NBNSQueryRequest(QUESTION_NAME=b"\x85"), ... check_NBNS_am_reply(b"\x85"), ... server_name=b"\x85") ###[ Ethernet ]### dst = aa:aa:aa:aa:aa:aa src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 90 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7c90 src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = netbios_ns dport = netbios_ns len = 70 chksum = 0x72f2 ###[ NBNS Header ]### NAME_TRN_ID= 0 RESPONSE = 1 OPCODE = 0 NM_FLAGS = RD+AA RCODE = 0 QDCOUNT = 0 ANCOUNT = 1 NSCOUNT = 0 ARCOUNT = 0 ###[ NBNS query response ]### RR_NAME = b'\x85' SUFFIX = workstation NULL = 0 QUESTION_TYPE= NB QUESTION_CLASS= INTERNET TTL = 300000 RDLENGTH = 6 \ADDR_ENTRY\ |###[ NBNS_ADD_ENTRY ]### | G = Unique name | OWNER_NODE_TYPE= B node | UNUSED = Unused | NB_ADDRESS= 192.168.122.109 Ether / IP / UDP / NBNSHeader / NBNSQueryRequest who has '\\\x85' ==> Ether / IP / UDP / NBNSHeader / NBNSQueryResponse '\\\x85' is at 192.168.122.109 ###(014)=[passed] LdapPing_am >>> def check_LdapPing_am_reply(packet): ... nlogon = packet[CLDAP].protocolOp.attributes[0] ... assert nlogon.type == b"Netlogon" ... logonresp = NETLOGON(nlogon.values[0].value.val) ... assert isinstance(logonresp, NETLOGON_SAM_LOGON_RESPONSE_EX) ... logonresp.show() ... assert logonresp.DnsForestName == b'scapy.fr.', "DnsForestName" ... assert logonresp.DnsDomainName == b'scapy.fr.', "DnsDomainName" ... assert logonresp.DnsHostName == b'DC.scapy.fr.', "DnsHostName" ... assert logonresp.NetbiosDomainName == b'SCAPY.', "NetbiosDomainName" ... assert logonresp.NetbiosComputerName == b'DC.', "NetbiosComputerName" ... assert logonresp.NtVersion == 3, "NtVersion" ... assert logonresp.Flags == 0x3f3fd, "Flags" ... assert logonresp.ClientSiteName == b'Default-First-Site-Name.', "ClientSiteName" ... >>> test_am(LdapPing_am, ... Ether(b'\xaa\xaa\xaa\xaa\xaa\xaa\xbb\xbb\xbb\xbb\xbb\xbb\x08\x00E\x00\x00\xaf\x9d\xb1\x00\x00\x80\x11\x9c\x89\xac\x13P\x01\xac\x13W\xdb\xc7{\x01\x85\x00\x9bV[0q\x02\x01\x01cl\x04\x00\n\x01\x00\n\x01\x00\x02\x01\x00\x02\x01\x00\x01\x01\x00\xa0M\xa3\x15\x04\tDnsDomain\x04\x08scapy.fr\xa3\x0e\x04\x04Host\x04\x06HOST01\xa3\r\x04\x05NtVer\x04\x04\x16\x00\x00 \xa3\x15\x04\x0bDnsHostName\x04\x06HOST010\n\x04\x08Netlogon'), ... check_LdapPing_am_reply, ... NetbiosComputerName="DC", ... NetbiosDomainName="SCAPY", ... DnsForestName="scapy.fr") ###[ NETLOGON_SAM_LOGON_RESPONSE_EX ]### OpCode = LOGON_SAM_LOGON_RESPONSE_EX Sbz = 0 Flags = PDC+GC+LDAP+DC+KDC+TIMESERV+CLOSEST+RODC+GOOD_TIMESERV+FULL_SECRET_DOMAIN_6+WS+DS_8+DS_9+DS_10+DS_11 DomainGuid= UUID('192bc4b3-0085-4521-83fe-062913ef59f2') DnsForestName= b'scapy.fr.' DnsDomainName= b'scapy.fr.' DnsHostName= b'DC.scapy.fr.' NetbiosDomainName= b'SCAPY.' NetbiosComputerName= b'DC.' UserName = b'.' DcSiteName= b'Default-First-Site-Name.' ClientSiteName= b'Default-First-Site-Name.' NtVersion = V1+V5 LmNtToken = 0xffff Lm20Token = 0xffff Ether / IP / UDP 172.19.80.1:51067 > 172.19.87.219:ldap / CLDAP ==> IP / UDP 172.19.87.219:ldap > 172.19.80.1:51067 / CLDAP / CLDAP >>> >>> >>> def check_NBNS_LdapPing_am_reply(packet): ... packet.show() ... assert SMBMailslot_Write in packet, "SMBMailslot_Write" ... assert packet[SMBMailslot_Write].Name == b'\\MAILSLOT\\NET\\GETDC510CC0AD', "SMBMailslot_Write.Name" ... logonresp = NETLOGON(packet[SMBMailslot_Write].Data.load) ... logonresp.show() ... assert logonresp.DcSockAddrSize == 16, "DcSockAddrSize" ... assert isinstance(logonresp.DcSockAddr, DcSockAddr) ... assert logonresp.DcSockAddr.sin_family == 2, "sin_family" ... assert logonresp.DcSockAddr.sin_port == 0, "sin_port" ... assert logonresp.DcSockAddr.sin_zero == 0, "sin_zero" ... assert logonresp.DcSockAddr.sin_addr == get_if_addr(conf.iface) ... assert logonresp.DnsForestName == b'scapy.fr.', "DnsForestName" ... assert logonresp.DnsDomainName == b'scapy.fr.', "DnsDomainName" ... assert logonresp.DnsHostName == b'DC.scapy.fr.', "DnsHostName" ... assert logonresp.NetbiosDomainName == b'SCAPY.', "NetbiosDomainName" ... assert logonresp.NetbiosComputerName == b'DC.', "NetbiosComputerName" ... assert logonresp.NtVersion == 13, "NtVersion" ... assert logonresp.Flags == 0x3f3fd, "Flags" ... assert logonresp.ClientSiteName == b'Default-First-Site-Name.', "ClientSiteName" ... >>> test_am(LdapPing_am, ... Ether(b'\xaa\xaa\xaa\xaa\xaa\xaa\xbb\xbb\xbb\xbb\xbb\xbb\x08\x00E\x00\x01\n\xff\x82\x00\x00\x80\x11:]\xac\x13P\x01\xac\x13W\xdb\x00\x8a\x00\x8a\x00\xf6\xd5\xcb\x10\x02\xde\x9d\xac\x13P\x01\x00\x8a\x00\xe0\x00\x00 EIEPFDFEDADBCACACACACACACACACAAA\x00 FDEDEBFAFJCACACACACACACACACACABM\x00\xffSMB%\x00\x00\x00\x00\x18\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x00\x00\x11\x00\x00@\x00\x02\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\x00@\x00\\\x00\x03\x00\x01\x00\x00\x00\x02\x00W\x00\\MAILSLOT\\NET\\NETLOGON\x00\x12\x00\x00\x00H\x00O\x00S\x00T\x000\x001\x00\x00\x00\x00\x00\\MAILSLOT\\NET\\GETDC510CC0AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00 \xff\xff\xff\xff'), ... check_NBNS_LdapPing_am_reply, ... NetbiosComputerName="DC", ... NetbiosDomainName="SCAPY", ... DnsForestName="scapy.fr") ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 351 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x4263 src = 192.168.122.109 dst = 172.19.80.1 \options \ ###[ UDP ]### sport = netbios_dgm dport = netbios_dgm len = 331 chksum = 0xf8d3 ###[ NBT Datagram Packet ]### Type = 16 Flags = 2 ID = 0 SourceIP = 192.168.122.109 SourcePort= 138 Length = 309 Offset = 0 SourceName= b'SCAPY' SUFFIX1 = domain controller NULL1 = 0 DestinationName= b'HOST01' SUFFIX2 = workstation NULL2 = 0 ###[ SMB 1 Protocol Request Header ]### Start = b'\xffSMB' Command = SMB_COM_TRANSACTION Status = STATUS_SUCCESS Flags = CASE_INSENSITIVE+CANONICALIZED_PATHS Flags2 = PIDHigh = 0 SecuritySignature= b'' Reserved = 0 TID = 0 PIDLow = 0 UID = 0 MID = 0 ###[ SMB COM Transaction Request ]### WordCount = 17 TotalParamCount= 0 TotalDataCount= 144 MaxParamCount= 0 MaxDataCount= 0 MaxSetupCount= 0 Reserved1 = 0 Flags = Timeout = 1000 Reserved2 = 0 ParameterLen= 0 ParameterBufferOffset= 0 DataLen = 144 DataBufferOffset= 97 SetupCount= 3 Reserved3 = 0 Setup = [1, 1, 2] ByteCount = 172 Name = b'\\MAILSLOT\\NET\\GETDC510CC0AD' Buffer = \Data \ |###[ Raw ]### | load = b'\x17\x00\x00\x00\xfd\xf3\x03\x00\xb3\xc4+\x19\x85\x00!E\x83\xfe\x06)\x13\xefY\xf2\x05scapy\x02fr\x00\x05scapy\x02fr\x00\x02DC\x05scapy\x02fr\x00\x05SCAPY\x00\x02DC\x00\x00\x17Default-First-Site-Name\x00\x17Default-First-Site-Name\x00\x10\x02\x00\x00\x00\xc0\xa8zm\x00\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\xff\xff\xff\xff' ###[ NETLOGON_SAM_LOGON_RESPONSE_EX ]### OpCode = LOGON_SAM_LOGON_RESPONSE_EX Sbz = 0 Flags = PDC+GC+LDAP+DC+KDC+TIMESERV+CLOSEST+RODC+GOOD_TIMESERV+FULL_SECRET_DOMAIN_6+WS+DS_8+DS_9+DS_10+DS_11 DomainGuid= UUID('192bc4b3-0085-4521-83fe-062913ef59f2') DnsForestName= b'scapy.fr.' DnsDomainName= b'scapy.fr.' DnsHostName= b'DC.scapy.fr.' NetbiosDomainName= b'SCAPY.' NetbiosComputerName= b'DC.' UserName = b'.' DcSiteName= b'Default-First-Site-Name.' ClientSiteName= b'Default-First-Site-Name.' DcSockAddrSize= 16 \DcSockAddr\ |###[ DcSockAddr ]### | sin_family= 2 | sin_port = 0 | sin_addr = 192.168.122.109 | sin_zero = 0 NtVersion = V1+V5EX+V5EX_WITH_IP LmNtToken = 0xffff Lm20Token = 0xffff Ether / IP / UDP / NBTDatagram / SMB_Header / Tran b'\\MAILSLOT\\NET\\NETLOGON' ==> IP / UDP / NBTDatagram / SMB_Header / Tran b'\\MAILSLOT\\NET\\GETDC510CC0AD' Regression tests for Scapy regarding fields ━ Run at 01:40:40 from [test/fields.uts] by UTscapy in 0.7754383087158203 └ Passed=147 └ Failed=0 ###### ## Tests on basic fields ###### ###(000)=[passed] ConditionnalField class >>> class TEST_COND(Packet): ... fields_desc = [ ... IntField("A", 0), ... ConditionalField(IntField("A0",0), lambda pkt:pkt.A == 0), ... ConditionalField(IntField("A1",0), lambda pkt:pkt.A != 0), ... IntField("B", 0), ... ConditionalField(IntField("B0",0), lambda pkt:pkt.B == 0), ... ConditionalField(IntField("B1",0), lambda pkt:pkt.B != 0), ... ] ... >>> print(TEST_COND(TEST_COND().build()).fields) {'A': 0, 'A0': 0, 'B': 0, 'B0': 0} >>> >>> a = TEST_COND() >>> b = TEST_COND(raw(TEST_COND())) >>> assert raw(a) == raw(b) >>> assert a == b >>> >>> >>> class TEST_COND(Packet): ... fields_desc = [ ... ByteField('A', 0), ... ConditionalField(ByteField('B', 0), ... lambda pkt:pkt.A != 0), ... ConditionalField(ByteField('C', 0), ... lambda pkt:pkt.B == 0), ... ] ... >>> assert TEST_COND().build() == b'\x00' >>> >>> >>> class TEST_INNER(Packet): ... fields_desc = [ ... ByteField('A', 0), ... ByteField('B', 0), ... ConditionalField( ... MultipleTypeField( ... [ ... (ByteField('C', 1), lambda pkt: pkt.B == 1), ... (ByteField('C', 2), lambda pkt: pkt.B == 2), ... ], ... ByteField('C', 0), ... ), ... lambda pkt: pkt.A, ... ) ... ] ... >>> pkt = TEST_INNER() >>> pkt.A = 1 >>> pkt.B = 1 >>> assert pkt.C == 1 ###(001)=[passed] Simple tests >>> assert LongField("test", None).addfield(None, b"", 0x44434241) == b'\x00\x00\x00\x00DCBA' >>> assert SignedLongField("test", None).addfield(None, b"", -2) == b'\xff\xff\xff\xff\xff\xff\xff\xfe' >>> >>> assert LELongField("test", None).addfield(None, b"", 0x44434241) == b'ABCD\x00\x00\x00\x00' >>> assert LESignedLongField("test", None).addfield(None, b"", -2) == b'\xfe\xff\xff\xff\xff\xff\xff\xff' ###(002)=[passed] MACField class >>> m = MACField("foo", None) >>> r = m.i2m(None, None) >>> r b'\x00\x00\x00\x00\x00\x00' >>> assert r == b"\x00\x00\x00\x00\x00\x00" >>> r = m.getfield(None, b"\xc0\x01\xbe\xef\xba\xbeABCD") >>> r (b'ABCD', 'c0:01:be:ef:ba:be') >>> assert r == (b"ABCD","c0:01:be:ef:ba:be") >>> r = m.addfield(None, b"FOO", "c0:01:be:ef:ba:be") >>> r b'FOO\xc0\x01\xbe\xef\xba\xbe' >>> assert r == b"FOO\xc0\x01\xbe\xef\xba\xbe" ###(003)=[passed] LEMACField class >>> m = LEMACField("foo", None) >>> r = m.i2m(None, None) >>> r b'\x00\x00\x00\x00\x00\x00' >>> assert r == b"\x00\x00\x00\x00\x00\x00" >>> r = m.getfield(None, b"\xbe\xba\xef\xbe\x01\xc0ABCD") >>> r (b'ABCD', 'c0:01:be:ef:ba:be') >>> assert r == (b"ABCD","c0:01:be:ef:ba:be") >>> r = m.addfield(None, b"FOO", "be:ba:ef:be:01:c0") >>> r b'FOO\xc0\x01\xbe\xef\xba\xbe' >>> assert r == b"FOO\xc0\x01\xbe\xef\xba\xbe" ###(004)=[passed] SourceMACField >>> conf.route.add(net="1.2.3.4/32", dev=conf.iface) >>> p = Ether() / ARP(pdst="1.2.3.4") >>> assert p.src == p.hwsrc == p[ARP].hwsrc == get_if_hwaddr(conf.iface) >>> p = Dot3() / LLC() / SNAP() / ARP(pdst="1.2.3.4") >>> assert p.src == p.hwsrc == p[ARP].hwsrc == get_if_hwaddr(conf.iface) >>> conf.route.delt(net="1.2.3.4/32", dev=conf.iface) ###(005)=[passed] IPField class >>> i = IPField("foo", None) >>> r = i.i2m(None, "1.2.3.4") >>> r b'\x01\x02\x03\x04' >>> assert r == b"\x01\x02\x03\x04" >>> r = i.i2m(None, "255.255.255.255") >>> r b'\xff\xff\xff\xff' >>> assert r == b"\xff\xff\xff\xff" >>> r = i.m2i(None, b"\x01\x02\x03\x04") >>> r '1.2.3.4' >>> assert r == "1.2.3.4" >>> r = i.getfield(None, b"\x01\x02\x03\x04ABCD") >>> r (b'ABCD', '1.2.3.4') >>> assert r == (b"ABCD","1.2.3.4") >>> r = i.addfield(None, b"FOO", "1.2.3.4") >>> r b'FOO\x01\x02\x03\x04' >>> assert r == b"FOO\x01\x02\x03\x04" ###(006)=[passed] SourceIPField >>> defaddr = conf.route.route('0.0.0.0')[1] >>> class Test(Packet): fields_desc = [SourceIPField("sourceip")] ... >>> assert Test().sourceip == defaddr >>> assert Test(raw(Test())).sourceip == defaddr >>> >>> assert IP(dst="0.0.0.0").src == defaddr >>> assert IP(raw(IP(dst="0.0.0.0"))).src == defaddr >>> defaddr = conf.route.route('1.1.1.1')[1] >>> assert IP(dst="1.1.1.1").src == defaddr >>> assert IP(raw(IP(dst="1.1.1.1"))).src == defaddr ###(007)=[passed] ThreeBytesField >>> class TestThreeBytesField(Packet): ... fields_desc = [ ... X3BytesField('test1', None), ... ThreeBytesField('test2', None), ... XLE3BytesField('test3', None), ... LEThreeBytesField('test4', None), ... ] ... >>> p = TestThreeBytesField(test1=0x123456, test2=123456, test3=0xfedbca, test4=567890) >>> assert raw(p) == b'\x12\x34\x56\x01\xe2\x40\xca\xdb\xfe\x52\xaa\x08' >>> print(p.sprintf('%test1% %test2% %test3% %test4%')) 0x123456 123456 0xfedbca 567890 >>> assert p.sprintf('%test1% %test2% %test3% %test4%') == '0x123456 123456 0xfedbca 567890' >>> assert repr(p.test1) == '1193046' ###(008)=[passed] NBytesField >>> class TestNBytesField(Packet): ... fields_desc = [ ... NBytesField('test1', None, 7), ... XNBytesField('test2', None, 5), ... XNBytesField('test3', None, 11), ... NBytesField('test4', None, 11), ... ] ... >>> p = TestNBytesField(test1=0x00112233445566, test2=824650445619, test3=0xffeeddccbbaa9988776655, test4=0xffeeddccbbaa9988776655) >>> print(raw(p)) b'\x00\x11"3DUf\xc0\x00\xff33\xff\xee\xdd\xcc\xbb\xaa\x99\x88wfU\xff\xee\xdd\xcc\xbb\xaa\x99\x88wfU' >>> assert raw(p) == b'\x00\x11\x22\x33\x44\x55\x66\xc0\x00\xff\x33\x33\xff\xee\xdd\xcc\xbb\xaa\x99\x88\x77\x66\x55\xff\xee\xdd\xcc\xbb\xaa\x99\x88\x77\x66\x55' >>> print(p.sprintf('%test1% %test2% %test3% %test4%')) 18838586676582 0xc000ff3333 0xffeeddccbbaa9988776655 309404098707666285700277845 >>> assert p.sprintf('%test1% %test2% %test3% %test4%') == '18838586676582 0xc000ff3333 0xffeeddccbbaa9988776655 309404098707666285700277845' >>> assert p.test1 == 0x112233445566 >>> assert p.test2 == 0xc000ff3333 >>> assert p.test3 == 0xffeeddccbbaa9988776655 >>> assert p.test4 == 309404098707666285700277845 >>> >>> class TestFuzzNBytesField(Packet): ... fields_desc = [ ... NBytesField('test1', 0, 128), ... ] ... >>> f = fuzz(TestFuzzNBytesField()) >>> assert f.test1.max == 2 ** (128 * 8) - 1 >>> >>> p2 = TestNBytesField(raw(p)) >>> assert p2.sprintf('%test1% %test2% %test3% %test4%') == '18838586676582 0xc000ff3333 0xffeeddccbbaa9988776655 309404098707666285700277845' >>> assert p2.test1 == 18838586676582 >>> assert p2.test2 == 0xc000ff3333 >>> assert p2.test3 == 0xffeeddccbbaa9988776655 >>> assert p2.test4 == 309404098707666285700277845 >>> assert raw(p2) == raw(TestNBytesField(test1=p2.test1, test2=p2.test2, test3=p2.test3, test4=p2.test4)) ###(009)=[passed] StrField >>> class TestStrField(Packet): ... fields_desc = [ ... LEFieldLenField('slen', None, length_of="s1"), ... StrLenField('s1', None, length_from=lambda pkt: pkt.slen), ... StrField('s2', None), ... ] ... >>> p = TestStrField(s1="cafe", s2="deadbeef") >>> assert raw(p) == b'\x04\x00cafedeadbeef' >>> print(p.sprintf("%s1% %s2%")) b'cafe' b'deadbeef' >>> assert p.sprintf("%s1% %s2%") == "b'cafe' b'deadbeef'" ###(010)=[passed] StrFieldUtf16 >>> class TestStrLenFieldUtf16(Packet): ... fields_desc = [ ... LEFieldLenField('slen', None, length_of="s1"), ... StrLenFieldUtf16('s1', None, length_from=lambda pkt: pkt.slen), ... ] ... >>> p = TestStrLenFieldUtf16(s1='cafe') >>> assert raw(p) == b'\x08\x00c\x00a\x00f\x00e\x00' >>> assert p.sprintf("%s1%") == 'cafe' ###(011)=[passed] StrFieldUtf16 >>> class TestStrFieldUtf16(Packet): ... fields_desc = [ ... StrFieldUtf16('s1', None), ... ] ... >>> p = TestStrFieldUtf16(s1='cafe') >>> assert raw(p) == b'c\x00a\x00f\x00e\x00' >>> assert p.sprintf("%s1%") == 'cafe' ###### ## Tests on ActionField ###### ###(012)=[passed] Creation of a layer with ActionField >>> class TestAction(Packet): ... __slots__ = ["_val", "_fld", "_priv1", "_priv2"] ... name = "TestAction" ... fields_desc = [ ActionField(ByteField("tst", 3), "my_action", priv1=1, priv2=2) ] ... def __init__(self, *args, **kargs): ... self._val, self._fld, self._priv1, self._priv2 = None, None, None, None ... super(TestAction, self).__init__(*args, **kargs) ... def my_action(self, val, fld, priv1, priv2): ... print("Action (%i)!" % val) ... self._val, self._fld, self._priv1, self._priv2 = val, fld, priv1, priv2 ... ###(013)=[passed] Triggering action >>> t = TestAction() >>> assert t._val == t._fld == t._priv1 == t._priv2 == None >>> t.tst=42 Action (42)! >>> assert t._priv1 == 1 >>> assert t._priv2 == 2 >>> assert t._val == 42 ###### ## Tests on FieldLenField ###### ###(014)=[passed] Creation of a layer with FieldLenField >>> class TestFLenF(Packet): ... fields_desc = [ FieldLenField("len", None, length_of="str", fmt="B", adjust=lambda pkt,x:x+1), ... StrLenField("str", "default", length_from=lambda pkt:pkt.len-1,) ] ... ###(015)=[passed] Assembly of an empty packet >>> p = TestFLenF() >>> p >>> r = raw(p) >>> r b'\x08default' >>> r == b"\x08default" True ###(016)=[passed] Assembly of non empty packet >>> p = TestFLenF(str="123") >>> p >>> r = raw(p) >>> r b'\x04123' >>> r == b"\x04123" True ###(017)=[passed] Disassembly >>> p = TestFLenF(b"\x04ABCDEFGHIJKL") >>> p > >>> p.len == 4 and p.str == b"ABC" and Raw in p True ###(018)=[passed] BitFieldLenField test >>> class TestBFLenF(Packet): ... fields_desc = [ BitFieldLenField("len", None, 4, length_of="str" , adjust=lambda pkt,x:x+1, tot_size=-2), ... BitField("nothing",0xfff, 12, end_tot_size=-2), ... StrLenField("str", "default", length_from=lambda pkt:pkt.len-1, ) ] ... >>> a=TestBFLenF() >>> r = raw(a) >>> r b'\xff\x8fdefault' >>> assert r == b"\xff\x8fdefault" >>> >>> a.str="" >>> r = raw(a) >>> r b'\xff\x1f' >>> assert r == b"\xff\x1f" >>> >>> p = TestBFLenF(b"\xff\x1f@@") >>> p > >>> assert p.len == 1 and p.str == b"" and Raw in p and p[Raw].load == b"@@" >>> >>> p = TestBFLenF(b"\xff\x6fabcdeFGH") >>> p > >>> assert p.len == 6 and p.str == b"abcde" and Raw in p and p[Raw].load == b"FGH" ###(019)=[passed] Test BitLenField >>> SIZES = {0: 6, 1: 6, 2: 14, 3: 22} >>> >>> class TestBitLenField(Packet): ... fields_desc = [ ... BitField("mode", 0, 2), ... BitLenField("value", 0, length_from=lambda pkt: SIZES[pkt.mode]) ... ] ... >>> p = TestBitLenField(mode=1, value=50) >>> assert bytes(p) == b"r" >>> >>> p = TestBitLenField(mode=2, value=5000) >>> assert bytes(p) == b'\x93\x88' >>> >>> p = TestBitLenField(b'\xc0\x01\xf4') >>> assert p.mode == 3 >>> assert p.value == 500 ###(020)=[passed] Test UTCTimeField >>> class TestUTCTimeField(Packet): ... fields_desc = [ ... # A Windows time field. See GH#4308 ... UTCTimeField( ... "Time", ... None, ... fmt=">> >>> p = TestUTCTimeField(Time=0) >>> assert p.sprintf("%Time%") == 'Mon, 01 Jan 1601 00:00:00 (-11644473600)' >>> >>> p = TestUTCTimeField(Time=133587912345678900) >>> assert p.sprintf("%Time%") == 'Sun, 28 Apr 2024 15:20:34 (1714317634)' ###### ## Tests on FieldListField ###### ###(021)=[passed] Creation of a layer >>> class TestFLF(Packet): ... name="test" ... fields_desc = [ FieldLenField("len", None, count_of="lst", fmt="B"), ... FieldListField("lst", None, IntField("elt",0), count_from=lambda pkt:pkt.len) ... ] ... ###(022)=[passed] Assembly of an empty packet >>> a = TestFLF() >>> raw(a) b'\x00' ###(023)=[passed] Assembly of a non-empty packet >>> a = TestFLF() >>> a.lst = [7,65539] >>> ls(a) len : FieldLenField = None ('None') lst : FieldListField = [7, 65539] ('[]') >>> r = raw(a) >>> r b'\x02\x00\x00\x00\x07\x00\x01\x00\x03' >>> import struct >>> r == struct.pack("!BII", 2,7,65539) True ###(024)=[passed] Disassemble >>> import struct >>> p = TestFLF(b"\x00\x11\x12") >>> p > >>> assert p.len == 0 and Raw in p and p[Raw].load == b"\x11\x12" >>> p = TestFLF(struct.pack("!BIII",3,1234,2345,12345678)) >>> p >>> assert p.len == 3 and p.lst == [1234,2345,12345678] ###(025)=[passed] Disassemble unaligned >>> import struct >>> class TestFLFUnaligned(Packet): ... name="test" ... fields_desc = [ BitFieldLenField("len", None, 3, count_of="lst"), ... FieldListField("lst", None, XBitField("elt",0,8), count_from=lambda pkt:pkt.len), ... BitField("ignore", None, 5), ... ] ... >>> p = TestFLFUnaligned(b"\x68\x28\x48\x6a") >>> p >>> assert p.len == 3 and p.lst == [0x41,0x42,0x43] and p.ignore == 0xa ###(026)=[passed] Manipulate >>> a = TestFLF(lst=[4]) >>> r = raw(a) >>> r b'\x01\x00\x00\x00\x04' >>> assert r == b"\x01\x00\x00\x00\x04" >>> a.lst.append(1234) >>> TestFLF(raw(a)) >>> a.show2() ###[ test ]### len = 2 lst = [4, 1234] >>> a.len=7 >>> r = raw(a) >>> assert r == b"\x07\x00\x00\x00\x04\x00\x00\x04\xd2" >>> a.len=2 >>> a.lst=[1,2,3,4,5] >>> p = TestFLF(raw(a)) >>> p > >>> assert Raw in p and p[Raw].load == b'\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05' ###(027)=[passed] Test mutability of the default values >>> class X(Packet): ... fields_desc = [ FieldListField("f", [], ByteField("", 0)) ] ... >>> m = X() >>> m.f.append(3) >>> assert raw(m) == b"\x03" >>> assert m.default_fields['f'] == [] >>> assert m.fields['f'] == [3] ###### ## PacketListField ###### ###(028)=[passed] Create a layer >>> class TestPLF(Packet): ... name="test" ... fields_desc=[ FieldLenField("len", None, count_of="plist"), ... PacketListField("plist", None, IP, count_from=lambda pkt:pkt.len,) ] ... ###(029)=[passed] Test the PacketListField assembly >>> x=TestPLF() >>> r = raw(x) >>> r b'\x00\x00' >>> r == b"\x00\x00" True ###(030)=[passed] Test the PacketListField assembly 2 >>> x=TestPLF() >>> x.plist=[IP()/TCP(), IP()/UDP()] >>> r = raw(x) >>> r b'\x00\x02E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r' >>> r.startswith(b'\x00\x02E') True ###(031)=[passed] Test disassembly >>> x=TestPLF(plist=[IP()/TCP(seq=1234567), IP()/UDP()]) >>> p = TestPLF(raw(x)) >>> p >, >] |> >>> p.show() ###[ test ]### len = 2 \plist \ |###[ IP ]### | version = 4 | ihl = 5 | tos = 0x0 | len = 40 | id = 1 | flags = | frag = 0 | ttl = 64 | proto = tcp | chksum = 0x7ccd | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ TCP ]### | sport = ftp_data | dport = http | seq = 1234567 | ack = 0 | dataofs = 5 | reserved = 0 | flags = S | window = 8192 | chksum = 0xbae2 | urgptr = 0 | options = [] |###[ IP ]### | version = 4 | ihl = 5 | tos = 0x0 | len = 28 | id = 1 | flags = | frag = 0 | ttl = 64 | proto = udp | chksum = 0x7cce | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ UDP ]### | sport = domain | dport = domain | len = 8 | chksum = 0x172 >>> IP in p and TCP in p and UDP in p and p[TCP].seq == 1234567 True ###(032)=[passed] Nested PacketListField >>> y=IP()/TCP(seq=111111)/TestPLF(plist=[IP()/TCP(seq=222222),IP()/UDP()]) >>> p = TestPLF(plist=[y,IP()/TCP(seq=333333)]) >>> p >, >] |>>>, >] |> >>> p.show() ###[ test ]### len = None \plist \ |###[ IP ]### | version = 4 | ihl = None | tos = 0x0 | len = None | id = 1 | flags = | frag = 0 | ttl = 64 | proto = tcp | chksum = None | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ TCP ]### | sport = ftp_data | dport = http | seq = 111111 | ack = 0 | dataofs = None | reserved = 0 | flags = S | window = 8192 | chksum = None | urgptr = 0 | options = [] |###[ test ]### | len = None | \plist \ | |###[ IP ]### | | version = 4 | | ihl = None | | tos = 0x0 | | len = None | | id = 1 | | flags = | | frag = 0 | | ttl = 64 | | proto = tcp | | chksum = None | | src = 127.0.0.1 | | dst = 127.0.0.1 | | \options \ | |###[ TCP ]### | | sport = ftp_data | | dport = http | | seq = 222222 | | ack = 0 | | dataofs = None | | reserved = 0 | | flags = S | | window = 8192 | | chksum = None | | urgptr = 0 | | options = [] | |###[ IP ]### | | version = 4 | | ihl = None | | tos = 0x0 | | len = None | | id = 1 | | flags = | | frag = 0 | | ttl = 64 | | proto = udp | | chksum = None | | src = 127.0.0.1 | | dst = 127.0.0.1 | | \options \ | |###[ UDP ]### | | sport = domain | | dport = domain | | len = None | | chksum = None |###[ IP ]### | version = 4 | ihl = None | tos = 0x0 | len = None | id = 1 | flags = | frag = 0 | ttl = 64 | proto = tcp | chksum = None | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ TCP ]### | sport = ftp_data | dport = http | seq = 333333 | ack = 0 | dataofs = None | reserved = 0 | flags = S | window = 8192 | chksum = None | urgptr = 0 | options = [] >>> IP in p and TCP in p and UDP in p and p[TCP].seq == 111111 and p[TCP:2].seq==222222 and p[TCP:3].seq == 333333 True ###### ## PacketListField tests ###### ###(033)=[passed] Create a layer >>> class TestPLF(Packet): ... name="test" ... fields_desc=[ FieldLenField("len", None, count_of="plist"), ... PacketListField("plist", None, IP, count_from=lambda pkt:pkt.len) ] ... ###(034)=[passed] Test the PacketListField assembly >>> x=TestPLF() >>> r = raw(x) >>> r b'\x00\x00' >>> r == b"\x00\x00" True ###(035)=[passed] Test the PacketListField assembly 2 >>> x=TestPLF() >>> x.plist=[IP()/TCP(), IP()/UDP()] >>> r = raw(x) >>> r b'\x00\x02E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r' >>> r.startswith(b'\x00\x02E') True ###(036)=[passed] Test disassembly >>> x=TestPLF(plist=[IP()/TCP(seq=1234567), IP()/UDP()]) >>> p = TestPLF(raw(x)) >>> p >, >] |> >>> p.show() ###[ test ]### len = 2 \plist \ |###[ IP ]### | version = 4 | ihl = 5 | tos = 0x0 | len = 40 | id = 1 | flags = | frag = 0 | ttl = 64 | proto = tcp | chksum = 0x7ccd | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ TCP ]### | sport = ftp_data | dport = http | seq = 1234567 | ack = 0 | dataofs = 5 | reserved = 0 | flags = S | window = 8192 | chksum = 0xbae2 | urgptr = 0 | options = [] |###[ IP ]### | version = 4 | ihl = 5 | tos = 0x0 | len = 28 | id = 1 | flags = | frag = 0 | ttl = 64 | proto = udp | chksum = 0x7cce | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ UDP ]### | sport = domain | dport = domain | len = 8 | chksum = 0x172 >>> IP in p and TCP in p and UDP in p and p[TCP].seq == 1234567 True ###(037)=[passed] Test parent reference >>> x=TestPLF(plist=[IP()/TCP(), IP()/UDP()]) >>> assert p.getlayer(IP, 1).parent == p and p.getlayer(IP, 2).parent == p >>> p = TestPLF(raw(x)) >>> assert p.getlayer(IP, 1).parent == p and p.getlayer(IP, 2).parent == p ###(038)=[passed] Test parent reference in guess_payload_class >>> class TestGuessPLFInner(Packet): ... name="test guess inner" ... fields_desc=[ LenField("foo", None) ] ... def guess_payload_class(self, payload): ... self.parentflag = True ... if self.parent is None: ... # all exceptions are caught, so have to use flag ... self.parentflag = False ... return super(TestGuessPLFInner, self).guess_payload_class(payload) ... >>> class TestGuessPLF(Packet): ... name="test guess" ... fields_desc=[PacketListField("plist", None, TestGuessPLFInner, ... next_cls_cb=lambda p,l,c,r: TestGuessPLFInner if len(l) == 0 else None)] ... >>> x=TestGuessPLF(plist=TestGuessPLFInner()/Raw(b'123')) >>> p=TestGuessPLF(raw(x)) >>> assert p[TestGuessPLFInner].parentflag >>> assert p[TestGuessPLFInner].parent == p ###(039)=[passed] Nested PacketListField >>> y=IP()/TCP(seq=111111)/TestPLF(plist=[IP()/TCP(seq=222222),IP()/UDP()]) >>> p = TestPLF(plist=[y,IP()/TCP(seq=333333)]) >>> p >, >] |>>>, >] |> >>> p.show() ###[ test ]### len = None \plist \ |###[ IP ]### | version = 4 | ihl = None | tos = 0x0 | len = None | id = 1 | flags = | frag = 0 | ttl = 64 | proto = tcp | chksum = None | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ TCP ]### | sport = ftp_data | dport = http | seq = 111111 | ack = 0 | dataofs = None | reserved = 0 | flags = S | window = 8192 | chksum = None | urgptr = 0 | options = [] |###[ test ]### | len = None | \plist \ | |###[ IP ]### | | version = 4 | | ihl = None | | tos = 0x0 | | len = None | | id = 1 | | flags = | | frag = 0 | | ttl = 64 | | proto = tcp | | chksum = None | | src = 127.0.0.1 | | dst = 127.0.0.1 | | \options \ | |###[ TCP ]### | | sport = ftp_data | | dport = http | | seq = 222222 | | ack = 0 | | dataofs = None | | reserved = 0 | | flags = S | | window = 8192 | | chksum = None | | urgptr = 0 | | options = [] | |###[ IP ]### | | version = 4 | | ihl = None | | tos = 0x0 | | len = None | | id = 1 | | flags = | | frag = 0 | | ttl = 64 | | proto = udp | | chksum = None | | src = 127.0.0.1 | | dst = 127.0.0.1 | | \options \ | |###[ UDP ]### | | sport = domain | | dport = domain | | len = None | | chksum = None |###[ IP ]### | version = 4 | ihl = None | tos = 0x0 | len = None | id = 1 | flags = | frag = 0 | ttl = 64 | proto = tcp | chksum = None | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ TCP ]### | sport = ftp_data | dport = http | seq = 333333 | ack = 0 | dataofs = None | reserved = 0 | flags = S | window = 8192 | chksum = None | urgptr = 0 | options = [] >>> IP in p and TCP in p and UDP in p and p[TCP].seq == 111111 and p[TCP:2].seq==222222 and p[TCP:3].seq == 333333 True ###(040)=[passed] Complex packet >>> class TestPkt(Packet): ... fields_desc = [ ByteField("f1",65), ... ShortField("f2",0x4244) ] ... def extract_padding(self, p): ... return "", p ... >>> class TestPLF2(Packet): ... fields_desc = [ FieldLenField("len1", None, count_of="plist", fmt="H", ... adjust=lambda pkt, x: x + 2), ... FieldLenField("len2", None, length_of="plist", fmt="I", ... adjust=lambda pkt, x: (x + 1) // 2), ... PacketListField("plist", None, TestPkt, ... length_from=lambda x: (x.len2 * 2) // 3 * 3) ] ... >>> a=TestPLF2() >>> r = raw(a) >>> r b'\x00\x02\x00\x00\x00\x00' >>> assert r == b"\x00\x02\x00\x00\x00\x00" >>> >>> a.plist=[TestPkt(),TestPkt(f1=100)] >>> r = raw(a) >>> r b'\x00\x04\x00\x00\x00\x03ABDdBD' >>> assert r == b'\x00\x04\x00\x00\x00\x03ABDdBD' >>> >>> a /= "123456" >>> b = TestPLF2(raw(a)) >>> b.show() ###[ TestPLF2 ]### len1 = 4 len2 = 3 \plist \ |###[ TestPkt ]### | f1 = 65 | f2 = 16964 |###[ TestPkt ]### | f1 = 100 | f2 = 16964 ###[ Raw ]### load = b'123456' >>> assert b.len1 == 4 and b.len2 == 3 >>> assert b[TestPkt].f1 == 65 and b[TestPkt].f2 == 0x4244 >>> assert b[TestPkt:2].f1 == 100 >>> assert Raw in b and b[Raw].load == b"123456" >>> >>> a.plist.append(TestPkt(f1=200)) >>> b = TestPLF2(raw(a)) >>> b.show() ###[ TestPLF2 ]### len1 = 5 len2 = 5 \plist \ |###[ TestPkt ]### | f1 = 65 | f2 = 16964 |###[ TestPkt ]### | f1 = 100 | f2 = 16964 |###[ TestPkt ]### | f1 = 200 | f2 = 16964 ###[ Raw ]### load = b'123456' >>> assert b.len1 == 5 and b.len2 == 5 >>> assert b[TestPkt].f1 == 65 and b[TestPkt].f2 == 0x4244 >>> assert b[TestPkt:2].f1 == 100 >>> assert b[TestPkt:3].f1 == 200 >>> assert b.getlayer(TestPkt,4) is None >>> assert Raw in b and b[Raw].load == b"123456" >>> hexdiff(a,b) 0000 0000 00 05 00 00 00 05 41 42 44 64 42 44 C8 42 44 31 ......ABDdBD.BD1 0010 0010 32 33 34 35 36 23456 >>> assert raw(a) == raw(b) ###### ## Tests on TCPOptionsField ###### ###(041)=[passed] Test calls on TCPOptionsField.getfield >>> assert TCPOptionsField("test", "").getfield(TCP(dataofs=0), "") == ('', []) ###### ## PacketListField tests ###### ###(042)=[passed] Create a layer >>> class TestPLF(Packet): ... name="test" ... fields_desc=[ FieldLenField("len", None, count_of="plist"), ... PacketListField("plist", None, IP, count_from=lambda pkt:pkt.len) ] ... ###(043)=[passed] Test the PacketListField assembly >>> x=TestPLF() >>> r = raw(x) >>> r b'\x00\x00' >>> r == b"\x00\x00" True ###(044)=[passed] Test the PacketListField assembly 2 >>> x=TestPLF() >>> x.plist=[IP()/TCP(), IP()/UDP()] >>> r = raw(x) >>> r b'\x00\x02E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r' >>> r.startswith(b'\x00\x02E') True ###(045)=[passed] Test disassembly >>> x=TestPLF(plist=[IP()/TCP(seq=1234567), IP()/UDP()]) >>> p = TestPLF(raw(x)) >>> p >, >] |> >>> p.show() ###[ test ]### len = 2 \plist \ |###[ IP ]### | version = 4 | ihl = 5 | tos = 0x0 | len = 40 | id = 1 | flags = | frag = 0 | ttl = 64 | proto = tcp | chksum = 0x7ccd | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ TCP ]### | sport = ftp_data | dport = http | seq = 1234567 | ack = 0 | dataofs = 5 | reserved = 0 | flags = S | window = 8192 | chksum = 0xbae2 | urgptr = 0 | options = [] |###[ IP ]### | version = 4 | ihl = 5 | tos = 0x0 | len = 28 | id = 1 | flags = | frag = 0 | ttl = 64 | proto = udp | chksum = 0x7cce | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ UDP ]### | sport = domain | dport = domain | len = 8 | chksum = 0x172 >>> IP in p and TCP in p and UDP in p and p[TCP].seq == 1234567 True ###(046)=[passed] Nested PacketListField >>> y=IP()/TCP(seq=111111)/TestPLF(plist=[IP()/TCP(seq=222222),IP()/UDP()]) >>> p = TestPLF(plist=[y,IP()/TCP(seq=333333)]) >>> p >, >] |>>>, >] |> >>> p.show() ###[ test ]### len = None \plist \ |###[ IP ]### | version = 4 | ihl = None | tos = 0x0 | len = None | id = 1 | flags = | frag = 0 | ttl = 64 | proto = tcp | chksum = None | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ TCP ]### | sport = ftp_data | dport = http | seq = 111111 | ack = 0 | dataofs = None | reserved = 0 | flags = S | window = 8192 | chksum = None | urgptr = 0 | options = [] |###[ test ]### | len = None | \plist \ | |###[ IP ]### | | version = 4 | | ihl = None | | tos = 0x0 | | len = None | | id = 1 | | flags = | | frag = 0 | | ttl = 64 | | proto = tcp | | chksum = None | | src = 127.0.0.1 | | dst = 127.0.0.1 | | \options \ | |###[ TCP ]### | | sport = ftp_data | | dport = http | | seq = 222222 | | ack = 0 | | dataofs = None | | reserved = 0 | | flags = S | | window = 8192 | | chksum = None | | urgptr = 0 | | options = [] | |###[ IP ]### | | version = 4 | | ihl = None | | tos = 0x0 | | len = None | | id = 1 | | flags = | | frag = 0 | | ttl = 64 | | proto = udp | | chksum = None | | src = 127.0.0.1 | | dst = 127.0.0.1 | | \options \ | |###[ UDP ]### | | sport = domain | | dport = domain | | len = None | | chksum = None |###[ IP ]### | version = 4 | ihl = None | tos = 0x0 | len = None | id = 1 | flags = | frag = 0 | ttl = 64 | proto = tcp | chksum = None | src = 127.0.0.1 | dst = 127.0.0.1 | \options \ |###[ TCP ]### | sport = ftp_data | dport = http | seq = 333333 | ack = 0 | dataofs = None | reserved = 0 | flags = S | window = 8192 | chksum = None | urgptr = 0 | options = [] >>> IP in p and TCP in p and UDP in p and p[TCP].seq == 111111 and p[TCP:2].seq==222222 and p[TCP:3].seq == 333333 True ###(047)=[passed] Complex packet >>> class TestPkt(Packet): ... fields_desc = [ ByteField("f1",65), ... ShortField("f2",0x4244) ] ... def extract_padding(self, p): ... return "", p ... >>> class TestPLF2(Packet): ... fields_desc = [ FieldLenField("len1", None, count_of="plist",fmt="H", ... adjust=lambda pkt,x: x + 2), ... FieldLenField("len2", None, length_of="plist", fmt="I", ... adjust=lambda pkt, x: (x + 1) // 2), ... PacketListField("plist", None, TestPkt, ... length_from=lambda x: (x.len2 * 2) // 3 *3) ] ... >>> a=TestPLF2() >>> r = raw(a) >>> r b'\x00\x02\x00\x00\x00\x00' >>> assert r == b"\x00\x02\x00\x00\x00\x00" >>> >>> a.plist=[TestPkt(),TestPkt(f1=100)] >>> r = raw(a) >>> r b'\x00\x04\x00\x00\x00\x03ABDdBD' >>> assert r == b'\x00\x04\x00\x00\x00\x03ABDdBD' >>> >>> a /= "123456" >>> b = TestPLF2(raw(a)) >>> b.show() ###[ TestPLF2 ]### len1 = 4 len2 = 3 \plist \ |###[ TestPkt ]### | f1 = 65 | f2 = 16964 |###[ TestPkt ]### | f1 = 100 | f2 = 16964 ###[ Raw ]### load = b'123456' >>> assert b.len1 == 4 and b.len2 == 3 >>> assert b[TestPkt].f1 == 65 and b[TestPkt].f2 == 0x4244 >>> assert b[TestPkt:2].f1 == 100 >>> assert Raw in b and b[Raw].load == b"123456" >>> >>> a.plist.append(TestPkt(f1=200)) >>> b = TestPLF2(raw(a)) >>> b.show() ###[ TestPLF2 ]### len1 = 5 len2 = 5 \plist \ |###[ TestPkt ]### | f1 = 65 | f2 = 16964 |###[ TestPkt ]### | f1 = 100 | f2 = 16964 |###[ TestPkt ]### | f1 = 200 | f2 = 16964 ###[ Raw ]### load = b'123456' >>> assert b.len1 == 5 and b.len2 == 5 >>> assert b[TestPkt].f1 == 65 and b[TestPkt].f2 == 0x4244 >>> assert b[TestPkt:2].f1 == 100 >>> assert b[TestPkt:3].f1 == 200 >>> assert b.getlayer(TestPkt,4) is None >>> assert Raw in b and b[Raw].load == b"123456" >>> hexdiff(a,b) 0000 0000 00 05 00 00 00 05 41 42 44 64 42 44 C8 42 44 31 ......ABDdBD.BD1 0010 0010 32 33 34 35 36 23456 >>> assert raw(a) == raw(b) ###(048)=[passed] Create layers for heterogeneous PacketListField >>> TestPLFH1 = type('TestPLFH1', (Packet,), { ... 'name': 'test1', ... 'fields_desc': [ByteField('data', 0)], ... 'guess_payload_class': lambda self, p: conf.padding_layer, ... } ... ) >>> TestPLFH2 = type('TestPLFH2', (Packet,), { ... 'name': 'test2', ... 'fields_desc': [ShortField('data', 0)], ... 'guess_payload_class': lambda self, p: conf.padding_layer, ... } ... ) >>> class TestPLFH3(Packet): ... name = 'test3' ... fields_desc = [ ... PacketListField( ... 'data', [], ... next_cls_cb=lambda pkt, lst, p, remain: pkt.detect_next_packet(lst, p, remain) ... ) ... ] ... def detect_next_packet(self, lst, p, remain): ... if len(remain) < 3: ... return None ... if isinstance(p, type(None)): ... return TestPLFH1 ... if p.data & 3 == 1: ... return TestPLFH1 ... if p.data & 3 == 2: ... return TestPLFH2 ... return None ... ###(049)=[passed] Test heterogeneous PacketListField >>> p = TestPLFH3(b'\x02\x01\x01\xc1\x02\x80\x04toto') >>> assert isinstance(p.data[0], TestPLFH1) >>> assert p.data[0].data == 0x2 >>> assert isinstance(p.data[1], TestPLFH2) >>> assert p.data[1].data == 0x101 >>> assert isinstance(p.data[2], TestPLFH1) >>> assert p.data[2].data == 0xc1 >>> assert isinstance(p.data[3], TestPLFH1) >>> assert p.data[3].data == 0x2 >>> assert isinstance(p.data[4], TestPLFH2) >>> assert p.data[4].data == 0x8004 >>> assert isinstance(p.payload, conf.raw_layer) >>> assert p.payload.load == b'toto' >>> >>> p = TestPLFH3(b'\x02\x01\x01\xc1\x02\x80\x02to') >>> assert isinstance(p.data[0], TestPLFH1) >>> assert p.data[0].data == 0x2 >>> assert isinstance(p.data[1], TestPLFH2) >>> assert p.data[1].data == 0x101 >>> assert isinstance(p.data[2], TestPLFH1) >>> assert p.data[2].data == 0xc1 >>> assert isinstance(p.data[3], TestPLFH1) >>> assert p.data[3].data == 0x2 >>> assert isinstance(p.data[4], TestPLFH2) >>> assert p.data[4].data == 0x8002 >>> assert isinstance(p.payload, conf.raw_layer) >>> assert p.payload.load == b'to' ###(050)=[passed] Create layers for heterogeneous PacketListField with memory >>> TestPLFH4 = type('TestPLFH4', (Packet,), { ... 'name': 'test4', ... 'fields_desc': [ByteField('data', 0)], ... 'guess_payload_class': lambda self, p: conf.padding_layer, ... } ... ) >>> TestPLFH5 = type('TestPLFH5', (Packet,), { ... 'name': 'test5', ... 'fields_desc': [ShortField('data', 0)], ... 'guess_payload_class': lambda self, p: conf.padding_layer, ... } ... ) >>> class TestPLFH6(Packet): ... __slots__ = ['_memory'] ... name = 'test6' ... fields_desc = [ ... PacketListField( ... 'data', [], ... next_cls_cb=lambda pkt, lst, p, remain: pkt.detect_next_packet(lst, p, remain) ... ) ... ] ... def detect_next_packet(self, lst, p, remain): ... if isinstance(p, type(None)): ... self._memory = [TestPLFH4] * 3 + [TestPLFH5] ... try: ... return self._memory.pop(0) ... except IndexError: ... return None ... ###(051)=[passed] Test heterogeneous PacketListField with memory >>> p = TestPLFH6(b'\x01\x02\x03\xc1\x02toto') >>> assert isinstance(p.data[0], TestPLFH4) >>> assert p.data[0].data == 0x1 >>> assert isinstance(p.data[1], TestPLFH4) >>> assert p.data[1].data == 0x2 >>> assert isinstance(p.data[2], TestPLFH4) >>> assert p.data[2].data == 0x3 >>> assert isinstance(p.data[3], TestPLFH5) >>> assert p.data[3].data == 0xc102 >>> assert isinstance(p.payload, conf.raw_layer) >>> assert p.payload.load == b'toto' ###(052)=[passed] Test nested PacketListFields >>> class GuessPayload(Packet): ... @classmethod ... def dispatch_hook(cls, *args, **kargs): ... return TestNestedPLF ... >>> class TestNestedPLF(Packet): ... fields_desc = [ ... ByteField('b', 0), ... PacketListField('pl', [], GuessPayload) ... ] ... >>> p = TestNestedPLF(b'\x01' * 100) >>> >>> i = 1 >>> while p.pl: ... p = p.pl[0] ... p.show() ... i += 1 ... ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ | | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ | | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | | b = 1 | | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ | | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | | b = 1 | | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ | | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | | b = 1 | | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ | | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | | b = 1 | | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ | | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | | b = 1 | | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ | | | | | | | |###[ TestNestedPLF ]### | | | | | | | | b = 1 | | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ | | | | | | |###[ TestNestedPLF ]### | | | | | | | b = 1 | | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ | | | | | |###[ TestNestedPLF ]### | | | | | | b = 1 | | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ | | | | |###[ TestNestedPLF ]### | | | | | b = 1 | | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ | | | |###[ TestNestedPLF ]### | | | | b = 1 | | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ | | |###[ TestNestedPLF ]### | | | b = 1 | | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ | |###[ TestNestedPLF ]### | | b = 1 | | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ |###[ TestNestedPLF ]### | b = 1 | \pl \ ###[ TestNestedPLF ]### b = 1 \pl \ >>> assert i == 100 ###(053)=[passed] Test cache handling of payload modification in a PacketListField >>> class SubPacket(Packet): ... fields_desc = [ ... ByteField("b", 0), ... ] ... >>> class MyPacket(Packet): ... fields_desc = [ ... PacketListField("a", [], SubPacket), ... ] ... >>> >>> p = MyPacket(b"\x00extrapayload") >>> p.a[0] = SubPacket(b=0) / b"test" >>> >>> assert bytes(p) == b"\x00test" ###(054)=[passed] Test cache handling of payload modification in a PacketField >>> class PayloadPacket(Packet): ... fields_desc = [ ... StrField("b", ""), ... ] ... >>> class SubPacket(Packet): ... fields_desc = [] ... >>> bind_layers(SubPacket, PayloadPacket) >>> >>> class MyPacket(Packet): ... fields_desc = [ ... PacketField("a", None, SubPacket), ... ] ... >>> >>> s = b'test' >>> p = MyPacket(s) >>> >>> p[PayloadPacket].b = b'new' >>> assert p.build() != s ###### ## Tests on MultiFlagsField ###### ###(055)=[passed] Test calls on MultiFlagsField.any2i >>> import collections >>> MockPacket = collections.namedtuple('MockPacket', ['type']) >>> >>> f = MultiFlagsField('flags', set(), 3, { ... 0: { ... 0: MultiFlagsEntry('A', 'OptionA'), ... 1: MultiFlagsEntry('B', 'OptionB'), ... }, ... 1: { ... 0: MultiFlagsEntry('+', 'Plus'), ... 1: MultiFlagsEntry('*', 'Star'), ... }, ... }, ... depends_on=lambda x: x.type ... ) >>> >>> mp = MockPacket(0) >>> x = f.any2i(mp, set()) >>> assert isinstance(x, set) >>> assert len(x) == 0 >>> x = f.any2i(mp, {'A'}) >>> assert isinstance(x, set) >>> assert len(x) == 1 >>> assert 'A' in x >>> assert 'B' not in x >>> assert '+' not in x >>> x = f.any2i(mp, {'A', 'B'}) >>> assert isinstance(x, set) >>> assert len(x) == 2 >>> assert 'A' in x >>> assert 'B' in x >>> assert '+' not in x >>> assert '*' not in x >>> x = f.any2i(mp, 3) >>> assert isinstance(x, set) >>> assert len(x) == 2 >>> assert 'A' in x >>> assert 'B' in x >>> assert '+' not in x >>> assert '*' not in x >>> x = f.any2i(mp, 7) >>> assert isinstance(x, set) >>> assert len(x) == 3 >>> assert 'A' in x >>> assert 'B' in x >>> assert 'bit 2' in x >>> assert '+' not in x >>> assert '*' not in x >>> mp = MockPacket(1) >>> x = f.any2i(mp, {'+', '*'}) >>> assert isinstance(x, set) >>> assert len(x) == 2 >>> assert '+' in x >>> assert '*' in x >>> assert 'A' not in x >>> assert 'B' not in x >>> try: ... x = f.any2i(mp, {'A'}) ... ret = False ... except AssertionError: ... ret = True ... >>> assert ret >>> x = f.any2i(None, {'Toto'}) >>> assert 'Toto' in x ###(056)=[passed] Test calls on MultiFlagsField.i2m >>> import collections >>> MockPacket = collections.namedtuple('MockPacket', ['type']) >>> >>> f = MultiFlagsField('flags', set(), 3, { ... 0: { ... 0: MultiFlagsEntry('A', 'OptionA'), ... 1: MultiFlagsEntry('B', 'OptionB'), ... }, ... 1: { ... 0: MultiFlagsEntry('+', 'Plus'), ... 1: MultiFlagsEntry('*', 'Star'), ... }, ... }, ... depends_on=lambda x: x.type ... ) >>> >>> mp = MockPacket(0) >>> x = f.i2m(mp, set()) >>> assert isinstance(x, int) >>> assert x == 0 >>> x = f.i2m(mp, {'A'}) >>> assert isinstance(x, int) >>> assert x == 1 >>> x = f.i2m(mp, {'A', 'B'}) >>> assert isinstance(x, int) >>> assert x == 3 >>> x = f.i2m(mp, {'A', 'B', 'bit 2'}) >>> assert isinstance(x, int) >>> assert x == 7 >>> try: ... x = f.i2m(mp, {'+'}) ... ret = False ... except: ... ret = True ... >>> assert ret ###(057)=[passed] Test calls on MultiFlagsField.m2i >>> import collections >>> MockPacket = collections.namedtuple('MockPacket', ['type']) >>> >>> f = MultiFlagsField('flags', set(), 3, { ... 0: { ... 0: MultiFlagsEntry('A', 'OptionA'), ... 1: MultiFlagsEntry('B', 'OptionB'), ... }, ... 1: { ... 0: MultiFlagsEntry('+', 'Plus'), ... 1: MultiFlagsEntry('*', 'Star'), ... }, ... }, ... depends_on=lambda x: x.type ... ) >>> >>> mp = MockPacket(0) >>> x = f.m2i(mp, 2) >>> assert isinstance(x, set) >>> assert len(x) == 1 >>> assert 'B' in x >>> assert 'A' not in x >>> assert '*' not in x >>> >>> x = f.m2i(mp, 7) >>> assert isinstance(x, set) >>> assert 'B' in x >>> assert 'A' in x >>> assert 'bit 2' in x >>> assert '*' not in x >>> assert '+' not in x >>> x = f.m2i(mp, 0) >>> assert len(x) == 0 >>> mp = MockPacket(1) >>> x = f.m2i(mp, 2) >>> assert isinstance(x, set) >>> assert len(x) == 1 >>> assert '*' in x >>> assert '+' not in x >>> assert 'B' not in x ###(058)=[passed] Test calls on MultiFlagsField.i2repr >>> import collections, re >>> MockPacket = collections.namedtuple('MockPacket', ['type']) >>> >>> f = MultiFlagsField('flags', set(), 3, { ... 0: { ... 0: MultiFlagsEntry('A', 'OptionA'), ... 1: MultiFlagsEntry('B', 'OptionB'), ... }, ... 1: { ... 0: MultiFlagsEntry('+', 'Plus'), ... 1: MultiFlagsEntry('*', 'Star'), ... }, ... }, ... depends_on=lambda x: x.type ... ) >>> >>> mp = MockPacket(0) >>> x = f.i2repr(mp, {'A', 'B'}) >>> assert re.match(r'^.*OptionA \(A\).*$', x) is not None >>> assert re.match(r'^.*OptionB \(B\).*$', x) is not None >>> mp = MockPacket(1) >>> x = f.i2repr(mp, {'*', '+', 'bit 2'}) >>> assert re.match(r'^.*Star \(\*\).*$', x) is not None >>> assert re.match(r'^.*Plus \(\+\).*$', x) is not None >>> assert re.match(r'^.*bit 2.*$', x) is not None ###### ## EnumField tests ###### ###(059)=[passed] EnumField tests initialization >>> f = EnumField('test', 0, {0: 'Foo', 1: 'Bar'}) >>> rf = EnumField('test', 0, {'Foo': 0, 'Bar': 1}) >>> lf = EnumField('test', 0, ['Foo', 'Bar']) >>> fcb = EnumField('test', 0, ( ... lambda x: 'Foo' if x == 0 else 'Bar' if 1 <= x <= 10 else repr(x), ... lambda x: 0 if x == 'Foo' else 1 if x == 'Bar' else int(x), ... ) ... ) >>> >>> def expect_exception(e, c): ... try: ... eval(c) ... assert False ... except e: ... assert True ... ###(060)=[passed] EnumField.any2i_one >>> assert f.any2i_one(None, 'Foo') == 0 >>> assert f.any2i_one(None, 'Bar') == 1 >>> assert f.any2i_one(None, 2) == 2 >>> expect_exception(KeyError, 'f.any2i_one(None, "Baz")') >>> >>> assert rf.any2i_one(None, 'Foo') == 0 >>> assert rf.any2i_one(None, 'Bar') == 1 >>> assert rf.any2i_one(None, 2) == 2 >>> expect_exception(KeyError, 'rf.any2i_one(None, "Baz")') >>> >>> assert lf.any2i_one(None, 'Foo') == 0 >>> assert lf.any2i_one(None, 'Bar') == 1 >>> assert lf.any2i_one(None, 2) == 2 >>> expect_exception(KeyError, 'lf.any2i_one(None, "Baz")') >>> >>> assert fcb.any2i_one(None, 'Foo') == 0 >>> assert fcb.any2i_one(None, 'Bar') == 1 >>> assert fcb.any2i_one(None, 5) == 5 >>> expect_exception(ValueError, 'fcb.any2i_one(None, "Baz")') ###(061)=[passed] EnumField.any2i >>> assert f.any2i(None, 'Foo') == 0 >>> assert f.any2i(None, 'Bar') == 1 >>> assert f.any2i(None, 2) == 2 >>> expect_exception(KeyError, 'f.any2i(None, "Baz")') >>> assert f.any2i(None, ['Foo', 'Bar', 2]) == [0, 1, 2] >>> >>> assert rf.any2i(None, 'Foo') == 0 >>> assert rf.any2i(None, 'Bar') == 1 >>> assert rf.any2i(None, 2) == 2 >>> expect_exception(KeyError, 'rf.any2i(None, "Baz")') >>> assert rf.any2i(None, ['Foo', 'Bar', 2]) == [0, 1, 2] >>> >>> assert lf.any2i(None, 'Foo') == 0 >>> assert lf.any2i(None, 'Bar') == 1 >>> assert lf.any2i(None, 2) == 2 >>> expect_exception(KeyError, 'lf.any2i(None, "Baz")') >>> assert lf.any2i(None, ['Foo', 'Bar', 2]) == [0, 1, 2] >>> >>> assert fcb.any2i(None, 'Foo') == 0 >>> assert fcb.any2i(None, 'Bar') == 1 >>> assert fcb.any2i(None, 5) == 5 >>> expect_exception(ValueError, 'fcb.any2i(None, "Baz")') >>> assert f.any2i(None, ['Foo', 'Bar', 5]) == [0, 1, 5] >>> >>> True True ###(062)=[passed] EnumField.i2repr_one >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == 'Bar' >>> assert f.i2repr_one(None, 2) == '2' >>> >>> assert rf.i2repr_one(None, 0) == 'Foo' >>> assert rf.i2repr_one(None, 1) == 'Bar' >>> assert rf.i2repr_one(None, 2) == '2' >>> >>> assert lf.i2repr_one(None, 0) == 'Foo' >>> assert lf.i2repr_one(None, 1) == 'Bar' >>> assert lf.i2repr_one(None, 2) == '2' >>> >>> assert fcb.i2repr_one(None, 0) == 'Foo' >>> assert fcb.i2repr_one(None, 1) == 'Bar' >>> assert fcb.i2repr_one(None, 5) == 'Bar' >>> assert fcb.i2repr_one(None, 11) == repr(11) >>> >>> conf.noenum.add(f, rf, lf, fcb) >>> >>> assert f.i2repr_one(None, 0) == repr(0) >>> assert f.i2repr_one(None, 1) == repr(1) >>> assert f.i2repr_one(None, 2) == repr(2) >>> >>> assert rf.i2repr_one(None, 0) == repr(0) >>> assert rf.i2repr_one(None, 1) == repr(1) >>> assert rf.i2repr_one(None, 2) == repr(2) >>> >>> assert lf.i2repr_one(None, 0) == repr(0) >>> assert lf.i2repr_one(None, 1) == repr(1) >>> assert lf.i2repr_one(None, 2) == repr(2) >>> >>> assert fcb.i2repr_one(None, 0) == repr(0) >>> assert fcb.i2repr_one(None, 1) == repr(1) >>> assert fcb.i2repr_one(None, 5) == repr(5) >>> assert fcb.i2repr_one(None, 11) == repr(11) >>> >>> conf.noenum.remove(f, rf, lf, fcb) >>> >>> assert f.i2repr_one(None, RandNum(0, 10)) == '' >>> assert rf.i2repr_one(None, RandNum(0, 10)) == '' >>> assert lf.i2repr_one(None, RandNum(0, 10)) == '' >>> assert fcb.i2repr_one(None, RandNum(0, 10)) == '' >>> >>> True True ###(063)=[passed] EnumField.i2repr >>> assert f.i2repr(None, 0) == 'Foo' >>> assert f.i2repr(None, 1) == 'Bar' >>> assert f.i2repr(None, 2) == '2' >>> assert f.i2repr(None, [0, 1]) == ['Foo', 'Bar'] >>> >>> assert rf.i2repr(None, 0) == 'Foo' >>> assert rf.i2repr(None, 1) == 'Bar' >>> assert rf.i2repr(None, 2) == '2' >>> assert rf.i2repr(None, [0, 1]) == ['Foo', 'Bar'] >>> >>> assert lf.i2repr(None, 0) == 'Foo' >>> assert lf.i2repr(None, 1) == 'Bar' >>> assert lf.i2repr(None, 2) == '2' >>> assert lf.i2repr(None, [0, 1]) == ['Foo', 'Bar'] >>> >>> assert fcb.i2repr(None, 0) == 'Foo' >>> assert fcb.i2repr(None, 1) == 'Bar' >>> assert fcb.i2repr(None, 5) == 'Bar' >>> assert fcb.i2repr(None, 11) == repr(11) >>> assert fcb.i2repr(None, [0, 1, 5, 11]) == ['Foo', 'Bar', 'Bar', repr(11)] >>> >>> conf.noenum.add(f, rf, lf, fcb) >>> >>> assert f.i2repr(None, 0) == repr(0) >>> assert f.i2repr(None, 1) == repr(1) >>> assert f.i2repr(None, 2) == repr(2) >>> assert f.i2repr(None, [0, 1, 2]) == [repr(0), repr(1), repr(2)] >>> >>> assert rf.i2repr(None, 0) == repr(0) >>> assert rf.i2repr(None, 1) == repr(1) >>> assert rf.i2repr(None, 2) == repr(2) >>> assert rf.i2repr(None, [0, 1, 2]) == [repr(0), repr(1), repr(2)] >>> >>> assert lf.i2repr(None, 0) == repr(0) >>> assert lf.i2repr(None, 1) == repr(1) >>> assert lf.i2repr(None, 2) == repr(2) >>> assert lf.i2repr(None, [0, 1, 2]) == [repr(0), repr(1), repr(2)] >>> >>> assert fcb.i2repr(None, 0) == repr(0) >>> assert fcb.i2repr(None, 1) == repr(1) >>> assert fcb.i2repr(None, 5) == repr(5) >>> assert fcb.i2repr(None, 11) == repr(11) >>> assert fcb.i2repr(None, [0, 1, 5, 11]) == [repr(0), repr(1), repr(5), repr(11)] >>> >>> conf.noenum.remove(f, rf, lf, fcb) >>> >>> assert f.i2repr_one(None, RandNum(0, 10)) == '' >>> assert rf.i2repr_one(None, RandNum(0, 10)) == '' >>> assert lf.i2repr_one(None, RandNum(0, 10)) == '' >>> assert fcb.i2repr_one(None, RandNum(0, 10)) == '' >>> >>> True True ###(064)=[passed] EnumField with Enum >>> from enum import Enum >>> >>> class JUICE(Enum): ... APPLE = 0 ... ORANGE = 1 ... PINEAPPLE = 2 ... >>> >>> class Breakfast(Packet): ... fields_desc = [EnumField("juice", 1, JUICE, fmt="H")] ... >>> >>> assert raw(Breakfast(juice="ORANGE")) == b"\x00\x01" ###(065)=[passed] LE3BytesEnumField >>> f = LE3BytesEnumField('test', 0, {0: 'Foo', 1: 'Bar'}) ###(066)=[passed] LE3BytesEnumField.i2repr_one >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == 'Bar' >>> assert f.i2repr_one(None, 2) == '2' ###(067)=[passed] XLE3BytesEnumField >>> assert XLE3BytesEnumField("a", 0, {0: "test"}).i2repr_one(None, 0) == "test" >>> assert XLE3BytesEnumField("a", 0, {0: "test"}).i2repr_one(None, 1) == "0x1" ###### ## CharEnumField tests ###### ###(068)=[passed] Building expect_exception handler >>> def expect_exception(e, c): ... try: ... eval(c) ... assert False ... except e: ... assert True ... ###(069)=[passed] CharEnumField tests initialization >>> fc = CharEnumField('test', 'f', {'f': 'Foo', 'b': 'Bar'}) >>> fcb = CharEnumField('test', 'a', ( ... lambda x: 'Foo' if x == 'a' else 'Bar' if x == 'b' else 'Baz', ... lambda x: 'a' if x == 'Foo' else 'b' if x == 'Bar' else '' ... )) >>> >>> True True ###(070)=[passed] CharEnumField.any2i_one >>> assert fc.any2i_one(None, 'Foo') == 'f' >>> assert fc.any2i_one(None, 'Bar') == 'b' >>> expect_exception(KeyError, 'fc.any2i_one(None, "Baz")') >>> >>> assert fcb.any2i_one(None, 'Foo') == 'a' >>> assert fcb.any2i_one(None, 'Bar') == 'b' >>> assert fcb.any2i_one(None, 'Baz') == '' >>> >>> True True ###### ## XByteEnumField tests ###### ###(071)=[passed] Building expect_exception handler >>> def expect_exception(e, c): ... try: ... eval(c) ... assert False ... except e: ... assert True ... ###(072)=[passed] XByteEnumField tests initialization >>> f = XByteEnumField('test', 0, {0: 'Foo', 1: 'Bar'}) >>> fcb = XByteEnumField('test', 0, ( ... lambda x: 'Foo' if x == 0 else 'Bar' if x == 1 else lhex(x), ... lambda x: x ... )) >>> >>> True True ###(073)=[passed] XByteEnumField.i2repr_one >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == 'Bar' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == 'Bar' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> True True ###(074)=[passed] XByteEnumField update tests initialization >>> enum = ObservableDict({0: 'Foo', 1: 'Bar'}) >>> f = XByteEnumField('test', 0, enum) >>> fcb = XByteEnumField('test', 0, ( ... lambda x: 'Foo' if x == 0 else 'Bar' if x == 1 else lhex(x), ... lambda x: x ... )) >>> >>> True True ###(075)=[passed] XByteEnumField.i2repr_one with update >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == 'Bar' >>> assert f.i2repr_one(None, 2) == '0x2' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == 'Bar' >>> assert f.i2repr_one(None, 2) == '0x2' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> del enum[1] >>> enum[2] = 'Baz' >>> >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == '0x1' >>> assert f.i2repr_one(None, 2) == 'Baz' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == '0x1' >>> assert f.i2repr_one(None, 2) == 'Baz' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> True True ###### ## XShortEnumField tests ###### ###(076)=[passed] Building expect_exception handler >>> def expect_exception(e, c): ... try: ... eval(c) ... assert False ... except e: ... assert True ... ###(077)=[passed] XShortEnumField tests initialization >>> f = XShortEnumField('test', 0, {0: 'Foo', 1: 'Bar'}) >>> fcb = XShortEnumField('test', 0, ( ... lambda x: 'Foo' if x == 0 else 'Bar' if x == 1 else lhex(x), ... lambda x: x ... )) >>> >>> True True ###(078)=[passed] XShortEnumField.i2repr_one >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == 'Bar' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == 'Bar' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> True True ###(079)=[passed] XShortEnumField update tests initialization >>> enum = ObservableDict({0: 'Foo', 1: 'Bar'}) >>> f = XShortEnumField('test', 0, enum) >>> fcb = XShortEnumField('test', 0, ( ... lambda x: 'Foo' if x == 0 else 'Bar' if x == 1 else lhex(x), ... lambda x: x ... )) >>> >>> True True ###(080)=[passed] XShortEnumField.i2repr_one with update >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == 'Bar' >>> assert f.i2repr_one(None, 2) == '0x2' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == 'Bar' >>> assert f.i2repr_one(None, 2) == '0x2' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> del enum[1] >>> enum[2] = 'Baz' >>> >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == '0x1' >>> assert f.i2repr_one(None, 2) == 'Baz' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> assert f.i2repr_one(None, 0) == 'Foo' >>> assert f.i2repr_one(None, 1) == '0x1' >>> assert f.i2repr_one(None, 2) == 'Baz' >>> assert f.i2repr_one(None, 0xff) == '0xff' >>> >>> True True ###### ## DNSStrField tests ###### ###(081)=[passed] Raise exception - test data >>> dnsf = DNSStrField("test", "") >>> assert dnsf.getfield(None, b"\x01x\x00") == (b"", b"x.") >>> >>> try: ... dnsf.getfield(None, b"\xc0\xff") ... assert False ... except (Scapy_Exception, IndexError): ... pass ... ###### ## YesNoByteField ###### ###(082)=[passed] default usage >>> yn_bf = YesNoByteField('test', 0x00) >>> assert yn_bf.i2repr(None, 0x00) == 'no' >>> assert yn_bf.i2repr(None, 0x01) == 'yes' >>> assert yn_bf.i2repr(None, 0x02) == 'yes' >>> assert yn_bf.i2repr(None, 0xff) == 'yes' ###(083)=[passed] inverted yes - no (scalar config) >>> yn_bf = YesNoByteField('test', 0x00, config={'yes': 0x00, 'no': 0x01}) >>> assert yn_bf.i2repr(None, 0x00) == 'yes' >>> assert yn_bf.i2repr(None, 0x01) == 'no' >>> assert yn_bf.i2repr(None, 0x02) == 2 >>> assert yn_bf.i2repr(None, 0xff) == 255 ###(084)=[passed] inverted yes - no (range config) >>> yn_bf = YesNoByteField('test', 0x00, config={'yes': 0x00, 'no': (0x01, 0xff)}) >>> assert yn_bf.i2repr(None, 0x00) == 'yes' >>> assert yn_bf.i2repr(None, 0x01) == 'no' >>> assert yn_bf.i2repr(None, 0x02) == 'no' >>> assert yn_bf.i2repr(None, 0xff) == 'no' ###(085)=[passed] yes - no (using sets) >>> yn_bf = YesNoByteField('test', 0x00, config={'yes': [0x00, 0x02], 'no': [0x01, 0x04, 0xff]}) >>> assert yn_bf.i2repr(None, 0x00) == 'yes' >>> assert yn_bf.i2repr(None, 0x01) == 'no' >>> assert yn_bf.i2repr(None, 0x02) == 'yes' >>> assert yn_bf.i2repr(None, 0x03) == 3 >>> assert yn_bf.i2repr(None, 0x04) == 'no' >>> assert yn_bf.i2repr(None, 0x05) == 5 >>> assert yn_bf.i2repr(None, 0xff) == 'no' ###(086)=[passed] yes, no and invalid >>> yn_bf = YesNoByteField('test', 0x00, config={'no': 0x00, 'yes': 0x01, 'invalid': (0x02, 0xff)}) >>> assert yn_bf.i2repr(None, 0x00) == 'no' >>> assert yn_bf.i2repr(None, 0x01) == 'yes' >>> assert yn_bf.i2repr(None, 0x02) == 'invalid' >>> assert yn_bf.i2repr(None, 0xff) == 'invalid' ###(087)=[passed] invalid scalar spec >>> try: ... YesNoByteField('test', 0x00, config={'no': 0x00, 'yes': 256}) ... assert False ... except FieldValueRangeException: ... pass ... ###(088)=[passed] invalid range spec - invalid length >>> try: ... YesNoByteField('test', 0x00, config={'no': 0x00, 'yes': (0x00, 0x02, 0x02)}) ... assert False ... except FieldAttributeException: ... pass ... ###(089)=[passed] invalid range spec - invalid value >>> try: ... YesNoByteField('test', 0x00, config={'no': 0x00, 'yes': (0x100, 0x01)}) ... assert False ... except FieldValueRangeException: ... pass ... >>> try: ... YesNoByteField('test', 0x00, config={'no': 0x00, 'yes': (0x00, 0x100)}) ... assert False ... except FieldValueRangeException: ... pass ... ###(090)=[passed] invalid set spec - invalid value >>> try: ... YesNoByteField('test', 0x00, config={'no': 0x00, 'yes': [0x01, 0x101]}) ... assert False ... except FieldValueRangeException: ... pass ... ###(091)=[passed] FlasgField - Python incompatible name >>> assert Dot11().FCfield.to_DS is False ###### ## MultipleTypeField ###### ###(092)=[passed] Test initialization order >>> class DebugPacket(Packet): ... fields_desc = [ ... ByteEnumField("atyp", 0x1, {0x1: "IPv4", 0x3: "DNS", 0x4: "IPv6"}), ... MultipleTypeField( ... [ ... # IPv4 ... (IPField("addr", "0.0.0.0"), lambda pkt: pkt.atyp == 0x1), ... # DNS ... (DNSStrField("addr", ""), lambda pkt: pkt.atyp == 0x3), ... # IPv6 ... (IP6Field("addr", "::"), lambda pkt: pkt.atyp == 0x4), ... ], ... StrField("addr", "") ... ), ... ] ... ###(093)=[passed] Default order >>> a = DebugPacket(atyp=0x3, addr="scapy.net") >>> a = DebugPacket(raw(a)) >>> assert a.addr == b"scapy.net." ###(094)=[passed] Reversed order >>> a = DebugPacket(addr="scapy.net", atyp=0x3) >>> a = DebugPacket(raw(a)) >>> assert a.addr == b"scapy.net." ###(095)=[passed] Test default values auto-update >>> class SweetPacket(Packet): ... name = 'Sweet Celestian Packet' ... fields_desc = [ ... IntField('switch', 0), ... MultipleTypeField([ ... (XShortField('subfield', 0xDEAD), lambda pkt: pkt.switch == 1), ... (XIntField('subfield', 0xBEEFBEEF), lambda pkt: pkt.switch == 2)], ... XByteField('subfield', 0x88) ... ) ... ] ... >>> o = SweetPacket() >>> assert o.subfield == 0x88 >>> >>> o = SweetPacket(switch=1) >>> assert o.subfield == 0xDEAD >>> >>> o = SweetPacket(switch=2) >>> assert o.subfield == 0xBEEFBEEF >>> >>> o = SweetPacket() >>> assert o.subfield == 0x88 >>> o.switch = 1 >>> assert o.subfield == 0xDEAD >>> o.switch = 2 >>> assert o.subfield == 0xBEEFBEEF >>> >>> o = SweetPacket(switch=1, subfield=0x88) >>> assert o.subfield == 0x88 ###(096)=[passed] MultipleTypeField - syntax error >>> import warnings >>> >>> with warnings.catch_warnings(record=True) as w: ... warnings.simplefilter("always") ... class MTFPacket(Packet): ... fields_desc = [ByteField("a", 0), ... MultipleTypeField([ ... (ByteField("b", 0), lambda pkt: pkt.a == 0), ... (ShortField("not_b", 0), lambda: pkt.a != 0), ... ], IntField("b", 0))] ... assert len(w) == 1 ... assert issubclass(w[-1].category, SyntaxWarning) ... ###### ## FlagsField ###### ###(097)=[passed] Test Flags Field Iterator >>> class FlagsTest(Packet): ... fields_desc = [FlagsField("flags", 0, 8, ... ["f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7"])] ... ###(098)=[passed] Test upper nibble >>> a = FlagsTest(b"\xf0") >>> flags = list(a.flags) >>> >>> assert len(flags) == 4 >>> assert "f4" in flags >>> assert "f5" in flags >>> assert "f6" in flags >>> assert "f7" in flags ###(099)=[passed] Test lower nibble >>> a = FlagsTest(b"\x0f") >>> flags = list(a.flags) >>> >>> assert len(flags) == 4 >>> assert "f3" in flags >>> assert "f2" in flags >>> assert "f1" in flags >>> assert "f0" in flags ###(100)=[passed] Test single flag 1 >>> a = FlagsTest(b"\x01") >>> flags = list(a.flags) >>> >>> assert len(flags) == 1 >>> assert "f0" in flags ###(101)=[passed] Test single flag 2 >>> a = FlagsTest(b"\x02") >>> flags = list(a.flags) >>> >>> assert len(flags) == 1 >>> assert "f1" in flags ###(102)=[passed] Test single flag 0x80 >>> a = FlagsTest(b"\x80") >>> flags = list(a.flags) >>> >>> assert len(flags) == 1 >>> assert "f7" in flags ###(103)=[passed] Test pattern 0x55 >>> a = FlagsTest(b"\x55") >>> flags = list(a.flags) >>> >>> assert len(flags) == 4 >>> assert "f6" in flags >>> assert "f2" in flags >>> assert "f4" in flags >>> assert "f0" in flags ###(104)=[passed] Test pattern 0xAA >>> a = FlagsTest(b"\xAA") >>> flags = list(a.flags) >>> >>> assert len(flags) == 4 >>> assert "f7" in flags >>> assert "f3" in flags >>> assert "f5" in flags >>> assert "f1" in flags ###(105)=[passed] Test pattern 0x00 >>> a = FlagsTest(b"\x00") >>> flags = list(a.flags) >>> >>> assert len(flags) == 0 ###(106)=[passed] Test pattern 0xFF >>> a = FlagsTest(b"\xFF") >>> flags = list(a.flags) >>> >>> assert len(flags) == 8 >>> assert "f7" in flags >>> assert "f3" in flags >>> assert "f5" in flags >>> assert "f1" in flags >>> assert "f6" in flags >>> assert "f2" in flags >>> assert "f4" in flags >>> assert "f0" in flags ###(107)=[passed] FlagsField with str >>> class TCPTest(Packet): ... fields_desc = [ ... BitField("reserved", 0, 7), ... FlagsField("flags", 0x2, 9, "FSRPAUECN") ... ] ... >>> a = TCPTest(flags=3) >>> assert a.flags.F >>> assert a.flags.S >>> assert a.sprintf("%flags%") == "FS" ###(108)=[passed] FlagsField with dict >>> class FlagsTest2(Packet): ... fields_desc = [ ... FlagsField("flags", 0x2, 16, { ... 0x0001: "A", ... 0x0008: "B", ... 0x1000: "C", ... }) ... ] ... >>> a = FlagsTest2(flags=9) >>> a.sprintf("%flags%") 'A+B' >>> assert a.flags.A >>> assert a.flags.B >>> assert a.sprintf("%flags%") == "A+B" >>> >>> b = FlagsTest2(flags="B+C") >>> assert b.flags == 0x1000 | 0x0008 ###(109)=[passed] Conditional FlagsField command >>> class CondFlagsTest(Packet): ... fields_desc = [ ... ByteField("b", 0), ... ConditionalField(FlagsField("f", 0, 8, ""), lambda p: p.b == 0) ... ] ... >>> p = CondFlagsTest(b"\x00\x0f") >>> assert p == eval(p.command()) ###### ## ScalingField ###### ###(110)=[passed] ScalingField Test default behaviour >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0) ... ] ... >>> x = DebugPacket() >>> assert len(x) == 1 >>> assert x.data == 0 >>> >>> x.data = 1 >>> assert x.data == 1 ###(111)=[passed] ScalingField Test string assignment >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.1) ... ] ... >>> x = DebugPacket() >>> >>> x.data = '\x01' >>> assert x.data == 0.1 >>> x.data = 2.0 >>> assert x.data == 2.0 >>> assert bytes(x) == b"\x14" >>> x.data = b'\xff' >>> assert x.data == 25.5 >>> x.data = '\x7f' >>> assert x.data == 12.7 ###(112)=[passed] ScalingField Test scaling >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.1) ... ] ... >>> x = DebugPacket() >>> >>> x.data = b'\x01' >>> assert x.data == 0.1 >>> x.data = 2.0 >>> assert x.data == 2.0 >>> assert bytes(x) == b"\x14" >>> x.data = b'\xff' >>> assert x.data == 25.5 ###(113)=[passed] ScalingField Test scaling signed >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.1, fmt="b") ... ] ... >>> x = DebugPacket() >>> >>> x.data = b'\x01' >>> assert x.data == 0.1 >>> x.data = 12.7 >>> assert x.data == 12.7 >>> assert bytes(x) == b"\x7f" >>> x.data = b'\x80' >>> assert x.data == -12.8 >>> x.data = -0.1 >>> assert x.data == -0.1 >>> assert bytes(x) == b"\xff" ###(114)=[passed] ScalingField Test scaling signed offset >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.1, offset=-1, fmt="b") ... ] ... >>> x = DebugPacket() >>> >>> x.data = b'\x01' >>> assert x.data == -0.9 >>> x.data = 11.7 >>> assert x.data == 11.7 >>> assert bytes(x) == b"\x7f" >>> x.data = b'\x80' >>> assert x.data == -13.8 >>> x.data = -1.1 >>> assert x.data == -1.1 >>> assert bytes(x) == b"\xff" ###(115)=[passed] ScalingField Test scaling offset >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.1, offset=-1) ... ] ... >>> x = DebugPacket() >>> >>> x.data = b'\x01' >>> assert x.data == -0.9 >>> x.data = 11.7 >>> assert x.data == 11.7 >>> assert bytes(x) == b"\x7f" >>> x.data = b'\x80' >>> assert x.data == 11.8 >>> x.data = 24.5 >>> assert x.data == 24.5 >>> assert bytes(x) == b"\xff" ###(116)=[passed] ScalingField Test unit >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, unit="V") ... ] ... >>> x = DebugPacket() >>> >>> x.data = b'\x01' >>> assert x.data == 1 >>> assert ScalingField.i2repr(x.fields_desc[0],x, x.data) == '1 V' ###(117)=[passed] ScalingField Test unit and ndigits >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.123456, unit="V", ndigits=1) ... ] ... >>> x = DebugPacket() >>> >>> x.data = b'\x01' >>> assert x.data == 0.1 >>> assert ScalingField.i2repr(x.fields_desc[0],x, x.data) == '0.1 V' ###(118)=[passed] ScalingField Test unit and ndigits 2 >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.123456, unit="V", ndigits=3) ... ] ... >>> x = DebugPacket() >>> >>> x.data = b'\x01' >>> print(x.__repr__()) >>> assert x.data == 0.123 >>> assert ScalingField.i2repr(x.fields_desc[0],x, x.data) == '0.123 V' ###(119)=[passed] ScalingField Test unit and ndigits 3 >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.123456, unit="V", ndigits=5) ... ] ... >>> x = DebugPacket() >>> >>> x.data = b'\x01' >>> print(x.__repr__()) >>> assert x.data == 0.12346 >>> assert ScalingField.i2repr(x.fields_desc[0],x, x.data) == '0.12346 V' ###(120)=[passed] ScalingField randval byte >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.1, offset=-5) ... ] ... >>> x = DebugPacket() >>> >>> r = x.fields_desc[0].randval() >>> val = r._fix() >>> assert r.min == -5.0 >>> assert r.max == 20.5 ###(121)=[passed] ScalingField randval byte 2 >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=-0.1, offset=-5) ... ] ... >>> x = DebugPacket() >>> >>> r = x.fields_desc[0].randval() >>> val = r._fix() >>> assert r.min == -30.5 >>> assert r.max == -5 ###(122)=[passed] ScalingField signed randval byte >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=-0.1, offset=-5, fmt="b") ... ] ... >>> x = DebugPacket() >>> >>> r = x.fields_desc[0].randval() >>> val = r._fix() >>> assert r.min == -17.7 >>> assert r.max == 7.8 ###(123)=[passed] ScalingField signed randval byte 2 >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.1, offset=-5, fmt="b") ... ] ... >>> x = DebugPacket() >>> >>> r = x.fields_desc[0].randval() >>> val = r._fix() >>> assert r.min == -17.8 >>> assert r.max == 7.7 ###(124)=[passed] ScalingField signed randval short >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.1, offset=-5, fmt="h") ... ] ... >>> x = DebugPacket() >>> >>> r = x.fields_desc[0].randval() >>> val = r._fix() >>> assert r.min == -3281.8 >>> assert r.max == 3271.7 ###(125)=[passed] ScalingField signed randval int >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.1, offset=-5, fmt="i") ... ] ... >>> x = DebugPacket() >>> >>> r = x.fields_desc[0].randval() >>> val = r._fix() >>> assert r.min == -214748369.8 >>> assert r.max == 214748359.7 ###(126)=[passed] ScalingField signed randval long >>> class DebugPacket(Packet): ... fields_desc = [ ... ScalingField('data', 0, scaling=0.1, offset=-5, fmt="q") ... ] ... >>> x = DebugPacket() >>> >>> r = x.fields_desc[0].randval() >>> val = r._fix() >>> assert r.min == -922337203685477585.8 >>> assert r.max == 922337203685477575.7 ###(127)=[passed] ScalingField signed randval long >>> y = fuzz(x) >>> assert bytes(y) != bytes(y) ###### ## BitExtendedField ###### ###(128)=[passed] BitExtendedField: simple test >>> class DebugPacket(Packet): ... fields_desc = [ ... BitExtendedField("val", None, extension_bit=0) ... ] ... >>> a = DebugPacket(val=1234) >>> assert a.val == 1234 ###(129)=[passed] BitExtendedField i2m: corner values 7 bits of data = 0 7 bits of data = 1 >>> import codecs >>> for i in range(8): ... m = BitExtendedField("foo", None, extension_bit=i) ... r = m.i2m(None, 0) ... r = int(codecs.encode(r, 'hex'), 16) ... assert r == 0 ... >>> for i in range(8): ... m = BitExtendedField("foo", None, extension_bit=i) ... r = m.i2m(None, 0b1111111) ... r = int(codecs.encode(r, 'hex'), 16) ... assert r == 0xff - 2**i ... ###(130)=[passed] BitExtendedField i2m: field expansion If there is 8 bits of data, we need to add a byte >>> m = BitExtendedField("foo", None, extension_bit=0) >>> r = m.i2m(None, 0b10000000) >>> r = int(codecs.encode(r, 'hex'), 16) >>> assert r == 0x0300 ###(131)=[passed] BitExtendedField i2m: test all FX bit positions Data is 0b10000001 (129) and all str values are precomputed >>> data_129 = { ... "extended": 129, ... "int_with_fx": [770, 769, 1281, 2305, 4353, 8449, 16641, 33025], ... "str_with_fx" : [] ... } >>> for i in range(8): ... m = BitExtendedField("foo", None, extension_bit=i) ... r = m.i2m(None, data_129["extended"]) ... data_129["str_with_fx"].append(r) ... r = int(codecs.encode(r, 'hex'), 16) ... assert r == data_129["int_with_fx"][i] ... ###(132)=[passed] BitExtendedField m2i: test all FX bit positions Data is 0b10000001 (129) and all str values are precomputed >>> for i in range(8): ... m = BitExtendedField("foo", None, extension_bit=i) ... r = m.m2i(None, data_129["str_with_fx"][i]) ... assert r == data_129["extended"] ... ###(133)=[passed] BitExtendedField m2i: stop at FX zero 1 byte of zeroes (FX stop) then 1 byte of ones : ignore 2nd byte >>> for i in range(8): ... m = BitExtendedField("foo", None, extension_bit=i) ... r = m.m2i(None, b'\x00\xff') ... assert r == 0 ... ###(134)=[passed] BitExtendedField m2i: multiple bytes 0b00000011 0b11111110 --> 0xff >>> data_254 = { ... "extended": 0xff, ... "str_with_fx" : [b'\x03\xfe', b'\x03\xfd', b'\x05\xfb', b'\x09\xf7', b'\x11\xef', b'\x21\xdf', b'\x41\xbf', b'\x81\x7f'] ... } >>> for i in range(len(data_254['str_with_fx'])): ... m = BitExtendedField("foo", None, extension_bit=i) ... r = m.m2i(None, data_254["str_with_fx"][i]) ... assert r == data_254['extended'] ... ###(135)=[passed] BitExtendedField m2i: invalid field with no stopping bit 1 byte of one (no FX stop) shall return an error >>> for i in range(8): ... m = BitExtendedField("foo", None, extension_bit=i) ... r = m.m2i(None, b'\xff') ... assert r == None ... ###(136)=[passed] LSBExtendedField Test i2m and m2i >>> data_129 = { ... "extended": 129, ... "int_with_fx": 770, ... "str_with_fx" : None ... } >>> m = LSBExtendedField("foo", None) >>> r = m.i2m(None, data_129["extended"]) >>> data_129["str_with_fx"] = r >>> r = int(codecs.encode(r, 'hex'), 16) >>> assert r == data_129["int_with_fx"] >>> >>> m = LSBExtendedField("foo", None) >>> r = m.m2i(None, data_129["str_with_fx"]) >>> assert r == data_129["extended"] ###(137)=[passed] MSBExtendedField Test i2m and m2i >>> data_129 = { ... "extended": 129, ... "int_with_fx": 33025, ... "str_with_fx" : None ... } >>> m = MSBExtendedField("foo", None) >>> r = m.i2m(None, data_129["extended"]) >>> data_129["str_with_fx"] = r >>> r = int(codecs.encode(r, 'hex'), 16) >>> assert r == data_129["int_with_fx"] >>> >>> m = MSBExtendedField("foo", None) >>> r = m.m2i(None, data_129["str_with_fx"]) >>> assert r == data_129["extended"] ###### ## Deprecated fields in Packet ###### ###(138)=[passed] Field Deprecation test >>> class TestPacket(Packet): ... fields_desc = [ ... ByteField("a", 0), ... LEShortField("b", 15), ... ] ... deprecated_fields = { ... "dpr": ("a", "1.0"), ... "B": ("b", "1.0"), ... } ... >>> try: ... pkt = TestPacket(a=2, B=3) ... assert pkt.B == 3 ... assert pkt.b == 3 ... assert pkt.a == 2 ... ... import warnings ... ... with warnings.catch_warnings(record=True) as w: ... warnings.simplefilter("always") ... assert pkt.dpr == 2 ... assert len(w) == 1 ... assert issubclass(w[-1].category, DeprecationWarning) ... except DeprecationWarning: ... # -Werror is used ... pass ... ###### ## FCSField ###### ###(139)=[passed] FCSField: basic test >>> class TestPacket(Packet): ... fields_desc = [ ... ByteField("a", 0), ... LEShortField("b", 15), ... LEIntField("c", 7), ... FCSField("fcs", None), ... IntField("bottom", 0) ... ] ... >>> bind_layers(TestPacket, Ether) >>> >>> pkt = TestPacket(a=12, fcs=0xbeef, bottom=123)/Ether(src="aa:aa:aa:aa:aa:aa", dst="bb:bb:bb:bb:bb:bb")/IP(src="127.0.0.1", dst="127.0.0.1") >>> >>> assert raw(pkt) == b'\x0c\x0f\x00\x07\x00\x00\x00\x00\x00\x00{\xbb\xbb\xbb\xbb\xbb\xbb\xaa\xaa\xaa\xaa\xaa\xaa\x08\x00E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01\xbe\xef' >>> assert raw(pkt) == b'\x0c\x0f\x00\x07\x00\x00\x00\x00\x00\x00{\xbb\xbb\xbb\xbb\xbb\xbb\xaa\xaa\xaa\xaa\xaa\xaa\x08\x00E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01\xbe\xef' >>> >>> pkt = TestPacket(raw(pkt)) >>> assert pkt.fcs == 0xbeef ###(140)=[passed] FCSField: multiple >>> class TestPacket2(Packet): ... fields_desc = [ ... ByteField("a", 0), ... LEShortField("b", 15), ... FCSField("fcs1", None), ... LEIntField("c", 7), ... FCSField("fcs2", None), ... IntField("bottom", 0), ... ] ... >>> bind_layers(TestPacket2, Ether) >>> >>> pkt = TestPacket2(a=12, fcs1=0xbeef, fcs2=0xfeed, bottom=123)/Ether(src="aa:aa:aa:aa:aa:aa", dst="bb:bb:bb:bb:bb:bb")/IP(src="127.0.0.1", dst="127.0.0.1") >>> >>> assert raw(pkt) == b'\x0c\x0f\x00\x07\x00\x00\x00\x00\x00\x00{\xbb\xbb\xbb\xbb\xbb\xbb\xaa\xaa\xaa\xaa\xaa\xaa\x08\x00E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01\xfe\xed\xbe\xef' >>> assert raw(pkt) == b'\x0c\x0f\x00\x07\x00\x00\x00\x00\x00\x00{\xbb\xbb\xbb\xbb\xbb\xbb\xaa\xaa\xaa\xaa\xaa\xaa\x08\x00E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01\xfe\xed\xbe\xef' >>> >>> pkt = TestPacket2(raw(pkt)) >>> assert pkt.fcs1 == 0xbeef >>> assert pkt.fcs2 == 0xfeed >>> assert pkt.bottom == 123 >>> assert pkt.a == 12 ###### ## PacketField ###### ###(141)=[passed] PacketField: randval() >>> class DebugPacket(Packet): ... fields_desc = [ ... ShortField('short', 0), ... ByteField('byte', 0), ... LongField('long', 0) ... ] ... >>> p = PacketField('packet', b'', DebugPacket).randval() >>> >>> assert isinstance(p.short, RandShort) >>> assert isinstance(p.byte, RandByte) >>> assert isinstance(p.long, RandLong) ###(142)=[passed] PacketField: randval(), PacketField in PacketField >>> class DebugPacket(Packet): ... fields_desc = [ ... ShortField('short1', 0), ... ByteField('byte', 0), ... LongField('long', 0) ... ] ... >>> class DummyPacket(Packet): ... fields_desc = [ ... PacketField('packet', b'', DebugPacket), ... ShortField('short2', 0) ... ] ... >>> >>> p = PacketField('packet', b'', DummyPacket).randval() >>> >>> assert isinstance(p.packet.short1, RandShort) >>> assert isinstance(p.packet.byte, RandByte) >>> assert isinstance(p.packet.long, RandLong) >>> assert isinstance(p.short2, RandShort) ###(143)=[passed] Test parent reference in guess_payload_class >>> class TestGuessInner(Packet): ... name="test guess inner" ... fields_desc=[ ByteField("foo", 0) ] ... def guess_payload_class(self, payload): ... self.parentflag = True ... if self.parent is None: ... # all exceptions are caught, so have to use flag ... self.parentflag = False ... return super(TestGuessInner, self).guess_payload_class(payload) ... >>> class TestGuess(Packet): ... name="test guess" ... fields_desc=[ PacketField("pf", None, TestGuessInner) ] ... >>> x=TestGuess(pf=TestGuessInner()/Raw(b'123')) >>> p=TestGuess(raw(x)) >>> assert p[TestGuessInner].parentflag >>> assert p[TestGuessInner].parent == p ###### ## XStr(*)Field tests ###### ###(144)=[passed] i2repr >>> from collections import namedtuple >>> MockPacket = namedtuple('MockPacket', ['type']) >>> >>> mp = MockPacket(0) >>> f = XStrField('test', None) >>> x = f.i2repr(mp, RandBin()) >>> assert x == '' ###### ## Raw() tests ###### ###(145)=[passed] unaligned data >>> p = Raw(b"abc") >>> p >>> >>> offsetdata = bytes.fromhex("0" + p.load.hex() + "0") >>> >>> p = Raw((offsetdata, 4)) >>> p ###### ## PacketListField() tests ###### ###(146)=[passed] unaligned data >>> class PInner(Packet): ... name = "PInner" ... fields_desc = [ ... BitField("x", 0, 8), ... ] ... def extract_padding(self, s): ... return '', s ... >>> class POuter(Packet): ... name = "POuter" ... fields_desc = [ ... BitField("indent", 0, 4), ... BitFieldLenField("pcount", None, 8, count_of="plist"), ... PacketListField("plist", None, PInner, ... count_from=lambda pkt: pkt.pcount), ... ] ... >>> p = POuter(b"\xf0\x44\x14\x24\x34\x40") >>> p , , , ] |> >>> >>> assert p.indent == 0xf >>> assert p.pcount == 4 >>> assert [p.x for p in p.plist] == [0x41, 0x42, 0x43, 0x44] Import tests ━ Run at 01:41:49 from [test/imports.uts] by UTscapy in 68.90119934082031 └ Passed=4 └ Failed=0 ###### ## Import tests ###### ###(000)=[passed] Prepare importing all scapy files >>> import os >>> import glob >>> import subprocess >>> import re >>> import time >>> import sys >>> from scapy.consts import WINDOWS, OPENBSD >>> >>> EXCEPTIONS = [ ... "scapy.__main__", ... "scapy.all", ... "scapy.contrib.automotive*", ... "scapy.contrib.cansocket*", ... "scapy.contrib.isotp*", ... "scapy.contrib.scada*", ... "scapy.layers.all", ... "scapy.main", ... ] >>> >>> if WINDOWS: ... EXCEPTIONS.append("scapy.layers.tuntap") ... >>> EXCEPTION_PACKAGES = [ ... "arch", ... "libs", ... "modules", ... "tools", ... ] >>> >>> ALL_FILES = [ ... "scapy." + re.match(".*scapy\\" + os.path.sep + "(.*)\\.py$", x).group(1).replace(os.path.sep, ".") ... for x in glob.iglob(scapy_path('/scapy/**/*.py'), recursive=True) ... ] >>> ALL_FILES = [ ... x for x in ALL_FILES if ... not any(x == y if y[-1] != "*" else x.startswith(y[:-1]) for y in EXCEPTIONS) and ... x.split(".")[1] not in EXCEPTION_PACKAGES ... ] >>> >>> NB_PROC = 1 if WINDOWS or OPENBSD else 4 >>> >>> def append_processes(processes, filename): ... processes.append( ... (subprocess.Popen( ... [sys.executable, "-c", "import %s" % filename], ... stderr=subprocess.PIPE, encoding="utf8"), ... time.time(), ... filename)) ... >>> def check_processes(processes): ... for i, tup in enumerate(processes): ... proc, start_ts, file = tup ... errs = "" ... try: ... _, errs = proc.communicate(timeout=0.5) ... except subprocess.TimeoutExpired: ... if time.time() - start_ts > 30: ... proc.kill() ... errs = "Timed out (>30s)!" ... if proc.returncode is None: ... continue ... else: ... print("Finished %s with %d after %f sec" % ... (file, proc.returncode, time.time() - start_ts)) ... if proc.returncode != 0: ... for p in processes: ... p[0].kill() ... raise Exception( ... "Importing the file '%s' failed !\\n%s" % (file, errs)) ... del processes[i] ... return ... >>> >>> def import_all(FILES): ... processes = list() ... while len(processes) == NB_PROC: ... check_processes(processes) ... for filename in FILES: ... check_processes(processes) ... if len(processes) < NB_PROC: ... append_processes(processes, filename) ... ###(001)=[passed] Try importing all core separately >>> import_all(x for x in ALL_FILES if "layers" not in x and "contrib" not in x) Finished scapy.__init__ with 0 after 0.038347 sec Finished scapy.ansmachine with 0 after 0.279745 sec Finished scapy.as_resolvers with 0 after 0.142246 sec Finished scapy.asn1fields with 0 after 0.243196 sec Finished scapy.asn1packet with 0 after 0.220667 sec Finished scapy.automaton with 0 after 0.243638 sec Finished scapy.autorun with 0 after 0.193535 sec Finished scapy.base_classes with 0 after 0.071654 sec Finished scapy.compat with 0 after 0.033916 sec Finished scapy.config with 0 after 0.144191 sec Finished scapy.consts with 0 after 0.030812 sec Finished scapy.dadict with 0 after 0.040813 sec Finished scapy.data with 0 after 0.104834 sec Finished scapy.error with 0 after 0.061205 sec Finished scapy.fields with 0 after 0.203484 sec Finished scapy.interfaces with 0 after 0.226638 sec Finished scapy.packet with 0 after 0.207273 sec Finished scapy.pipetool with 0 after 0.249188 sec Finished scapy.plist with 0 after 0.212418 sec Finished scapy.pton_ntop with 0 after 0.049659 sec Finished scapy.route with 0 after 0.265810 sec Finished scapy.route6 with 0 after 0.300537 sec Finished scapy.scapypipes with 0 after 0.210114 sec Finished scapy.sendrecv with 0 after 0.271187 sec Finished scapy.sessions with 0 after 0.213324 sec Finished scapy.supersocket with 0 after 0.206943 sec Finished scapy.themes with 0 after 0.054996 sec Finished scapy.utils with 0 after 0.188950 sec Finished scapy.utils6 with 0 after 0.227082 sec Finished scapy.volatile with 0 after 0.189895 sec Finished scapy.asn1.__init__ with 0 after 0.046197 sec Finished scapy.asn1.asn1 with 0 after 0.193463 sec Finished scapy.asn1.ber with 0 after 0.196403 sec ###(002)=[passed] Try importing all layers separately >>> import_all(x for x in ALL_FILES if "layers" in x) Finished scapy.layers.__init__ with 0 after 0.124892 sec Finished scapy.layers.bluetooth with 0 after 0.311463 sec Finished scapy.layers.bluetooth4LE with 0 after 0.317889 sec Finished scapy.layers.can with 0 after 0.270787 sec Finished scapy.layers.clns with 0 after 0.297081 sec Finished scapy.layers.dcerpc with 0 after 0.452522 sec Finished scapy.layers.dhcp with 0 after 0.348797 sec Finished scapy.layers.dhcp6 with 0 after 0.391927 sec Finished scapy.layers.dns with 0 after 0.354029 sec Finished scapy.layers.dot11 with 0 after 0.380336 sec Finished scapy.layers.dot15d4 with 0 after 0.211287 sec Finished scapy.layers.eap with 0 after 0.315396 sec Finished scapy.layers.gprs with 0 after 0.349614 sec Finished scapy.layers.gssapi with 0 after 0.218475 sec Finished scapy.layers.hsrp with 0 after 0.373099 sec Finished scapy.layers.http with 0 after 0.373957 sec Finished scapy.layers.inet with 0 after 0.345432 sec Finished scapy.layers.inet6 with 0 after 0.371076 sec Finished scapy.layers.ipsec with 0 after 0.359863 sec Finished scapy.layers.ir with 0 after 0.299010 sec Finished scapy.layers.isakmp with 0 after 0.349645 sec Finished scapy.layers.kerberos with 0 after 0.451505 sec Finished scapy.layers.l2 with 0 after 0.279304 sec Finished scapy.layers.l2tp with 0 after 0.387904 sec Finished scapy.layers.ldap with 0 after 0.413033 sec Finished scapy.layers.llmnr with 0 after 0.379381 sec Finished scapy.layers.lltd with 0 after 0.353806 sec Finished scapy.layers.mgcp with 0 after 0.369016 sec Finished scapy.layers.mobileip with 0 after 0.341489 sec Finished scapy.layers.netbios with 0 after 0.368826 sec Finished scapy.layers.netflow with 0 after 0.351250 sec Finished scapy.layers.ntlm with 0 after 0.228268 sec Finished scapy.layers.ntp with 0 after 0.379061 sec Finished scapy.layers.pflog with 0 after 0.354563 sec Finished scapy.layers.ppi with 0 after 0.234812 sec Finished scapy.layers.ppp with 0 after 0.388465 sec Finished scapy.layers.pptp with 0 after 0.376420 sec Finished scapy.layers.radius with 0 after 0.368082 sec Finished scapy.layers.rip with 0 after 0.368730 sec Finished scapy.layers.rtp with 0 after 0.211066 sec Finished scapy.layers.sctp with 0 after 0.380263 sec Finished scapy.layers.sixlowpan with 0 after 0.356602 sec Finished scapy.layers.skinny with 0 after 0.371496 sec Finished scapy.layers.smb with 0 after 0.405622 sec Finished scapy.layers.smb2 with 0 after 0.430940 sec Finished scapy.layers.smbclient with 0 after 0.458137 sec Finished scapy.layers.smbserver with 0 after 0.481147 sec Finished scapy.layers.snmp with 0 after 0.357841 sec Finished scapy.layers.spnego with 0 after 0.463158 sec Finished scapy.layers.ssh with 0 after 0.387791 sec Finished scapy.layers.tftp with 0 after 0.387885 sec Finished scapy.layers.tuntap with 0 after 0.365580 sec Finished scapy.layers.usb with 0 after 0.213693 sec Finished scapy.layers.vrrp with 0 after 0.376663 sec Finished scapy.layers.vxlan with 0 after 0.360081 sec Finished scapy.layers.x509 with 0 after 0.274415 sec Finished scapy.layers.zigbee with 0 after 0.368023 sec Finished scapy.layers.msrpce.__init__ with 0 after 0.158218 sec Finished scapy.layers.msrpce.all with 0 after 0.494220 sec Finished scapy.layers.msrpce.ept with 0 after 0.484097 sec Finished scapy.layers.msrpce.msdcom with 0 after 0.476916 sec Finished scapy.layers.msrpce.msdrsr with 0 after 0.486604 sec Finished scapy.layers.msrpce.msnrpc with 0 after 0.480168 sec Finished scapy.layers.msrpce.mspac with 0 after 0.490892 sec Finished scapy.layers.msrpce.rpcclient with 0 after 0.461379 sec Finished scapy.layers.msrpce.rpcserver with 0 after 0.424538 sec Finished scapy.layers.msrpce.raw.__init__ with 0 after 0.154108 sec Finished scapy.layers.msrpce.raw.ept with 0 after 0.453953 sec Finished scapy.layers.msrpce.raw.ms_dcom with 0 after 0.484183 sec Finished scapy.layers.msrpce.raw.ms_drsr with 0 after 0.467377 sec Finished scapy.layers.msrpce.raw.ms_nrpc with 0 after 0.484969 sec Finished scapy.layers.msrpce.raw.ms_samr with 0 after 0.458510 sec Finished scapy.layers.msrpce.raw.ms_srvs with 0 after 0.473798 sec Finished scapy.layers.msrpce.raw.ms_wkst with 0 after 0.442827 sec Finished scapy.layers.tls.__init__ with 0 after 0.152889 sec Finished scapy.layers.tls.all with 0 after 0.405233 sec Finished scapy.layers.tls.automaton with 0 after 0.447548 sec Finished scapy.layers.tls.automaton_cli with 0 after 0.406848 sec Finished scapy.layers.tls.automaton_srv with 0 after 0.401282 sec Finished scapy.layers.tls.basefields with 0 after 0.221733 sec Finished scapy.layers.tls.cert with 0 after 0.237691 sec Finished scapy.layers.tls.extensions with 0 after 0.423203 sec Finished scapy.layers.tls.handshake with 0 after 0.414489 sec Finished scapy.layers.tls.handshake_sslv2 with 0 after 0.420203 sec Finished scapy.layers.tls.keyexchange with 0 after 0.380573 sec Finished scapy.layers.tls.keyexchange_tls13 with 0 after 0.433682 sec Finished scapy.layers.tls.record with 0 after 0.429201 sec Finished scapy.layers.tls.record_sslv2 with 0 after 0.453994 sec Finished scapy.layers.tls.record_tls13 with 0 after 0.463327 sec Finished scapy.layers.tls.session with 0 after 0.361004 sec Finished scapy.layers.tls.tools with 0 after 0.217560 sec Finished scapy.layers.tls.crypto.__init__ with 0 after 0.135069 sec Finished scapy.layers.tls.crypto.all with 0 after 0.416581 sec Finished scapy.layers.tls.crypto.cipher_aead with 0 after 0.190421 sec Finished scapy.layers.tls.crypto.cipher_block with 0 after 0.135395 sec Finished scapy.layers.tls.crypto.cipher_stream with 0 after 0.136239 sec Finished scapy.layers.tls.crypto.ciphers with 0 after 0.193751 sec Finished scapy.layers.tls.crypto.common with 0 after 0.136005 sec Finished scapy.layers.tls.crypto.compression with 0 after 0.141406 sec Finished scapy.layers.tls.crypto.groups with 0 after 0.210699 sec Finished scapy.layers.tls.crypto.h_mac with 0 after 0.128645 sec Finished scapy.layers.tls.crypto.hash with 0 after 0.149980 sec Finished scapy.layers.tls.crypto.hkdf with 0 after 0.151011 sec Finished scapy.layers.tls.crypto.kx_algs with 0 after 0.431700 sec Finished scapy.layers.tls.crypto.md4 with 0 after 0.150153 sec Finished scapy.layers.tls.crypto.pkcs1 with 0 after 0.137392 sec Finished scapy.layers.tls.crypto.prf with 0 after 0.196034 sec ###(003)=[passed] Try importing all contribs separately >>> import_all(x for x in ALL_FILES if "contrib" in x) Finished scapy.contrib.__init__ with 0 after 0.151476 sec Finished scapy.contrib.altbeacon with 0 after 0.308675 sec Finished scapy.contrib.aoe with 0 after 0.301698 sec Finished scapy.contrib.avs with 0 after 0.393870 sec Finished scapy.contrib.bfd with 0 after 0.354048 sec Finished scapy.contrib.bgp with 0 after 0.373007 sec Finished scapy.contrib.bier with 0 after 0.361318 sec Finished scapy.contrib.bp with 0 after 0.347758 sec Finished scapy.contrib.carp with 0 after 0.403538 sec Finished scapy.contrib.cdp with 0 after 0.361102 sec Finished scapy.contrib.chdlc with 0 after 0.354127 sec Finished scapy.contrib.coap with 0 after 0.357734 sec Finished scapy.contrib.concox with 0 after 0.357524 sec Finished scapy.contrib.diameter with 0 after 0.395451 sec Finished scapy.contrib.dtp with 0 after 0.297295 sec Finished scapy.contrib.eddystone with 0 after 0.302922 sec Finished scapy.contrib.eigrp with 0 after 0.352670 sec Finished scapy.contrib.enipTCP with 0 after 0.348593 sec Finished scapy.contrib.erspan with 0 after 0.273212 sec Finished scapy.contrib.esmc with 0 after 0.275748 sec Finished scapy.contrib.ethercat with 0 after 0.295687 sec Finished scapy.contrib.etherip with 0 after 0.355830 sec Finished scapy.contrib.exposure_notification with 0 after 0.291971 sec Finished scapy.contrib.geneve with 0 after 0.347311 sec Finished scapy.contrib.gtp with 0 after 0.370624 sec Finished scapy.contrib.gtp_v2 with 0 after 0.394923 sec Finished scapy.contrib.gxrp with 0 after 0.267072 sec Finished scapy.contrib.hicp with 0 after 0.356495 sec Finished scapy.contrib.homeplugav with 0 after 0.295971 sec Finished scapy.contrib.homepluggp with 0 after 0.308073 sec Finished scapy.contrib.homeplugsg with 0 after 0.316049 sec Finished scapy.contrib.http2 with 0 after 0.233414 sec Finished scapy.contrib.ibeacon with 0 after 0.330504 sec Finished scapy.contrib.icmp_extensions with 0 after 0.368632 sec Finished scapy.contrib.ife with 0 after 0.312296 sec Finished scapy.contrib.igmp with 0 after 0.346602 sec Finished scapy.contrib.igmpv3 with 0 after 0.381172 sec Finished scapy.contrib.ikev2 with 0 after 0.406260 sec Finished scapy.contrib.isis with 0 after 0.381514 sec Finished scapy.contrib.knx with 0 after 0.353930 sec Finished scapy.contrib.lacp with 0 after 0.295407 sec Finished scapy.contrib.ldp with 0 after 0.364166 sec Finished scapy.contrib.lldp with 0 after 0.296658 sec Finished scapy.contrib.loraphy2wan with 0 after 0.242184 sec Finished scapy.contrib.ltp with 0 after 0.372066 sec Finished scapy.contrib.mac_control with 0 after 0.373738 sec Finished scapy.contrib.macsec with 0 after 0.372900 sec Finished scapy.contrib.metawatch with 0 after 0.293222 sec Finished scapy.contrib.modbus with 0 after 0.372976 sec Finished scapy.contrib.mount with 0 after 0.243482 sec Finished scapy.contrib.mpls with 0 after 0.365903 sec Finished scapy.contrib.mqtt with 0 after 0.343509 sec Finished scapy.contrib.mqttsn with 0 after 0.346106 sec Finished scapy.contrib.nfs with 0 after 0.237533 sec Finished scapy.contrib.nlm with 0 after 0.226855 sec Finished scapy.contrib.nrf_sniffer with 0 after 0.317559 sec Finished scapy.contrib.nsh with 0 after 0.678957 sec Finished scapy.contrib.oam with 0 after 0.300130 sec Finished scapy.contrib.oncrpc with 0 after 0.225045 sec Finished scapy.contrib.opc_da with 0 after 0.256069 sec Finished scapy.contrib.openflow with 0 after 0.378370 sec Finished scapy.contrib.openflow3 with 0 after 0.423830 sec Finished scapy.contrib.ospf with 0 after 0.394040 sec Finished scapy.contrib.pfcp with 0 after 0.391152 sec Finished scapy.contrib.pim with 0 after 0.370566 sec Finished scapy.contrib.pnio with 0 after 0.349214 sec Finished scapy.contrib.pnio_rpc with 0 after 0.500865 sec Finished scapy.contrib.pnio_dcp with 0 after 0.704399 sec Finished scapy.contrib.portmap with 0 after 0.235083 sec Finished scapy.contrib.postgres with 0 after 0.348222 sec Finished scapy.contrib.ppi_cace with 0 after 0.227446 sec Finished scapy.contrib.ppi_geotag with 0 after 0.230410 sec Finished scapy.contrib.ripng with 0 after 0.370566 sec Finished scapy.contrib.roce with 0 after 0.390805 sec Finished scapy.contrib.rpl with 0 after 0.379575 sec Finished scapy.contrib.rpl_metrics with 0 after 0.391770 sec Finished scapy.contrib.rsvp with 0 after 0.373693 sec Finished scapy.contrib.rtcp with 0 after 0.239187 sec Finished scapy.contrib.rtr with 0 after 0.374884 sec Finished scapy.contrib.rtsp with 0 after 0.364347 sec Finished scapy.contrib.sdnv with 0 after 0.228182 sec Finished scapy.contrib.sebek with 0 after 0.342322 sec Finished scapy.contrib.send with 0 after 0.404717 sec Finished scapy.contrib.skinny with 0 after 0.370836 sec Finished scapy.contrib.slowprot with 0 after 0.303760 sec Finished scapy.contrib.socks with 0 after 0.381766 sec Finished scapy.contrib.stamp with 0 after 0.392428 sec Finished scapy.contrib.stun with 0 after 0.369916 sec Finished scapy.contrib.tacacs with 0 after 0.371590 sec Finished scapy.contrib.tcpao with 0 after 0.368666 sec Finished scapy.contrib.tcpros with 0 after 0.386700 sec Finished scapy.contrib.tzsp with 0 after 0.376402 sec Finished scapy.contrib.vqp with 0 after 0.355061 sec Finished scapy.contrib.vtp with 0 after 0.311481 sec Finished scapy.contrib.wireguard with 0 after 0.380229 sec Finished scapy.contrib.rtps.__init__ with 0 after 0.278181 sec Finished scapy.contrib.rtps.common_types with 0 after 0.241178 sec Regression tests for Linux only ━ Run at 01:41:49 from [test/linux.uts] by UTscapy in 0.16069531440734863 └ Passed=3 └ Failed=0 ###### ## Linux only test ###### ###(005)=[passed] IPv6 link-local address selection >>> conf.ifaces._add_fake_iface("scapy0", 'e2:39:91:79:19:10') >>> >>> from unittest.mock import patch >>> conf.route6.routes = [('fe80::', 64, '::', 'scapy0', ['fe80::e039:91ff:fe79:1910'], 256)] >>> conf.route6.ipv6_ifaces = set(['scapy0']) >>> bck_conf_iface = conf.iface >>> conf.iface = "scapy0" This interface is not specified in any provider ! See conf.ifaces output >>> >>> p = Ether()/IPv6(dst="ff02::1")/ICMPv6NIQueryName(data="ff02::1") >>> print(p.sprintf("%Ether.src% > %Ether.dst%\n%IPv6.src% > %IPv6.dst%")) e2:39:91:79:19:10 > None fe80::e039:91ff:fe79:1910 > ff02::1 >>> ip6_ll_address = 'fe80::e039:91ff:fe79:1910' >>> print(p[IPv6].src, ip6_ll_address) fe80::e039:91ff:fe79:1910 fe80::e039:91ff:fe79:1910 >>> assert p[IPv6].src == ip6_ll_address >>> mac_address = 'e2:39:91:79:19:10' >>> print(p[Ether].src, mac_address) e2:39:91:79:19:10 e2:39:91:79:19:10 >>> assert p[Ether].src == mac_address >>> >>> conf.iface = bck_conf_iface >>> conf.route6.resync() ###(010)=[passed] Routing table, interface with no names >>> from unittest.mock import patch >>> >>> @patch("scapy.arch.linux.ioctl") ... def test_read_routes(mock_ioctl): ... def raise_ioerror(*args, **kwargs): ... if args[1] == 0x8912: ... return args[2] ... raise IOError ... mock_ioctl.side_effect = raise_ioerror ... read_routes() ... >>> test_read_routes() ###(014)=[passed] Reload interfaces & routes >>> conf.ifaces.reload() >>> conf.route.resync() >>> conf.route6.resync() Regression tests for Scapy Nmap module ━ Run at 01:41:49 from [test/nmap.uts] by UTscapy in 0.357546329498291 └ Passed=6 └ Failed=0 ###### ## Basic Nmap OS fingerprints tests ###### ###(000)=[passed] Module loading >>> load_module('nmap') ###(001)=[passed] Test functions >>> d = nmap_udppacket_sig(IP()/UDP(), IP(raw(IP()/ICMP(type=3, code=2)/IPerror()/UDPerror()))) >>> assert len(d) == 9 >>> >>> d = nmap_tcppacket_sig(IP()/TCP()) >>> assert len(d) == 5 ###(002)=[passed] Fetch database >>> try: ... from urllib.request import urlopen ... except ImportError: ... from urllib2 import urlopen ... >>> filename = 'nmap-os-fingerprints' + str(RandString(6)) >>> >>> def _test(): ... with open(filename, 'wb') as fd: ... fd.write(urlopen('https://raw.githubusercontent.com/nmap/nmap/9efe1892/nmap-os-fingerprints').read()) ... >>> retry_test(_test) >>> >>> conf.nmap_base = filename ###(003)=[passed] Database loading >>> print(conf.nmap_kdb.base, conf.nmap_kdb.filename, len(conf.nmap_kdb.get_base())) None None 1684 >>> assert len(conf.nmap_kdb.get_base()) > 100 ###### ## Nmap errors triggering ###### ###(008)=[passed] Nmap base not available >>> conf.nmap_kdb.filename = "invalid" >>> conf.nmap_kdb.reload() Cannot open nmap database [invalid] >>> assert conf.nmap_kdb.filename == None ###(009)=[passed] Clear temp files >>> try: ... os.remove(filename) ... except: ... pass ... Tests for Scapy's p0f module. ━ Run at 01:41:50 from [test/p0f.uts] by UTscapy in 0.16785693168640137 └ Passed=17 └ Failed=0 ###### ## Basic p0f module tests ###### ###(000)=[passed] Module loading >>> load_module('p0f') ###(001)=[passed] Fetch database >>> try: ... from urllib.request import urlopen ... except ImportError: ... from urllib2 import urlopen ... >>> for i in range(10): ... try: ... open("p0f.fp", 'wb').write(urlopen('https://raw.githubusercontent.com/p0f/p0f/e8b924ae7fa099a3a5fe7def0ce3e397fd9a7137/p0f.fp').read()) ... break ... except: ... raise ... 35901 >>> conf.p0f_base = "p0f.fp" >>> p0fdb.reload(conf.p0f_base) ###### ## Default tests ###### ###(002)=[passed] Test TCP p0f, SYN - Windows >>> pkt = IP(b'E\x00\x004Se@\x00\x80\x06\x93?\n\x00\x00\x14\n\x00\x00\x0c\xc3\x08\x01\xbb\xcf\xb4\xbb\\\x00\x00\x00\x00\x80\x02 \x00\xeb\x1b\x00\x00\x02\x04\x05\xb4\x01\x03\x03\x08\x01\x01\x04\x02') >>> assert p0f(pkt) == (('s', 'win', 'Windows', '7 or 8'), 0, False) ###(003)=[passed] Test TCP p0f, SYN - Linux >>> pkt = IP(b"E\x10\x00>> assert p0f(pkt) == (('s', 'unix', 'Linux', '2.6.x'), 0, False) ###(004)=[passed] Test TCP p0f, SYN - IPv6 FreeBSD >>> pkt = IPv6(hlim=64) / TCP(seq=1, window=65535, options=[("MSS", 150), ("NOP", None), ("WScale", 6), ("SAckOK", ""), ("Timestamp", (12345, 0))]) >>> assert p0f(pkt) == (('s', 'unix', 'FreeBSD', '9.x or newer'), 0, False) ###(005)=[passed] Test TCP p0f, SYN-ACK - Linux >>> pkt = IP(b'E\x00\x00<\x00\x00@\x008\x06N;?t\xf3a\xc0\xa8\x01\x03\x00P\xe5\xc0\xa3\xc4\x80\x9f\xe5\x94=\xab\xa0\x12\x16\xa0N\x07\x00\x00\x02\x04\x05\xb4\x04\x02\x08\n\x8d\x9d\x9d\xfa\x00\x17\x95e\x01\x03\x03\x05') >>> assert p0f(pkt) == (('s', 'unix', 'Linux', '2.6.x'), 8, False) ###(006)=[passed] Test HTTP p0f, request - wget >>> pkt = IP(b'E\x00\x00\xba\xcb]@\x00@\x06(d\xc0\xa8\x01\x8c\xae\x8f\xd5\xb8\xe1N\x00P\x8eP\x19\x02\xc7R\x9d\x89\x80\x18\x00.G)\x00\x00\x01\x01\x08\n\x00!\xd2_1\xc7\xbaHGET /images/layout/logo.png HTTP/1.0\r\nUser-Agent: Wget/1.12 (linux-gnu)\r\nAccept: */*\r\nHost: packetlife.net\r\nConnection: Keep-Alive\r\n\r\n') >>> assert p0f(pkt) == (('s', '!', 'wget', '', ('@unix', 'Windows')), False) ###(007)=[passed] Test HTTP p0f, response - nginx >>> pkt = IP(b"E\x00\x05\xdc'\xde@\x00\xfb\x06\x0b\xc1\xae\x8f\xd5\xb8\xc0\xa8\x01\x8c\x00P\xe1N\xc7R\x9d\x89\x8eP\x19\x88\x80\x10\x00lS\xc4\x00\x00\x01\x01\x08\n1\xc7\xbaT\x00!\xd2_HTTP/1.1 200 OK\r\nServer: nginx/0.8.53\r\nDate: Tue, 01 Mar 2011 20:45:16 GMT\r\nContent-Type: image/png\r\nContent-Length: 21684\r\nLast-Modified: Fri, 21 Jan 2011 03:41:14 GMT\r\nConnection: keep-alive\r\nKeep-Alive: timeout=20\r\nExpires: Wed, 29 Feb 2012 20:45:16 GMT\r\nCache-Control: max-age=31536000\r\nCache-Control: public\r\nVary: Accept-Encoding\r\nAccept-Ranges: bytes\r\n\r\n") >>> assert p0f(pkt) == (('s', '!', 'nginx', '1.x', ('@unix',)), False) ###(008)=[passed] Test MTU p0f >>> pkt = IP(b'E\x00\x004Se@\x00\x80\x06\x93?\n\x00\x00\x14\n\x00\x00\x0c\xc3\x08\x01\xbb\xcf\xb4\xbb\\\x00\x00\x00\x00\x80\x02 \x00\xeb\x1b\x00\x00\x02\x04\x05\xb4\x01\x03\x03\x08\x01\x01\x04\x02') >>> assert fingerprint_mtu(pkt) == "Ethernet or modem" ###### ## Tests for p0f_impersonate ###### ###(009)=[passed] Check that the impersonated packet is properly detected by p0f >>> pkt = p0f_impersonate(IP()/TCP(), osgenre="Linux", osdetails="3.11 and newer") >>> assert p0f(pkt) == (("s", "unix", "Linux", "3.11 and newer"), 0, False) ###(010)=[passed] Check incidence of MSS value on linux version detection >>> pkt = IP(ttl=64, flags=2)/TCP(options=[('MSS', 14), ('SAckOK', ''), ('Timestamp', (2638474259, 0)), ('NOP', None), ('WScale', 7)], window=280, seq=3964706621, flags=2) >>> assert p0f(pkt) == (('g', 'unix', 'Linux', '2.2.x-3.x'), 0, False) >>> >>> pkt[TCP].options = [('MSS', 100), ('SAckOK', ''), ('Timestamp', (2638474259, 0)), ('NOP', None), ('WScale', 7)] >>> pkt[TCP].window = 100*20 >>> assert p0f(pkt) == (("s", "unix", "Linux", "3.11 and newer"), 0, False) ###(011)=[passed] Impersonate when window size must be multiple of some integer >>> sig = "*:64:0:1460:%8192,0:mss,nop,ws::0" >>> pkt = p0f_impersonate(IP()/TCP(), signature=sig) >>> assert pkt[TCP].window % 8192 == 0 ###(012)=[passed] Impersonate when window size must be multiple of mss >>> sig = "*:64:0:1024:mss*4,0:mss::0" >>> pkt = p0f_impersonate(IP()/TCP(), signature=sig) >>> assert (pkt[TCP].window // 4) == 1024 ###(013)=[passed] Impersonate when the following quirks are present: seq-,ack-,pushf+,urgf+ >>> sig = "*:64:0:1460:8192,0:mss:seq-,ack-,pushf+,urgf+:0" >>> pkt = p0f_impersonate(IP()/TCP(seq=1, ack=1, flags="S"), signature=sig) >>> tcp = pkt[TCP] >>> assert pkt[TCP].seq == pkt[TCP].ack == 0 >>> assert pkt[TCP].flags.A and pkt[TCP].flags.P and pkt[TCP].flags.U ###(014)=[passed] Use valid option values from original packet >>> sig = "*:64:0:*:8192,*:mss,ws,ts::0" >>> opts = [("MSS", 1400), ("WScale", 3), ("Timestamp", (97256, 0))] >>> pkt = p0f_impersonate(IP()/TCP(options=opts), signature=sig) >>> assert pkt[TCP].options == opts ###(015)=[passed] Discard invalid options values >>> sig = "*:64:0:1000:8192,5:mss,ws::0" >>> opts = [("MSS", 1400), ("WScale", 3)] >>> pkt = p0f_impersonate(IP()/TCP(options=opts), signature=sig) >>> assert pkt[TCP].options[0][1] == 1000 >>> assert pkt[TCP].options[1][1] == 5 ###### ## Clear temp files ###### ###(016)=[passed] Remove fp files >>> def _rem(f): ... try: ... os.remove(f) ... except: ... pass ... >>> _rem("p0f.fp") Tests for Scapy's p0fv2 module. ━ Run at 01:41:50 from [test/p0fv2.uts] by UTscapy in 0.45725560188293457 └ Passed=12 └ Failed=0 ###### ## Basic p0f module tests ###### ###(000)=[passed] Module loading >>> load_module('p0fv2') ###(001)=[passed] Fetch database >>> try: ... from urllib.request import urlopen ... except ImportError: ... from urllib2 import urlopen ... >>> def _load_database(file): ... for i in range(10): ... try: ... with open(file, 'wb') as fd: ... fd.write(urlopen('https://raw.githubusercontent.com/p0f/p0f/4b4d1f384abebbb9b1b25b8f3c6df5ad7ab365f7/' + file).read()) ... break ... except: ... raise ... pass ... >>> _load_database("p0f.fp") >>> conf.p0f_base = "p0f.fp" >>> _load_database("p0fa.fp") >>> conf.p0fa_base = "p0fa.fp" >>> _load_database("p0fr.fp") >>> conf.p0fr_base = "p0fr.fp" >>> _load_database("p0fo.fp") >>> conf.p0fo_base = "p0fo.fp" >>> >>> p0f_load_knowledgebases() ###### ## Default tests ###### ###(002)=[passed] Test p0f >>> pkt = Ether(b'\x14\x0cv\x8f\xfe(\xd0P\x99V\xdd\xf9\x08\x00E\x00\x0045+@\x00\x80\x06\x00\x00\xc0\xa8\x00w(M\xe2\xf9\xda\xcb\x01\xbbcc\xdd\x1e\x00\x00\x00\x00\x80\x02\xfa\xf0\xcc\x8c\x00\x00\x02\x04\x05\xb4\x01\x03\x03\x08\x01\x01\x04\x02') >>> >>> assert p0f(pkt) == [('@Windows', 'XP/2000 (RFC1323+, w+, tstamp-)', 0)] ###(003)=[passed] Test prnp0f >>> with ContextManagerCaptureOutput() as cmco: ... prnp0f(pkt) ... assert cmco.get_output() == '192.168.0.119:56011 - @Windows XP/2000 (RFC1323+, w+, tstamp-)\n -> 40.77.226.249:https (S) (distance 0)\n' ... ###### ## Tests for p0f_impersonate ###### ###(004)=[passed] Impersonate when window size must be multiple of some integer >>> sig = ('%467', 64, 1, 60, 'M*,W*', '.', 'Phony Sys', '1.0') >>> pkt = p0f_impersonate(IP()/TCP(), signature=sig) >>> assert pkt.payload.window % 467 == 0 ###(005)=[passed] Handle unusual flags ("F") quirk >>> sig = ('1024', 64, 0, 60, 'W*', 'F', 'Phony Sys', '1.0') >>> pkt = p0f_impersonate(IP()/TCP(), signature=sig) >>> assert (pkt.payload.flags & 40) in (8, 32, 40) ###(006)=[passed] Use valid option values from original packet >>> sig = ('S4', 64, 1, 60, 'M*,W*,T', '.', 'Phony Sys', '1.0') >>> opts = [('MSS', 1400), ('WScale', 3), ('Timestamp', (97256, 0))] >>> pkt = p0f_impersonate(IP()/TCP(options=opts), signature=sig) >>> assert pkt.payload.options == opts ###(007)=[passed] Use valid option values when multiples required >>> sig = ('S4', 64, 1, 60, 'M%37,W%19', '.', 'Phony Sys', '1.0') >>> opts = [('MSS', 37*15), ('WScale', 19*12)] >>> pkt = p0f_impersonate(IP()/TCP(options=opts), signature=sig) >>> assert pkt.payload.options == opts ###(008)=[passed] Discard non-multiple option values when multiples required >>> sig = ('S4', 64, 1, 60, 'M%37,W%19', '.', 'Phony Sys', '1.0') >>> opts = [('MSS', 37*15 + 1), ('WScale', 19*12 + 1)] >>> pkt = p0f_impersonate(IP()/TCP(options=opts), signature=sig) >>> assert pkt.payload.options[0][1] % 37 == 0 >>> assert pkt.payload.options[1][1] % 19 == 0 ###(009)=[passed] Discard bad timestamp values >>> sig = ('S4', 64, 1, 60, 'M*,T', '.', 'Phony Sys', '1.0') >>> opts = [('Timestamp', (0, 1000))] >>> pkt = p0f_impersonate(IP()/TCP(options=opts), signature=sig) >>> assert pkt.payload.options[1][1][0] > 0 >>> assert pkt.payload.options[1][1][1] == 0 ###(010)=[passed] Discard 2nd timestamp of 0 if "T" quirk is present >>> sig = ('S4', 64, 1, 60, 'M*,T', 'T', 'Phony Sys', '1.0') >>> opts = [('Timestamp', (54321, 0))] >>> pkt = p0f_impersonate(IP()/TCP(options=opts), signature=sig) >>> assert pkt.payload.options[1][1][1] > 0 ###### ## Clear temp files ###### ###(011)=[passed] Remove fp files >>> def _rem(f): ... try: ... os.remove(f) ... except: ... pass ... >>> _rem("p0f.fp") >>> _rem("p0fa.fp") >>> _rem("p0fr.fp") >>> _rem("p0fo.fp") Pipetool related tests ━ Run at 01:41:53 from [test/pipetool.uts] by UTscapy in 3.3077049255371094 └ Passed=29 └ Failed=0 ###### ## Basic tests ###### ###(000)=[passed] Test default test case >>> s = PeriodicSource("hello", 1, name="src") >>> d1 = Drain(name="d1") >>> c = ConsoleSink(name="c") >>> tf = TransformDrain(lambda x: "Got %s" % x) >>> s > d1 > c #]> >>> d1 > tf #]> >>> try: ... t = TermSink(name="PipeToolsPeriodicTest", keepterm=False) ... tf > t ... except (IOError, OSError): ... pass ... >>> p = PipeEngine(s) >>> p.start() >>> time.sleep(3) >'hello' >'hello' >'hello' >>> s.msg = [] >>> p.stop() ###(001)=[passed] Test add_pipe >>> s = AutoSource() >>> p = PipeEngine(s) >>> p.add(Pipe()) >>> assert len(p.active_pipes) == 2 >>> >>> x = p.spawn_Pipe() >>> assert len(p.active_pipes) == 3 >>> assert isinstance(x, Pipe) ###(002)=[passed] Test exhausted source >>> s = AutoSource() >>> s._gen_data("hello") >>> s.is_exhausted = True >>> d1 = Drain(name="d1") >>> c = ConsoleSink(name="c") >>> s > d1 > c #]> >>> >>> p = PipeEngine(s) >>> p.start() >'hello' >>> p.wait_and_stop() ###(003)=[passed] Test add_pipe on running instance >>> p = PipeEngine() >>> p.start() >>> >>> s = CLIFeeder() >>> >>> d1 = Drain(name="d1") >>> c = QueueSink(name="c") >>> s > d1 > c #]> >>> >>> p.add(s) >>> >>> s.send("hello") 1 >>> s.send("hi") 1 >>> >>> assert c.q.get(timeout=5) == "hello" >>> assert c.q.get(timeout=5) == "hi" >>> >>> p.stop() ###(004)=[passed] Test Operators >>> s = AutoSource() >>> p = PipeEngine(s) >>> assert p == p >>> >>> a = AutoSource() >>> b = AutoSource() >>> a >> b >#]> >>> assert len(a.high_sinks) == 1 >>> assert len(a.high_sources) == 0 >>> assert len(b.high_sinks) == 0 >>> assert len(b.high_sources) == 1 >>> a >AutoSource]> >>> b >#]> >>> >>> a = Sink() >>> b = AutoSource() >>> a << b >Sink]> >>> assert len(a.high_sinks) == 0 >>> assert len(a.high_sources) == 1 >>> assert len(b.high_sinks) == 1 >>> assert len(b.high_sources) == 0 >>> a >#]> >>> b >Sink]> >>> >>> a = Sink() >>> b = Sink() >>> a % b #>Sink]> >>> assert len(a.sinks) == 1 >>> assert len(a.sources) == 1 >>> assert len(b.sinks) == 1 >>> assert len(b.sources) == 1 >>> >>> a = Sink() >>> b = Sink() >>> a//b >#>>Sink]> >>> assert len(a.high_sinks) == 1 >>> assert len(a.high_sources) == 1 >>> assert len(b.high_sinks) == 1 >>> assert len(b.high_sources) == 1 >>> >>> a = AutoSource() >>> b = Sink() >>> a^b >>> assert len(b.trigger_sources) == 1 >>> assert len(a.trigger_sinks) == 1 ###(005)=[passed] Test doc >>> s = AutoSource() >>> p = PipeEngine(s) >>> p.list_pipes() AutoSource: CLIFeeder: Send messages from python command line: CLIHighFeeder: Send messages from python command line to high output: ConsoleSink: Print messages on low and high entries to ``stdout`` DownDrain: Repeat messages from high entry to low exit: Drain: Repeat messages from low/high entries to (resp.) low/high exits FDSourceSink: Use a file descriptor as source and sink Inject3Sink: InjectSink: Packets received on low input are injected to an interface PeriodicSource: Generate messages periodically on low exit: Pipe: QueueSink: RawConsoleSink: Print messages on low and high entries, using os.write RdpcapSource: Read packets from a PCAP file send them to low exit. Sink: SniffSource: Read packets from an interface and send them to low exit. Source: TCPConnectPipe: TCP connect to addr:port and use it as source and sink TCPListenPipe: TCP listen on [addr:]port and use first connection as source and sink; TermSink: ThreadGenSource: TransformDrain: Apply a function to messages on low and high entry: TriggerDrain: Pass messages and trigger when a condition is met TriggerSink: TriggeredMessage: Send a preloaded message when triggered and trigger in chain TriggeredQueueingValve: Let messages alternatively pass or queued, changing on trigger TriggeredSwitch: Let messages alternatively high or low, changing on trigger TriggeredValve: Let messages alternatively pass or not, changing on trigger UDPClientPipe: UDP send packets to addr:port and use it as source and sink UDPDrain: UDP payloads received on high entry are sent over UDP UDPServerPipe: UDP bind to [addr:]port and use as source and sink UpDrain: Repeat messages from low entry to high exit: WiresharkSink: WrpcapSink: >>> p.list_pipes_detailed() ###### AutoSource ###### CLIFeeder Send messages from python command line: .. code:: +--------+ >>-| |->> | send() | >-| `----|-> +--------+ ###### CLIHighFeeder Send messages from python command line to high output: .. code:: +--------+ >>-| .----|->> | send() | >-| |-> +--------+ ###### ConsoleSink Print messages on low and high entries to ``stdout`` .. code:: +-------+ >>-|--. |->> | print | >-|--' |-> +-------+ ###### DownDrain Repeat messages from high entry to low exit: .. code:: +-------+ >>-|--. |->> | \ | >-| `--|-> +-------+ ###### Drain Repeat messages from low/high entries to (resp.) low/high exits .. code:: +-------+ >>-|-------|->> | | >-|-------|-> +-------+ ###### FDSourceSink Use a file descriptor as source and sink .. code:: +-------------+ >>-| |->> | | >-|-[file desc]-|-> +-------------+ ###### Inject3Sink ###### InjectSink Packets received on low input are injected to an interface .. code:: +-----------+ >>-| |->> | | >-|--[iface] |-> +-----------+ ###### PeriodicSource Generate messages periodically on low exit: .. code:: +-------+ >>-| |->> | msg,T | >-| `----|-> +-------+ ###### Pipe ###### QueueSink Collects messages on the low and high entries into a :py:class:`Queue`. Messages are dequeued with :py:meth:`recv`. Both high and low entries share the same :py:class:`Queue`. .. code:: +-------+ >>-|--. |->> | queue | >-|--' |-> +-------+ ###### RawConsoleSink Print messages on low and high entries, using os.write .. code:: +-------+ >>-|--. |->> | write | >-|--' |-> +-------+ :param newlines: Include a new-line character after printing each packet. Defaults to True. :type newlines: bool ###### RdpcapSource Read packets from a PCAP file send them to low exit. .. code:: +----------+ >>-| |->> | | >-| [pcap]--|-> +----------+ ###### Sink Does nothing; interface to extend for custom sinks. All sinks have the following constructor parameters: :param name: a human-readable name for the element :type name: str ###### SniffSource Read packets from an interface and send them to low exit. .. code:: +-----------+ >>-| |->> | | >-| [iface]--|-> +-----------+ If neither of the ``iface`` or ``socket`` parameters are specified, then Scapy will capture from the first network interface. :param iface: A layer 2 interface to sniff packets from. Mutually exclusive with the ``socket`` parameter. :param filter: Packet filter to use while capturing. See ``L2listen``. Not used with ``socket`` parameter. :param socket: A ``SuperSocket`` to sniff packets from. ###### Source ###### TCPConnectPipe TCP connect to addr:port and use it as source and sink .. code:: +-------------+ >>-| |->> | | >-|-[addr:port]-|-> +-------------+ ###### TCPListenPipe TCP listen on [addr:]port and use first connection as source and sink; send peer address to high output .. code:: +------^------+ >>-| +-[peer]-|->> | / | >-|-[addr:port]-|-> +-------------+ ###### TermSink Prints messages on the low and high entries, on a separate terminal (xterm or cmd). .. code:: +-------+ >>-|--. |->> | print | >-|--' |-> +-------+ :param keepterm: Leave the terminal window open after :py:meth:`~Pipe.stop` is called. Defaults to True. :type keepterm: bool :param newlines: Include a new-line character after printing each packet. Defaults to True. :type newlines: bool :param openearly: Automatically starts the terminal when the constructor is called, rather than waiting for :py:meth:`~Pipe.start`. Defaults to True. :type openearly: bool ###### ThreadGenSource ###### TransformDrain Apply a function to messages on low and high entry: .. code:: +-------+ >>-|--[f]--|->> | | >-|--[f]--|-> +-------+ ###### TriggerDrain Pass messages and trigger when a condition is met .. code:: +------^------+ >>-|-[condition]-|->> | | | >-|-[condition]-|-> +-------------+ ###### TriggerSink ###### TriggeredMessage Send a preloaded message when triggered and trigger in chain .. code:: +------^------+ >>-| | /----|->> | |/ | >-|-[ message ]-|-> +------^------+ ###### TriggeredQueueingValve Let messages alternatively pass or queued, changing on trigger .. code:: +------^-------+ >>-|-[pass/queue]-|->> | | | >-|-[pass/queue]-|-> +------^-------+ ###### TriggeredSwitch Let messages alternatively high or low, changing on trigger .. code:: +------^------+ >>-|-\ | /-|->> | [up/down] | >-|-/ | \-|-> +------^------+ ###### TriggeredValve Let messages alternatively pass or not, changing on trigger .. code:: +------^------+ >>-|-[pass/stop]-|->> | | | >-|-[pass/stop]-|-> +------^------+ ###### UDPClientPipe UDP send packets to addr:port and use it as source and sink Start trying to receive only once a packet has been send .. code:: +-------------+ >>-| |->> | | >-|-[addr:port]-|-> +-------------+ ###### UDPDrain UDP payloads received on high entry are sent over UDP .. code:: +-------------+ >>-|--[payload]--|->> | X | >-|----[UDP]----|-> +-------------+ ###### UDPServerPipe UDP bind to [addr:]port and use as source and sink Use (ip, port) from first received IP packet as destination for all data .. code:: +------^------+ >>-| +-[peer]-|->> | / | >-|-[addr:port]-|-> +-------------+ ###### UpDrain Repeat messages from low entry to high exit: .. code:: +-------+ >>-| ,--|->> | / | >-|--' |-> +-------+ ###### WiresharkSink Streams :py:class:`Packet` from the low entry to Wireshark. Packets are written into a ``pcap`` stream (like :py:class:`WrpcapSink`), and streamed to a new Wireshark process on its ``stdin``. Wireshark is run with the ``-ki -`` arguments, which cause it to treat ``stdin`` as a capture device. Arguments in :py:attr:`args` will be appended after this. Extends :py:mod:`WrpcapSink`. .. code:: +----------+ >>-| |->> | | >-|--[pcap] |-> +----------+ :param linktype: See :py:attr:`WrpcapSink.linktype`. :type linktype: None or int :param args: See :py:attr:`args`. :type args: None or list[str] .. py:attribute:: args Additional arguments for the Wireshark process. This must be either ``None`` (the default), or a ``list`` of ``str``. This attribute has no effect after calling :py:meth:`PipeEngine.start`. See :manpage:`wireshark(1)` for more details. ###### WrpcapSink Writes :py:class:`Packet` on the low entry to a ``pcap`` file. Ignores all messages on the high entry. .. note:: Due to limitations of the ``pcap`` format, all packets **must** be of the same link type. This class will not mutate packets to conform with the expected link type. .. code:: +----------+ >>-| |->> | | >-|--[pcap] |-> +----------+ :param fname: Filename to write packets to. :type fname: str :param linktype: See :py:attr:`linktype`. :type linktype: None or int .. py:attribute:: linktype Set an explicit link-type (``DLT_``) for packets. This must be an ``int`` or ``None``. This is the same as the :py:func:`wrpcap` ``linktype`` parameter. If ``None`` (the default), the linktype will be auto-detected on the first packet. This field will *not* be updated with the result of this auto-detection. This attribute has no effect after calling :py:meth:`PipeEngine.start`. ###(006)=[passed] Test RawConsoleSink with CLIFeeder >>> p = PipeEngine() >>> >>> s = CLIFeeder() >>> s.send("hello") 1 >>> s.is_exhausted = True >>> >>> r, w = os.pipe() >>> >>> d1 = Drain(name="d1") >>> c = RawConsoleSink(name="c") >>> c._write_pipe = w >>> s > d1 > c #]> >>> >>> p.add(s) >>> p.start() >>> >>> assert os.read(r, 20) == b"hello\n" >>> p.wait_and_stop() ###(007)=[passed] Test QueueSink with CLIFeeder >>> p = PipeEngine() >>> >>> s = CLIFeeder() >>> s.send("hello") 1 >>> s.is_exhausted = True >>> >>> d1 = Drain(name="d1") >>> c = QueueSink(name="c") >>> s > d1 > c #]> >>> >>> p.add(s) >>> p.start() >>> >>> p.wait_and_stop() >>> assert c.recv() == "hello" >>> assert c.recv(block=False) is None ###(008)=[passed] Test UpDrain >>> test_val = None >>> >>> class TestSink(Sink): ... def high_push(self, msg): ... global test_val ... test_val = msg ... >>> p = PipeEngine() >>> >>> s = CLIFeeder() >>> s.send("hello") 1 >>> s.is_exhausted = True >>> >>> d1 = UpDrain(name="d1") >>> c = TestSink(name="c") >>> s > d1 #]> >>> d1 >> c >#]> >>> >>> p.add(s) >>> p.start() >>> >>> p.wait_and_stop() >>> assert test_val == "hello" ###(009)=[passed] Test DownDrain >>> test_val = None >>> >>> class TestSink(Sink): ... def push(self, msg): ... global test_val ... test_val = msg ... >>> p = PipeEngine() >>> >>> s = CLIHighFeeder() >>> s.send("hello") 1 >>> s.is_exhausted = True >>> >>> d1 = DownDrain(name="d1") >>> c = TestSink(name="c") >>> s >> d1 >#]> >>> d1 > c #]> >>> >>> p.add(s) >>> p.start() >>> >>> p.wait_and_stop() >>> assert test_val == "hello" ###(010)=[passed] Test PeriodicSource exhaustion >>> s = PeriodicSource("", 1) >>> s.msg = [] >>> p = PipeEngine(s) >>> p.start() >>> p.wait_and_stop() ###### ## Advanced ScapyPipes pipetools tests ###### ###(011)=[passed] Test SniffSource >>> from unittest import mock >>> fd = ObjectPipe("sniffsource") >>> fd.write("test") >>> >>> @mock.patch("scapy.scapypipes.conf.L2listen") ... def _test(l2listen): ... l2listen.return_value=Bunch(close=lambda *args: None, fileno=lambda: fd.fileno(), recv=lambda *args: Raw("data")) ... p = PipeEngine() ... s = SniffSource() ... assert s.s is None ... d1 = Drain(name="d1") ... c = QueueSink(name="c") ... s > d1 > c ... p.add(s) ... p.start() ... x = c.q.get(2) ... assert bytes(x) == b"data" ... assert s.s is not None ... p.stop() ... >>> try: ... _test() ... finally: ... fd.close() ... ###(012)=[passed] Test SniffSource with socket >>> fd = ObjectPipe("sniffsource_socket") >>> fd.write("test") >>> >>> class FakeSocket(object): ... def __init__(self): ... self.times = 0 ... def recv(self, x=None): ... if self.times > 2: ... return ... self.times += 1 ... return Raw(b'hello') ... def fileno(self): ... return fd.fileno() ... >>> try: ... p = PipeEngine() ... s = SniffSource(socket=FakeSocket()) ... assert s.s is not None ... d = Drain() ... c = QueueSink() ... p.add(s > d > c) ... p.start() ... msg = c.q.get(timeout=1) ... p.stop() ... assert raw(msg) == b'hello' ... finally: ... fd.close() ... Exception in thread scapy.pipetool.PipeEngine: Traceback (most recent call last): File "/usr/lib64/python3.13/threading.py", line 1041, in _bootstrap_inner self.run() ~~~~~~~~^^ File "/usr/lib64/python3.13/threading.py", line 992, in run self._target(*self._args, **self._kwargs) ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/pipetool.py", line 168, in run p.stop() ~~~~~~^^ File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/scapypipes.py", line 74, in stop self.s.close() ^^^^^^^^^^^^ AttributeError: 'FakeSocket' object has no attribute 'close' ###(013)=[passed] Test SniffSource with invalid args >>> try: ... s = SniffSource(iface='eth0', socket='not a socket') ... except ValueError: ... pass ... else: ... # expected ValueError ... assert False ... ###(014)=[passed] Test exhausted AutoSource and SniffSource >>> from unittest import mock >>> from scapy.error import Scapy_Exception >>> >>> def _fail(): ... raise Scapy_Exception() ... >>> a = AutoSource() >>> a._send = mock.MagicMock(side_effect=_fail) >>> a.send("x") 1 >>> try: ... a.deliver() ... except: ... pass ... >>> s = SniffSource() >>> s.s = mock.MagicMock() >>> s.s.recv = mock.MagicMock(side_effect=_fail) >>> try: ... s.deliver() ... except: ... pass ... ###(015)=[passed] Test WiresharkSink >>> q = ObjectPipe("wiresharksink") >>> pkt = Ether(dst="aa:aa:aa:aa:aa:aa", src="bb:bb:bb:bb:bb:bb")/IP(dst="127.0.0.1", src="127.0.0.1")/ICMP() >>> >>> from unittest import mock >>> with mock.patch("scapy.scapypipes.subprocess.Popen", return_value=Bunch(stdin=q)) as popen: ... sink = WiresharkSink() ... sink.start() ... >>> sink.push(pkt) >>> >>> q.recv() b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x01\x00\x00\x00' >>> q.recv() b'a\xf9Tg\xb6\xa2\t\x00*\x00\x00\x00*\x00\x00\x00' >>> assert raw(pkt) in q.recv() >>> >>> popen.assert_called_once_with( ... [conf.prog.wireshark, '-Slki', '-'], stdin=subprocess.PIPE, stdout=None, ... stderr=None) ###(016)=[passed] Test WiresharkSink with linktype >>> linktype = scapy.data.DLT_EN3MB >>> q = ObjectPipe("wiresharksink_linktype") >>> pkt = Ether(dst="aa:aa:aa:aa:aa:aa", src="bb:bb:bb:bb:bb:bb")/IP(dst="127.0.0.1", src="127.0.0.1")/ICMP() >>> >>> from unittest import mock >>> with mock.patch("scapy.scapypipes.subprocess.Popen", return_value=Bunch(stdin=q)) as popen: ... sink = WiresharkSink(linktype=linktype) ... sink.start() ... >>> sink.push(pkt) Inconsistent linktypes detected! The resulting file might contain invalid packets. >>> >>> chb(linktype) in q.recv() True >>> q.recv() b'a\xf9Tg\xbd\xc2\t\x00*\x00\x00\x00*\x00\x00\x00' >>> assert raw(pkt) in q.recv() ###(017)=[passed] Test WiresharkSink with args >>> linktype = scapy.data.DLT_EN3MB >>> q = ObjectPipe("wiresharksink_args") >>> pkt = Ether(dst="aa:aa:aa:aa:aa:aa", src="bb:bb:bb:bb:bb:bb")/IP(dst="127.0.0.1", src="127.0.0.1")/ICMP() >>> >>> from unittest import mock >>> with mock.patch("scapy.scapypipes.subprocess.Popen", return_value=Bunch(stdin=q)) as popen: ... sink = WiresharkSink(args=['-c', '1']) ... sink.start() ... >>> sink.push(pkt) >>> >>> popen.assert_called_once_with( ... [conf.prog.wireshark, '-Slki', '-', '-c', '1'], ... stdin=subprocess.PIPE, stdout=None, stderr=None) ###(018)=[passed] Test RdpcapSource and WrpcapSink >>> dname = get_temp_dir() >>> >>> req = Ether(b'E\x00\x00\x1c\x00\x00\x00\x004\x01\x1d\x04\xd8:\xd0\x83\xc0\xa8\x00w\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> rpy = Ether(b'\x8c\xf8\x13C5P\xdcS`\xeb\x80H\x08\x00E\x00\x00\x1c\x00\x00\x00\x004\x01\x1d\x04\xd8:\xd0\x83\xc0\xa8\x00w\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> >>> wrpcap(os.path.join(dname, "t.pcap"), [req, rpy]) >>> >>> p = PipeEngine() >>> >>> s = RdpcapSource(os.path.join(dname, "t.pcap")) >>> d1 = Drain(name="d1") >>> c = WrpcapSink(os.path.join(dname, "t2.pcap.gz"), name="c", gz=1) >>> s > d1 > c #]> >>> p.add(s) >>> p.start() >>> p.wait_and_stop() >>> >>> results = rdpcap(os.path.join(dname, "t2.pcap.gz")) >>> >>> assert raw(results[0]) == raw(req) >>> assert raw(results[1]) == raw(rpy) >>> >>> os.unlink(os.path.join(dname, "t.pcap")) >>> os.unlink(os.path.join(dname, "t2.pcap.gz")) ###(020)=[passed] TriggerDrain and TriggeredValve with CLIFeeder >>> s = CLIFeeder() >>> d1 = TriggerDrain(lambda x:x=="trigger") >>> d2 = TriggeredValve() >>> c = QueueSink() >>> >>> s > d1 > d2 > c #]> >>> d1 ^ d2 #>QueueSink] [TriggerDrain^#]> >>> >>> p = PipeEngine(s) >>> p.start() >>> >>> s.send("hello") 1 >>> s.send("trigger") 1 >>> s.send("hello2") 1 >>> s.send("trigger") 1 >>> s.send("hello3") 1 >>> >>> assert c.q.get(timeout=5) == "hello" >>> assert c.q.get(timeout=5) == "trigger" >>> assert c.q.get(timeout=5) == "hello3" >>> >>> p.stop() ###(021)=[passed] TriggerDrain and TriggeredValve with CLIHighFeeder >>> s = CLIHighFeeder() >>> d1 = TriggerDrain(lambda x:x=="trigger") >>> d2 = TriggeredValve() >>> c = QueueSink() >>> >>> s >> d1 >#]> >>> d1 >> d2 >#]> >>> d2 >> c >#]> >>> d1 ^ d2 >#>>QueueSink] [TriggerDrain^#]> >>> >>> p = PipeEngine(s) >>> p.start() >>> >>> s.send("hello") 1 >>> s.send("trigger") 1 >>> s.send("hello2") 1 >>> s.send("trigger") 1 >>> s.send("hello3") 1 >>> >>> assert c.q.get(timeout=5) == "hello" >>> assert c.q.get(timeout=5) == "trigger" >>> assert c.q.get(timeout=5) == "hello3" >>> >>> p.stop() ###(022)=[passed] TriggerDrain and TriggeredQueueingValve with CLIFeeder >>> s = CLIFeeder() >>> d1 = TriggerDrain(lambda x:x=="trigger") >>> d2 = TriggeredValve() >>> c = QueueSink() >>> >>> s > d1 > d2 > c #]> >>> d1 ^ d2 #>QueueSink] [TriggerDrain^#]> >>> >>> p = PipeEngine(s) >>> p.start() >>> >>> s.send("hello") 1 >>> s.send("trigger") 1 >>> s.send("hello2") 1 >>> s.send("trigger") 1 >>> s.send("hello3") 1 >>> >>> assert c.q.get(timeout=5) == "hello" >>> assert c.q.get(timeout=5) == "trigger" >>> assert c.q.get(timeout=5) == "hello3" >>> >>> p.stop() ###(023)=[passed] TriggerDrain and TriggeredSwitch with CLIFeeder on high channel >>> s = CLIFeeder() >>> d1 = TriggerDrain(lambda x:x=="trigger") >>> d2 = TriggeredSwitch() >>> c = QueueSink() >>> >>> s > d1 > d2 #]> >>> d2 >> c >#]> >>> d1 ^ d2 #] [#>>QueueSink] [TriggerDrain^#]> >>> >>> p = PipeEngine(s) >>> p.start() >>> >>> s.send("hello") 1 >>> s.send("trigger") 1 >>> s.send("hello2") 1 >>> s.send("trigger") 1 >>> s.send("hello3") 1 >>> >>> assert c.q.get(timeout=5) == "trigger" >>> assert c.q.get(timeout=5) == "hello2" >>> >>> p.stop() ###(024)=[passed] TriggerDrain and TriggeredSwitch with CLIHighFeeder on low channel >>> s = CLIHighFeeder() >>> d1 = TriggerDrain(lambda x:x=="trigger") >>> d2 = TriggeredSwitch() >>> c = QueueSink() >>> >>> s >> d1 >#]> >>> d1 >> d2 >#]> >>> d2 > c #]> >>> d1 ^ d2 QueueSink] [TriggerDrain>>#] [TriggerDrain^#]> >>> >>> p = PipeEngine(s) >>> p.start() >>> >>> s.send("hello") 1 >>> s.send("trigger") 1 >>> s.send("hello2") 1 >>> s.send("trigger") 1 >>> s.send("hello3") 1 >>> >>> assert c.q.get(timeout=5) == "hello" >>> assert c.q.get(timeout=5) == "trigger" >>> assert c.q.get(timeout=5) == "hello3" >>> >>> p.stop() ###(025)=[passed] TriggerDrain and TriggeredMessage >>> s = CLIFeeder() >>> d1 = TriggerDrain(lambda x:x=="trigger") >>> d2 = TriggeredMessage("hello") >>> c = QueueSink() >>> >>> s > d1 > d2 > c #]> >>> d1 ^ d2 #>QueueSink] [TriggerDrain^#]> >>> >>> p = PipeEngine(s) >>> p.start() >>> >>> s.send("trigger") 1 >>> >>> r = [c.q.get(timeout=5), c.q.get(timeout=5)] >>> assert "hello" in r >>> assert "trigger" in r >>> >>> p.stop() ###(026)=[passed] TriggerDrain and TriggeredQueueingValve on low channel >>> p = PipeEngine() >>> >>> s = CLIFeeder() >>> r, w = os.pipe() >>> >>> d1 = TriggerDrain(lambda x:x=="trigger") >>> d2 = TriggeredQueueingValve() >>> c = QueueSink(name="c") >>> s > d1 > d2 > c #]> >>> d1 ^ d2 #>c] [TriggerDrain^#]> >>> >>> p.add(s) >>> p.start() >>> >>> s.send("trigger") 1 >>> s.send("hello") 1 >>> s.send("trigger") 1 >>> assert c.q.get(timeout=3) == "trigger" >>> assert c.q.get(timeout=3) in ['hello', 'trigger'] >>> assert c.q.get(timeout=3) in ['hello', 'trigger'] >>> assert d2.q.qsize() == 0 >>> >>> p.stop() ###(027)=[passed] TriggerDrain and TriggeredQueueingValve on high channel >>> p = PipeEngine() >>> >>> s = CLIHighFeeder() >>> r, w = os.pipe() >>> >>> d1 = TriggerDrain(lambda x:x=="trigger") >>> d2 = TriggeredQueueingValve() >>> c = QueueSink(name="c") >>> s >> d1 >> d2 >> c >#]> >>> d1 ^ d2 >#>>c] [TriggerDrain^#]> >>> >>> p.add(s) >>> p.start() >>> >>> s.send("trigger") 1 >>> s.send("hello") 1 >>> s.send("trigger") 1 >>> assert c.q.get(timeout=3) == "trigger" >>> assert c.q.get(timeout=3) == "hello" >>> assert d2.q.qsize() == 0 >>> >>> p.stop() ###(028)=[passed] UDPDrain >>> p = PipeEngine() >>> >>> s = CLIFeeder() >>> s2 = CLIHighFeeder() >>> d1 = UDPDrain() >>> c = QueueSink() >>> >>> s > d1 > c #]> >>> s2 >> d1 >> c #] [UDPDrain>>#]> >>> >>> p.add(s) >>> p.add(s2) >>> p.start() >>> >>> pkt = DNS() >>> >>> s.send(IP(src="127.0.0.1")/UDP()/DNS()) 1 >>> s2.send(pkt) 1 >>> >>> res = [c.q.get(timeout=2), c.q.get(timeout=2)] >>> assert raw(pkt) in res >>> res.remove(raw(pkt)) >>> assert DNS in res[0] and res[0][UDP].sport == 1234 >>> >>> p.stop() ###(029)=[passed] FDSourceSink on a ObjectPipe object >>> obj = ObjectPipe("fdsourcesink") >>> obj.send("hello") 1 >>> >>> s = FDSourceSink(obj) >>> d = Drain() >>> c = QueueSink() >>> s > d > c #]> >>> >>> s.push("data") >>> s.deliver() >>> assert c.q.get(timeout=1) == "hello" Regression tests for Scapy random objects ━ Run at 01:41:53 from [test/random.uts] by UTscapy in 0.03139019012451172 └ Passed=11 └ Failed=0 ###### ## Random objects ###### ###(000)=[passed] RandomEnumeration >>> ren = RandomEnumeration(0, 7, seed=0x2807, forever=False) >>> [x for x in ren] == [5, 0, 2, 7, 6, 3, 1, 4] True ###(001)=[passed] RandIP6 >>> random.seed(0x2807) >>> r6 = RandIP6() >>> assert r6 == "240b:238f:b53f:b727:d0f9:bfc4:2007:e265" >>> assert r6.command() == "RandIP6()" >>> >>> random.seed(0x2807) >>> r6 = RandIP6("2001:db8::-") >>> assert r6 == "2001:0db8::b53f" >>> assert r6.command() == "RandIP6(ip6template='2001:db8::-')" >>> >>> r6 = RandIP6("2001:db8::*") >>> assert r6 == "2001:0db8::bfc4" >>> assert r6.command() == "RandIP6(ip6template='2001:db8::*')" ###(002)=[passed] RandMAC >>> random.seed(0x2807) >>> rm = RandMAC() >>> assert rm == "24:23:b5:b7:d0:bf" >>> assert rm.command() == "RandMAC()" >>> >>> rm = RandMAC("00:01:02:03:04:0-7") >>> assert rm == "00:01:02:03:04:01" >>> assert rm.command() == "RandMAC(template='00:01:02:03:04:0-7')" ###(003)=[passed] RandOID >>> random.seed(0x2807) >>> rand_obj = RandOID() >>> assert rand_obj == "7.222.44.194.276.116.320.6.84.97.31.5.25.20.13.84.104.18" >>> assert rand_obj.command() == "RandOID()" >>> >>> rand_obj = RandOID("1.2.3.*") >>> assert rand_obj == "1.2.3.41" >>> assert rand_obj.command() == "RandOID(fmt='1.2.3.*')" >>> >>> rand_obj = RandOID("1.2.3.0-28") >>> assert rand_obj == "1.2.3.12" >>> assert rand_obj.command() == "RandOID(fmt='1.2.3.0-28')" >>> >>> rand_obj = RandOID("1.2.3.0-28", depth=RandNumExpo(0.2), idnum=RandNumExpo(0.02)) >>> assert rand_obj.command() == "RandOID(fmt='1.2.3.0-28', depth=RandNumExpo(lambd=0.2), idnum=RandNumExpo(lambd=0.02))" ###(004)=[passed] RandRegExp >>> random.seed(0x2807) >>> rex = RandRegExp("[g-v]* @? [0-9]{3} . (g|v)") >>> bytes(rex) == b'irrtv @ 517 \xc2\xb8 v' True >>> assert rex.command() == "RandRegExp(regexp='[g-v]* @? [0-9]{3} . (g|v)')" >>> >>> rex = RandRegExp("[:digit:][:space:][:word:]") >>> assert re.match(b"\\d\\s\\w", bytes(rex)) ###(005)=[passed] Corrupted(Bytes|Bits) >>> random.seed(0x2807) >>> cb = CorruptedBytes("ABCDE", p=0.5) >>> assert cb.command() == "CorruptedBytes(s='ABCDE', p=0.5)" >>> assert sane(raw(cb)) in [".BCD)", "&BCDW"] >>> >>> cb = CorruptedBits("ABCDE", p=0.2) >>> assert cb.command() == "CorruptedBits(s='ABCDE', p=0.2)" >>> assert sane(raw(cb)) in ["ECk@Y", "QB.P."] ###(006)=[passed] RandEnumKeys >>> random.seed(0x2807) >>> rek = RandEnumKeys({'a': 1, 'b': 2, 'c': 3}, seed=0x2807) >>> rek.enum.sort() >>> assert rek.command() == "RandEnumKeys(enum=['a', 'b', 'c'], seed=10247)" >>> r = str(rek) >>> assert r == 'a' ###(007)=[passed] RandSingNum >>> random.seed(0x2807) >>> rs = RandSingNum(-28, 7) >>> assert rs._fix() in [2, 3] >>> assert rs.command() == "RandSingNum(mn=-28, mx=7)" ###(008)=[passed] Rand* >>> random.seed(0x2807) >>> rss = RandSingString() >>> assert rss == "foo.exe:" >>> assert rss.command() == "RandSingString()" >>> >>> random.seed(0x2807) >>> rts = RandTermString(4, "scapy") >>> assert sane(raw(rts)) in ["...Zscapy", "$#..scapy"] >>> assert rts.command() == "RandTermString(size=4, term=b'scapy')" ###(009)=[passed] RandInt (test __bool__) >>> a = "True" if RandNum(False, True) else "False" >>> assert a in ["True", "False"] ###(010)=[passed] Various volatiles >>> random.seed(0x2807) >>> rng = RandNumGamma(1, 42) >>> assert rng._fix() in (8, 73) >>> assert rng.command() == "RandNumGamma(alpha=1, beta=42)" >>> >>> random.seed(0x2807) >>> rng = RandNumGauss(1, 42) >>> assert rng._fix() == 8 >>> assert rng.command() == "RandNumGauss(mu=1, sigma=42)" >>> >>> renum = RandEnum(1, 42, seed=0x2807) >>> assert renum == 37 >>> assert renum.command() == "RandEnum(min=1, max=42, seed=10247)" >>> >>> rp = RandPool((IncrementalValue(), 42), (IncrementalValue(), 0)) >>> assert rp == 0 >>> assert rp.command() == "RandPool((IncrementalValue(), 42), (IncrementalValue(), 0))" >>> >>> de = DelayedEval("3 + 1") >>> assert de == 4 >>> assert de.command() == "DelayedEval(expr='3 + 1')" >>> >>> v = IncrementalValue(restart=2) >>> assert v == 0 and v == 1 and v == 2 and v == 0 >>> assert v.command() == "IncrementalValue(restart=2)" with LatexTheme ━ Run at 01:42:06 from [test/regression.uts] by UTscapy in 13.131541967391968 └ Passed=296 └ Failed=0 ###### ## Information on Scapy ###### ###(000)=[passed] Setup >>> def expect_exception(e, c): ... try: ... c() ... return False ... except e: ... return True ... ###(001)=[passed] Get conf Dump the current configuration >>> conf ASN1_default_codec = ASN1_default_long_size = 0 AS_resolver = BTsocket = commands = IPID_count : Identify IP id values classes in a list of packets... contribs = {'http': {'auto_compression': True, 'auto_chunk': True}} crypto_valid = True crypto_valid_advanced = True dcerpc_force_header_signing = False dcerpc_session_enable = False debug_dissector = False debug_match = False debug_tls = False default_l2 = dot15d4_protocol = None emph = ethertypes = except_filter = '' exts = Name Version Specs fancy_banner = True filter = '' geoip_city = None histfile = '/builddir/.config/scapy/history' iface = ifaces = Source Index Name MAC IPv4 IPv6 sys 1 lo 00:00:00:00:00:00 127.... interactive = False interactive_shell = 'auto' ipv6_enabled = True ipython_use_jedi = False l2types = 0x0 <-> Loopback (Loopback) 0x1 <- Dot3 (802.3) 0x1 <-> Ether (... l3types = 0x3 -> IPv46 (IPv4/6) 0x800 <-> IP (IP) 0x806 <-> ARP (ARP) 0x8... layers = Packet : NoPayload : max_list_count = 100 mib = min_pkt_size = 60 nameservers = ['192.168.122.1'] neighbor = Ether -> LLC Dot3 -> LLC Dot3 -> SNAP Ether -> Dot1Q Ether -> A... netcache = arp_cache: 0 valid items. Timeout=120s in6_neighbor: 0 valid it... nmap_base = 'nmap-os-fingerprintsYBaMoO' nmap_kdb = noenum = p0f_base = 'p0f.fp' p0fa_base = 'p0fa.fp' p0fo_base = 'p0fo.fp' p0fr_base = 'p0fr.fp' padding = 1 padding_layer = prog = display = 'display' dot = 'dot' extcap_folders = ['/builddir/.c... prompt = '>>> ' protocols = raise_no_dst_mac = False raw_layer = raw_summary = False recv_poll_rate = 0.05 resolve = route = Network Netmask Gateway Iface Output IP Metric 0.0.0.0 0.0.0.0 ... route6 = Destination Next Hop Iface Src candidates Metric ::/0 2620:52:3... route6_autoload = True route_autoload = True services_sctp = services_tcp = services_udp = session = '' sniff_promisc = True stats_classic_protocols = [, , >> >>> IP().src '127.0.0.1' >>> conf.loopback_name 'lo' ###(002)=[passed] Test module version detection >>> class FakeModule(object): ... __version__ = "v1.12" ... >>> class FakeModule2(object): ... __version__ = "5.143.3.12" ... >>> class FakeModule3(object): ... __version__ = "v2.4.2.dev42" ... >>> from scapy.config import _version_checker >>> >>> assert _version_checker(FakeModule, (1,11,5)) >>> assert not _version_checker(FakeModule, (1,13)) >>> >>> assert _version_checker(FakeModule2, (5, 1)) >>> assert not _version_checker(FakeModule2, (5, 143, 4)) >>> >>> assert _version_checker(FakeModule3, (2, 4, 2)) ###(003)=[passed] Check Scapy version >>> from unittest import mock >>> >>> import scapy >>> from scapy import _parse_tag, _version_from_git_describe >>> from scapy.config import _version_checker >>> >>> b = Bunch(returncode=0, communicate=lambda *args, **kargs: (b"v2.4.5rc1-261-g44b98e14", None)) >>> with mock.patch('scapy.subprocess.Popen', return_value=b): ... with mock.patch('scapy.os.path.isdir', return_value=True): ... class GitModuleScapy(object): ... __version__ = _version_from_git_describe() ... >>> with mock.patch('scapy.subprocess.Popen', return_value=b): ... with mock.patch('scapy.os.path.isdir', return_value=False): ... try: ... _version_from_git_describe() ... assert False ... except ValueError: ... pass ... >>> assert GitModuleScapy.__version__ == '2.4.5rc1.dev261' >>> assert _version_checker(GitModuleScapy, (2, 4, 5)) ###(004)=[passed] List layers >>> ls() AD_AND_OR : None AD_KDCIssued : None AH : AH AKMSuite : AKM suite ARP : ARP ASN1P_INTEGER : None ASN1P_OID : None ASN1P_PRIVSEQ : None ASN1_Packet : None ATT_Error_Response : Error Response ATT_Exchange_MTU_Request : Exchange MTU Request ATT_Exchange_MTU_Response : Exchange MTU Response ATT_Execute_Write_Request : Execute Write Request ATT_Execute_Write_Response : Execute Write Response ATT_Find_By_Type_Value_Request : Find By Type Value Request ATT_Find_By_Type_Value_Response : Find By Type Value Response ATT_Find_Information_Request : Find Information Request ATT_Find_Information_Response : Find Information Response ATT_Handle : ATT Short Handle ATT_Handle_UUID128 : ATT Handle (UUID 128) ATT_Handle_Value_Indication : Handle Value Indication ATT_Handle_Value_Notification : Handle Value Notification ATT_Handle_Variable : None ATT_Hdr : ATT header ATT_Prepare_Write_Request : Prepare Write Request ATT_Prepare_Write_Response : Prepare Write Response ATT_Read_Blob_Request : Read Blob Request ATT_Read_Blob_Response : Read Blob Response ATT_Read_By_Group_Type_Request : Read By Group Type Request ATT_Read_By_Group_Type_Response : Read By Group Type Response ATT_Read_By_Type_Request : Read By Type Request ATT_Read_By_Type_Request_128bit : Read By Type Request ATT_Read_By_Type_Response : Read By Type Response ATT_Read_Multiple_Request : Read Multiple Request ATT_Read_Multiple_Response : Read Multiple Response ATT_Read_Request : Read Request ATT_Read_Response : Read Response ATT_Write_Command : Write Request ATT_Write_Request : Write Request ATT_Write_Response : Write Response AV_PAIR : NTLM AV Pair AlgorithmIdentifier : None AttributeValueAssertion : None AuthorizationData : None AuthorizationDataItem : None BOOTP : BOOTP BRWS : None BRWS_BecomeBackup : None BRWS_HostAnnouncement : None BRWS_LocalMasterAnnouncement : None BSSTerminationDuration : BSS Termination Duration BTLE : BT4LE BTLE_ADV : BTLE advertising header BTLE_ADV_DIRECT_IND : BTLE ADV_DIRECT_IND BTLE_ADV_IND : BTLE ADV_IND BTLE_ADV_NONCONN_IND : BTLE ADV_NONCONN_IND BTLE_ADV_SCAN_IND : BTLE ADV_SCAN_IND BTLE_CONNECT_REQ : BTLE connect request BTLE_CTRL : BTLE_CTRL BTLE_DATA : BTLE data header BTLE_EMPTY_PDU : Empty data PDU BTLE_PPI : BTLE PPI header BTLE_RF : BTLE RF info header BTLE_SCAN_REQ : BTLE scan request BTLE_SCAN_RSP : BTLE scan response Breakfast : None CLAIM_SECURITY_ATTRIBUTE_RELATIVE_V1 : None CLDAP : None ChangePasswdData : None Checksum : None CommonAuthVerifier : Common Authentication Verifier CondFlagsTest : None CookedLinux : cooked linux CookedLinuxV2 : cooked linux v2 DFS_REFERRAL : None DFS_REFERRAL_ENTRY0 : None DFS_REFERRAL_ENTRY1 : None DFS_REFERRAL_V3 : None DFS_REFERRAL_V4 : None DHCP : DHCP options DHCP6 : DHCPv6 Generic Message DHCP6NTPSubOptMCAddr : DHCP6 NTP Multicast Address Suboption DHCP6NTPSubOptSrvAddr : DHCP6 NTP Server Address Suboption DHCP6NTPSubOptSrvFQDN : DHCP6 NTP Server FQDN Suboption DHCP6OptAuth : DHCP6 Option - Authentication DHCP6OptBCMCSDomains : DHCP6 Option - BCMCS Domain Name List DHCP6OptBCMCSServers : DHCP6 Option - BCMCS Addresses List DHCP6OptBootFileUrl : DHCP6 Boot File URL Option DHCP6OptCaptivePortal : DHCP6 Option - Captive-Portal DHCP6OptClientArchType : DHCP6 Client System Architecture Type Option DHCP6OptClientFQDN : DHCP6 Option - Client FQDN DHCP6OptClientId : DHCP6 Client Identifier Option DHCP6OptClientLinkLayerAddr : DHCP6 Option - Client Link Layer address DHCP6OptClientNetworkInterId : DHCP6 Client Network Interface Identifier Option DHCP6OptDNSDomains : DHCP6 Option - Domain Search List option DHCP6OptDNSServers : DHCP6 Option - DNS Recursive Name Server DHCP6OptERPDomain : DHCP6 Option - ERP Domain Name List DHCP6OptElapsedTime : DHCP6 Elapsed Time Option DHCP6OptGeoConf : DHCP6 Option - Civic Location DHCP6OptGeoConfElement : None DHCP6OptIAAddress : DHCP6 IA Address Option (IA_TA or IA_NA suboption) DHCP6OptIAPrefix : DHCP6 Option - IA Prefix option DHCP6OptIA_NA : DHCP6 Identity Association for Non-temporary Addresses Option DHCP6OptIA_PD : DHCP6 Option - Identity Association for Prefix Delegation DHCP6OptIA_TA : DHCP6 Identity Association for Temporary Addresses Option DHCP6OptIfaceId : DHCP6 Interface-Id Option DHCP6OptInfoRefreshTime : DHCP6 Option - Information Refresh Time DHCP6OptLQClientLink : DHCP6 Client Link Option DHCP6OptMudUrl : DHCP6 Option - MUD URL DHCP6OptNISDomain : DHCP6 Option - NIS Domain Name DHCP6OptNISPDomain : DHCP6 Option - NIS+ Domain Name DHCP6OptNISPServers : DHCP6 Option - NIS+ Servers DHCP6OptNISServers : DHCP6 Option - NIS Servers DHCP6OptNTPServer : DHCP6 NTP Server Option DHCP6OptNewPOSIXTimeZone : DHCP6 POSIX Timezone Option DHCP6OptNewTZDBTimeZone : DHCP6 TZDB Timezone Option DHCP6OptOptReq : DHCP6 Option Request Option DHCP6OptPanaAuthAgent : DHCP6 PANA Authentication Agent Option DHCP6OptPref : DHCP6 Preference Option DHCP6OptRapidCommit : DHCP6 Rapid Commit Option DHCP6OptReconfAccept : DHCP6 Reconfigure Accept Option DHCP6OptReconfMsg : DHCP6 Reconfigure Message Option DHCP6OptRelayAgentERO : DHCP6 Option - RelayRequest Option DHCP6OptRelayMsg : DHCP6 Relay Message Option DHCP6OptRelaySuppliedOpt : DHCP6 Relay-Supplied Options Option DHCP6OptRemoteID : DHCP6 Option - Relay Agent Remote-ID DHCP6OptSIPDomains : DHCP6 Option - SIP Servers Domain Name List DHCP6OptSIPServers : DHCP6 Option - SIP Servers IPv6 Address List DHCP6OptSNTPServers : DHCP6 option - SNTP Servers DHCP6OptServerId : DHCP6 Server Identifier Option DHCP6OptServerUnicast : DHCP6 Server Unicast Option DHCP6OptStatusCode : DHCP6 Status Code Option DHCP6OptSubscriberID : DHCP6 Option - Subscriber ID DHCP6OptUnknown : Unknown DHCPv6 Option DHCP6OptUserClass : DHCP6 User Class Option DHCP6OptVSS : DHCP6 Option - Virtual Subnet Selection DHCP6OptVendorClass : DHCP6 Vendor Class Option DHCP6OptVendorSpecificInfo : DHCP6 Vendor-specific Information Option DHCP6_Advertise : DHCPv6 Advertise Message DHCP6_Confirm : DHCPv6 Confirm Message DHCP6_Decline : DHCPv6 Decline Message DHCP6_InfoRequest : DHCPv6 Information Request Message DHCP6_Rebind : DHCPv6 Rebind Message DHCP6_Reconf : DHCPv6 Reconfigure Message DHCP6_RelayForward : DHCPv6 Relay Forward Message (Relay Agent/Server Message) DHCP6_RelayReply : DHCPv6 Relay Reply Message (Relay Agent/Server Message) DHCP6_Release : DHCPv6 Release Message DHCP6_Renew : DHCPv6 Renew Message DHCP6_Reply : DHCPv6 Reply Message DHCP6_Request : DHCPv6 Request Message DHCP6_Solicit : DHCPv6 Solicit Message DHRepInfo : None DIR_PPP : None DNS : DNS DNSCompressedPacket : None DNSQR : DNS Question Record DNSRR : DNS Resource Record DNSRRDLV : DNS DLV Resource Record DNSRRDNSKEY : DNS DNSKEY Resource Record DNSRRDS : DNS DS Resource Record DNSRRHINFO : DNS HINFO Resource Record DNSRRHTTPS : DNS HTTPS Resource Record DNSRRMX : DNS MX Resource Record DNSRRNAPTR : DNS NAPTR Resource Record DNSRRNSEC : DNS NSEC Resource Record DNSRRNSEC3 : DNS NSEC3 Resource Record DNSRRNSEC3PARAM : DNS NSEC3PARAM Resource Record DNSRROPT : DNS OPT Resource Record DNSRRRSIG : DNS RRSIG Resource Record DNSRRSOA : DNS SOA Resource Record DNSRRSRV : DNS SRV Resource Record DNSRRSVCB : DNS SVCB Resource Record DNSRRTSIG : DNS TSIG Resource Record DUID_EN : DUID - Assigned by Vendor Based on Enterprise Number DUID_LL : DUID - Based on Link-layer Address DUID_LLT : DUID - Link-layer address plus time DUID_UUID : DUID - Based on UUID DataPacket : Data Packet DcSockAddr : None DceRpc : None DceRpc4 : DCE/RPC v4 DceRpc4Payload : None DceRpc5 : DCE/RPC v5 DceRpc5AbstractSyntax : Presentation Syntax (p_syntax_id_t) DceRpc5AlterContext : DCE/RPC v5 - AlterContext DceRpc5AlterContextResp : DCE/RPC v5 - AlterContextResp DceRpc5Auth3 : DCE/RPC v5 - Auth3 DceRpc5Bind : DCE/RPC v5 - Bind DceRpc5BindAck : DCE/RPC v5 - Bind Ack DceRpc5BindNak : DCE/RPC v5 - Bind Nak DceRpc5Context : Presentation Context (p_cont_elem_t) DceRpc5Fault : DCE/RPC v5 - Fault DceRpc5PortAny : Port Any (port_any_t) DceRpc5Request : DCE/RPC v5 - Request DceRpc5Response : DCE/RPC v5 - Response DceRpc5Result : Context negotiation Result DceRpc5TransferSyntax : Presentation Transfer Syntax (p_syntax_id_t) DceRpc5Version : version_t DceRpcSecVT : Verification trailer DceRpcSecVTBitmask : rpc_sec_vt_bitmask DceRpcSecVTCommand : Verification trailer command DceRpcSecVTHeader2 : rpc_sec_vt_header2 DceRpcSecVTPcontext : rpc_sec_vt_pcontext DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DebugPacket : None DirectTCP : Direct TCP Dot11 : 802.11 Dot11ATIM : 802.11 ATIM Dot11Ack : 802.11 Ack packet Dot11Action : 802.11 Action Dot11AssoReq : 802.11 Association Request Dot11AssoResp : 802.11 Association Response Dot11Auth : 802.11 Authentication Dot11BSSTMRequest : BSS Transition Management Request Dot11BSSTMResponse : BSS Transition Management Response Dot11Beacon : 802.11 Beacon Dot11CCMP : 802.11 CCMP packet Dot11CSA : Channel Switch Announcement Frame Dot11Deauth : 802.11 Deauthentication Dot11Disas : 802.11 Disassociation Dot11Elt : 802.11 Information Element Dot11EltCSA : 802.11 CSA Element Dot11EltCountry : 802.11 Country Dot11EltCountryConstraintTriplet : 802.11 Country Constraint Triplet Dot11EltDSSSet : 802.11 DSSS Parameter Set Dot11EltERP : 802.11 ERP Dot11EltHTCapabilities : 802.11 HT Capabilities Dot11EltMicrosoftWPA : 802.11 Microsoft WPA Dot11EltOBSS : 802.11 OBSS Scan Parameters Element Dot11EltRSN : 802.11 RSN information Dot11EltRates : 802.11 Rates Dot11EltVHTOperation : 802.11 VHT Operation Element Dot11EltVendorSpecific : 802.11 Vendor Specific Dot11Encrypted : 802.11 Encrypted (unknown algorithm) Dot11FCS : 802.11-FCS Dot11ProbeReq : 802.11 Probe Request Dot11ProbeResp : 802.11 Probe Response Dot11QoS : 802.11 QoS Dot11ReassoReq : 802.11 Reassociation Request Dot11ReassoResp : 802.11 Reassociation Response Dot11SpectrumManagement : 802.11 Spectrum Management Action Dot11TKIP : 802.11 TKIP packet Dot11VHTOperationInfo : 802.11 VHT Operation Information Dot11WEP : 802.11 WEP packet Dot11WNM : 802.11 WNM Action Dot15d4 : 802.15.4 Dot15d4Ack : 802.15.4 Ack Dot15d4AuxSecurityHeader : 802.15.4 Auxiliary Security Header Dot15d4Beacon : 802.15.4 Beacon Dot15d4Cmd : 802.15.4 Command Dot15d4CmdAssocReq : 802.15.4 Association Request Payload Dot15d4CmdAssocResp : 802.15.4 Association Response Payload Dot15d4CmdCoordRealign : 802.15.4 Coordinator Realign Command Dot15d4CmdCoordRealignPage : 802.15.4 Coordinator Realign Page Dot15d4CmdDisassociation : 802.15.4 Disassociation Notification Payload Dot15d4CmdGTSReq : 802.15.4 GTS request command Dot15d4Data : 802.15.4 Data Dot15d4FCS : 802.15.4 - FCS Dot1AD : 802_1AD Dot1AH : 802_1AH Dot1Q : 802.1Q Dot3 : 802.3 DummyPacket : None EAP : EAP EAPOL : EAPOL EAPOL_KEY : EAPOL_KEY EAP_FAST : EAP-FAST EAP_MD5 : EAP-MD5 EAP_PEAP : PEAP EAP_TLS : EAP-TLS EAP_TTLS : EAP-TTLS ECCurve : None ECDSAPrivateKey : None ECDSAPrivateKey_OpenSSL : ECDSA Params + Private Key ECDSAPublicKey : None ECDSASignature : None ECFieldID : None ECParameters : None ECSpecifiedDomain : None EDNS0COOKIE : DNS EDNS0 COOKIE EDNS0ClientSubnet : DNS EDNS0 Client Subnet EDNS0DAU : DNSSEC Algorithm Understood (DAU) EDNS0DHU : DS Hash Understood (DHU) EDNS0ExtendedDNSError : DNS EDNS0 Extended DNS Error EDNS0N3U : NSEC3 Hash Understood (N3U) EDNS0OWN : EDNS0 Owner (OWN) EDNS0TLV : DNS EDNS0 TLV EIR_ClassOfDevice : Class of device EIR_CompleteList128BitServiceUUIDs : Complete list of 128-bit service UUIDs EIR_CompleteList16BitServiceUUIDs : Complete list of 16-bit service UUIDs EIR_CompleteList32BitServiceUUIDs : Complete list of 32-bit service UUIDs EIR_CompleteLocalName : Complete Local Name EIR_Device_ID : Device ID EIR_Element : EIR Element EIR_Flags : Flags EIR_Hdr : EIR Header EIR_IncompleteList128BitServiceUUIDs : Incomplete list of 128-bit service UUIDs EIR_IncompleteList16BitServiceUUIDs : Incomplete list of 16-bit service UUIDs EIR_IncompleteList32BitServiceUUIDs : Incomplete list of 32-bit service UUIDs EIR_Manufacturer_Specific_Data : EIR Manufacturer Specific Data EIR_PeripheralConnectionIntervalRange : Peripheral Connection Interval Range EIR_Raw : EIR Raw EIR_SecureSimplePairingHashC192 : Secure Simple Pairing Hash C-192 EIR_SecureSimplePairingRandomizerR192 : Secure Simple Pairing Randomizer R-192 EIR_SecurityManagerOOBFlags : Security Manager Out of Band Flags EIR_ServiceData128BitUUID : EIR Service Data - 128-bit UUID EIR_ServiceData16BitUUID : EIR Service Data - 16-bit UUID EIR_ServiceData32BitUUID : EIR Service Data - 32-bit UUID EIR_ShortenedLocalName : Shortened Local Name EIR_TX_Power_Level : TX Power Level EPacket : None ESP : ESP ETYPE_INFO : None ETYPE_INFO2 : None ETYPE_INFO_ENTRY : None ETYPE_INFO_ENTRY2 : None EdDSAPrivateKey : None EdDSAPublicKey : None EncAPRepPart : None EncASRepPart : None EncKeyPack : None EncKrbCredPart : None EncKrbPrivPart : None EncTGSRepPart : None EncTicketPart : None EncryptedData : None EncryptionKey : None EndpointFlagsPacket : RTPS Endpoint Builtin Endpoint Flags Ether : Ethernet EtherCat : None EtherCatAPRD : None EtherCatAPRW : None EtherCatAPWR : None EtherCatARMW : None EtherCatBRD : None EtherCatBRW : None EtherCatBWR : None EtherCatFPRD : None EtherCatFPRW : None EtherCatFPWR : None EtherCatFRMW : None EtherCatLRD : None EtherCatLRW : None EtherCatLWR : None EtherCatType12DLPDU : None ExternalPrincipalIdentifier : None FILE_BOTH_DIR_INFORMATION : None FILE_FULL_DIR_INFORMATION : None FILE_GET_QUOTA_INFORMATION : None FILE_ID_BOTH_DIR_INFORMATION : None FILE_NAME_INFORMATION : None FILE_NOTIFY_INFORMATION : None FileAccessInformation : None FileAlignmentInformation : None FileAllInformation : None FileAlternateNameInformation : None FileBasicInformation : None FileBothDirectoryInformation : None FileEaInformation : None FileFsAttributeInformation : None FileFsSizeInformation : None FileFsVolumeInformation : None FileFullDirectoryInformation : None FileIdBothDirectoryInformation : None FileInternalInformation : None FileModeInformation : None FileNetworkOpenInformation : None FilePositionInformation : None FileRenameInformation : None FileStandardInformation : None FileStreamInformation : None FlagsTest : None FlagsTest2 : None GPRS : GPRSdummy GRE : GRE GRE_PPTP : GRE PPTP GRErouting : GRE routing information GSSAPI_BLOB : None GSSAPI_BLOB_SIGNATURE : None GUIDPacket : RTPS GUID GUIDPrefixPacket : RTPS GUID Prefix GssBufferDesc : gss_buffer_desc GssChannelBindings : gss_channel_bindings_struct GuessPayload : None H2AbstractHeadersFrame : None H2ContinuationFrame : HTTP/2 Continuation Frame H2DataFrame : HTTP/2 Data Frame H2Frame : HTTP/2 Frame H2FramePayload : None H2GoAwayFrame : HTTP/2 Go Away Frame H2HeadersFrame : HTTP/2 Headers Frame H2PaddedDataFrame : HTTP/2 Padded Data Frame H2PaddedHeadersFrame : HTTP/2 Headers Frame with Padding H2PaddedPriorityHeadersFrame : HTTP/2 Headers Frame with Padding and Priority H2PaddedPushPromiseFrame : HTTP/2 Padded Push Promise Frame H2PingFrame : HTTP/2 Ping Frame H2PriorityFrame : HTTP/2 Priority Frame H2PriorityHeadersFrame : HTTP/2 Headers Frame with Priority H2PushPromiseFrame : HTTP/2 Push Promise Frame H2ResetFrame : HTTP/2 Reset Frame H2Seq : HTTP/2 Frame Sequence H2Setting : HTTP/2 Setting H2SettingsFrame : HTTP/2 Settings Frame H2WindowUpdateFrame : HTTP/2 Window Update Frame HAO : Home Address Option HBHOptUnknown : Scapy6 Unknown Option HCI_ACL_Hdr : HCI ACL header HCI_Cmd_Accept_Connection_Request : HCI_Accept_Connection_Request HCI_Cmd_Authentication_Requested : HCI_Authentication_Requested HCI_Cmd_Change_Connection_Link_Key : HCI_Change_Connection_Link_Key HCI_Cmd_Change_Connection_Packet_Type : HCI_Cmd_Change_Connection_Packet_Type HCI_Cmd_Complete_LE_Read_White_List_Size : LE Read White List Size HCI_Cmd_Complete_Read_BD_Addr : Read BD Addr HCI_Cmd_Complete_Read_Local_Extended_Features : Read Local Extended Features command complete HCI_Cmd_Complete_Read_Local_Name : Read Local Name command complete HCI_Cmd_Complete_Read_Local_Version_Information : Read Local Version Information HCI_Cmd_Create_Connection : HCI_Create_Connection HCI_Cmd_Create_Connection_Cancel : HCI_Create_Connection_Cancel HCI_Cmd_Disconnect : HCI_Disconnect HCI_Cmd_Exit_Peiodic_Inquiry_Mode : HCI_Exit_Periodic_Inquiry_Mode HCI_Cmd_Hold_Mode : HCI_Hold_Mode HCI_Cmd_IO_Capability_Request_Reply : HCI_Read_Remote_Supported_Features HCI_Cmd_Inquiry : HCI_Inquiry HCI_Cmd_Inquiry_Cancel : HCI_Inquiry_Cancel HCI_Cmd_LE_Add_Device_To_Filter_Accept_List : HCI_LE_Add_Device_To_Filter_Accept_List HCI_Cmd_LE_Clear_Filter_Accept_List : HCI_LE_Clear_Filter_Accept_List HCI_Cmd_LE_Connection_Update : HCI_LE_Connection_Update HCI_Cmd_LE_Create_Connection : HCI_LE_Create_Connection HCI_Cmd_LE_Create_Connection_Cancel : HCI_LE_Create_Connection_Cancel HCI_Cmd_LE_Enable_Encryption : HCI_LE_Enable_Encryption HCI_Cmd_LE_Long_Term_Key_Request_Negative_Reply : HCI_LE_Long_Term_Key_Request _Negative_Reply HCI_Cmd_LE_Long_Term_Key_Request_Reply : HCI_LE_Long_Term_Key_Request_Reply HCI_Cmd_LE_Read_Buffer_Size_V1 : HCI_LE_Read_Buffer_Size [v1] HCI_Cmd_LE_Read_Buffer_Size_V2 : HCI_LE_Read_Buffer_Size [v2] HCI_Cmd_LE_Read_Filter_Accept_List_Size : HCI_LE_Read_Filter_Accept_List_Size HCI_Cmd_LE_Read_Local_Supported_Features : HCI_LE_Read_Local_Supported_Features HCI_Cmd_LE_Read_Remote_Features : HCI_LE_Read_Remote_Features HCI_Cmd_LE_Remove_Device_From_Filter_Accept_List : HCI_LE_Remove_Device_From_Filter_Accept_List HCI_Cmd_LE_Set_Advertise_Enable : HCI_LE_Set_Advertising_Enable HCI_Cmd_LE_Set_Advertising_Data : HCI_LE_Set_Advertising_Data HCI_Cmd_LE_Set_Advertising_Parameters : HCI_LE_Set_Advertising_Parameters HCI_Cmd_LE_Set_Random_Address : HCI_LE_Set_Random_Address HCI_Cmd_LE_Set_Scan_Enable : HCI_LE_Set_Scan_Enable HCI_Cmd_LE_Set_Scan_Parameters : HCI_LE_Set_Scan_Parameters HCI_Cmd_LE_Set_Scan_Response_Data : HCI_LE_Set_Scan_Response_Data HCI_Cmd_Link_Key_Request_Negative_Reply : HCI_Link_Key_Request_Negative_Reply HCI_Cmd_Link_Key_Request_Reply : HCI_Link_Key_Request_Reply HCI_Cmd_Link_Key_Selection : HCI_Cmd_Link_Key_Selection HCI_Cmd_PIN_Code_Request_Negative_Reply : HCI_PIN_Code_Request_Negative_Reply HCI_Cmd_PIN_Code_Request_Reply : HCI_PIN_Code_Request_Reply HCI_Cmd_Periodic_Inquiry_Mode : HCI_Periodic_Inquiry_Mode HCI_Cmd_Read_BD_Addr : HCI_Read_BD_ADDR HCI_Cmd_Read_LE_Host_Support : HCI_Read_LE_Host_Support HCI_Cmd_Read_Link_Quality : HCI_Read_Link_Quality HCI_Cmd_Read_Local_Extended_Features : HCI_Read_Local_Extended_Features HCI_Cmd_Read_Local_Name : HCI_Read_Local_Name HCI_Cmd_Read_Local_Version_Information : HCI_Read_Local_Version_Information HCI_Cmd_Read_Loopback_Mode : HCI_Read_Loopback_Mode HCI_Cmd_Read_RSSI : HCI_Read_RSSI HCI_Cmd_Read_Remote_Extended_Features : HCI_Read_Remote_Supported_Features HCI_Cmd_Read_Remote_Supported_Features : HCI_Read_Remote_Supported_Features HCI_Cmd_Reject_Connection_Response : HCI_Reject_Connection_Response HCI_Cmd_Remote_Name_Request : HCI_Remote_Name_Request HCI_Cmd_Remote_Name_Request_Cancel : HCI_Remote_Name_Request_Cancel HCI_Cmd_Remote_OOB_Data_Request_Negative_Reply : HCI_Remote_OOB_Data_Request_Negative_Reply HCI_Cmd_Remote_OOB_Data_Request_Reply : HCI_Remote_OOB_Data_Request_Reply HCI_Cmd_Reset : HCI_Reset HCI_Cmd_Set_Connection_Encryption : HCI_Set_Connection_Encryption HCI_Cmd_Set_Event_Filter : HCI_Set_Event_Filter HCI_Cmd_Set_Event_Mask : HCI_Set_Event_Mask HCI_Cmd_User_Confirmation_Request_Negative_Reply : HCI_User_Confirmation_Request_Negative_Reply HCI_Cmd_User_Confirmation_Request_Reply : HCI_User_Confirmation_Request_Reply HCI_Cmd_User_Passkey_Request_Negative_Reply : HCI_User_Passkey_Request_Negative_Reply HCI_Cmd_User_Passkey_Request_Reply : HCI_User_Passkey_Request_Reply HCI_Cmd_Write_Connect_Accept_Timeout : HCI_Write_Connection_Accept_Timeout HCI_Cmd_Write_Extended_Inquiry_Response : HCI_Write_Extended_Inquiry_Response HCI_Cmd_Write_LE_Host_Support : HCI_Write_LE_Host_Support HCI_Cmd_Write_Local_Name : None HCI_Cmd_Write_Loopback_Mode : HCI_Write_Loopback_Mode HCI_Command_Hdr : HCI Command header HCI_Event_Command_Complete : HCI_Command_Complete HCI_Event_Command_Status : HCI_Command_Status HCI_Event_Connection_Complete : HCI_Connection_Complete HCI_Event_Disconnection_Complete : HCI_Disconnection_Complete HCI_Event_Encryption_Change : HCI_Encryption_Change HCI_Event_Extended_Inquiry_Result : HCI_Extended_Inquiry_Result HCI_Event_Hdr : HCI Event header HCI_Event_IO_Capability_Response : HCI_IO_Capability_Response HCI_Event_Inquiry_Complete : HCI_Inquiry_Complete HCI_Event_Inquiry_Result : HCI_Inquiry_Result HCI_Event_Inquiry_Result_With_Rssi : HCI_Inquiry_Result_with_RSSI HCI_Event_LE_Meta : HCI_LE_Meta HCI_Event_Link_Key_Request : HCI_Link_Key_Request HCI_Event_Number_Of_Completed_Packets : HCI_Number_Of_Completed_Packets HCI_Event_Read_Remote_Extended_Features_Complete : HCI_Read_Remote_Extended_Features_Complete HCI_Event_Read_Remote_Supported_Features_Complete : HCI_Read_Remote_Supported_Features_Complete HCI_Event_Read_Remote_Version_Information_Complete : HCI_Read_Remote_Version_Information HCI_Event_Remote_Name_Request_Complete : HCI_Remote_Name_Request_Complete HCI_Extended_Inquiry_Response : None HCI_Hdr : HCI header HCI_LE_Meta_Advertising_Report : Advertising Report HCI_LE_Meta_Advertising_Reports : Advertising Reports HCI_LE_Meta_Connection_Complete : Connection Complete HCI_LE_Meta_Connection_Update_Complete : Connection Update Complete HCI_LE_Meta_Long_Term_Key_Request : Long Term Key Request HCI_Mon_Hdr : Bluetooth Linux Monitor Transport Header HCI_Mon_Index_Info : Bluetooth Linux Monitor Transport Index Info Packet HCI_Mon_New_Index : Bluetooth Linux Monitor Transport New Index Packet HCI_Mon_Pcap_Hdr : Bluetooth Linux Monitor Transport Pcap Header HCI_Mon_System_Note : Bluetooth Linux Monitor Transport System Note Packet HCI_PHDR_Hdr : HCI PHDR transport layer HDLC : None HPackDynamicSizeUpdate : HPack Dynamic Size Update HPackHdrString : HPack Header String HPackHeaders : None HPackIndexedHdr : HPack Indexed Header Field HPackLitHdrFldWithIncrIndexing : HPack Literal Header With Incremental Indexing HPackLitHdrFldWithoutIndexing : HPack Literal Header Without Indexing (or Never Indexing) HSRP : HSRP HSRPmd5 : HSRP MD5 Authentication HTTP : HTTP 1 HTTPRequest : HTTP Request HTTPResponse : HTTP Response HostAddress : None IAKERB_HEADER : None ICMP : ICMP ICMPExtension_Header : ICMP Extension Header (RFC4884) ICMPExtension_InterfaceInformation : ICMP Extension Object - Interface Information Object (RFC5837) ICMPExtension_Object : ICMP Extension Object ICMPerror : ICMP in ICMP ICMPv6DestUnreach : ICMPv6 Destination Unreachable ICMPv6EchoReply : ICMPv6 Echo Reply ICMPv6EchoRequest : ICMPv6 Echo Request ICMPv6HAADReply : ICMPv6 Home Agent Address Discovery Reply ICMPv6HAADRequest : ICMPv6 Home Agent Address Discovery Request ICMPv6MLDMultAddrRec : ICMPv6 MLDv2 - Multicast Address Record ICMPv6MLDone : MLD - Multicast Listener Done ICMPv6MLQuery : MLD - Multicast Listener Query ICMPv6MLQuery2 : MLDv2 - Multicast Listener Query ICMPv6MLReport : MLD - Multicast Listener Report ICMPv6MLReport2 : MLDv2 - Multicast Listener Report ICMPv6MPAdv : ICMPv6 Mobile Prefix Advertisement ICMPv6MPSol : ICMPv6 Mobile Prefix Solicitation ICMPv6MRD_Advertisement : ICMPv6 Multicast Router Discovery Advertisement ICMPv6MRD_Solicitation : ICMPv6 Multicast Router Discovery Solicitation ICMPv6MRD_Termination : ICMPv6 Multicast Router Discovery Termination ICMPv6NDOptAdvInterval : ICMPv6 Neighbor Discovery - Interval Advertisement ICMPv6NDOptCaptivePortal : ICMPv6 Neighbor Discovery Option - Captive-Portal Option ICMPv6NDOptDNSSL : ICMPv6 Neighbor Discovery Option - DNS Search List Option ICMPv6NDOptDstLLAddr : ICMPv6 Neighbor Discovery Option - Destination Link-Layer Address ICMPv6NDOptEFA : ICMPv6 Neighbor Discovery Option - Expanded Flags Option ICMPv6NDOptHAInfo : ICMPv6 Neighbor Discovery - Home Agent Information ICMPv6NDOptIPAddr : ICMPv6 Neighbor Discovery - IP Address Option (FH for MIPv6) ICMPv6NDOptLLA : ICMPv6 Neighbor Discovery - Link-Layer Address (LLA) Option (FH for MIPv6) ICMPv6NDOptMAP : ICMPv6 Neighbor Discovery - MAP Option ICMPv6NDOptMTU : ICMPv6 Neighbor Discovery Option - MTU ICMPv6NDOptNewRtrPrefix : ICMPv6 Neighbor Discovery - New Router Prefix Information Option (FH for MIPv6) ICMPv6NDOptPREF64 : ICMPv6 Neighbor Discovery Option - PREF64 Option ICMPv6NDOptPrefixInfo : ICMPv6 Neighbor Discovery Option - Prefix Information ICMPv6NDOptRDNSS : ICMPv6 Neighbor Discovery Option - Recursive DNS Server Option ICMPv6NDOptRedirectedHdr : ICMPv6 Neighbor Discovery Option - Redirected Header ICMPv6NDOptRouteInfo : ICMPv6 Neighbor Discovery Option - Route Information Option ICMPv6NDOptShortcutLimit : ICMPv6 Neighbor Discovery Option - NBMA Shortcut Limit ICMPv6NDOptSrcAddrList : ICMPv6 Inverse Neighbor Discovery Option - Source Address List ICMPv6NDOptSrcLLAddr : ICMPv6 Neighbor Discovery Option - Source Link-Layer Address ICMPv6NDOptTgtAddrList : ICMPv6 Inverse Neighbor Discovery Option - Target Address List ICMPv6NDOptUnknown : ICMPv6 Neighbor Discovery Option - Scapy Unimplemented ICMPv6ND_INDAdv : ICMPv6 Inverse Neighbor Discovery Advertisement ICMPv6ND_INDSol : ICMPv6 Inverse Neighbor Discovery Solicitation ICMPv6ND_NA : ICMPv6 Neighbor Discovery - Neighbor Advertisement ICMPv6ND_NS : ICMPv6 Neighbor Discovery - Neighbor Solicitation ICMPv6ND_RA : ICMPv6 Neighbor Discovery - Router Advertisement ICMPv6ND_RS : ICMPv6 Neighbor Discovery - Router Solicitation ICMPv6ND_Redirect : ICMPv6 Neighbor Discovery - Redirect ICMPv6NIQueryIPv4 : ICMPv6 Node Information Query - IPv4 Address Query ICMPv6NIQueryIPv6 : ICMPv6 Node Information Query - IPv6 Address Query ICMPv6NIQueryNOOP : ICMPv6 Node Information Query - NOOP Query ICMPv6NIQueryName : ICMPv6 Node Information Query - IPv6 Name Query ICMPv6NIReplyIPv4 : ICMPv6 Node Information Reply - IPv4 addresses ICMPv6NIReplyIPv6 : ICMPv6 Node Information Reply - IPv6 addresses ICMPv6NIReplyNOOP : ICMPv6 Node Information Reply - NOOP Reply ICMPv6NIReplyName : ICMPv6 Node Information Reply - Node Names ICMPv6NIReplyRefuse : ICMPv6 Node Information Reply - Responder refuses to supply answer ICMPv6NIReplyUnknown : ICMPv6 Node Information Reply - Qtype unknown to the responder ICMPv6PacketTooBig : ICMPv6 Packet Too Big ICMPv6ParamProblem : ICMPv6 Parameter Problem ICMPv6RPL : RPL ICMPv6TimeExceeded : ICMPv6 Time Exceeded ICMPv6Unknown : Scapy6 ICMPv6 fallback class IP : IP IPOption : IP Option IPOption_Address_Extension : IP Option Address Extension IPOption_EOL : IP Option End of Options List IPOption_LSRR : IP Option Loose Source and Record Route IPOption_MTU_Probe : IP Option MTU Probe IPOption_MTU_Reply : IP Option MTU Reply IPOption_NOP : IP Option No Operation IPOption_RR : IP Option Record Route IPOption_Router_Alert : IP Option Router Alert IPOption_SDBM : IP Option Selective Directed Broadcast Mode IPOption_SSRR : IP Option Strict Source and Record Route IPOption_Security : IP Option Security IPOption_Stream_Id : IP Option Stream ID IPOption_Timestamp : IP Option Timestamp IPOption_Traceroute : IP Option Traceroute IPerror : IP in ICMP IPerror6 : IPv6 in ICMPv6 IPv46 : IPv4/6 IPv6 : IPv6 IPv6ExtHdrDestOpt : IPv6 Extension Header - Destination Options Header IPv6ExtHdrFragment : IPv6 Extension Header - Fragmentation header IPv6ExtHdrHopByHop : IPv6 Extension Header - Hop-by-Hop Options Header IPv6ExtHdrRouting : IPv6 Option Header Routing IPv6ExtHdrSegmentRouting : IPv6 Option Header Segment Routing IPv6ExtHdrSegmentRoutingTLV : IPv6 Option Header Segment Routing - Generic TLV IPv6ExtHdrSegmentRoutingTLVEgressNode : IPv6 Option Header Segment Routing - Egress Node TLV IPv6ExtHdrSegmentRoutingTLVHMAC : IPv6 Option Header Segment Routing - HMAC TLV IPv6ExtHdrSegmentRoutingTLVIngressNode : IPv6 Option Header Segment Routing - Ingress Node TLV IPv6ExtHdrSegmentRoutingTLVPad1 : IPv6 Option Header Segment Routing - Pad1 TLV IPv6ExtHdrSegmentRoutingTLVPadN : IPv6 Option Header Segment Routing - PadN TLV ISAKMP : ISAKMP ISAKMP_payload : ISAKMP payload ISAKMP_payload_Delete : ISAKMP Delete ISAKMP_payload_Hash : ISAKMP Hash ISAKMP_payload_ID : ISAKMP Identification ISAKMP_payload_KE : ISAKMP Key Exchange ISAKMP_payload_Nonce : ISAKMP Nonce ISAKMP_payload_Notify : ISAKMP Notify (Notification) ISAKMP_payload_Proposal : IKE proposal ISAKMP_payload_SA : ISAKMP SA ISAKMP_payload_Transform : IKE Transform ISAKMP_payload_VendorID : ISAKMP Vendor ID InlineQoSPacket : Inline QoS IrLAPCommand : IrDA Link Access Protocol Command IrLAPHead : IrDA Link Access Protocol Header IrLMP : IrDA Link Management Protocol Jumbo : Jumbo Payload KDC_PROXY_MESSAGE : None KERB_AD_LOGIN_ALIAS : None KERB_AD_RESTRICTION_ENTRY : KERB-AD-RESTRICTION-ENTRY KERB_AUTH_DATA_AP_OPTIONS : KERB-AUTH-DATA-AP-OPTIONS KERB_AUTH_DATA_CLIENT_TARGET : KERB-AD-TARGET-PRINCIPAL KERB_DMSA_KEY_PACKAGE : None KERB_ERROR_DATA : None KERB_EXT_ERROR : None KERB_KEY_LIST_REP : None KERB_KEY_LIST_REQ : None KERB_SUPERSEDED_BY_USER : None KPASSWD_REP : None KPASSWD_REQ : None KPasswdRepData : None KRB_AP_REP : None KRB_AP_REQ : None KRB_AS_REP : None KRB_AS_REQ : None KRB_Authenticator : None KRB_AuthenticatorChecksum : None KRB_CRED : None KRB_ERROR : None KRB_FINISHED : None KRB_GSSAPI_Token : Kerberos GSSAPI-Token KRB_GSS_Delete_sec_context_RFC1964 : Kerberos v5 GSS_Delete_sec_context (RFC1964) KRB_GSS_EXT : None KRB_GSS_MIC : Kerberos v5 MIC Token KRB_GSS_MIC_RFC1964 : Kerberos v5 MIC Token (RFC1964) KRB_GSS_Wrap : Kerberos v5 Wrap Token KRB_GSS_Wrap_RFC1964 : Kerberos v5 GSS_Wrap (RFC1964) KRB_InnerToken : Kerberos v5 InnerToken KRB_KDC_REQ_BODY : None KRB_PRIV : None KRB_TGS_REP : None KRB_TGS_REQ : None KRB_TGT_REP : None KRB_TGT_REQ : None KRB_Ticket : None Kerberos : None KerberosTCPHeader : None Kpasswd : None KpasswdTCPHeader : None KrbCredInfo : None KrbFastArmor : None KrbFastArmoredRep : None KrbFastArmoredReq : None KrbFastFinished : None KrbFastReq : None KrbFastResponse : None L2CAP_CmdHdr : L2CAP command header L2CAP_CmdRej : L2CAP Command Rej L2CAP_ConfReq : L2CAP Conf Req L2CAP_ConfResp : L2CAP Conf Resp L2CAP_ConnReq : L2CAP Conn Req L2CAP_ConnResp : L2CAP Conn Resp L2CAP_Connection_Parameter_Update_Request : L2CAP Connection Parameter Update Request L2CAP_Connection_Parameter_Update_Response : L2CAP Connection Parameter Update Response L2CAP_Create_Channel_Request : L2CAP Create Channel Request L2CAP_Create_Channel_Response : L2CAP Create Channel Response L2CAP_Credit_Based_Connection_Request : L2CAP Credit Based Connection Request L2CAP_Credit_Based_Connection_Response : L2CAP Credit Based Connection Response L2CAP_Credit_Based_Reconfigure_Request : L2CAP Credit Based Reconfigure Request L2CAP_Credit_Based_Reconfigure_Response : L2CAP Credit Based Reconfigure Response L2CAP_DisconnReq : L2CAP Disconn Req L2CAP_DisconnResp : L2CAP Disconn Resp L2CAP_EchoReq : L2CAP Echo Req L2CAP_EchoResp : L2CAP Echo Resp L2CAP_Flow_Control_Credit_Ind : L2CAP Flow Control Credit Ind L2CAP_Hdr : L2CAP header L2CAP_InfoReq : L2CAP Info Req L2CAP_InfoResp : L2CAP Info Resp L2CAP_LE_Credit_Based_Connection_Request : L2CAP LE Credit Based Connection Request L2CAP_LE_Credit_Based_Connection_Response : L2CAP LE Credit Based Connection Response L2CAP_Move_Channel_Confirmation_Request : L2CAP Move Channel Confirmation Request L2CAP_Move_Channel_Confirmation_Response : L2CAP Move Channel Confirmation Response L2CAP_Move_Channel_Request : L2CAP Move Channel Request L2CAP_Move_Channel_Response : L2CAP Move Channel Response L2TP : L2TP LDAP : None LDAPReferral : None LDAP_AbandonRequest : None LDAP_AddRequest : None LDAP_AddResponse : None LDAP_Attribute : None LDAP_AttributeValue : None LDAP_Authentication_SaslCredentials : None LDAP_BindRequest : None LDAP_BindResponse : None LDAP_Control : None LDAP_DelRequest : None LDAP_DelResponse : None LDAP_ExtendedResponse : None LDAP_Filter : None LDAP_FilterAnd : None LDAP_FilterApproxMatch : None LDAP_FilterEqual : None LDAP_FilterExtensibleMatch : None LDAP_FilterGreaterOrEqual : None LDAP_FilterLessOrEqual : None LDAP_FilterNot : None LDAP_FilterOr : None LDAP_FilterPresent : None LDAP_ModifyRequest : None LDAP_ModifyRequestChange : None LDAP_ModifyResponse : None LDAP_PartialAttribute : None LDAP_SASL_Buffer : None LDAP_SASL_GSSAPI_SsfCap : None LDAP_SearchRequest : None LDAP_SearchRequestAttribute : None LDAP_SearchResponseEntry : None LDAP_SearchResponseReference : None LDAP_SearchResponseResultDone : None LDAP_SubstringFilter : None LDAP_SubstringFilterAny : None LDAP_SubstringFilterFinal : None LDAP_SubstringFilterInitial : None LDAP_SubstringFilterStr : None LDAP_UnbindRequest : None LDAP_realSearchControlValue : None LDAP_serverSDFlagsControl : None LEAP : Cisco LEAP LLC : LLC LLMNRQuery : Link Local Multicast Node Resolution - Query LLMNRResponse : Link Local Multicast Node Resolution - Response LLTD : LLTD LLTDAttribute : LLTD Attribute LLTDAttribute80211MaxRate : LLTD Attribute - 802.11 Max Rate LLTDAttribute80211PhysicalMedium : LLTD Attribute - 802.11 Physical Medium LLTDAttributeCharacteristics : LLTD Attribute - Characteristics LLTDAttributeDeviceUUID : LLTD Attribute - Device UUID LLTDAttributeEOP : LLTD Attribute - End Of Property LLTDAttributeHostID : LLTD Attribute - Host ID LLTDAttributeIPv4Address : LLTD Attribute - IPv4 Address LLTDAttributeIPv6Address : LLTD Attribute - IPv6 Address LLTDAttributeLargeTLV : LLTD Attribute - Large TLV LLTDAttributeLinkSpeed : LLTD Attribute - Link Speed LLTDAttributeMachineName : LLTD Attribute - Machine Name LLTDAttributePerformanceCounterFrequency : LLTD Attribute - Performance Counter Frequency LLTDAttributePhysicalMedium : LLTD Attribute - Physical Medium LLTDAttributeQOSCharacteristics : LLTD Attribute - QoS Characteristics LLTDAttributeSeesList : LLTD Attribute - Sees List Working Set LLTDDiscover : LLTD - Discover LLTDEmit : LLTD - Emit LLTDEmiteeDesc : LLTD - Emitee Desc LLTDHello : LLTD - Hello LLTDQueryLargeTlv : LLTD - Query Large Tlv LLTDQueryLargeTlvResp : LLTD - Query Large Tlv Response LLTDQueryResp : LLTD - Query Response LLTDRecveeDesc : LLTD - Recvee Desc LL_CHANNEL_MAP_IND : LL_CHANNEL_MAP_IND LL_CHANNEL_REPORTING_IND : LL_SUBRATE_IND LL_CHANNEL_STATUS_IND : LL_CHANNEL_STATUS_IND LL_CIS_IND : LL_CIS_IND LL_CIS_REQ : LL_CIS_REQ LL_CIS_RSP : LL_CIS_RSP LL_CIS_TERMINATE_IND : LL_CIS_TERMINATE_IND LL_CLOCK_ACCURACY_REQ : LL_CLOCK_ACCURACY_REQ LL_CLOCK_ACCURACY_RSP : LL_CLOCK_ACCURACY_RSP LL_CONNECTION_PARAM_REQ : LL_CONNECTION_PARAM_REQ LL_CONNECTION_PARAM_RSP : LL_CONNECTION_PARAM_RSP LL_CONNECTION_UPDATE_IND : LL_CONNECTION_UPDATE_IND LL_CTE_REQ : LL_CTE_REQ LL_CTE_RSP : LL_CTE_RSP LL_ENC_REQ : LL_ENC_REQ LL_ENC_RSP : LL_ENC_RSP LL_FEATURE_REQ : LL_FEATURE_REQ LL_FEATURE_RSP : LL_FEATURE_RSP LL_LENGTH_REQ : LL_LENGTH_REQ LL_LENGTH_RSP : LL_LENGTH_RSP LL_MIN_USED_CHANNELS_IND : LL_MIN_USED_CHANNELS_IND LL_PAUSE_ENC_REQ : LL_PAUSE_ENC_REQ LL_PAUSE_ENC_RSP : LL_PAUSE_ENC_RSP LL_PERIODIC_SYNC_IND : LL_PERIODIC_SYNC_IND LL_PHY_REQ : LL_PHY_REQ LL_PHY_RSP : LL_PHY_RSP LL_PHY_UPDATE_IND : LL_PHY_UPDATE_IND LL_PING_REQ : LL_PING_REQ LL_PING_RSP : LL_PING_RSP LL_POWER_CHANGE_IND : LL_POWER_CHANGE_IND LL_POWER_CONTROL_REQ : LL_POWER_CONTROL_REQ LL_POWER_CONTROL_RSP : LL_POWER_CONTROL_RSP LL_REJECT_EXT_IND : LL_REJECT_EXT_IND LL_REJECT_IND : LL_REJECT_IND LL_SLAVE_FEATURE_REQ : LL_SLAVE_FEATURE_REQ LL_START_ENC_REQ : LL_START_ENC_REQ LL_START_ENC_RSP : LL_START_ENC_RSP LL_SUBRATE_IND : LL_SUBRATE_IND LL_SUBRATE_REQ : LL_SUBRATE_REQ LL_TERMINATE_IND : LL_TERMINATE_IND LL_UNKNOWN_RSP : LL_UNKNOWN_RSP LL_VERSION_IND : LL_VERSION_IND LM_RESPONSE : None LMv2_RESPONSE : None LPSERVER_INFO_101 : None LPSHARE_ENUM_STRUCT : None LPSHARE_INFO_1 : None LPWKSTA_INFO_100 : None LSAP_TOKEN_INFO_INTEGRITY : None LastReqItem : None LeaseDurationPacket : Lease Duration LinkStatusEntry : ZigBee Link Status Entry LinuxTunIfReq : None LinuxTunPacketInfo : None LoWPANBroadcast : 6LoWPAN Broadcast LoWPANFragmentationFirst : 6LoWPAN First Fragmentation Packet LoWPANFragmentationSubsequent : 6LoWPAN Subsequent Fragmentation Packet LoWPANMesh : 6LoWPAN Mesh Packet LoWPANUncompressedIPv6 : 6LoWPAN Uncompressed IPv6 LoWPAN_HC1 : LoWPAN_HC1 Compressed IPv6 LoWPAN_HC2_UDP : 6LoWPAN HC1 UDP encoding LoWPAN_IPHC : LoWPAN IP Header Compression Packet LoWPAN_NHC : LOWPAN_NHC LoWPAN_NHC_Hdr : None LoWPAN_NHC_IPv6Ext : None LoWPAN_NHC_UDP : None LocatorPacket : RTPS Locator Loopback : Loopback LoopbackOpenBSD : OpenBSD Loopback MACsecSCI : SCI MGCP : MGCP MIP6MH_BA : IPv6 Mobility Header - Binding ACK MIP6MH_BE : IPv6 Mobility Header - Binding Error MIP6MH_BRR : IPv6 Mobility Header - Binding Refresh Request MIP6MH_BU : IPv6 Mobility Header - Binding Update MIP6MH_CoT : IPv6 Mobility Header - Care-of Test MIP6MH_CoTI : IPv6 Mobility Header - Care-of Test Init MIP6MH_Generic : IPv6 Mobility Header - Generic Message MIP6MH_HoT : IPv6 Mobility Header - Home Test MIP6MH_HoTI : IPv6 Mobility Header - Home Test Init MIP6OptAltCoA : MIPv6 Option - Alternate Care-of Address MIP6OptBRAdvice : Mobile IPv6 Option - Binding Refresh Advice MIP6OptBindingAuthData : MIPv6 Option - Binding Authorization Data MIP6OptCGAParams : MIPv6 option - CGA Parameters MIP6OptCGAParamsReq : MIPv6 option - CGA Parameters Request MIP6OptCareOfTest : MIPv6 option - Care-of Test MIP6OptCareOfTestInit : MIPv6 option - Care-of Test Init MIP6OptHomeKeygenToken : MIPv6 option - Home Keygen Token MIP6OptLLAddr : MIPv6 Option - Link-Layer Address (MH-LLA) MIP6OptMNID : MIPv6 Option - Mobile Node Identifier MIP6OptMobNetPrefix : NEMO Option - Mobile Network Prefix MIP6OptMsgAuth : MIPv6 Option - Mobility Message Authentication MIP6OptNonceIndices : MIPv6 Option - Nonce Indices MIP6OptReplayProtection : MIPv6 option - Replay Protection MIP6OptSignature : MIPv6 option - Signature MIP6OptUnknown : Scapy6 - Unknown Mobility Option MKABasicParamSet : Basic Parameter Set MKADistributedCAKParamSet : Distributed CAK parameter set MKADistributedSAKParamSet : Distributed SAK parameter set MKAICVSet : ICV MKALivePeerListParamSet : Live Peer List Parameter Set MKAPDU : MKPDU MKAParamSet : None MKAPeerListTuple : Peer List Tuple MKAPotentialPeerListParamSet : Potential Peer List Parameter Set MKASAKUseParamSet : SAK Use Parameter Set MOVE_DST_IPADDR : None MPacketPreamble : MPacket Preamble MTFPacket : None MethodData : None MobileIP : Mobile IP (RFC3344) MobileIPRRP : Mobile IP Registration Reply (RFC3344) MobileIPRRQ : Mobile IP Registration Request (RFC3344) MobileIPTunnelData : Mobile IP Tunnel Data Message (RFC3519) MyPacket : None MyPacket : None NAT_KEEPALIVE : None NBNSHeader : NBNS Header NBNSNodeStatusRequest : NBNS status request NBNSNodeStatusResponse : NBNS Node Status Response NBNSNodeStatusResponseService : NBNS Node Status Response Service NBNSQueryRequest : NBNS query request NBNSQueryResponse : NBNS query response NBNSRegistrationRequest : NBNS registration request NBNSWackResponse : NBNS Wait for Acknowledgement Response NBNS_ADD_ENTRY : None NBTDatagram : NBT Datagram Packet NBTSession : NBT Session Packet NDRConformantArray : None NDRConformantString : None NDRContextHandle : None NDRPacket : None NDRPointer : None NDRSerialization1Header : None NDRSerialization1PrivateHeader : None NDRUnion : None NDRVaryingArray : None NEGOEX_BYTE_VECTOR : None NEGOEX_CHECKSUM : None NEGOEX_EXCHANGE_MESSAGE : None NEGOEX_EXCHANGE_NTLM : None NEGOEX_EXCHANGE_NTLM_ITEM : None NEGOEX_EXTENSION_VECTOR : None NEGOEX_MESSAGE_HEADER : None NEGOEX_NEGO_MESSAGE : None NEGOEX_VERIFY_MESSAGE : None NETLOGON : None NETLOGON_LOGON_QUERY : None NETLOGON_SAM_LOGON_REQUEST : None NETLOGON_SAM_LOGON_RESPONSE : None NETLOGON_SAM_LOGON_RESPONSE_EX : None NETLOGON_SAM_LOGON_RESPONSE_NT40 : None NETWORK_INTERFACE_INFO : None NL_AUTH_MESSAGE : NL_AUTH_MESSAGE NL_AUTH_SIGNATURE : NL_AUTH_(SHA2_)SIGNATURE NON_ESP : None NTLMSSP_MESSAGE_SIGNATURE : None NTLM_AUTHENTICATE : NTLM Authenticate NTLM_AUTHENTICATE_V2 : NTLM Authenticate NTLM_CHALLENGE : NTLM Challenge NTLM_Header : NTLM Header NTLM_NEGOTIATE : NTLM Negotiate NTLM_RESPONSE : None NTLMv2_CLIENT_CHALLENGE : None NTLMv2_RESPONSE : None NTP : None NTPAuthenticator : Authenticator NTPClockStatusPacket : clock status NTPConfPeer : conf_peer NTPConfRestrict : conf_restrict NTPConfTrap : conf_trap NTPConfUnpeer : conf_unpeer NTPControl : Control message NTPErrorStatusPacket : error status NTPExtension : extension NTPExtensions : NTPv4 extensions NTPHeader : NTPHeader NTPInfoAuth : info_auth NTPInfoControl : info_control NTPInfoIOStats : info_io_stats NTPInfoIfStatsIPv4 : info_if_stats NTPInfoIfStatsIPv6 : info_if_stats NTPInfoKernel : info_kernel NTPInfoLoop : info_loop NTPInfoMemStats : info_mem_stats NTPInfoMonitor1 : InfoMonitor1 NTPInfoPeer : info_peer NTPInfoPeerList : info_peer_list NTPInfoPeerStats : info_peer_stats NTPInfoPeerSummary : info_peer_summary NTPInfoSys : info_sys NTPInfoSysStats : info_sys_stats NTPInfoTimerStats : info_timer_stats NTPPeerStatusDataPacket : data / peer status NTPPeerStatusPacket : peer status NTPPrivate : Private (mode 7) NTPPrivatePktTail : req_pkt_tail NTPPrivateReqPacket : request data NTPStatusPacket : status NTPSystemStatusPacket : system status NeighborReport : Neighbor Report NetBIOS_DS : NetBIOS datagram service NetflowDataflowsetV9 : Netflow DataFlowSet V9/10 NetflowFlowsetV9 : Netflow FlowSet V9/10 NetflowHeader : Netflow Header NetflowHeaderV1 : Netflow Header v1 NetflowHeaderV10 : IPFix (Netflow V10) Header NetflowHeaderV5 : Netflow Header v5 NetflowHeaderV9 : Netflow Header V9 NetflowOptionsFlowset10 : Netflow V10 (IPFix) Options Template FlowSet NetflowOptionsFlowsetOptionV9 : Netflow Options Template FlowSet V9/10 - Option NetflowOptionsFlowsetScopeV9 : Netflow Options Template FlowSet V9/10 - Scope NetflowOptionsFlowsetV9 : Netflow Options Template FlowSet V9 NetflowOptionsRecordOptionV9 : Netflow Options Template Record V9/10 - Option NetflowOptionsRecordScopeV9 : Netflow Options Template Record V9/10 - Scope NetflowRecordV1 : Netflow Record v1 NetflowRecordV5 : Netflow Record v5 NetflowRecordV9 : Netflow DataFlowset Record V9/10 NetflowTemplateFieldV9 : Netflow Flowset Template Field V9/10 NetflowTemplateV9 : Netflow Flowset Template V9/10 NetrEnumerateComputerNames_Request : None NetrEnumerateComputerNames_Response : None NetrServerGetInfo_Request : None NetrServerGetInfo_Response : None NetrShareEnum_Request : None NetrShareEnum_Response : None NetrShareGetInfo_Request : None NetrShareGetInfo_Response : None NetrWkstaGetInfo_Request : None NetrWkstaGetInfo_Response : None NoPayload : None OCSP_ByKey : None OCSP_ByName : None OCSP_CertID : None OCSP_CertStatus : None OCSP_GoodInfo : None OCSP_ResponderID : None OCSP_Response : None OCSP_ResponseBytes : None OCSP_ResponseData : None OCSP_RevokedInfo : None OCSP_SingleResponse : None OCSP_UnknownInfo : None PADATA : None PA_AUTHENTICATION_SET : None PA_AUTHENTICATION_SET_ELEM : None PA_ENC_TS_ENC : None PA_FOR_USER : None PA_FX_FAST_REPLY : None PA_FX_FAST_REQUEST : None PA_PAC_OPTIONS : None PA_PAC_REQUEST : None PA_PK_AS_REP : None PA_PK_AS_REQ : None PA_S4U_X509_USER : None PA_SUPPORTED_ENCTYPES : None PIDPacketBase : PID Base Packet PID_BUILTIN_ENDPOINT_QOS : PID_BUILTIN_ENDPOINT_QOS PID_BUILTIN_ENDPOINT_SET : PID_BUILTIN_ENDPOINT_SET PID_CONTENT_FILTER_PROPERTY : PID_CONTENT_FILTER_PROPERTY PID_DEADLINE : PID_DEADLINE PID_DEFAULT_MULTICAST_LOCATOR : PID_DEFAULT_MULTICAST_LOCATOR PID_DEFAULT_UNICAST_IPADDRESS : PID_DEFAULT_UNICAST_IPADDRESS PID_DEFAULT_UNICAST_LOCATOR : PID_DEFAULT_UNICAST_LOCATOR PID_DEFAULT_UNICAST_PORT : PID_DEFAULT_UNICAST_PORT PID_DESTINATION_ORDER : PID_DESTINATION_ORDER PID_DOMAIN_ID : PID_DOMAIN_ID PID_DOMAIN_TAG : PID_DOMAIN_TAG PID_DURABILITY : PID_DURABILITY PID_DURABILITY_SERVICE : PID_DURABILITY_SERVICE PID_ENDPOINT_GUID : PID_ENDPOINT_GUID PID_ENTITY_NAME : PID_ENTITY_NAME PID_EXPECTS_INLINE_QOS : PID_EXPECTS_INLINE_QOS PID_GROUP_DATA : PID_GROUP_DATA PID_GROUP_ENTITYID : PID_GROUP_ENTITYID PID_GROUP_GUID : PID_GROUP_GUID PID_HISTORY : PID_HISTORY PID_KEY_HASH : PID_KEY_HASH PID_LATENCY_BUDGET : PID_LATENCY_BUDGET PID_LIFESPAN : PID_LIFESPAN PID_LIVELINESS : PID_LIVELINESS PID_METATRAFFIC_MULTICAST_IPADDRESS : PID_METATRAFFIC_MULTICAST_IPADDRESS PID_METATRAFFIC_MULTICAST_LOCATOR : PID_METATRAFFIC_MULTICAST_LOCATOR PID_METATRAFFIC_MULTICAST_PORT : PID_METATRAFFIC_MULTICAST_PORT PID_METATRAFFIC_UNICAST_IPADDRESS : PID_METATRAFFIC_UNICAST_IPADDRESS PID_METATRAFFIC_UNICAST_LOCATOR : PID_METATRAFFIC_UNICAST_LOCATOR PID_METATRAFFIC_UNICAST_PORT : PID_METATRAFFIC_UNICAST_PORT PID_MULTICAST_IPADDRESS : PID_MULTICAST_IPADDRESS PID_MULTICAST_LOCATOR : PID_MULTICAST_LOCATOR PID_OWNERSHIP : PID_OWNERSHIP PID_OWNERSHIP_STRENGTH : PID_OWNERSHIP_STRENGTH PID_PAD : PID_PAD PID_PARTICIPANT_BUILTIN_ENDPOINTS : PID_PARTICIPANT_BUILTIN_ENDPOINTS PID_PARTICIPANT_GUID : PID_PARTICIPANT_GUID PID_PARTICIPANT_LEASE_DURATION : PID_PARTICIPANT_LEASE_DURATION PID_PARTICIPANT_MANUAL_LIVELINESS_COUNT : PID_PARTICIPANT_MANUAL_LIVELINESS_COUNT PID_PARTITION : PID_PARTITION PID_PLUGIN_PROMISCUITY_KIND : PID_PLUGIN_PROMISCUITY_KIND PID_PRESENTATION : PID_PRESENTATION PID_PRODUCT_VERSION : PID_PRODUCT_VERSION PID_PROPERTY_LIST : PID_PROPERTY_LIST PID_PROTOCOL_VERSION : PID_PROTOCOL_VERSION PID_REACHABILITY_LEASE_DURATION : PID_REACHABILITY_LEASE_DURATION PID_RELIABILITY : PID_RELIABILITY PID_RESOURCE_LIMITS : PID_RESOURCE_LIMITS PID_RTI_DOMAIN_ID : PID_RTI_DOMAIN_ID PID_SENTINEL : PID_SENTINEL PID_STATUS_INFO : PID_STATUS_INFO PID_TIME_BASED_FILTER : PID_TIME_BASED_FILTER PID_TOPIC_DATA : PID_TOPIC_DATA PID_TOPIC_NAME : PID_TOPIC_NAME PID_TRANSPORT_INFO_LIST : PID_TRANSPORT_INFO_LIST PID_TRANSPORT_PRIO : PID_TRANSPORT_PRIO PID_TRANSPORT_PRIORITY : PID_TRANSPORT_PRIORITY PID_TYPE_MAX_SIZE_SERIALIZED : PID_TYPE_MAX_SIZE_SERIALIZED PID_TYPE_NAME : PID_TYPE_NAME PID_UNICAST_LOCATOR : PID_UNICAST_LOCATOR PID_UNKNOWN : PID_UNKNOWN PID_USER_DATA : PID_USER_DATA PID_VENDOR_BUILTIN_ENDPOINT_SET : PID_VENDOR_BUILTIN_ENDPOINT_SET PID_VENDOR_ID : PID_VENDOR_ID PInner : PInner PMKIDListPacket : PMKIDs PNET_COMPUTER_NAME_ARRAY : None POuter : POuter PPI : Per-Packet Information header (PPI) PPI_Element : PPI Element PPI_Hdr : PPI Header PPP : PPP Link Layer PPP_CHAP : PPP Challenge Handshake Authentication Protocol PPP_CHAP_ChallengeResponse : PPP Challenge Handshake Authentication Protocol PPP_ECP : None PPP_ECP_Option : PPP ECP Option PPP_ECP_Option_OUI : PPP ECP Option PPP_IPCP : None PPP_IPCP_Option : PPP IPCP Option PPP_IPCP_Option_DNS1 : PPP IPCP Option: DNS1 Address PPP_IPCP_Option_DNS2 : PPP IPCP Option: DNS2 Address PPP_IPCP_Option_IPAddress : PPP IPCP Option: IP Address PPP_IPCP_Option_NBNS1 : PPP IPCP Option: NBNS1 Address PPP_IPCP_Option_NBNS2 : PPP IPCP Option: NBNS2 Address PPP_LCP : PPP Link Control Protocol PPP_LCP_ACCM_Option : PPP LCP Option PPP_LCP_Auth_Protocol_Option : PPP LCP Option PPP_LCP_Callback_Option : PPP LCP Option PPP_LCP_Code_Reject : PPP Link Control Protocol PPP_LCP_Configure : PPP Link Control Protocol PPP_LCP_Discard_Request : PPP Link Control Protocol PPP_LCP_Echo : PPP Link Control Protocol PPP_LCP_MRU_Option : PPP LCP Option PPP_LCP_Magic_Number_Option : PPP LCP Option PPP_LCP_Option : PPP LCP Option PPP_LCP_Protocol_Reject : PPP Link Control Protocol PPP_LCP_Quality_Protocol_Option : PPP LCP Option PPP_LCP_Terminate : PPP Link Control Protocol PPP_PAP : PPP Password Authentication Protocol PPP_PAP_Request : PPP Password Authentication Protocol PPP_PAP_Response : PPP Password Authentication Protocol PPPoE : PPP over Ethernet PPPoED : PPP over Ethernet Discovery PPPoED_Tags : PPPoE Tag List PPPoETag : PPPoE Tag PPTP : PPTP PPTPCallClearRequest : PPTP Call Clear Request PPTPCallDisconnectNotify : PPTP Call Disconnect Notify PPTPEchoReply : PPTP Echo Reply PPTPEchoRequest : PPTP Echo Request PPTPIncomingCallConnected : PPTP Incoming Call Connected PPTPIncomingCallReply : PPTP Incoming Call Reply PPTPIncomingCallRequest : PPTP Incoming Call Request PPTPOutgoingCallReply : PPTP Outgoing Call Reply PPTPOutgoingCallRequest : PPTP Outgoing Call Request PPTPSetLinkInfo : PPTP Set Link Info PPTPStartControlConnectionReply : PPTP Start Control Connection Reply PPTPStartControlConnectionRequest : PPTP Start Control Connection Request PPTPStopControlConnectionReply : PPTP Stop Control Connection Reply PPTPStopControlConnectionRequest : PPTP Stop Control Connection Request PPTPWANErrorNotify : PPTP WAN Error Notify PUNICODE_STRING : None Packet : None Pad1 : Pad1 PadN : PadN Padding : Padding ParameterListPacket : PID list ParticipantMessageDataPacket : Participant Message Data PayloadPacket : None PrincipalName : None PrismHeader : Prism header ProductVersionPacket : Product Version ProtocolVersionPacket : RTPS Protocol Version PseudoIPv6 : Pseudo IPv6 Header RIP : RIP header RIPAuth : RIP authentication RIPEntry : RIP entry RPC_IF_ID : None RSAOtherPrimeInfo : None RSAPrivateKey : None RSAPrivateKey_OpenSSL : None RSAPublicKey : None RSNCipherSuite : Cipher suite RTP : RTP RTPExtension : RTP extension RTPS : RTPS Header RTPSMessage : RTPS Message RTPSSubMessage_ACKNACK : RTPS ACKNACK (0x06) RTPSSubMessage_DATA : RTPS DATA (0x15) RTPSSubMessage_DATA_FRAG : RTPS DATA_FRAG (0x16) RTPSSubMessage_GAP : RTPS GAP (0x08) RTPSSubMessage_HEARTBEAT : RTPS HEARTBEAT (0x07) RTPSSubMessage_INFO_DST : RTPS INFO_DTS (0x0e) RTPSSubMessage_INFO_TS : RTPS INFO_TS (0x09) RTPSSubMessage_PAD : RTPS PAD (0x01) RTPSSubMessage_SEC_BODY : RTPS SEC_BODY (0x30) RTPSSubMessage_SEC_POSTFIX : RTPS SEC_POSTFIX (0x32) RTPSSubMessage_SEC_PREFIX : RTPS SEC_PREFIX (0x31) RTPSSubMessage_SRTPS_POSTFIX : RTPS SRPTS_POSTFIX (0x34) RTPSSubMessage_SRTPS_PREFIX : RTPS SRPTS_PREFIX (0x33) RadioTap : RadioTap RadioTapExtendedPresenceMask : RadioTap Extended presence mask RadioTapTLV : None Radius : RADIUS RadiusAttr_ARAP_Security : Radius Attribute RadiusAttr_Acct_Authentic : Radius Attribute RadiusAttr_Acct_Delay_Time : Radius Attribute RadiusAttr_Acct_Input_Gigawords : Radius Attribute RadiusAttr_Acct_Input_Octets : Radius Attribute RadiusAttr_Acct_Input_Packets : Radius Attribute RadiusAttr_Acct_Interim_Interval : Radius Attribute RadiusAttr_Acct_Link_Count : Radius Attribute RadiusAttr_Acct_Output_Gigawords : Radius Attribute RadiusAttr_Acct_Output_Octets : Radius Attribute RadiusAttr_Acct_Output_Packets : Radius Attribute RadiusAttr_Acct_Session_Time : Radius Attribute RadiusAttr_Acct_Status_Type : Radius Attribute RadiusAttr_Acct_Terminate_Cause : Radius Attribute RadiusAttr_Acct_Tunnel_Packets_Lost : Radius Attribute RadiusAttr_EAP_Message : EAP-Message RadiusAttr_Egress_VLANID : Radius Attribute RadiusAttr_Framed_AppleTalk_Link : Radius Attribute RadiusAttr_Framed_AppleTalk_Network : Radius Attribute RadiusAttr_Framed_IPX_Network : Radius Attribute RadiusAttr_Framed_IP_Address : Radius Attribute RadiusAttr_Framed_IP_Netmask : Radius Attribute RadiusAttr_Framed_MTU : Radius Attribute RadiusAttr_Framed_Protocol : Radius Attribute RadiusAttr_Idle_Timeout : Radius Attribute RadiusAttr_Login_IP_Host : Radius Attribute RadiusAttr_Login_TCP_Port : Radius Attribute RadiusAttr_Management_Privilege_Level : Radius Attribute RadiusAttr_Message_Authenticator : Radius Attribute RadiusAttr_Mobility_Domain_Id : Radius Attribute RadiusAttr_NAS_IP_Address : Radius Attribute RadiusAttr_NAS_Port : Radius Attribute RadiusAttr_NAS_Port_Type : Radius Attribute RadiusAttr_PMIP6_Home_DHCP4_Server_Address : Radius Attribute RadiusAttr_PMIP6_Home_IPv4_Gateway : Radius Attribute RadiusAttr_PMIP6_Home_LMA_IPv4_Address : Radius Attribute RadiusAttr_PMIP6_Visited_DHCP4_Server_Address : Radius Attribute RadiusAttr_PMIP6_Visited_IPv4_Gateway : Radius Attribute RadiusAttr_PMIP6_Visited_LMA_IPv4_Address : Radius Attribute RadiusAttr_Password_Retry : Radius Attribute RadiusAttr_Port_Limit : Radius Attribute RadiusAttr_Preauth_Timeout : Radius Attribute RadiusAttr_Service_Type : Radius Attribute RadiusAttr_Session_Timeout : Radius Attribute RadiusAttr_State : Radius Attribute RadiusAttr_Tunnel_Preference : Radius Attribute RadiusAttr_User_Name : Radius Attribute RadiusAttr_User_Password : Radius Attribute RadiusAttr_Vendor_Specific : Vendor-Specific RadiusAttr_WLAN_AKM_Suite : Radius Attribute RadiusAttr_WLAN_Group_Cipher : Radius Attribute RadiusAttr_WLAN_Group_Mgmt_Cipher : Radius Attribute RadiusAttr_WLAN_Pairwise_Cipher : Radius Attribute RadiusAttr_WLAN_RF_Band : Radius Attribute RadiusAttr_WLAN_Reason_Code : Radius Attribute RadiusAttr_WLAN_Venue_Info : Radius Attribute RadiusAttribute : Radius Attribute Raw : Raw RouterAlert : Router Alert RplOption : RPL Option S4UUserID : None SCTP : None SCTPChunkAbort : None SCTPChunkAddressConf : None SCTPChunkAddressConfAck : None SCTPChunkAuthentication : None SCTPChunkCookieAck : None SCTPChunkCookieEcho : None SCTPChunkData : None SCTPChunkError : None SCTPChunkForwardTSN : None SCTPChunkHeartbeatAck : None SCTPChunkHeartbeatReq : None SCTPChunkIData : None SCTPChunkIForwardTSN : None SCTPChunkInit : None SCTPChunkInitAck : None SCTPChunkPad : None SCTPChunkParamAdaptationLayer : None SCTPChunkParamAddIPAddr : None SCTPChunkParamAddIncomingStreamReq : None SCTPChunkParamAddOutgoingStreamReq : None SCTPChunkParamChunkList : None SCTPChunkParamCookiePreservative : None SCTPChunkParamDelIPAddr : None SCTPChunkParamECNCapable : None SCTPChunkParamErrorIndication : None SCTPChunkParamFwdTSN : None SCTPChunkParamHeartbeatInfo : None SCTPChunkParamHostname : None SCTPChunkParamIPv4Addr : None SCTPChunkParamIPv6Addr : None SCTPChunkParamInSSNResetReq : None SCTPChunkParamOutSSNResetReq : None SCTPChunkParamRandom : None SCTPChunkParamReConfigRes : None SCTPChunkParamRequestedHMACFunctions : None SCTPChunkParamSSNTSNResetReq : None SCTPChunkParamSetPrimaryAddr : None SCTPChunkParamStateCookie : None SCTPChunkParamSuccessIndication : None SCTPChunkParamSupportedAddrTypes : None SCTPChunkParamSupportedExtensions : None SCTPChunkParamUnrocognizedParam : None SCTPChunkReConfig : None SCTPChunkSACK : None SCTPChunkShutdown : None SCTPChunkShutdownAck : None SCTPChunkShutdownComplete : None SCTPForwardSkip : None SCTPIForwardSkip : None SCTPerror : SCTP in ICMP SECURITY_DESCRIPTOR : None SHARE_INFO_1_CONTAINER : None SMB2_CREATE_ALLOCATION_SIZE : None SMB2_CREATE_APP_INSTANCE_ID : None SMB2_CREATE_APP_INSTANCE_VERSION : None SMB2_CREATE_DURABLE_HANDLE_RECONNECT : None SMB2_CREATE_DURABLE_HANDLE_RECONNECT_V2 : None SMB2_CREATE_DURABLE_HANDLE_REQUEST : None SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2 : None SMB2_CREATE_DURABLE_HANDLE_RESPONSE : None SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2 : None SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST : None SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSE : None SMB2_CREATE_QUERY_ON_DISK_ID : None SMB2_CREATE_REQUEST_LEASE : None SMB2_CREATE_REQUEST_LEASE_V2 : None SMB2_CREATE_RESPONSE_LEASE : None SMB2_CREATE_RESPONSE_LEASE_V2 : None SMB2_CREATE_TIMEWARP_TOKEN : None SMB2_Cancel_Request : SMB2 CANCEL Request SMB2_Change_Notify_Request : SMB2 CHANGE NOTIFY Request SMB2_Change_Notify_Response : SMB2 CHANGE NOTIFY Response SMB2_Close_Request : SMB2 CLOSE Request SMB2_Close_Response : SMB2 CLOSE Response SMB2_Compression_Capabilities : SMB2 Compression Capabilities SMB2_Compression_Transform_Header : SMB2 Compression Transform Header SMB2_Create_Context : SMB2 CREATE CONTEXT SMB2_Create_Request : SMB2 CREATE Request SMB2_Create_Response : SMB2 CREATE Response SMB2_Echo_Request : SMB2 ECHO Request SMB2_Echo_Response : SMB2 ECHO Response SMB2_Encryption_Capabilities : SMB2 Encryption Capabilities SMB2_Error_ContextResponse : None SMB2_Error_Response : SMB2 Error Response SMB2_Error_Share_Redirect_Context_Response : Share Redirect Error Context Response SMB2_FILEID : None SMB2_Header : SMB2 Header SMB2_IOCTL_Network_Interface_Info : SMB2 IOCTL Network Interface Info response SMB2_IOCTL_OFFLOAD_READ_Request : SMB2 IOCTL OFFLOAD_READ Request SMB2_IOCTL_OFFLOAD_READ_Response : SMB2 IOCTL OFFLOAD_READ Response SMB2_IOCTL_REQ_GET_DFS_Referral : None SMB2_IOCTL_RESP_GET_DFS_Referral : None SMB2_IOCTL_Request : SMB2 IOCTL Request SMB2_IOCTL_Response : SMB2 IOCTL Response SMB2_IOCTL_Validate_Negotiate_Info_Request : SMB2 IOCTL Validate Negotiate Info SMB2_IOCTL_Validate_Negotiate_Info_Response : SMB2 IOCTL Validate Negotiate Info SMB2_Negotiate_Context : SMB2 Negotiate Context SMB2_Negotiate_Protocol_Request : SMB2 Negotiate Protocol Request SMB2_Negotiate_Protocol_Response : SMB2 Negotiate Protocol Response SMB2_Netname_Negotiate_Context_ID : SMB2 Netname Negotiate Context ID SMB2_Preauth_Integrity_Capabilities : SMB2 Preauth Integrity Capabilities SMB2_Query_Directory_Request : SMB2 QUERY DIRECTORY Request SMB2_Query_Directory_Response : SMB2 QUERY DIRECTORY Response SMB2_Query_Info_Request : SMB2 QUERY INFO Request SMB2_Query_Info_Response : SMB2 QUERY INFO Response SMB2_Query_Quota_Info : None SMB2_RDMA_Transform_Capabilities : SMB2 RDMA Transform Capabilities SMB2_Read_Request : SMB2 READ Request SMB2_Read_Response : SMB2 READ Response SMB2_Session_Logoff_Request : SMB2 LOGOFF Request SMB2_Session_Logoff_Response : SMB2 LOGOFF Request SMB2_Session_Setup_Request : SMB2 Session Setup Request SMB2_Session_Setup_Response : SMB2 Session Setup Response SMB2_Set_Info_Request : SMB2 SET INFO Request SMB2_Set_Info_Response : SMB2 SET INFO Request SMB2_Signing_Capabilities : SMB2 Signing Capabilities SMB2_Transport_Capabilities : SMB2 Transport Capabilities SMB2_Tree_Connect_Request : SMB2 TREE_CONNECT Request SMB2_Tree_Connect_Response : SMB2 TREE_CONNECT Response SMB2_Tree_Disconnect_Request : SMB2 TREE_DISCONNECT Request SMB2_Tree_Disconnect_Response : SMB2 TREE_DISCONNECT Response SMB2_Write_Request : SMB2 WRITE Request SMB2_Write_Response : SMB2 WRITE Response SMBMailslot_Write : SMB COM Transaction Request SMBNegotiate_Request : SMB Negotiate Request SMBNegotiate_Response_Extended_Security : SMB Negotiate Extended Security Response (SMB) SMBNegotiate_Response_NoSecurity : SMB Negotiate No-Security Response (CIFS) SMBNegotiate_Response_Security : SMB Negotiate Non-Extended Security Response (SMB) SMBSession_Null : None SMBSession_Setup_AndX_Request : Session Setup AndX Request (CIFS) SMBSession_Setup_AndX_Request_Extended_Security : Session Setup AndX Extended Security Request (SMB) SMBSession_Setup_AndX_Response : Session Setup AndX Response (CIFS) SMBSession_Setup_AndX_Response_Extended_Security : Session Setup AndX Extended Security Response (SMB) SMBTransaction_Request : SMB COM Transaction Request SMBTransaction_Response : SMB COM Transaction Response SMBTree_Connect_AndX : Session Tree Connect AndX SMB_Dialect : SMB Dialect SMB_Header : SMB 1 Protocol Request Header SM_Confirm : Pairing Confirm SM_DHKey_Check : DHKey Check SM_Encryption_Information : Encryption Information SM_Failed : Pairing Failed SM_Hdr : SM header SM_Identity_Address_Information : Identity Address Information SM_Identity_Information : Identity Information SM_Master_Identification : Master Identification SM_Pairing_Request : Pairing Request SM_Pairing_Response : Pairing Response SM_Public_Key : Public Key SM_Random : Pairing Random SM_Signing_Information : Signing Information SNAP : SNAP SNMP : None SNMPbulk : None SNMPget : None SNMPinform : None SNMPnext : None SNMPresponse : None SNMPset : None SNMPtrapv1 : None SNMPtrapv2 : None SNMPvarbind : None SOCKADDR_STORAGE : None SPNEGO_MechListMIC : None SPNEGO_MechType : None SPNEGO_MechTypes : None SPNEGO_Token : None SPNEGO_negHints : None SPNEGO_negToken : None SPNEGO_negTokenInit : None SPNEGO_negTokenResp : None STORAGE_OFFLOAD_TOKEN : None STP : Spanning Tree Protocol Single_Host_Data : None SixLoWPAN : SixLoWPAN Dispatcher SixLoWPAN_ESC : SixLoWPAN Dispatcher ESC Skinny : Skinny SubPacket : None SubPacket : None SubelemTLV : None SvcParam : SvcParam SweetPacket : Sweet Celestian Packet TCP : TCP TCPAOValue : None TCPTest : None TCPerror : TCP in ICMP TEST_COND : None TEST_COND : None TEST_INNER : None TFTP : TFTP opcode TFTP_ACK : TFTP Ack TFTP_DATA : TFTP Data TFTP_ERROR : TFTP Error TFTP_OACK : TFTP Option Ack TFTP_Option : None TFTP_Options : None TFTP_RRQ : TFTP Read Request TFTP_WRQ : TFTP Write Request Test : None TestAction : TestAction TestBFLenF : None TestBitLenField : None TestFLF : test TestFLFUnaligned : test TestFLenF : None TestFuzzNBytesField : None TestGuess : test guess TestGuessInner : test guess inner TestGuessPLF : test guess TestGuessPLFInner : test guess inner TestNBytesField : None TestNestedPLF : None TestPLF : test TestPLF : test TestPLF : test TestPLF2 : None TestPLF2 : None TestPLFH1 : test1 TestPLFH2 : test2 TestPLFH3 : test3 TestPLFH4 : test4 TestPLFH5 : test5 TestPLFH6 : test6 TestPacket : None TestPacket : None TestPacket2 : None TestPkt : None TestPkt : None TestStrField : None TestStrFieldUtf16 : None TestStrLenFieldUtf16 : None TestThreeBytesField : None TestUTCTimeField : None TransitedEncoding : None TransportInfoPacket : Transport Info TunPacketInfo : None UDP : UDP UDPerror : UDP in ICMP USER_CLASS_DATA : user class data UUID : None VENDOR_CLASS_DATA : vendor class data VENDOR_SPECIFIC_OPTION : vendor specific option data VRRP : None VRRPv3 : None VXLAN : VXLAN VendorIdPacket : RTPS Vendor ID WINNT_ACCESS_ALLOWED_ACE : None WINNT_ACCESS_ALLOWED_CALLBACK_ACE : None WINNT_ACCESS_ALLOWED_CALLBACK_OBJECT_ACE : None WINNT_ACCESS_ALLOWED_OBJECT_ACE : None WINNT_ACCESS_DENIED_ACE : None WINNT_ACCESS_DENIED_CALLBACK_ACE : None WINNT_ACCESS_DENIED_CALLBACK_OBJECT_ACE : None WINNT_ACCESS_DENIED_OBJECT_ACE : None WINNT_ACE_HEADER : None WINNT_ACL : None WINNT_APPLICATION_DATA : None WINNT_APPLICATION_DATA_LITERAL_TOKEN : None WINNT_SID : None WINNT_SID_IDENTIFIER_AUTHORITY : None WINNT_SYSTEM_AUDIT_ACE : None WINNT_SYSTEM_AUDIT_CALLBACK_ACE : None WINNT_SYSTEM_AUDIT_CALLBACK_OBJECT_ACE : None WINNT_SYSTEM_AUDIT_OBJECT_ACE : None WINNT_SYSTEM_MANDATORY_LABEL_ACE : None WINNT_SYSTEM_RESOURCE_ATTRIBUTE_ACE : None WINNT_SYSTEM_SCOPED_POLICY_ID_ACE : None X : None X509_AccessDescription : None X509_AlgorithmIdentifier : None X509_Attribute : None X509_AttributeTypeAndValue : None X509_AttributeValue : None X509_CRL : None X509_Cert : None X509_DNSName : None X509_DirectoryName : None X509_EDIPartyName : None X509_ExtAuthInfoAccess : None X509_ExtAuthorityKeyIdentifier : None X509_ExtBasicConstraints : None X509_ExtCRLDistributionPoints : None X509_ExtCRLNumber : None X509_ExtCertificateIssuer : None X509_ExtCertificatePolicies : None X509_ExtCertificateTemplateName : None X509_ExtComment : None X509_ExtDeltaCRLIndicator : None X509_ExtDistributionPoint : None X509_ExtDistributionPointName : None X509_ExtExtendedKeyUsage : None X509_ExtFreshestCRL : None X509_ExtFullName : None X509_ExtGeneralSubtree : None X509_ExtInhibitAnyPolicy : None X509_ExtInvalidityDate : None X509_ExtIssuerAltName : None X509_ExtIssuingDistributionPoint : None X509_ExtKeyUsage : None X509_ExtNameConstraints : None X509_ExtNameRelativeToCRLIssuer : None X509_ExtNetscapeCertType : None X509_ExtNoticeReference : None X509_ExtOidNTDSCaSecurity : None X509_ExtPolicyConstraints : None X509_ExtPolicyInformation : None X509_ExtPolicyMappings : None X509_ExtPolicyQualifierInfo : None X509_ExtPrivateKeyUsagePeriod : None X509_ExtQcStatement : None X509_ExtQcStatements : None X509_ExtReasonCode : None X509_ExtSubjInfoAccess : None X509_ExtSubjectAltName : None X509_ExtSubjectDirectoryAttributes : None X509_ExtSubjectKeyIdentifier : None X509_ExtUserNotice : None X509_Extension : None X509_Extensions : None X509_GeneralName : None X509_IPAddress : None X509_OtherName : None X509_PolicyMapping : None X509_RDN : None X509_RFC822Name : None X509_RegisteredID : None X509_RevokedCertificate : None X509_SubjectPublicKeyInfo : None X509_TBSCertList : None X509_TBSCertificate : None X509_URI : None X509_Validity : None X509_X400Address : None ZCLAttributeReport : ZCL Attribute Report ZCLConfigureReportingRecord : ZCL Configure Reporting Record ZCLConfigureReportingResponseRecord : ZCL Configure Reporting Response Record ZCLGeneralConfigureReporting : General Domain: Command Frame Payload: configure_reporting ZCLGeneralConfigureReportingResponse : General Domain: Command Frame Payload: configure_reporting_response ZCLGeneralDefaultResponse : General Domain: Command Frame Payload: default_response ZCLGeneralReadAttributes : General Domain: Command Frame Payload: read_attributes ZCLGeneralReadAttributesResponse : General Domain: Command Frame Payload: read_attributes_response ZCLGeneralReportAttributes : General Domain: Command Frame Payload: report_attributes ZCLGeneralWriteAttributes : General Domain: Command Frame Payload: write_attributes ZCLGeneralWriteAttributesResponse : General Domain: Command Frame Payload: write_attributes_response ZCLIASZoneZoneEnrollRequest : IAS Zone Cluster: Zone Enroll Request Command (Server: Generated) ZCLIASZoneZoneEnrollResponse : IAS Zone Cluster: Zone Enroll Response Command (Server: Received) ZCLIASZoneZoneStatusChangeNotification : IAS Zone Cluster: Zone Status Change Notification Command (Server: Generated) ZCLMeteringGetProfile : Metering Cluster: Get Profile Command (Server: Received) ZCLPriceGetCurrentPrice : Price Cluster: Get Current Price Command (Server: Received) ZCLPriceGetScheduledPrices : Price Cluster: Get Scheduled Prices Command (Server: Received) ZCLPricePublishPrice : Price Cluster: Publish Price Command (Server: Generated) ZCLReadAttributeStatusRecord : ZCL Read Attribute Status Record ZCLWriteAttributeRecord : ZCL Write Attribute Record ZCLWriteAttributeStatusRecord : ZCL Write Attribute Status Record ZDPActiveEPReq : ZDP Transaction Data: Active_EP_req ZDPDeviceAnnce : ZDP Transaction Data: Device_annce ZEP1 : Zigbee Encapsulation Protocol (V1) ZEP2 : Zigbee Encapsulation Protocol (V2) ZigBeeBeacon : ZigBee Beacon Payload ZigbeeAppCommandPayload : Zigbee Application Layer Command Payload ZigbeeAppDataPayload : Zigbee Application Layer Data Payload (General APS Frame Format) ZigbeeAppDataPayloadStub : Zigbee Application Layer Data Payload for Inter-PAN Transmission ZigbeeClusterLibrary : Zigbee Cluster Library (ZCL) Frame ZigbeeDeviceProfile : Zigbee Device Profile (ZDP) Frame ZigbeeNWK : Zigbee Network Layer ZigbeeNWKCommandPayload : Zigbee Network Layer Command Payload ZigbeeNWKStub : Zigbee Network Layer for Inter-PAN Transmission ZigbeeSecurityHeader : Zigbee Security Header ept_entry_t : None ept_lookup_Request : None ept_lookup_Response : None ept_map_Request : None ept_map_Response : None ifaddrmsg : None ifaddrmsg_rtattr : None ifinfomsg : None ifinfomsg_rtattr : None ifla_af_spec_inet6_rtattr : None ifla_af_spec_inet_rtattr : None ifla_af_spec_rtattr : None nlmsgerr : None nlmsgerr_rtattr : None octet_string_t : None prot_and_addr_t : None protocol_tower_t : None rtmsg : None rtmsg_rtattr : None rtmsghdr : None rtmsghdrs : None twr_p_t : None ###(005)=[passed] List layers - advanced >>> with ContextManagerCaptureOutput() as cmco: ... ls("IP", case_sensitive=True) ... result_ls = cmco.get_output().split("\n") ... >>> assert all("IP" in x for x in result_ls if x.strip()) >>> assert len(result_ls) >= 3 ###(006)=[passed] List packet fields - ls >>> with ContextManagerCaptureOutput() as cmco: ... ls(ARP(hwsrc="aa:aa:aa:aa:aa:aa", psrc="1.1.1.1")) ... result_ls = cmco.get_output().split("\n") ... >>> result_ls ["hwtype : XShortEnumField = 1 ('1')", "ptype : XShortEnumField = 2048 ('2048')", "hwlen : FieldLenField = None ('None')", "plen : FieldLenField = None ('None')", "op : ShortEnumField = 1 ('1')", "hwsrc : MultipleTypeField (SourceMACField, StrFixedLenField) = 'aa:aa:aa:aa:aa:aa' ('None')", "psrc : MultipleTypeField (SourceIPField, SourceIP6Field, StrFixedLenField) = '1.1.1.1' ('None')", "hwdst : MultipleTypeField (MACField, StrFixedLenField) = '00:00:00:00:00:00' ('None')", "pdst : MultipleTypeField (IPField, IP6Field, StrFixedLenField) = '0.0.0.0' ('None')", ''] >>> assert result_ls[5] == "hwsrc : MultipleTypeField (SourceMACField, StrFixedLenField) = 'aa:aa:aa:aa:aa:aa' ('None')" >>> assert result_ls[6] == "psrc : MultipleTypeField (SourceIPField, SourceIP6Field, StrFixedLenField) = '1.1.1.1' ('None')" ###(007)=[passed] List commands >>> lsc() IPID_count : Identify IP id values classes in a list of packets arp_mitm : ARP MitM: poison 2 target's ARP cache arpcachepoison : Poison targets' ARP cache arping : Send ARP who-has requests to determine which hosts are up:: arpleak : Exploit ARP leak flaws, like NetBSD-SA2017-002. bind_layers : Bind 2 layers on some specific fields' values. bridge_and_sniff : Forward traffic between interfaces if1 and if2, sniff and return chexdump : Build a per byte hexadecimal representation computeNIGroupAddr : Compute the NI group Address. Can take a FQDN as input parameter connect_from_ip : Open a TCP socket to a host:port while spoofing another IP. corrupt_bits : Flip a given percentage (at least one bit) or number of bits corrupt_bytes : Corrupt a given percentage (at least one byte) or number of bytes dclocator : Perform a DC Locator as per [MS-ADTS] sect 6.3.6 or RFC4120. defrag : defrag(plist) -> ([not fragmented], [defragmented], defragment : defragment(plist) -> plist defragmented as much as possible dhcp_request : Send a DHCP discover request and return the answer. dns_resolve : Perform a simple DNS resolution using conf.nameservers with caching dnssd : Performs a DNS-SD (RFC6763) request dyndns_add : Send a DNS add message to a nameserver for "name" to have a new "rdata" dyndns_del : Send a DNS delete message to a nameserver for "name" etherleak : Exploit Etherleak flaw explore : Function used to discover the Scapy layers and protocols. fletcher16_checkbytes : Calculates the Fletcher-16 checkbytes returned as 2 byte binary-string. fletcher16_checksum : Calculates Fletcher-16 checksum of the given buffer. fragleak : -- fragleak2 : -- fragment : Fragment a big IP datagram fuzz : Transform a layer into a fuzzy layer by replacing some default values getmacbyip : Returns the destination MAC address used to reach a given IP address. getmacbyip6 : Returns the MAC address of the next hop used to reach a given IPv6 address. hexdiff : Show differences between 2 binary strings, Packets... hexdump : Build a tcpdump like hexadecimal view hexedit : Run hexedit on a list of packets, then return the edited packets. hexstr : Build a fancy tcpdump like hex from bytes. import_hexcap : Imports a tcpdump like hexadecimal view is_promisc : Try to guess if target is in Promisc mode. The target is provided by its ip. linehexdump : Build an equivalent view of hexdump() on a single line ls : List available layers, or infos on a given layer class or name. neighsol : Sends and receive an ICMPv6 Neighbor Solicitation message nmap_fp : nmap fingerprinting nmap_sig2txt : -- overlap_frag : Build overlapping fragments to bypass NIPS p0f : Passive OS fingerprinting: which OS emitted this TCP packet ? pkt2uptime : Calculate the date the machine which emitted the packet booted using TCP timestamp # noqa: E501 promiscping : Send ARP who-has requests to determine which hosts are in promiscuous mode rderf : Read a ERF file and return a packet list rdpcap : Read a pcap or pcapng file and return a packet list report_ports : portscan a target and output a LaTeX table restart : Restarts scapy rfc : Generate an RFC-like representation of a packet def. send : Send packets at layer 3 sendp : Send packets at layer 2 sendpfast : Send packets at layer 2 using tcpreplay for performance smbclient : A simple smbclient CLI sniff : Sniff packets and return a list of packets. split_layers : Split 2 layers previously bound. sr : Send and receive packets at layer 3 sr1 : Send packets at layer 3 and return only the first answer sr1flood : Flood and receive packets at layer 3 and return only the first answer srbt : send and receive using a bluetooth socket srbt1 : send and receive 1 packet using a bluetooth socket srflood : Flood and receive packets at layer 3 srloop : Send a packet at layer 3 in loop and print the answer each time srp : Send and receive packets at layer 2 srp1 : Send and receive packets at layer 2 and return only the first answer srp1flood : Flood and receive packets at layer 2 and return only the first answer srpflood : Flood and receive packets at layer 2 srploop : Send a packet at layer 2 in loop and print the answer each time tcpdump : Run tcpdump or tshark on a list of packets. tdecode : Run tshark on a list of packets. traceroute : Instant TCP traceroute traceroute6 : Instant TCP traceroute using IPv6 traceroute_map : Util function to call traceroute on multiple targets, then tshark : Sniff packets and print them calling pkt.summary(). wireshark : Runs Wireshark on a list of packets. wrerf : Write a list of packets to a ERF file wrpcap : Write a list of packets to a pcap file wrpcapng : Write a list of packets to a pcapng file ###(008)=[passed] List contribs >>> def test_list_contrib(): ... with ContextManagerCaptureOutput() as cmco: ... list_contrib() ... result_list_contrib = cmco.get_output() ... assert "http2 : HTTP/2 (RFC 7540, RFC 7541) status=loads" in result_list_contrib ... assert len(result_list_contrib.split('\n')) > 40 ... >>> test_list_contrib() ###(009)=[passed] Test packet show() on LatexTheme >>> class SmallPacket(Packet): ... fields_desc = [ByteField("a", 0)] ... >>> conf_color_theme = conf.color_theme >>> conf.color_theme = LatexTheme() \textcolor{blue}{{\tt\char62}{\tt\char62}{\tt\char62} }pkt = SmallPacket() \textcolor{blue}{{\tt\char62}{\tt\char62}{\tt\char62} }with ContextManagerCaptureOutput() as cmco: ... pkt.show() ... result = cmco.get_output().strip() ... \textcolor{blue}{{\tt\char62}{\tt\char62}{\tt\char62} }assert result == '\\#\\#\\#[ \\textcolor{red}{\\bf SmallPacket} ]\\#\\#\\#\n \\textcolor{blue}{a} = \\textcolor{purple}{0}' \textcolor{blue}{{\tt\char62}{\tt\char62}{\tt\char62} }conf.color_theme = conf_color_theme ###(010)=[passed] Test rfc() >>> dat = rfc(IP, ret=True).split("\n") >>> assert dat[0].replace(" ", "").strip() == "0123" >>> assert "0123456789" in dat[1].replace(" ", "") >>> for l in dat: ... # only upper case and +- ... assert re.match(r"[A-Z+-]*", l) ... >>> result = """ ... 0 1 2 3 ... 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... |VERSION| IHL | TOS | LEN | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | ID |FLAGS| FRAG | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | TTL | PROTO | CHKSUM | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | SRC | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | DST | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | OPTIONS | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... ... Fig. IP ... """.strip() >>> result = [x.strip() for x in result.split("\n")] >>> output = [x.strip() for x in rfc(IP, ret=True).strip().split("\n")] >>> assert result == output >>> >>> result = """ ... 0 1 2 3 ... 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | CODE | ID | LEN | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | TYPE |L|M|S|RES|VERSI| MESSAGE LEN | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | | DATA | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... ... Fig. EAP_TTLS ... """.strip() >>> result = [x.strip() for x in result.split("\n")] >>> output = [x.strip() for x in rfc(EAP_TTLS, ret=True).strip().split("\n")] >>> assert result == output >>> >>> >>> result = """ ... 0 1 2 3 ... 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... |VERSION| TC | FL | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | PLEN | NH | HLIM | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | SRC | ... + + ... | | ... + + ... | | ... + + ... | | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | DST | ... + + ... | | ... + + ... | | ... + + ... | | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... ... Fig. IPv6 ... """.strip() >>> result = [x.strip() for x in result.split("\n")] >>> output = [x.strip() for x in rfc(IPv6, ret=True).strip().split("\n")] >>> assert result == output >>> >>> >>> class TestPad(Packet): ... fields_desc = [ShortField("f0", 0), ... ShortField("f1", 0), ... PadField(ByteField("f2", 1), 8), ... PadField(ShortField("f3", 0), 4)] ... >>> >>> result = """ ... 0 1 2 3 ... 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | F0 | F1 | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | F2 | padding | ... +-+-+-+-+-+-+-+-+ + ... | | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... | F3 | padding | ... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ... ... Fig. TestPad ... """.strip() >>> result = [x.strip() for x in result.split("\n")] >>> output = [x.strip() for x in rfc(TestPad, ret=True).strip().split("\n")] >>> assert result == output ###(011)=[passed] Check that all contrib modules are well-configured >>> list_contrib(_debug=True) HICP : HMS Anybus Host IP Control Protocol status=loads altbeacon : AltBeacon BLE proximity beacon status=loads aoe : ATA Over Internet status=loads automotive.autosar.pdu: AUTOSAR PDU packets handling package. status=loads automotive.autosar.secoc: AUTOSAR Secure On-Board Communication status=library automotive.autosar.secoc_canfd: AUTOSAR Secure On-Board Communication PDUs status=loads automotive.autosar.secoc_pdu: AUTOSAR Secure On-Board Communication PDUs status=loads automotive.bmw.definitions: BMW specific definitions for UDS status=loads automotive.bmw.enumerator: BMW specific enumerators status=loads automotive.bmw.hsfz : HSFZ - BMW High-Speed-Fahrzeug-Zugang status=loads automotive.ccp : CAN Calibration Protocol (CCP) status=loads automotive.doip : Diagnostic over IP (DoIP) / ISO 13400 status=loads automotive.ecu : Helper class for tracking Ecu states (Ecu) status=loads automotive.gm.gmlan : General Motors Local Area Network (GMLAN) status=loads automotive.gm.gmlan_ecu_states: GMLAN EcuState modifications status=library automotive.gm.gmlan_logging: GMLAN Ecu logging additions status=library automotive.gm.gmlan_scanner: GMLAN AutomotiveTestCaseExecutor Utilities status=loads automotive.gm.gmlanutils: GMLAN Utilities status=loads automotive.kwp : Keyword Protocol 2000 (KWP2000) / ISO 14230 status=loads automotive.obd.obd : On Board Diagnostic Protocol (OBD-II) status=loads automotive.obd.scanner: OnBoardDiagnosticScanner status=loads automotive.scanner.configuration: AutomotiveTestCaseExecutorConfiguration status=library automotive.scanner.enumerator: ServiceEnumerator definitions status=library automotive.scanner.executor: AutomotiveTestCaseExecutor base class status=library automotive.scanner.graph: Graph library for AutomotiveTestCaseExecutor status=library automotive.scanner.staged_test_case: Staged AutomotiveTestCase base classes status=library automotive.scanner.test_case: TestCase base class definitions status=library automotive.someip : Scalable service-Oriented MiddlewarE/IP (SOME/IP) status=loads automotive.uds : Unified Diagnostic Service (UDS) status=loads automotive.uds_ecu_states: UDS EcuState modifications status=library automotive.uds_logging: UDS Ecu logging additions status=library automotive.uds_scan : UDS AutomotiveTestCaseExecutor status=loads automotive.xcp.scanner: XCPScanner status=loads automotive.xcp.xcp : Universal calibration and measurement protocol (XCP) # noqa: E501 status=loads avs : AVS WLAN Monitor Header status=loads bfd : BFD status=loads bgp : BGP v0.1 status=loads bier : Bit Index Explicit Replication (BIER) status=loads bp : Bundle Protocol (BP) status=loads cansocket : CANSocket Utils status=loads cansocket_native : Native CANSocket status=loads cansocket_python_can: python-can CANSocket status=loads carp : Common Address Redundancy Protocol (CARP) status=loads cdp : Cisco Discovery Protocol (CDP) status=loads chdlc : Cisco HDLC and SLARP status=loads coap : Constrained Application Protocol (CoAP) status=loads concox : Concox CRX1 unit tests status=loads diameter : Diameter status=loads dtp : Dynamic Trunking Protocol (DTP) status=loads eddystone : Eddystone BLE proximity beacon status=loads eigrp : Enhanced Interior Gateway Routing Protocol (EIGRP) status=loads enipTCP : EtherNet/IP status=loads erspan : ERSPAN - Encapsulated Remote SPAN status=loads esmc : Ethernet Synchronization Message Channel (ESMC) status=loads ethercat : EtherCat status=loads etherip : EtherIP status=loads exposure_notification: Apple/Google Exposure Notification System (ENS) status=loads geneve : Generic Network Virtualization Encapsulation (GENEVE) status=loads gtp : GPRS Tunneling Protocol (GTP) status=loads gtp_v2 : GPRS Tunneling Protocol v2 (GTPv2) status=loads gxrp : Generic Attribute Register Protocol (GARP) status=loads homeplugav : HomePlugAV Layer status=loads homepluggp : HomePlugGP Layer status=loads homeplugsg : HomePlugSG Layer status=loads http2 : HTTP/2 (RFC 7540, RFC 7541) status=loads ibeacon : iBeacon BLE proximity beacon status=loads icmp_extensions : ICMP Extensions (deprecated) status=deprecated ife : ForCES Inter-FE LFB type (IFE) status=loads igmp : Internet Group Management Protocol v1/v2 (IGMP/IGMPv2) status=loads igmpv3 : Internet Group Management Protocol v3 (IGMPv3) status=loads ikev2 : Internet Key Exchange Protocol Version 2 (IKEv2), RFC 7296 status=loads isis : Intermediate System to Intermediate System (ISIS) status=loads isotp.__init__ : ISO-TP (ISO 15765-2) status=loads isotp.isotp_native_socket: ISO-TP (ISO 15765-2) Native Socket Library status=library isotp.isotp_packet : ISO-TP (ISO 15765-2) Packet Definitions status=library isotp.isotp_scanner : ISO-TP (ISO 15765-2) Scanner Utility status=library isotp.isotp_soft_socket: ISO-TP (ISO 15765-2) Soft Socket Library status=library isotp.isotp_utils : ISO-TP (ISO 15765-2) Utilities status=library knx : KNX Protocol status=loads lacp : Link Aggregation Control Protocol (LACP) status=loads ldp : Label Distribution Protocol (LDP) status=loads lldp : Link Layer Discovery Protocol (LLDP) status=loads loraphy2wan : LoRa PHY to WAN Layer status=loads ltp : Licklider Transmission Protocol (LTP) status=loads mac_control : MACControl status=loads macsec : 802.1AE - IEEE MAC Security standard (MACsec) status=loads metawatch : Arista Metawatch status=loads modbus : ModBus Protocol status=loads mount : NFS Mount v3 status=loads mpls : Multiprotocol Label Switching (MPLS) status=loads mqtt : Message Queuing Telemetry Transport (MQTT) status=loads mqttsn : MQTT for Sensor Networks (MQTT-SN) status=loads nfs : Network File System (NFS) v3 status=loads nlm : Network Lock Manager (NLM) v4 status=loads nrf_sniffer : nRF sniffer status=works nsh : Network Services Headers (NSH) status=loads oam : Operation, administration and maintenance (OAM) status=loads oncrpc : ONC-RPC v2 status=loads opc_da : OPC Data Access status=loads openflow : Openflow v1.0 status=loads openflow3 : OpenFlow v1.3 status=loads ospf : Open Shortest Path First (OSPF) status=loads pfcp : 3GPP Packet Forwarding Control Protocol status=loads pim : Protocol Independent Multicast (PIM) status=loads pnio : ProfinetIO RTC (+Profisafe) layer status=loads pnio_dcp : Profinet DCP layer status=loads pnio_rpc : ProfinetIO Remote Procedure Call (RPC) status=loads portmap : Portmapper v2 status=loads postgres : Postgres PSQL Binary Protocol status=loads ppi_cace : CACE Per-Packet Information (PPI) status=loads ppi_geotag : CACE Per-Packet Information (PPI) Geolocation status=loads ripng : Routing Information Protocol next gen (RIPng) status=loads roce : RoCE v2 status=loads rpl : Routing Protocol for LLNs (RPL) status=loads rpl_metrics : Routing Metrics used for Path Calc in LLNs status=loads rsvp : Resource Reservation Protocol (RSVP) status=loads rtcp : Real-Time Transport Control Protocol status=loads rtps.__init__ : Real-Time Publish-Subscribe Protocol (RTPS) status=loads rtps.common_types : RTPS common types status=library rtps.pid_types : RTPS PID type definitions status=library rtps.rtps : RTPS abstractions status=library rtr : The RPKI to Router Protocol status=loads rtsp : Real Time Streaming Protocol (RTSP) status=loads scada.iec104.__init__: IEC-60870-5-104 APCI / APDU layer definitions status=loads scada.iec104.iec104_information_objects: IEC-60870-5-104 ASDU layers / IO definitions status=loads scada.pcom : PCOM Protocol status=loads sdnv : Self-Delimiting Numeric Values (SDNV) status=library sebek : Sebek status=loads send : Secure Neighbor Discovery (SEND) (ICMPv6) status=loads skinny : Skinny Call Control Protocol (SCCP) status=loads slowprot : Slow Protocol status=loads socks : Socket Secure (SOCKS) status=loads stamp : Simple Two-Way Active Measurement Protocol (STAMP) status=loads stun : Session Traversal Utilities for NAT (STUN) status=loads tacacs : Terminal Access Controller Access-Control System+ status=loads tcpao : TCP-AO Signature Calculation status=loads tcpros : TCPROS transport layer for ROS Melodic Morenia status=loads tzsp : TaZmen Sniffer Protocol (TZSP) status=loads vqp : VLAN Query Protocol status=loads vtp : VLAN Trunking Protocol (VTP) status=loads wireguard : WireGuard status=loads ###(012)=[passed] Configuration >>> conf.debug_dissector = True ###(013)=[passed] Configuration conf.use_* LINUX >>> try: ... conf.use_bpf = True ... assert False ... except: ... True ... True >>> assert not conf.use_bpf ###(015)=[passed] Configuration conf.use_pcap >>> if not conf.use_pcap: ... assert not conf.iface.provider.libpcap ... conf.use_pcap = True ... assert conf.iface.provider.libpcap ... for iface in conf.ifaces.values(): ... assert iface.provider.libpcap or iface.is_valid() == False ... conf.use_pcap = False ... assert not conf.iface.provider.libpcap ... ###(016)=[passed] Test layer filtering >>> pkt = NetflowHeader()/NetflowHeaderV5()/NetflowRecordV5() >>> >>> conf.layers.filter([NetflowHeader, NetflowHeaderV5]) >>> assert NetflowRecordV5 not in NetflowHeader(bytes(pkt)) >>> >>> conf.layers.unfilter() >>> assert NetflowRecordV5 in NetflowHeader(bytes(pkt)) ###(017)=[passed] UTscapy route check Check that UTscapy has correctly replaced the routes. Many tests won't work otherwise >>> p = IP().src >>> p '127.0.0.1' >>> assert p == "127.0.0.1" ###### ## Scapy functions tests ###### ###(018)=[passed] Interface related functions >>> from unittest import mock >>> >>> conf.iface >>> >>> get_if_addr(conf.iface) '192.168.122.109' >>> get_if_hwaddr(conf.iface) '52:54:00:a3:0b:7c' >>> >>> bytes_hex(get_if_raw_addr(conf.iface)) b'c0a87a6d' >>> >>> def get_dummy_interface(): ... """Returns a dummy network interface""" ... conf.ifaces._add_fake_iface("dummy0") ... return "dummy0" ... >>> get_if_raw_addr(get_dummy_interface()) b'\x7f\x00\x00\x01' >>> >>> get_if_list() ['lo', 'eth0', 'eth1', 'dummy0'] >>> >>> get_working_if() >>> >>> get_if_raw_addr6(conf.iface) ###(019)=[passed] More Interfaces related functions >>> old = conf.iface >>> conf.iface = conf.iface.name >>> assert conf.iface == old >>> >>> assert isinstance(conf.iface, NetworkInterface) >>> assert conf.iface.is_valid() >>> >>> from unittest import mock >>> @mock.patch("scapy.interfaces.conf.route.routes", []) ... @mock.patch("scapy.interfaces.conf.ifaces.values") ... def _test_get_working_if(rou): ... rou.side_effect = lambda: [] ... assert get_working_if() is None ... >>> assert conf.iface + "a" # left + >>> assert "hey! are you, ready to go ? %s" % conf.iface # format >>> assert "cuz you know the way to go" + conf.iface # right + >>> >>> _test_get_working_if() ###(020)=[passed] Test conf.ifaces >>> conf.iface >>> conf.ifaces Source Index Name MAC IPv4 IPv6 sys 1 lo 00:00:00:00:00:00 127.0.0.1 ::1 sys 2 eth0 52:54:00:a3:0b:7c 192.168.122.109 fe80::5054:ff:fea3:b7c sys 3 eth1 52:54:00:64:b2:df 2620:52:3:1:dead:beef_ fe80::5054:ff:fe64:b2_ >>> >>> assert conf.iface in conf.ifaces.values() >>> assert conf.ifaces.dev_from_index(conf.iface.index) == conf.iface >>> assert conf.ifaces.dev_from_networkname(conf.iface.network_name) == conf.iface >>> >>> conf.ifaces.data = {'a': NetworkInterface(InterfaceProvider(), {"name": 'a', "network_name": 'a', "description": 'a', "ips": ["127.0.0.1", "::1", "::2", "127.0.0.2"], "mac": 'aa:aa:aa:aa:aa:aa'})} >>> >>> with ContextManagerCaptureOutput() as cmco: ... conf.ifaces.show() ... output = cmco.get_output() ... >>> data = """ ... Source Index Name MAC IPv4 IPv6 ... Unknown 0 a aa:aa:aa:aa:aa:aa 127.0.0.1 ::1 ... 127.0.0.2 ::2 ... """.strip() >>> >>> output = [x.strip() for x in output.strip().split("\n")] >>> data = [x.strip() for x in data.strip().split("\n")] >>> >>> assert output == data >>> >>> conf.ifaces.reload() ###(021)=[passed] Test extcap detection in conf.ifaces >>> import os >>> from scapy.libs.extcap import load_extcap >>> >>> _bkp_extcap = conf.prog.extcap_folders >>> _bkp_providers = conf.ifaces.providers.copy() >>> >>> conf.ifaces.providers.clear() >>> >>> extcapfld = get_temp_dir() >>> extcapprog = os.path.join(extcapfld, "runner.sh") >>> data = """#!/usr/bin/env python3 ... ... import struct ... import argparse ... parser = argparse.ArgumentParser() ... parser.add_argument('--extcap-interfaces', action='store_true') ... parser.add_argument('--capture', action='store_true') ... parser.add_argument('--extcap-config', action='store_true') ... parser.add_argument('--scan-follow-rsp', action='store_true') ... parser.add_argument('--scan-follow-aux', action='store_true') ... parser.add_argument('--extcap-interface', type=str) ... parser.add_argument('--fifo', type=str) ... ... args = parser.parse_args() ... if args.extcap_interfaces: ... # List interfaces ... print(bytes.fromhex("0a657874636170207b76657273696f6e3d342e312e317d7b646973706c61793d6e524620536e696666657220666f7220426c7565746f6f7468204c457d7b68656c703d68747470733a2f2f7777772e6e6f7264696373656d692e636f6d2f536f6674776172652d616e642d546f6f6c732f446576656c6f706d656e742d546f6f6c732f6e52462d536e69666665722d666f722d426c7565746f6f74682d4c457d0a696e74657266616365207b76616c75653d2f6465762f747479555342352d4e6f6e657d7b646973706c61793d6e524620536e696666657220666f7220426c7565746f6f7468204c457d0a636f6e74726f6c207b6e756d6265723d307d7b747970653d73656c6563746f727d7b646973706c61793d4465766963657d7b746f6f6c7469703d446576696365206c6973747d0a636f6e74726f6c207b6e756d6265723d317d7b747970653d73656c6563746f727d7b646973706c61793d4b65797d7b746f6f6c7469703d7d0a636f6e74726f6c207b6e756d6265723d327d7b747970653d737472696e677d7b646973706c61793d56616c75657d7b746f6f6c7469703d3620646967697420706173736b6579206f72203136206f7220333220627974657320656e6372797074696f6e206b657920696e2068657861646563696d616c207374617274696e67207769746820273078272c2062696720656e6469616e20666f726d61742e49662074686520656e7465726564206b65792069732073686f72746572207468616e203136206f722033322062797465732c2069742077696c6c206265207a65726f2d70616464656420696e2066726f6e74277d7b76616c69646174696f6e3d5c625e28285b302d395d7b367d297c2830785b302d39612d66412d465d7b312c36347d297c285b302d39412d46612d665d7b327d5b3a2d5d297b357d285b302d39412d46612d665d7b327d2920287075626c69637c72616e646f6d2929245c627d0a636f6e74726f6c207b6e756d6265723d337d7b747970653d737472696e677d7b646973706c61793d41647620486f707d7b64656661756c743d33372c33382c33397d7b746f6f6c7469703d4164766572746973696e67206368616e6e656c20686f702073657175656e63652e204368616e676520746865206f7264657220696e2077686963682074686520736e6966666572207377697463686573206164766572746973696e67206368616e6e656c732e2056616c6964206368616e6e656c73206172652033372c20333820616e642033392073657061726174656420627920636f6d6d612e7d7b76616c69646174696f6e3d5e5c732a282833377c33387c3339295c732a2c5c732a297b302c327d2833377c33387c3339297b317d5c732a247d7b72657175697265643d747275657d0a636f6e74726f6c207b6e756d6265723d377d7b747970653d627574746f6e7d7b646973706c61793d436c6561727d7b746f6f6c746f703d436c656172206f722072656d6f7665206465766963652066726f6d20446576696365206c6973747d0a636f6e74726f6c207b6e756d6265723d347d7b747970653d627574746f6e7d7b726f6c653d68656c707d7b646973706c61793d48656c707d7b746f6f6c7469703d416363657373207573657220677569646520286c61756e636865732062726f77736572297d0a636f6e74726f6c207b6e756d6265723d357d7b747970653d627574746f6e7d7b726f6c653d726573746f72657d7b646973706c61793d44656661756c74737d7b746f6f6c7469703d52657365747320746865207573657220696e7465726661636520616e6420636c6561727320746865206c6f672066696c657d0a636f6e74726f6c207b6e756d6265723d367d7b747970653d627574746f6e7d7b726f6c653d6c6f676765727d7b646973706c61793d4c6f677d7b746f6f6c7469703d4c6f672070657220696e746572666163657d0a76616c7565207b636f6e74726f6c3d307d7b76616c75653d207d7b646973706c61793d416c6c206164766572746973696e6720646576696365737d7b64656661756c743d747275657d0a76616c7565207b636f6e74726f6c3d307d7b76616c75653d5b30302c30302c30302c30302c30302c30302c305d7d7b646973706c61793d466f6c6c6f772049524b7d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d307d7b646973706c61793d4c656761637920506173736b65797d7b64656661756c743d747275657d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d317d7b646973706c61793d4c6567616379204f4f4220646174617d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d327d7b646973706c61793d4c6567616379204c544b7d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d337d7b646973706c61793d5343204c544b7d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d347d7b646973706c61793d53432050726976617465204b65797d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d357d7b646973706c61793d49524b7d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d367d7b646973706c61793d416464204c4520616464726573737d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d377d7b646973706c61793d466f6c6c6f77204c4520616464726573737d").decode()) ... elif args.extcap_interface and args.extcap_config: ... # List config ... print(bytes.fromhex("617267207b6e756d6265723d307d7b63616c6c3d2d2d6f6e6c792d6164766572746973696e677d7b646973706c61793d4f6e6c79206164766572746973696e67207061636b6574737d7b746f6f6c7469703d54686520736e69666665722077696c6c206f6e6c792063617074757265206164766572746973696e67207061636b6574732066726f6d207468652073656c6563746564206465766963657d7b747970653d626f6f6c666c61677d7b736176653d747275657d0a617267207b6e756d6265723d317d7b63616c6c3d2d2d6f6e6c792d6c65676163792d6164766572746973696e677d7b646973706c61793d4f6e6c79206c6567616379206164766572746973696e67207061636b6574737d7b746f6f6c7469703d54686520736e69666665722077696c6c206f6e6c792063617074757265206c6567616379206164766572746973696e67207061636b6574732066726f6d207468652073656c6563746564206465766963657d7b747970653d626f6f6c666c61677d7b736176653d747275657d0a617267207b6e756d6265723d327d7b63616c6c3d2d2d7363616e2d666f6c6c6f772d7273707d7b646973706c61793d46696e64207363616e20726573706f6e736520646174617d7b746f6f6c7469703d54686520736e69666665722077696c6c20666f6c6c6f77207363616e20726571756573747320616e64207363616e20726573706f6e73657320696e207363616e206d6f64657d7b747970653d626f6f6c666c61677d7b64656661756c743d747275657d7b736176653d747275657d0a617267207b6e756d6265723d337d7b63616c6c3d2d2d7363616e2d666f6c6c6f772d6175787d7b646973706c61793d46696e6420617578696c6961727920706f696e74657220646174617d7b746f6f6c7469703d54686520736e69666665722077696c6c20666f6c6c6f772061757820706f696e7465727320696e207363616e206d6f64657d7b747970653d626f6f6c666c61677d7b64656661756c743d747275657d7b736176653d747275657d0a617267207b6e756d6265723d337d7b63616c6c3d2d2d636f6465647d7b646973706c61793d5363616e20616e6420666f6c6c6f772064657669636573206f6e204c4520436f646564205048597d7b746f6f6c7469703d5363616e20666f72206465766963657320616e6420666f6c6c6f772061647665727469736572206f6e204c4520436f646564205048597d7b747970653d626f6f6c666c61677d7b64656661756c743d66616c73657d7b736176653d747275657d").decode()) ... elif args.capture and args.extcap_interface and args.fifo: ... # Capture ... pkts = [ ... bytes.fromhex("ffffffffffff00000000000008004500001c0001000040117cce7f0000017f0000010035003500080172") ... ] ... with open(args.fifo, "wb", 0) as fd: ... # header ... fd.write( ... struct.pack( ... "IHHIIII", ... 0xa1b2c3d4, ... 2, 4, 0, 0, 65535, 1 ... ) ... ) ... for pkt in pkts: ... fd.write(struct.pack("IIII", 0, 0, len(pkt), len(pkt))) ... fd.write(bytes(pkt)) ... else: ... raise ValueError("Bad arguments") ... """.strip() >>> with open(extcapprog, "w") as fd: ... fd.write(data) ... 7105 >>> print(data) #!/usr/bin/env python3 import struct import argparse parser = argparse.ArgumentParser() parser.add_argument('--extcap-interfaces', action='store_true') parser.add_argument('--capture', action='store_true') parser.add_argument('--extcap-config', action='store_true') parser.add_argument('--scan-follow-rsp', action='store_true') parser.add_argument('--scan-follow-aux', action='store_true') parser.add_argument('--extcap-interface', type=str) parser.add_argument('--fifo', type=str) args = parser.parse_args() if args.extcap_interfaces: # List interfaces print(bytes.fromhex("0a657874636170207b76657273696f6e3d342e312e317d7b646973706c61793d6e524620536e696666657220666f7220426c7565746f6f7468204c457d7b68656c703d68747470733a2f2f7777772e6e6f7264696373656d692e636f6d2f536f6674776172652d616e642d546f6f6c732f446576656c6f706d656e742d546f6f6c732f6e52462d536e69666665722d666f722d426c7565746f6f74682d4c457d0a696e74657266616365207b76616c75653d2f6465762f747479555342352d4e6f6e657d7b646973706c61793d6e524620536e696666657220666f7220426c7565746f6f7468204c457d0a636f6e74726f6c207b6e756d6265723d307d7b747970653d73656c6563746f727d7b646973706c61793d4465766963657d7b746f6f6c7469703d446576696365206c6973747d0a636f6e74726f6c207b6e756d6265723d317d7b747970653d73656c6563746f727d7b646973706c61793d4b65797d7b746f6f6c7469703d7d0a636f6e74726f6c207b6e756d6265723d327d7b747970653d737472696e677d7b646973706c61793d56616c75657d7b746f6f6c7469703d3620646967697420706173736b6579206f72203136206f7220333220627974657320656e6372797074696f6e206b657920696e2068657861646563696d616c207374617274696e67207769746820273078272c2062696720656e6469616e20666f726d61742e49662074686520656e7465726564206b65792069732073686f72746572207468616e203136206f722033322062797465732c2069742077696c6c206265207a65726f2d70616464656420696e2066726f6e74277d7b76616c69646174696f6e3d5c625e28285b302d395d7b367d297c2830785b302d39612d66412d465d7b312c36347d297c285b302d39412d46612d665d7b327d5b3a2d5d297b357d285b302d39412d46612d665d7b327d2920287075626c69637c72616e646f6d2929245c627d0a636f6e74726f6c207b6e756d6265723d337d7b747970653d737472696e677d7b646973706c61793d41647620486f707d7b64656661756c743d33372c33382c33397d7b746f6f6c7469703d4164766572746973696e67206368616e6e656c20686f702073657175656e63652e204368616e676520746865206f7264657220696e2077686963682074686520736e6966666572207377697463686573206164766572746973696e67206368616e6e656c732e2056616c6964206368616e6e656c73206172652033372c20333820616e642033392073657061726174656420627920636f6d6d612e7d7b76616c69646174696f6e3d5e5c732a282833377c33387c3339295c732a2c5c732a297b302c327d2833377c33387c3339297b317d5c732a247d7b72657175697265643d747275657d0a636f6e74726f6c207b6e756d6265723d377d7b747970653d627574746f6e7d7b646973706c61793d436c6561727d7b746f6f6c746f703d436c656172206f722072656d6f7665206465766963652066726f6d20446576696365206c6973747d0a636f6e74726f6c207b6e756d6265723d347d7b747970653d627574746f6e7d7b726f6c653d68656c707d7b646973706c61793d48656c707d7b746f6f6c7469703d416363657373207573657220677569646520286c61756e636865732062726f77736572297d0a636f6e74726f6c207b6e756d6265723d357d7b747970653d627574746f6e7d7b726f6c653d726573746f72657d7b646973706c61793d44656661756c74737d7b746f6f6c7469703d52657365747320746865207573657220696e7465726661636520616e6420636c6561727320746865206c6f672066696c657d0a636f6e74726f6c207b6e756d6265723d367d7b747970653d627574746f6e7d7b726f6c653d6c6f676765727d7b646973706c61793d4c6f677d7b746f6f6c7469703d4c6f672070657220696e746572666163657d0a76616c7565207b636f6e74726f6c3d307d7b76616c75653d207d7b646973706c61793d416c6c206164766572746973696e6720646576696365737d7b64656661756c743d747275657d0a76616c7565207b636f6e74726f6c3d307d7b76616c75653d5b30302c30302c30302c30302c30302c30302c305d7d7b646973706c61793d466f6c6c6f772049524b7d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d307d7b646973706c61793d4c656761637920506173736b65797d7b64656661756c743d747275657d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d317d7b646973706c61793d4c6567616379204f4f4220646174617d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d327d7b646973706c61793d4c6567616379204c544b7d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d337d7b646973706c61793d5343204c544b7d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d347d7b646973706c61793d53432050726976617465204b65797d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d357d7b646973706c61793d49524b7d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d367d7b646973706c61793d416464204c4520616464726573737d0a76616c7565207b636f6e74726f6c3d317d7b76616c75653d377d7b646973706c61793d466f6c6c6f77204c4520616464726573737d").decode()) elif args.extcap_interface and args.extcap_config: # List config print(bytes.fromhex("617267207b6e756d6265723d307d7b63616c6c3d2d2d6f6e6c792d6164766572746973696e677d7b646973706c61793d4f6e6c79206164766572746973696e67207061636b6574737d7b746f6f6c7469703d54686520736e69666665722077696c6c206f6e6c792063617074757265206164766572746973696e67207061636b6574732066726f6d207468652073656c6563746564206465766963657d7b747970653d626f6f6c666c61677d7b736176653d747275657d0a617267207b6e756d6265723d317d7b63616c6c3d2d2d6f6e6c792d6c65676163792d6164766572746973696e677d7b646973706c61793d4f6e6c79206c6567616379206164766572746973696e67207061636b6574737d7b746f6f6c7469703d54686520736e69666665722077696c6c206f6e6c792063617074757265206c6567616379206164766572746973696e67207061636b6574732066726f6d207468652073656c6563746564206465766963657d7b747970653d626f6f6c666c61677d7b736176653d747275657d0a617267207b6e756d6265723d327d7b63616c6c3d2d2d7363616e2d666f6c6c6f772d7273707d7b646973706c61793d46696e64207363616e20726573706f6e736520646174617d7b746f6f6c7469703d54686520736e69666665722077696c6c20666f6c6c6f77207363616e20726571756573747320616e64207363616e20726573706f6e73657320696e207363616e206d6f64657d7b747970653d626f6f6c666c61677d7b64656661756c743d747275657d7b736176653d747275657d0a617267207b6e756d6265723d337d7b63616c6c3d2d2d7363616e2d666f6c6c6f772d6175787d7b646973706c61793d46696e6420617578696c6961727920706f696e74657220646174617d7b746f6f6c7469703d54686520736e69666665722077696c6c20666f6c6c6f772061757820706f696e7465727320696e207363616e206d6f64657d7b747970653d626f6f6c666c61677d7b64656661756c743d747275657d7b736176653d747275657d0a617267207b6e756d6265723d337d7b63616c6c3d2d2d636f6465647d7b646973706c61793d5363616e20616e6420666f6c6c6f772064657669636573206f6e204c4520436f646564205048597d7b746f6f6c7469703d5363616e20666f72206465766963657320616e6420666f6c6c6f772061647665727469736572206f6e204c4520436f646564205048597d7b747970653d626f6f6c666c61677d7b64656661756c743d66616c73657d7b736176653d747275657d").decode()) elif args.capture and args.extcap_interface and args.fifo: # Capture pkts = [ bytes.fromhex("ffffffffffff00000000000008004500001c0001000040117cce7f0000017f0000010035003500080172") ] with open(args.fifo, "wb", 0) as fd: # header fd.write( struct.pack( "IHHIIII", 0xa1b2c3d4, 2, 4, 0, 0, 65535, 1 ) ) for pkt in pkts: fd.write(struct.pack("IIII", 0, 0, len(pkt), len(pkt))) fd.write(bytes(pkt)) else: raise ValueError("Bad arguments") >>> >>> os.chmod(extcapprog, 0o777) >>> >>> conf.prog.extcap_folders = [extcapfld] >>> load_extcap() >>> print(conf.ifaces.providers) {functools.partial(._prov'>, cmdprog='/tmp/scapymk6kov8a/runner.sh'): } >>> conf.ifaces.reload() >>> >>> iface = conf.ifaces.dev_from_networkname('/dev/ttyUSB5-None') >>> assert iface.name == "nRF Sniffer for Bluetooth LE" >>> sock = iface.l2listen()(iface=iface) >>> pkts = sock.sniff(timeout=2) >>> sock.close() >>> assert UDP in pkts[0] >>> >>> config = iface.get_extcap_config() >>> assert config["arg"] == [ ... ('0', '--only-advertising', 'Only advertising packets', '', ''), ... ('1', '--only-legacy-advertising', 'Only legacy advertising packets', '', ''), ... ('2', '--scan-follow-rsp', 'Find scan response data', 'true', ''), ... ('3', '--scan-follow-aux', 'Find auxiliary pointer data', 'true', ''), ... ('3', '--coded', 'Scan and follow devices on LE Coded PHY', 'false', '') ... ] >>> >>> conf.prog.extcap_folders = _bkp_extcap >>> conf.ifaces.providers = _bkp_providers >>> conf.ifaces.reload() ###(022)=[passed] Test read_routes6() - default output >>> routes6 = read_routes6() >>> if WINDOWS: ... from scapy.arch.windows import _route_add_loopback ... _route_add_loopback(routes6, True) ... >>> routes6 [('::1', 128, '::', 'lo', ['::1'], 0), ('2620:52:3:1:dead:beef:cafe:c297', 128, '::', 'eth1', ['2620:52:3:1:dead:beef:cafe:c297'], 0), ('fe80::5054:ff:fe64:b2df', 128, '::', 'eth1', ['fe80::5054:ff:fe64:b2df'], 0), ('fe80::5054:ff:fea3:b7c', 128, '::', 'eth0', ['fe80::5054:ff:fea3:b7c'], 0), ('2620:52:3:1:dead:beef:cafe:c297', 128, '::', 'eth1', ['2620:52:3:1:dead:beef:cafe:c297'], 101), ('2620:52:3:1:ffff:ffff:ffff:fffe', 128, '::', 'eth1', ['2620:52:3:1:dead:beef:cafe:c297'], 101), ('fe80::', 64, '::', 'eth1', ['fe80::5054:ff:fe64:b2df'], 1024), ('fe80::', 64, '::', 'eth0', ['fe80::5054:ff:fea3:b7c'], 1024), ('::', 0, '2620:52:3:1:ffff:ffff:ffff:fffe', 'eth1', ['2620:52:3:1:dead:beef:cafe:c297'], 101), ('ff00::', 8, '::', 'eth0', ['fe80::5054:ff:fea3:b7c'], 250), ('ff00::', 8, '::', 'eth1', ['2620:52:3:1:dead:beef:cafe:c297', 'fe80::5054:ff:fe64:b2df'], 250)] >>> >>> >>> if routes6: ... iflist = get_if_list() ... if WINDOWS: ... from scapy.arch.windows import _route_add_loopback ... _route_add_loopback(ipv6=True, iflist=iflist) ... if OPENBSD: ... len(routes6) >= 2 ... elif iflist == [conf.loopback_name]: ... len(routes6) == 1 ... elif len(iflist) >= 2: ... len(routes6) >= 1 ... else: ... False ... else: ... # IPv6 seems disabled. Force a route to ::1 ... conf.route6.routes.append(("::1", 128, "::", conf.loopback_name, ["::1"], 1)) ... conf.route6.ipv6_ifaces = set([conf.loopback_name]) ... True ... True ###(025)=[passed] Test read_routes6() - check mandatory routes >>> import re >>> ll_route = re.compile(r"fe80:\d{0,2}:") >>> >>> conf.route6 Destination Next Hop Iface Src candidates Metric ::/0 2620:52:3:1:ffff:ff_ eth1 2620:52:3:1:dead:be_ 101 ::1/128 :: lo ::1 0 2620:52:3:1:dead:be_ :: eth1 2620:52:3:1:dead:be_ 0 fe80::5054:ff:fe64:_ :: eth1 fe80::5054:ff:fe64:_ 0 fe80::5054:ff:fea3:_ :: eth0 fe80::5054:ff:fea3:_ 0 2620:52:3:1:dead:be_ :: eth1 2620:52:3:1:dead:be_ 101 2620:52:3:1:ffff:ff_ :: eth1 2620:52:3:1:dead:be_ 101 fe80::/64 :: eth1 fe80::5054:ff:fe64:_ 1024 fe80::/64 :: eth0 fe80::5054:ff:fea3:_ 1024 ff00::/8 :: eth0 fe80::5054:ff:fea3:_ 250 ff00::/8 :: eth1 2620:52:3:1:dead:be_ 250 fe80::5054:ff:fe64:_ >>> >>> if len(routes6) > 2 and not WINDOWS: ... # Identify routes to fe80::/64 ... assert sum(1 for r in routes6 if r[0] == "::1" and r[4] == ["::1"]) >= 1 ... if len(iflist) >= 2: ... assert sum(1 for r in routes6 if ll_route.match(r[0]) and r[1] == 64) >= 1 ... try: ... # Identify a route to a node IPv6 link-local address ... assert sum(1 for r in routes6 if in6_islladdr(r[0]) and r[1] == 128) >= 1 ... except: ... # IPv6 is not available, but we still check the loopback ... assert conf.route6.route("::/0") == (conf.loopback_name, "::", "::") ... assert sum(1 for r in routes6 if r[1] == 128 and r[4] == ["::1"]) >= 1 ... else: ... True ... ###(026)=[passed] Test ifchange() >>> conf.route6.ifchange(conf.loopback_name, "::1/128") >>> if WINDOWS: ... conf.netcache.in6_neighbor["::1"] = "ff:ff:ff:ff:ff:ff" # Restore fake cache ... >>> True True ###(027)=[passed] Packet.route() >>> assert (Ether() / ARP()).route()[0] is not None >>> assert (Ether() / ARP()).payload.route()[0] is not None >>> assert (ARP(ptype=0, pdst="hello. this isn't a valid IP")).route()[0] is None ###(028)=[passed] utils/in4_is* >>> assert in4_ismaddr("224.0.0.1") >>> assert not in4_ismaddr("192.168.0.1") >>> assert in4_ismaddr("239.0.0.255") >>> >>> assert in4_ismlladdr("224.0.0.1") >>> assert in4_ismlladdr("224.0.0.255") >>> assert not in4_ismlladdr("224.0.1.255") >>> >>> assert in4_ismgladdr("235.0.0.1") >>> assert not in4_ismgladdr("224.0.0.1") >>> assert not in4_ismgladdr("239.0.0.1") >>> >>> assert in4_ismlsaddr("239.0.0.1") >>> assert not in4_ismlsaddr("224.0.0.1") >>> >>> assert in4_isaddrllallnodes("224.0.0.1") >>> assert not in4_isaddrllallnodes("224.0.0.3") >>> >>> assert in4_getnsmac(b'\xe0\x00\x00\x01') == '01:00:5e:00:00:01' >>> assert getmacbyip("224.0.0.1") == '01:00:5e:00:00:01' ###(029)=[passed] plain_str test >>> data = b"\xffsweet\xef celestia\xab" >>> assert plain_str(data) == "\\xffsweet\\xef celestia\\xab" ###### ## compat.py ###### ###(030)=[passed] test bytes_hex/hex_bytes >>> monty_data = b"Stop! Who approaches the Bridge of Death must answer me these questions three, 'ere the other side he see." >>> hex_data = bytes_hex(monty_data) >>> assert hex_data == b'53746f70212057686f20617070726f61636865732074686520427269646765206f66204465617468206d75737420616e73776572206d65207468657365207175657374696f6e732074687265652c202765726520746865206f746865722073696465206865207365652e' >>> assert hex_bytes(hex_data) == monty_data ###(031)=[passed] orb/chb >>> assert orb(b"\x01"[0]) == 1 >>> assert chb(1) == b"\x01" ###### ## Main.py tests ###### ###(032)=[passed] Pickle and unpickle a packet >>> import pickle >>> >>> a = IP(dst="192.168.0.1")/UDP() >>> >>> b = pickle.dumps(a) >>> c = pickle.loads(b) >>> >>> assert c[IP].dst == "192.168.0.1" >>> assert raw(c) == raw(a) ###(033)=[passed] Usage test >>> from scapy.main import _usage >>> try: ... _usage() ... assert False ... except SystemExit: ... assert True ... Usage: scapy.py [-s sessionfile] [-c new_startup_file] [-p new_prestart_file] [-C] [-P] [-H] Args: -H: header-less start -C: do not read startup file -P: do not read pre-startup file ###(034)=[passed] Session test >>> import builtins >>> >>> def get_var(var): ... return builtins.__dict__["scapy_session"][var] ... >>> def set_var(var, value): ... builtins.__dict__["scapy_session"][var] = value ... >>> def del_var(var): ... del builtins.__dict__["scapy_session"][var] ... >>> init_session(None, {"init_value": 123}) >>> set_var("test_value", "8.8.8.8") # test_value = "8.8.8.8" >>> save_session() Saving session into [/tmp/scapyfxw0vjlt] >>> del_var("test_value") >>> load_session() >>> update_session() >>> assert get_var("test_value") == "8.8.8.8" #test_value == "8.8.8.8" >>> assert get_var("init_value") == 123 ###(035)=[passed] Session test with fname >>> session_name = tempfile.mktemp() >>> init_session(session_name) >>> set_var("test_value", IP(dst="192.168.0.1")) # test_value = IP(dst="192.168.0.1") >>> save_session(fname="%s.dat" % session_name) Saving session into [/tmp/tmpx1uwdhkj.dat] >>> del_var("test_value") >>> >>> set_var("z", True) #z = True >>> load_session(fname="%s.dat" % session_name) >>> try: ... get_var("z") ... assert False ... except: ... pass ... >>> set_var("z", False) #z = False >>> update_session(fname="%s.dat" % session_name) >>> assert get_var("test_value").dst == "192.168.0.1" #test_value.dst == "192.168.0.1" >>> assert not get_var("z") ###(036)=[passed] Clear session files >>> os.remove("%s.dat" % session_name) ###(038)=[passed] Emulate interact() >>> import sys >>> from unittest import mock >>> from scapy.main import interact >>> >>> from scapy.main import DEFAULT_PRESTART_FILE, DEFAULT_PRESTART, _read_config_file >>> _read_config_file(DEFAULT_PRESTART_FILE, _locals=globals(), default=DEFAULT_PRESTART) >>> with open(DEFAULT_PRESTART_FILE, "r") as fd: ... OLD_DEFAULT_PRESTART = fd.read() ... >>> with open(DEFAULT_PRESTART_FILE, "w+") as fd: ... fd.write("conf.interactive_shell = 'ipython'") ... 34 >>> try: ... import IPython ... except: ... code_interact_import = "scapy.main.code.interact" ... else: ... code_interact_import = "IPython.embed" ... >>> @mock.patch(code_interact_import) ... def interact_emulator(code_int, extra_args=[]): ... try: ... code_int.side_effect = lambda *args, **kwargs: lambda *args, **kwargs: None ... interact(argv=["-s scapy1"] + extra_args, mybanner="What a test") ... finally: ... sys.ps1 = ">>> " ... >>> interact_emulator() # Default Saving session into [/tmp/tmpx1uwdhkj] >>> >>> try: ... interact_emulator(extra_args=["-?"]) # Failing ... assert False ... except: ... pass ... option -? not recognized >>> interact_emulator(extra_args=["-d"]) # Extended option -d requires argument ###(039)=[passed] Emulate interact() and test startup.py with ptpython >>> import sys >>> from unittest import mock >>> >>> from scapy.main import DEFAULT_PRESTART_FILE, DEFAULT_PRESTART, _read_config_file >>> _read_config_file(DEFAULT_PRESTART_FILE, _locals=globals(), default=DEFAULT_PRESTART) >>> with open(DEFAULT_PRESTART_FILE, "w+") as fd: ... fd.write("conf.interactive_shell = 'ptpython'") ... 35 >>> called = [] >>> def checker(*args, **kwargs): ... locals = kwargs.pop("locals") ... assert locals["IP"] ... history_filename = kwargs.pop("history_filename") ... assert history_filename == conf.histfile ... called.append(True) ... >>> ptpython_mocked_module = Bunch( ... repl=Bunch( ... embed=checker ... ) ... ) >>> >>> modules_patched = { ... "ptpython": ptpython_mocked_module, ... "ptpython.repl": ptpython_mocked_module.repl, ... "ptpython.repl.embed": ptpython_mocked_module.repl.embed, ... } >>> >>> with mock.patch.dict("sys.modules", modules_patched): ... try: ... interact() ... finally: ... sys.ps1 = ">>> " ... ptpython support is currently partially broken aSPY//YASa apyyyyCY//////////YCa | sY//////YSpcs scpCY//Pp | Welcome to Scapy ayp ayyyyyyySCP//Pp syY//C | Version 2.5.0.dev467 AYAsAYYYYYYYY///Ps cY//S | pCCCCY//p cSSps y//Y | https://github.com/secdev/scapy SPPPP///a pP///AC//Y | A//A cyP////C | Have fun! p///Ac sC///a | P////YCpc A//A | Wanna support scapy? Star us on scccccp///pSP///p p//Y | GitHub! sY/////////y caa S//P | -- Satoshi Nakamoto cayCyayP//Ya pY/Ya | sY/PsY////YCc aC//Yp sc sccaCY//PCypaapyCP//YSs spCPY//////YPSps ccaacs using ptpython Saving session into [/tmp/tmpx1uwdhkj] >>> with open(DEFAULT_PRESTART_FILE, "w") as fd: ... print(OLD_DEFAULT_PRESTART) ... r = fd.write(OLD_DEFAULT_PRESTART) ... # Scapy CLI 'pre-start' config file # see https://scapy.readthedocs.io/en/latest/api/scapy.config.html#scapy.config.Conf # for all available options # default interpreter conf.interactive_shell = "auto" # color theme (DefaultTheme, BrightTheme, ColorOnBlackTheme, BlackAndWhite, ...) conf.color_theme = DefaultTheme() # disable INFO: tags related to dependencies missing # log_loading.setLevel(logging.WARNING) # force-use libpcap # conf.use_pcap = True >>> assert called ###(040)=[passed] Test explore() with GUI mode >>> from unittest import mock >>> >>> def test_explore_gui(is_layer, layer): ... prompt_toolkit_mocked_module = Bunch( ... shortcuts=Bunch( ... dialogs=Bunch( ... radiolist_dialog=(lambda *args, **kargs: layer), ... button_dialog=(lambda *args, **kargs: "layers" if is_layer else "contribs") ... ) ... ), ... formatted_text=Bunch(HTML=lambda x: x), ... __version__="2.0.0" ... ) ... # a mock.patch isn't enough to mock a module. Let's roll sys.modules ... modules_patched = { ... "prompt_toolkit": prompt_toolkit_mocked_module, ... "prompt_toolkit.shortcuts": prompt_toolkit_mocked_module.shortcuts, ... "prompt_toolkit.shortcuts.dialogs": prompt_toolkit_mocked_module.shortcuts.dialogs, ... "prompt_toolkit.formatted_text": prompt_toolkit_mocked_module.formatted_text, ... } ... with mock.patch.dict("sys.modules", modules_patched): ... with ContextManagerCaptureOutput() as cmco: ... explore() ... result_explore = cmco.get_output() ... return result_explore ... >>> conf.interactive = True >>> explore_dns = test_explore_gui(True, "scapy.layers.dns") >>> assert "DNS" in explore_dns >>> assert "DNS Question Record" in explore_dns >>> assert "DNSRRNSEC3" in explore_dns >>> assert "DNS TSIG Resource Record" in explore_dns >>> >>> explore_avs = test_explore_gui(False, "avs") >>> assert "AVSWLANHeader" in explore_avs >>> assert "AVS WLAN Monitor Header" in explore_avs ###(041)=[passed] Test explore() with non-GUI mode >>> def test_explore_non_gui(layer): ... with ContextManagerCaptureOutput() as cmco: ... explore(layer) ... result_explore = cmco.get_output() ... return result_explore ... >>> explore_dns = test_explore_non_gui("scapy.layers.dns") >>> assert "DNS" in explore_dns >>> assert "DNS Question Record" in explore_dns >>> assert "DNSRRNSEC3" in explore_dns >>> assert "DNS TSIG Resource Record" in explore_dns >>> >>> explore_avs = test_explore_non_gui("avs") >>> assert "AVSWLANHeader" in explore_avs >>> assert "AVS WLAN Monitor Header" in explore_avs >>> >>> assert test_explore_non_gui("scapy.layers.dns") == test_explore_non_gui("dns") >>> assert test_explore_non_gui("scapy.contrib.avs") == test_explore_non_gui("avs") >>> >>> try: ... explore("unknown_module") ... assert False # The previous should have raised an exception ... except Scapy_Exception: ... pass ... Loading module scapy.layers.unknown_module Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/main.py", line 308, in load_contrib importlib.import_module("scapy.contrib." + name) ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib64/python3.13/importlib/__init__.py", line 88, in import_module return _bootstrap._gcd_import(name[level:], package, level) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "", line 1387, in _gcd_import File "", line 1360, in _find_and_load File "", line 1324, in _find_and_load_unlocked ModuleNotFoundError: No module named 'scapy.contrib.unknown_module' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/main.py", line 260, in _load mod = importlib.import_module(module) File "/usr/lib64/python3.13/importlib/__init__.py", line 88, in import_module return _bootstrap._gcd_import(name[level:], package, level) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "", line 1387, in _gcd_import File "", line 1360, in _find_and_load File "", line 1324, in _find_and_load_unlocked ModuleNotFoundError: No module named 'scapy.layers.unknown_module' ###(042)=[passed] Test load_contrib overwrite >>> load_contrib("gtp") >>> assert GTPHeader.__module__ == "scapy.contrib.gtp" >>> >>> load_contrib("gtp_v2") >>> assert GTPHeader.__module__ == "scapy.contrib.gtp_v2" >>> >>> load_contrib("gtp") >>> assert GTPHeader.__module__ == "scapy.contrib.gtp" ###(043)=[passed] Test load_contrib failure >>> try: ... load_contrib("doesnotexist") ... assert False ... except: ... pass ... Loading module scapy.layers.doesnotexist Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/main.py", line 308, in load_contrib importlib.import_module("scapy.contrib." + name) ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib64/python3.13/importlib/__init__.py", line 88, in import_module return _bootstrap._gcd_import(name[level:], package, level) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "", line 1387, in _gcd_import File "", line 1360, in _find_and_load File "", line 1324, in _find_and_load_unlocked ModuleNotFoundError: No module named 'scapy.contrib.doesnotexist' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/main.py", line 260, in _load mod = importlib.import_module(module) File "/usr/lib64/python3.13/importlib/__init__.py", line 88, in import_module return _bootstrap._gcd_import(name[level:], package, level) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "", line 1387, in _gcd_import File "", line 1360, in _find_and_load File "", line 1324, in _find_and_load_unlocked ModuleNotFoundError: No module named 'scapy.layers.doesnotexist' ###(044)=[passed] Test sane function >>> sane("A\x00\xFFB") == "A..B" True ###(045)=[passed] Test lhex function >>> assert lhex(42) == "0x2a" >>> assert lhex((28,7)) == "(0x1c, 0x7)" >>> assert lhex([28,7]) == "[0x1c, 0x7]" ###(046)=[passed] Test restart function >>> from unittest import mock >>> conf.interactive = True >>> >>> try: ... from scapy.utils import restart ... import os ... @mock.patch("os.execv") ... @mock.patch("subprocess.call") ... @mock.patch("os._exit") ... def _test(e, m, m2): ... def check(x, y=[]): ... z = [x] + y if not isinstance(x, list) else x + y ... assert os.path.isfile(z[0]) ... assert os.path.isfile(z[1]) ... return 0 ... m2.side_effect = check ... m.side_effect = check ... e.side_effect = lambda x: None ... restart() ... _test() ... finally: ... conf.interactive = False ... ###(047)=[passed] Test linehexdump function >>> conf_color_theme = conf.color_theme >>> conf.color_theme = BlackAndWhite() >>> assert linehexdump(Ether(src="00:01:02:03:04:05"), dump=True) == 'FF FF FF FF FF FF 00 01 02 03 04 05 90 00 ..............' MAC address to reach destination not found. Using broadcast. >>> conf.color_theme = conf_color_theme ###(048)=[passed] Test chexdump function >>> chexdump(Ether(src="00:01:02:02:04:05"), dump=True) == "0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x02, 0x04, 0x05, 0x90, 0x00" MAC address to reach destination not found. Using broadcast. True ###(049)=[passed] Test repr_hex function >>> repr_hex("scapy") == "7363617079" True ###(050)=[passed] Test hexstr function >>> hexstr(b"A\x00\xFFB") == "41 00 FF 42 A..B" True ###(051)=[passed] Test fletcher16 functions >>> assert fletcher16_checksum(b"\x28\x07") == 22319 >>> assert fletcher16_checkbytes(b"\x28\x07", 1) == b"\xaf(" ###(052)=[passed] Test hexdiff function >>> def test_hexdiff(a, b, algo=None, autojunk=False): ... conf_color_theme = conf.color_theme ... conf.color_theme = BlackAndWhite() ... with ContextManagerCaptureOutput() as cmco: ... hexdiff(a, b, algo=algo, autojunk=autojunk) ... result_hexdiff = cmco.get_output() ... conf.interactive = True ... conf.color_theme = conf_color_theme ... return result_hexdiff ... >>> >>> result_hexdiff = test_hexdiff("abcde", "abCde") >>> expected = "0000 61 62 63 64 65 abcde\n" >>> expected += " 0000 61 62 43 64 65 abCde\n" >>> assert result_hexdiff == expected >>> >>> >>> result_hexdiff = test_hexdiff("add_common_", "_common_removed") >>> expected = "0000 61 64 64 5F 63 6F 6D 6D 6F 6E 5F add_common_ \n" >>> expected += " -003 5F 63 6F 6D 6D 6F 6E 5F 72 65 6D 6F 76 _common_remov\n" >>> expected += " 000d 65 64 ed\n" >>> assert result_hexdiff == expected >>> >>> >>> result_hexdiff = test_hexdiff(IP(dst="127.0.0.1", src="127.0.0.1"), IP(dst="127.0.0.2", src="127.0.0.1")) >>> expected = "0000 45 00 00 14 00 01 00 00 40 00 7C E7 7F 00 00 01 E.......@.|.....\n" >>> expected += " 0000 45 00 00 14 00 01 00 00 40 00 7C E6 7F 00 00 01 E.......@.|.....\n" >>> expected += "0010 7F 00 00 01 ....\n" >>> expected += " 0010 7F 00 00 02 ....\n" >>> assert result_hexdiff == expected >>> >>> >>> a = "A" * 1000 + "findme" + "B" * 1000 >>> b = "A" * 1000 + "B" * 1000 >>> ret1 = test_hexdiff(a, b, algo="difflib") >>> ret2 = test_hexdiff(a, b, algo="difflib", autojunk=True) >>> >>> expected_ret1 = """ ... 03d0 03d0 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA ... 03e0 41 41 41 41 41 41 41 41 66 69 6E 64 6D 65 42 42 AAAAAAAAfindmeBB ... 03e0 41 41 41 41 41 41 41 41 42 42 AAAAAAAA BB ... 03ea 03ea 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB ... """ >>> expected_ret2 = """ ... 03d0 03d0 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA ... 03e0 41 41 41 41 41 41 41 41 66 69 6E 64 6D 65 42 42 AAAAAAAAfindmeBB ... 03e0 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 AAAAAAAABBBBBBBB ... 03f0 03f0 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB ... """ >>> >>> assert ret1 != ret2 >>> assert expected_ret1 in ret1 >>> assert expected_ret2 in ret2 >>> >>> >>> hexdiff(b"abc", IP() / TCP()) 0000 61 62 63 abc 0000 45 00 00 28 00 01 00 00 40 06 7C CD 7F 00 00 01 E..(....@.|..... 0010 7F 00 00 01 00 14 00 50 00 00 00 00 00 00 00 00 .......P........ 0020 50 02 20 00 91 7C 00 00 P. ..|.. >>> hexdiff(IP() / TCP(), b"abc") 0000 45 00 00 28 00 01 00 00 40 06 7C CD 7F 00 00 01 E..(....@.|..... 0000 61 62 ab 0002 7F 00 00 01 00 14 00 50 00 00 00 00 00 00 00 00 .......P........ 0002 50 02 20 00 91 7C 00 00 P. ..|.. -005 63 c ###(053)=[passed] Test mysummary functions - Ether >>> p = Ether(dst="ff:ff:ff:ff:ff:ff", src="ff:ff:ff:ff:ff:ff", type=0x9000) >>> p >>> assert p.mysummary() in ['ff:ff:ff:ff:ff:ff > ff:ff:ff:ff:ff:ff (%s)' % loop ... for loop in ['0x9000', 'LOOP']] ###(054)=[passed] Test zerofree_randstring function >>> random.seed(0x2807) >>> zerofree_randstring(4) in [b"\xd2\x12\xe4\x5b", b'\xd3\x8b\x13\x12'] True ###(055)=[passed] Test strand function >>> assert strand(b"AC", b"BC") == b'@C' ###(056)=[passed] Test export_object and import_object functions >>> from unittest import mock >>> def test_export_import_object(): ... with ContextManagerCaptureOutput() as cmco: ... export_object(2807) ... result_export_object = cmco.get_output(eval_bytes=True) ... assert result_export_object.startswith("eNprYPL9zqUHAAdrAf8=") ... assert import_object(result_export_object) == 2807 ... >>> test_export_import_object() ###(057)=[passed] Test tex_escape function >>> tex_escape("$#_") == "\\$\\#\\_" True ###(058)=[passed] Test colgen function >>> f = colgen(range(3)) >>> assert len([next(f) for i in range(2)]) == 2 ###(059)=[passed] Test incremental_label function >>> f = incremental_label() >>> assert [next(f) for i in range(2)] == ["tag00000", "tag00001"] ###(060)=[passed] Test corrupt_* functions >>> import random >>> random.seed(0x2807) >>> assert corrupt_bytes("ABCDE") in [b"ABCDW", b"ABCDX"] >>> assert sane(corrupt_bytes("ABCDE", n=3)) in ["A.8D4", ".2.DE"] >>> >>> assert corrupt_bits("ABCDE") in [b"EBCDE", b"ABCDG"] >>> assert sane(corrupt_bits("ABCDE", n=3)) in ["AF.EE", "QB.TE"] ###(061)=[passed] Test save_object and load_object functions >>> import tempfile >>> fd, fname = tempfile.mkstemp() >>> save_object(fname, 2807) >>> assert load_object(fname) == 2807 ###(062)=[passed] Test whois function >>> if not WINDOWS: ... result = whois("193.0.6.139") ... assert b"inetnum" in result and b"Amsterdam" in result ... ###(063)=[passed] Test manuf DB methods >>> assert conf.manufdb._resolve_MAC("00:00:0F:01:02:03") == "Next:01:02:03" >>> assert conf.manufdb._get_short_manuf("00:00:0F:01:02:03") == "Next" >>> assert in6_addrtovendor("fe80::0200:0fff:fe01:0203").lower().startswith("next") >>> >>> assert conf.manufdb.lookup("00:00:0F:01:02:03") == ('Next', 'Next, Inc.') >>> assert "00:00:0F" in conf.manufdb.reverse_lookup("Next") ###(064)=[passed] Test multiple wireshark's manuf formats >>> new_format = """ ... 00:00:00 JokyIsland Joky Insland Corp SA ... 00:01:12 SecdevCorp Secdev Corporation SA LLC ... EE:05:01 Scapy Scapy CO LTD & CIE ... FF:00:11 NoName ... """ >>> old_format = """ ... 00:00:00 JokyIsland # Joky Insland Corp SA ... 00:01:12 SecdevCorp # Secdev Corporation SA LLC ... EE:05:01 Scapy # Scapy CO LTD & CIE ... FF:00:11 NoName ... """ >>> >>> manuf1 = get_temp_file() >>> manuf2 = get_temp_file() >>> >>> with open(manuf1, "w") as w: ... w.write(old_format) ... 167 >>> with open(manuf2, "w") as w: ... w.write(new_format) ... 164 >>> a = load_manuf(manuf1) >>> b = load_manuf(manuf2) >>> >>> assert a.lookup("00:00:00") == ('JokyIsland', 'Joky Insland Corp SA') >>> assert a.lookup("FF:00:11:00:00:00") == ('NoName', 'NoName') >>> assert a.reverse_lookup("Scapy") == {'EE:05:01': ('Scapy', 'Scapy CO LTD & CIE')} >>> assert a.reverse_lookup("Secdevcorp") == {'00:01:12': ('SecdevCorp', 'Secdev Corporation SA LLC')} >>> >>> >>> assert b.lookup("00:00:00") == ('JokyIsland', 'Joky Insland Corp SA') >>> assert b.lookup("FF:00:11:00:00:00") == ('NoName', 'NoName') >>> assert b.reverse_lookup("Scapy") == {'EE:05:01': ('Scapy', 'Scapy CO LTD & CIE')} >>> assert b.reverse_lookup("Secdevcorp") == {'00:01:12': ('SecdevCorp', 'Secdev Corporation SA LLC')} >>> >>> scapy_delete_temp_files() ###(065)=[passed] Test load_services >>> data_services = """ ... itu-bicc-stc 3097/sctp ... cvsup 5999/udp # CVSup ... x11 6000-6063/tcp # X Window System ... x11 6000-6063/udp # X Window System ... ndl-ahp-svc 6064/tcp # NDL-AHP-SVC ... """ >>> >>> services = get_temp_file() >>> with open(services, "w") as w: ... w.write(data_services) ... 165 >>> tcp, udp, sctp = load_services(services) >>> assert tcp[6002] == "x11" >>> assert tcp.ndl_ahp_svc == 6064 >>> assert tcp.x11 in range(6000, 6093) >>> assert udp[6002] == "x11" >>> assert udp.x11 in range(6000, 6093) >>> assert udp.cvsup == 5999 >>> assert sctp[3097] == "itu_bicc_stc" >>> assert sctp.itu_bicc_stc == 3097 >>> >>> scapy_delete_temp_files() ###(066)=[passed] Test utility functions - network related >>> assert atol("1.1.1.1") == 0x1010101 >>> assert atol("192.168.0.1") == 0xc0a80001 ###(067)=[passed] Test autorun functions >>> ret = autorun_get_text_interactive_session("IP().src") >>> ret (">>> IP().src\n'127.0.0.1'\n", '127.0.0.1') >>> assert ret == (">>> IP().src\n'127.0.0.1'\n", '127.0.0.1') >>> >>> ret = autorun_get_html_interactive_session("IP().src") >>> ret (">>> IP().src\n'127.0.0.1'\n", '127.0.0.1') >>> assert ret == (">>> IP().src\n'127.0.0.1'\n", '127.0.0.1') >>> >>> ret = autorun_get_latex_interactive_session("IP().src") >>> ret ("\\textcolor{blue}{{\\tt\\char62}{\\tt\\char62}{\\tt\\char62} }IP().src\n'127.0.0.1'\n", '127.0.0.1') >>> assert ret == ("\\textcolor{blue}{{\\tt\\char62}{\\tt\\char62}{\\tt\\char62} }IP().src\n'127.0.0.1'\n", '127.0.0.1') >>> >>> ret = autorun_get_text_interactive_session("scapy_undefined") >>> assert "NameError" in ret[0] ###(068)=[passed] Test autorun with logging >>> cmds = """log_runtime.info(hex_bytes("446166742050756e6b"))\n""" >>> ret = autorun_get_text_interactive_session(cmds) b'Daft Punk' >>> ret ('>>> log_runtime.info(hex_bytes("446166742050756e6b"))\nb\'Daft Punk\'\n', ("\\textcolor{blue}{{\\tt\\char62}{\\tt\\char62}{\\tt\\char62} }IP().src\n'127.0.0.1'\n", '127.0.0.1')) >>> assert "Daft Punk" in ret[0] ###(069)=[passed] Test utility TEX functions >>> assert tex_escape("{scapy}\\^$~#_&%|><") == "{\\tt\\char123}scapy{\\tt\\char125}{\\tt\\char92}\\^{}\\${\\tt\\char126}\\#\\_\\&\\%{\\tt\\char124}{\\tt\\char62}{\\tt\\char60}" >>> >>> a = colgen(1, 2, 3) >>> assert next(a) == (1, 2, 2) >>> assert next(a) == (1, 3, 3) >>> assert next(a) == (2, 2, 1) >>> assert next(a) == (2, 3, 2) >>> assert next(a) == (2, 1, 3) >>> assert next(a) == (3, 3, 1) >>> assert next(a) == (3, 1, 2) >>> assert next(a) == (3, 2, 3) ###(070)=[passed] Test config file functions >>> saved_conf_verb = conf.verb >>> fd, fname = tempfile.mkstemp() >>> os.write(fd, b"conf.verb = 42\n") 15 >>> os.close(fd) >>> from scapy.main import _read_config_file >>> _read_config_file(fname, globals(), locals()) >>> assert conf.verb == 42 >>> conf.verb = saved_conf_verb ###(071)=[passed] Test config file functions failures >>> from scapy.main import _read_config_file, _probe_config_folder >>> assert _read_config_file(_probe_config_folder("filethatdoesnotexistnorwillever.tsppajfsrdrr")) is None ###(072)=[passed] Test CacheInstance repr >>> conf.netcache arp_cache: 0 valid items. Timeout=120s in6_neighbor: 0 valid items. Timeout=120s dns_cache: 0 valid items. Timeout=300s dclocator: 0 valid items. Timeout=600s ###(073)=[passed] Test pyx detection functions >>> from unittest.mock import patch >>> >>> def _r(*args, **kwargs): ... raise OSError ... >>> with patch("scapy.libs.test_pyx.subprocess.check_call", _r): ... from scapy.libs.test_pyx import _test_pyx ... assert _test_pyx() == False ... ###(074)=[passed] Test matplotlib detection functions >>> from unittest.mock import MagicMock, patch >>> >>> bck_scapy_libs_matplot = sys.modules.get("scapy.libs.matplot", None) >>> if bck_scapy_libs_matplot: ... del sys.modules["scapy.libs.matplot"] ... >>> mock_matplotlib = MagicMock() >>> mock_matplotlib.get_backend.return_value = "inline" >>> mock_matplotlib.pyplot = MagicMock() >>> mock_matplotlib.pyplot.plt = None >>> with patch.dict("sys.modules", **{ "matplotlib": mock_matplotlib, "matplotlib.lines": mock_matplotlib}): ... from scapy.libs.matplot import MATPLOTLIB, MATPLOTLIB_INLINED, MATPLOTLIB_DEFAULT_PLOT_KARGS, Line2D ... assert MATPLOTLIB == 1 ... assert MATPLOTLIB_INLINED == 1 ... assert "marker" in MATPLOTLIB_DEFAULT_PLOT_KARGS ... >>> mock_matplotlib.get_backend.return_value = "ko" >>> with patch.dict("sys.modules", **{ "matplotlib": mock_matplotlib, "matplotlib.lines": mock_matplotlib}): ... from scapy.libs.matplot import MATPLOTLIB, MATPLOTLIB_INLINED, MATPLOTLIB_DEFAULT_PLOT_KARGS ... assert MATPLOTLIB == 1 ... assert MATPLOTLIB_INLINED == 0 ... assert "marker" in MATPLOTLIB_DEFAULT_PLOT_KARGS ... >>> if bck_scapy_libs_matplot: ... sys.modules["scapy.libs.matplot"] = bck_scapy_libs_matplot ... ###### ## Basic tests ###### Those test are here mainly to check nothing has been broken and to catch Exceptions ###(075)=[passed] Packet class methods >>> p = IP()/ICMP() >>> ret = p.do_build_ps() >>> assert ret[0] == b"@\x00\x00\x00\x00\x01\x00\x00@\x01\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\x00\x00\x00\x00\x00\x00" >>> assert len(ret[1]) == 2 >>> >>> assert p[ICMP].firstlayer() == p >>> >>> assert p.command() == "IP()/ICMP()" >>> >>> p.decode_payload_as(UDP) >>> assert p.sport == 2048 and p.dport == 63487 ###(076)=[passed] hide_defaults >>> conf_color_theme = conf.color_theme >>> conf.color_theme = BlackAndWhite() >>> p = IP(ttl=64)/ICMP() >>> assert repr(p) in [">", ">"] >>> p.hide_defaults() >>> assert repr(p) in [">", ">"] >>> conf.color_theme = conf_color_theme ###(077)=[passed] split_layers >>> p = IP()/ICMP() >>> s = raw(p) >>> split_layers(IP, ICMP, proto=1) >>> assert Raw in IP(s) >>> bind_layers(IP, ICMP, frag=0, proto=1) ###(078)=[passed] fuzz >>> r = fuzz(IP(tos=2)/ICMP()) >>> assert r.tos == 2 >>> z = r.ttl >>> assert r.ttl != z >>> assert r.ttl != z ###(079)=[passed] fuzz a Packet with MultipleTypeField >>> fuzz(ARP(pdst="127.0.0.1")) >>> fuzz(IP()/ARP(pdst='10.0.0.254')) > ###(080)=[passed] fuzz on packets with advanced RandNum >>> x = IP(dst="8.8.8.8")/fuzz(UDP()/NTP(version=4)) >>> x.show2() ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 76 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x2f7b src = 192.168.122.109 dst = 8.8.8.8 \options \ ###[ UDP ]### sport = ntp dport = ntp len = 56 chksum = 0x88c3 ###[ NTPHeader ]### leap = last minute of the day has 59 seconds version = 4 mode = client stratum = 23 poll = 39 precision = -31 delay = 57838.5561 dispersion= 16251.1583 id = 49.102.55.165 ref = 38044154.444068995 orig = Sun, 08 Dec 2024 01:41:56 +0000 recv = Sat, 08 Feb 2031 00:51:46 +0000 sent = Sun, 08 Dec 2024 01:41:56 +0000 >>> x = IP(raw(x)) >>> assert NTP in x ###(081)=[passed] fuzz on packets with FlagsField >>> assert isinstance(fuzz(TCP()).flags, VolatileValue) ###(082)=[passed] Building some packets >>> IP()/TCP() > >>> Ether()/IP()/UDP()/NTP() >>> >>> Dot11()/LLC()/SNAP()/IP()/TCP()/"XXX" >>>>> >>> IP(ttl=25)/TCP(sport=12, dport=42) > >>> IP().summary() '127.0.0.1 > 127.0.0.1 hopopt' ###(083)=[passed] Manipulating some packets >>> a=IP(ttl=4)/TCP() >>> a.ttl 4 >>> a.ttl=10 >>> del a.ttl >>> a.ttl 64 >>> TCP in a True >>> a[TCP] >>> a[TCP].dport=[80,443] >>> a > >>> assert a.copy().time == a.time >>> a=3 ###(084)=[passed] Bind string array as payload >>> assert bytes(Raw("sca")/"py") == b"scapy" >>> assert bytes(Raw("sca")/b"py") == b"scapy" >>> assert bytes(Raw("sca")/bytearray(b"py")) == b"scapy" >>> assert bytes("sca"/Raw("py")) == b"scapy" >>> assert bytes(b"sca"/Raw("py")) == b"scapy" >>> assert bytes(bytearray(b"sca")/Raw("py")) == b"scapy" >>> a=Raw("sca") >>> a.add_payload("py") >>> assert bytes(a) == b"scapy" >>> a=Raw("sca") >>> a.add_payload(b"py") >>> assert bytes(a) == b"scapy" >>> a=Raw("sca") >>> a.add_payload(bytearray(b"py")) >>> assert bytes(a) == b"scapy" ###(085)=[passed] Checking overloads >>> a=Ether()/IP()/TCP() >>> r = a.proto >>> r 6 >>> r == 6 True ###(086)=[passed] sprintf() function >>> a=Ether()/IP()/IP(ttl=4)/UDP()/NTP() >>> r = a.sprintf("%type% %IP.ttl% %#05xr,UDP.sport% %IP:2.ttl%") >>> r 'IPv4 64 0x07b 4' >>> r in ['0x800 64 0x07b 4', 'IPv4 64 0x07b 4'] True ###(087)=[passed] sprintf() function This test is on the conditional substring feature of sprintf() >>> a=Dot11()/LLC()/SNAP()/IP()/TCP() >>> r = a.sprintf("{IP:{TCP:flags=%TCP.flags%}{UDP:port=%UDP.ports%} %IP.src%}") >>> r 'flags=S 127.0.0.1' >>> r == 'flags=S 127.0.0.1' True ###(088)=[passed] haslayer function >>> x=IP(id=1)/ISAKMP_payload_SA(prop=ISAKMP_payload_SA(prop=IP()/ICMP()))/TCP() >>> r = (TCP in x, ICMP in x, IP in x, UDP in x) >>> r (True, True, True, False) >>> r == (True,True,True,False) True ###(089)=[passed] getlayer function >>> x=IP(id=1)/ISAKMP_payload_SA(prop=IP(id=2)/UDP(dport=1))/IP(id=3)/UDP(dport=2) >>> x[IP] > |>>> >>> x[IP:2] > >>> x[IP:3] > >>> x.getlayer(IP,3) > >>> x.getlayer(IP,4) >>> x[UDP] >>> x[UDP:1] >>> x[UDP:2] >>> assert(x[IP].id == 1 and x[IP:2].id == 2 and x[IP:3].id == 3 and ... x.getlayer(IP).id == 1 and x.getlayer(IP,3).id == 3 and ... x.getlayer(IP,4) == None and ... x[UDP].dport == 1 and x[UDP:2].dport == 2) >>> try: ... x[IP:4] ... except IndexError: ... True ... else: ... False ... True ###(090)=[passed] getlayer / haslayer with name >>> x = IP() / ICMP() / IPerror() >>> assert x.getlayer(ICMP) is not None >>> assert x.getlayer(IPerror) is not None >>> assert x.getlayer("IP in ICMP") is not None >>> assert x.getlayer(TCPerror) is None >>> assert x.getlayer("TCP in ICMP") is None >>> assert x.haslayer(ICMP) >>> assert x.haslayer(IPerror) >>> assert x.haslayer("IP in ICMP") >>> assert not x.haslayer(TCPerror) >>> assert not x.haslayer("TCP in ICMP") ###(091)=[passed] getlayer with a filter >>> pkt = IP() / IP(ttl=3) / IP() >>> assert pkt[IP::{"ttl":3}].ttl == 3 >>> assert pkt.getlayer(IP, ttl=3).ttl == 3 >>> assert IPv6ExtHdrHopByHop(options=[HBHOptUnknown()]).getlayer(HBHOptUnknown, otype=42) is None ###(092)=[passed] specific haslayer and getlayer implementations for EAP >>> pkt = Ether() / EAPOL() / EAP_MD5() >>> assert EAP in pkt >>> assert pkt.haslayer(EAP) >>> assert isinstance(pkt[EAP], EAP_MD5) >>> assert isinstance(pkt.getlayer(EAP), EAP_MD5) ###(093)=[passed] specific haslayer and getlayer implementations for RadiusAttribute >>> pkt = RadiusAttr_EAP_Message() >>> assert RadiusAttribute in pkt >>> assert pkt.haslayer(RadiusAttribute) >>> assert isinstance(pkt[RadiusAttribute], RadiusAttr_EAP_Message) >>> assert isinstance(pkt.getlayer(RadiusAttribute), RadiusAttr_EAP_Message) ###(094)=[passed] equality >>> w=Ether()/IP()/UDP(dport=53) >>> x=Ether()/IP(version=4)/UDP() >>> y=Ether()/IP()/UDP(dport=4) >>> z=Ether()/IP()/UDP()/NTP() >>> t=Ether()/IP()/TCP() >>> assert x != y and x != z and x != t and y != z and y != t and z != t and w == x ###(095)=[passed] answers >>> a1, a2 = "1.2.3.4", "5.6.7.8" >>> p1 = IP(src=a1, dst=a2)/ICMP(type=8) >>> p2 = IP(src=a2, dst=a1)/ICMP(type=0) >>> assert p1.hashret() == p2.hashret() >>> assert not p1.answers(p2) >>> assert p2.answers(p1) >>> assert p1 > p2 >>> assert p2 < p1 >>> assert p1 == p1 >>> conf_back = conf.checkIPinIP >>> conf.checkIPinIP = True >>> px = [IP()/p1, IPv6()/p1] >>> assert not any(p.hashret() == p2.hashret() for p in px) >>> assert not any(p.answers(p2) for p in px) >>> assert not any(p2.answers(p) for p in px) >>> conf.checkIPinIP = False >>> assert all(p.hashret() == p2.hashret() for p in px) >>> assert not any(p.answers(p2) for p in px) >>> assert all(p2.answers(p) for p in px) >>> conf.checkIPinIP = conf_back ###(096)=[passed] answers - Net >>> a1, a2 = Net("www.google.com"), Net("www.secdev.org") >>> prt1, prt2 = 12345, 54321 >>> s1, s2 = 2767216324, 3845532842 >>> p1 = IP(src=a1, dst=a2)/TCP(flags='SA', seq=s1, ack=s2, sport=prt1, dport=prt2) >>> p2 = IP(src=a2, dst=a1)/TCP(flags='R', seq=s2, ack=0, sport=prt2, dport=prt1) >>> assert p2.answers(p1) >>> assert not p1.answers(p2) >>> p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2) >>> p2 = IP(src=a2, dst=a1)/TCP(flags='RA', seq=0, ack=s1+1, sport=prt2, dport=prt1) >>> assert p2.answers(p1) >>> assert not p1.answers(p2) >>> p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2) >>> p2 = IP(src=a2, dst=a1)/TCP(flags='SA', seq=s2, ack=s1+1, sport=prt2, dport=prt1) >>> assert p2.answers(p1) >>> assert not p1.answers(p2) >>> p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1, ack=s2+1, sport=prt1, dport=prt2) >>> assert not p2.answers(p1) >>> assert p1.answers(p2) >>> p1 = IP(src=a1, dst=a2)/TCP(flags='S', seq=s1, ack=0, sport=prt1, dport=prt2) >>> p2 = IP(src=a2, dst=a1)/TCP(flags='SA', seq=s2, ack=s1+10, sport=prt2, dport=prt1) >>> assert not p2.answers(p1) >>> assert not p1.answers(p2) >>> p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1, ack=s2+1, sport=prt1, dport=prt2) >>> assert not p2.answers(p1) >>> assert not p1.answers(p2) >>> p1 = IP(src=a1, dst=a2)/TCP(flags='A', seq=s1+9, ack=s2+10, sport=prt1, dport=prt2) >>> assert not p2.answers(p1) >>> assert not p1.answers(p2) ###(097)=[passed] conf.checkIPsrc >>> conf_checkIPsrc = conf.checkIPsrc >>> conf.checkIPsrc = 0 >>> query = IP(id=42676, src='10.128.0.7', dst='192.168.0.1')/ICMP(id=26) >>> answer = IP(src='192.168.48.19', dst='10.128.0.7')/ICMP(type=11)/IPerror(id=42676, src='192.168.51.23', dst='192.168.0.1')/ICMPerror(id=26) >>> assert answer.answers(query) >>> conf.checkIPsrc = conf_checkIPsrc ###### ## command() / json() tests ###### ###(098)=[passed] Test command() with normal packet >>> pkt = IP(dst="127.0.0.1", src="127.0.0.1") / UDP(dport=12345, sport=654) >>> assert pkt.command() == "IP(src='127.0.0.1', dst='127.0.0.1')/UDP(sport=654, dport=12345)" ###(099)=[passed] Test json() with normal packet >>> assert pkt.json() == '{"version": 4, "ihl": null, "tos": 0, "len": null, "id": 1, "flags": 0, "frag": 0, "ttl": 64, "proto": 17, "chksum": null, "src": "127.0.0.1", "dst": "127.0.0.1", "payload": {"sport": 654, "dport": 12345, "len": null, "chksum": null}}' ###(100)=[passed] Test command() with nested packet >>> pkt = DNS(qd=[DNSQR(qtype="A", qname="google.com")]) >>> assert pkt.command() == "DNS(qd=[DNSQR(qname=b'google.com.', qtype=1)])" ###(101)=[passed] Test json() with nested packet >>> assert pkt.json() == '{"length": null, "id": 0, "qr": 0, "opcode": 0, "aa": 0, "tc": 0, "rd": 1, "ra": 0, "z": 0, "ad": 0, "cd": 0, "rcode": 0, "qdcount": null, "ancount": null, "nscount": null, "arcount": null, "qd": [{"qname": "google.com.", "qtype": 1, "unicastresponse": 0, "qclass": 1}]}' ###(102)=[passed] Test command() with ASN.1 packet >>> pkt = KRB_AP_REP(bytes(KRB_AP_REP(encPart=EncryptedData()))) >>> assert pkt.command() == "KRB_AP_REP(pvno=ASN1_INTEGER(5), msgType=ASN1_INTEGER(15), encPart=EncryptedData(etype=ASN1_INTEGER(23), kvno=None, cipher=ASN1_STRING(b'')))" ###(103)=[passed] Test json(à with ASN.1 packet >>> assert pkt.json() == '{"pvno": {"type": "ASN1_INTEGER", "value": "5"}, "msgType": {"type": "ASN1_INTEGER", "value": "15"}, "encPart": {"etype": {"type": "ASN1_INTEGER", "value": "23"}, "kvno": null, "cipher": {"type": "ASN1_STRING", "value": ""}}}' ###(104)=[passed] Test command() with meaningless payload >>> pkt = PPTPStartControlConnectionReply() / IP(dst="127.0.0.1", src="127.0.0.1") >>> assert pkt.command() == "PPTPStartControlConnectionReply()/IP(src='127.0.0.1', dst='127.0.0.1')" ###(105)=[passed] Test json() with meaningless payload >>> assert pkt.json() == '{"len": 156, "type": 1, "magic_cookie": 439041101, "ctrl_msg_type": 2, "reserved_0": 0, "protocol_version": 256, "result_code": 1, "error_code": 0, "framing_capabilities": 0, "bearer_capabilities": 0, "maximum_channels": 65535, "firmware_revision": 256, "host_name": "linux", "vendor_string": "", "payload": {"version": 4, "ihl": null, "tos": 0, "len": null, "id": 1, "flags": 0, "frag": 0, "ttl": 64, "proto": 0, "chksum": null, "src": "127.0.0.1", "dst": "127.0.0.1"}}' ###### ## Tests on padding ###### ###(106)=[passed] Padding assembly >>> r = raw(Padding("abc")) >>> r b'abc' >>> assert r == b"abc" >>> r = raw(Padding("abc")/Padding("def")) >>> r b'abcdef' >>> assert r == b"abcdef" >>> r = raw(Raw("ABC")/Padding("abc")/Padding("def")) >>> r b'ABCabcdef' >>> assert r == b"ABCabcdef" >>> r = raw(Raw("ABC")/Padding("abc")/Raw("DEF")/Padding("def")) >>> r b'ABCDEFabcdef' >>> assert r == b"ABCDEFabcdef" ###(107)=[passed] Padding and length computation >>> p = IP(raw(IP()/Padding("abc"))) >>> p > >>> assert p.len == 20 and len(p) == 23 >>> p = IP(raw(IP()/Raw("ABC")/Padding("abc"))) >>> p >> >>> assert p.len == 23 and len(p) == 26 >>> p = IP(raw(IP()/Raw("ABC")/Padding("abc")/Padding("def"))) >>> p >> >>> assert p.len == 23 and len(p) == 29 ###(108)=[passed] PadField test >>> class TestPad(Packet): ... fields_desc = [ PadField(StrNullField("st", b""), 6, padwith=b"\xff"), StrField("id", b"")] ... >>> assert TestPad() == TestPad(raw(TestPad())) >>> assert raw(TestPad(st=b"st", id=b"id")) == b'st\x00\xff\xff\xffid' ###(109)=[passed] ReversePadField >>> class TestReversePad(Packet): ... fields_desc = [ ByteField("a", 0), ... ReversePadField(IntField("b", 0), 4)] ... >>> assert raw(TestReversePad(a=1, b=0xffffffff)) == b'\x01\x00\x00\x00\xff\xff\xff\xff' >>> assert TestReversePad(raw(TestReversePad(a=1, b=0xffffffff))).b == 0xffffffff ###### ## Tests on default value changes mechanism ###### ###(110)=[passed] Creation of an IPv3 class from IP class with different default values >>> class IPv3(IP): ... version = 3 ... ttl = 32 ... ###(111)=[passed] Test of IPv3 class >>> a = IPv3() >>> v,t = a.version, a.ttl >>> v,t (3, 32) >>> assert (v,t) == (3,32) >>> r = raw(a) >>> r b'5\x00\x00\x14\x00\x01\x00\x00 \x00\xac\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01' >>> assert r == b'5\x00\x00\x14\x00\x01\x00\x00 \x00\xac\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01' ###### ## ASN.1 tests ###### ###(112)=[passed] ASN1 - ASN1_Object >>> assert ASN1_Object(1) == ASN1_Object(1) >>> assert ASN1_Object(1) > ASN1_Object(0) >>> assert ASN1_Object(1) >= ASN1_Object(1) >>> assert ASN1_Object(0) < ASN1_Object(1) >>> assert ASN1_Object(1) <= ASN1_Object(2) >>> assert ASN1_Object(1) != ASN1_Object(2) >>> ASN1_Object(2).show() ###(113)=[passed] ASN1 - RandASN1Object >>> a = RandASN1Object() >>> random.seed(0x2807) >>> o = bytes(a) >>> o b'F\x02\xfe\x92' >>> assert o in [ ... b'\x1e\x023V', # PyPy 2.7 ... b'A\x02\x07q', # Python 2.7 ... b'F\x02\xfe\x92', # python 3.7-3.9 ... ] ###(114)=[passed] ASN1 - ASN1_BIT_STRING >>> a = ASN1_BIT_STRING("test", readable=True) >>> a >>> assert a.val == '01110100011001010111001101110100' >>> assert raw(a) == b'\x03\x05\x00test' >>> >>> a = ASN1_BIT_STRING(b"\xff"*16, readable=True) >>> a >>> assert a.val == "1" * 128 >>> assert raw(a) == b'\x03\x11\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' ###(115)=[passed] ASN1 - ASN1_SEQUENCE >>> a = ASN1_SEQUENCE([ASN1_Object(1), ASN1_Object(0)]) >>> assert a.strshow() == '# ASN1_SEQUENCE:\n \n \n' ###(116)=[passed] ASN1 - ASN1_DECODING_ERROR >>> a = ASN1_DECODING_ERROR("error", exc=OSError(1)) >>> assert repr(a) == "" >>> b = ASN1_DECODING_ERROR("error", exc=OSError(ASN1_BIT_STRING("0"))) >>> assert repr(b) in ["}}>", ... "}}>"] ###(117)=[passed] ASN1 - ASN1_INTEGER >>> a = ASN1_INTEGER(int("1"*23)) >>> assert repr(a) in ["0x25a55a46e5da99c71c7 ", ... "0x25a55a46e5da99c71c7 "] ###(118)=[passed] ASN1 - ASN1_OID >>> assert raw(ASN1_OID("")) == b"\x06\x00" ###(119)=[passed] RandASN1Object(), specific crashes >>> import random >>> >>> random.seed(1514315682) >>> raw(RandASN1Object()) b"@\x04\x85'\xa3\xae" >>> >>> random.seed(1240186058) >>> raw(RandASN1Object()) b'\x13\x14xUafcbZJKIMaAdaVV3ma' >>> >>> random.seed(1873503288) >>> raw(RandASN1Object()) b'\x17\x0f20241208014156Z' ###(120)=[passed] SSID is parsed properly even with the presence of RSN Information >>> filename = scapy_path("/test/pcaps/bad_rsn_parsing_overrides_ssid.pcap") >>> frame = rdpcap(filename)[0] >>> beacon = frame.getlayer(5) >>> ssid = beacon.network_stats()['ssid'] >>> assert ssid == "ROUTE-821E295" ###(121)=[passed] SSID is parsed properly even when the Country Information Tag Element has an odd length (not complying with the standard) and a missing pad byte >>> from io import BytesIO >>> pcapfile = BytesIO(b'\n\r\r\n\x80\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x03\x00\x10\x00Linux 6.1.21-v8+\x04\x00E\x00Dumpcap (Wireshark) 3.4.10 (Git v3.4.10 packaged as 3.4.10-0+deb11u1)\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x01\x00\x00\x00@\x00\x00\x00\x7f\x00\x00\x00\x00\x04\x00\x00\x02\x00\x05\x00wifi2\x00\x00\x00\t\x00\x01\x00\t\x00\x00\x00\x0c\x00\x10\x00Linux 6.1.21-v8+\x00\x00\x00\x00@\x00\x00\x00\x06\x00\x00\x00\xb0\x01\x00\x00\x00\x00\x00\x00c\xd3\x87\x17\xe3c5\x82\x90\x01\x00\x00\x90\x01\x00\x00\x00\x00 \x00\xae@\x00\xa0 \x08\x00\xa0 \x08\x00\x00\x10\x0cd\x14@\x01\xa9\x00\x0c\x00\x00\x00\xa6\x00\xa8\x01\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x02\xbf\xaf\x9f\xf8\x07\x02\xbf\xaf\x9f\xf8\x070\x96[p\xdcM\x06\x00\x00\x00d\x00\x11\x00\x00\x00\x01\x08\x8c\x12\x98$\xb0H`l\x03\x01,\x05\x04\x00\x01\x00\x00\x07QUS \x01\r\x80$\x01\x80(\x01\x80,\x01\x800\x01\x804\x01\x808\x01\x80<\x01\x80@\x01\x80d\x01\x80h\x01\x80l\x01\x80p\x01\x80t\x01\x80x\x01\x80|\x01\x80\x80\x01\x80\x84\x01\x80\x88\x01\x80\x8c\x01\x80\x90\x01\x80\x95\x01\x80\x99\x01\x80\x9d\x01\x80\xa1\x01\x80\xa5\x01\x800\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x02\x0c\x00;\x02s\x00-\x1a,\t\x13\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00,\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x16,\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x18\x00P\xf2\x02\x01\x01\x81\x00\x03\xa4\x00\x00\'\xa4\x00\x00BC]\x00a\x11.\x00\xdd;\x00P\xf2\x04\x10J\x00\x01\x10\x10D\x00\x01\x02\x10I\x00\x06\x007*\x00\x01 \x10\x11\x00\x1358" Hisense Roku TV\x10T\x00\x08\x00\x07\x00P\xf2\x04\x00\x01\xdd\x16\xc8:k\x01\x01\x1048<@dhlptx|\x80\x84\x88\x8c\x90\xdd\x12Po\x9a\t\x02\x02\x00!\x0b\x03\x06\x00\x02\xbf\xaf\x9f\xf8\x07\xdd\rPo\x9a\n\x00\x00\x06\x01\x11\x1cD\x002\xf5N\xfbh\xb0\x01\x00\x00') >>> pktpcap = rdpcap(pcapfile) >>> frame = pktpcap[0] >>> beacon = frame.getlayer(4) >>> stats = beacon.network_stats() >>> ssid = stats['ssid'] >>> assert ssid == "" >>> country = stats['country'] >>> assert country == 'US' ###### ## Network tests ###### Those tests need network access ###(126)=[passed] Test sniffing with AsyncSniffer on failed >>> try: ... sniffer = AsyncSniffer(iface="this_interface_does_not_exists") ... sniffer.start() ... sniffer.join() ... assert False, "Should have errored by now" ... except ValueError: ... assert True ... ###(129)=[passed] test chainEX >>> import socket >>> sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) >>> ssck = StreamSocket(sck) >>> >>> try: ... r = ssck.sr1(ICMP(type='echo-request'), timeout=0.1, chainEX=True, threaded=False) ... assert False ... except Exception: ... assert True ... finally: ... sck.close() ... ###(131)=[passed] Whois request This test retries on failure because it often fails >>> def _test(): ... IP(src="8.8.8.8").whois() ... >>> retry_test(_test) % The RIPE Database is subject to Terms and Conditions. % See https://docs.db.ripe.net/terms-conditions.html % Note: this output has been filtered. % To receive output for a database update, use the "-B" flag. % Information related to '6.0.0.0 - 9.134.255.255' % No abuse contact registered for 6.0.0.0 - 9.134.255.255 inetnum: 6.0.0.0 - 9.134.255.255 netname: NON-RIPE-NCC-MANAGED-ADDRESS-BLOCK descr: IPv4 address block not managed by the RIPE NCC country: EU # Country is really world wide admin-c: IANA1-RIPE tech-c: IANA1-RIPE status: ALLOCATED UNSPECIFIED mnt-by: RIPE-NCC-HM-MNT created: 2024-06-17T13:25:47Z last-modified: 2024-06-17T13:25:47Z source: RIPE role: Internet Assigned Numbers Authority address: see http://www.iana.org. admin-c: IANA1-RIPE tech-c: IANA1-RIPE nic-hdl: IANA1-RIPE mnt-by: RIPE-NCC-MNT created: 1970-01-01T00:00:00Z last-modified: 2001-09-22T09:31:27Z source: RIPE # Filtered % This query was served by the RIPE Database Query Service version 1.114 (SHETLAND) ###(132)=[passed] AS resolvers This test retries on failure because it often fails >>> def _test(): ... ret = conf.AS_resolver.resolve("8.8.8.8", "8.8.4.4") ... assert (len(ret) == 2) ... assert any(x[1] == "AS15169" for x in ret) ... >>> retry_test(_test) >>> >>> riswhois_data = b"route: 8.8.8.0/24\ndescr: Google\norigin: AS15169\nnotify: radb-contact@google.com\nmnt-by: MAINT-AS15169\nchanged: radb-contact@google.com 20150728\nsource: RADB\n\nroute: 8.0.0.0/9\ndescr: Proxy-registered route object\norigin: AS3356\nremarks: auto-generated route object\nremarks: this next line gives the robot something to recognize\nremarks: L'enfer, c'est les autres\nremarks: \nremarks: This route object is for a Level 3 customer route\nremarks: which is being exported under this origin AS.\nremarks: \nremarks: This route object was created because no existing\nremarks: route object with the same origin was found, and\nremarks: since some Level 3 peers filter based on these objects\nremarks: this route may be rejected if this object is not created.\nremarks: \nremarks: Please contact routing@Level3.net if you have any\nremarks: questions regarding this object.\nmnt-by: LEVEL3-MNT\nchanged: roy@Level3.net 20060203\nsource: LEVEL3\n\n\n" >>> >>> ret = AS_resolver_riswhois()._parse_whois(riswhois_data) >>> assert ret == ('AS15169', 'Google') >>> >>> retry_test(_test) >>> >>> >>> cymru_bulk_data = """ ... Bulk mode; whois.cymru.com [2017-10-03 08:38:08 +0000] ... 24776 | 217.25.178.5 | INFOCLIP-AS, FR ... 36459 | 192.30.253.112 | GITHUB - GitHub, Inc., US ... 26496 | 68.178.213.61 | AS-26496-GO-DADDY-COM-LLC - GoDaddy.com, LLC, US ... """ >>> tmp = AS_resolver_cymru().parse(cymru_bulk_data) >>> assert len(tmp) == 3 >>> assert [l[1] for l in tmp] == ['AS24776', 'AS36459', 'AS26496'] ###(133)=[passed] AS resolver - IPv6 This test retries on failure because it often fails >>> def _test(): ... as_resolver6 = AS_resolver6() ... ret = as_resolver6.resolve("2001:4860:4860::8888", "2001:4860:4860::4444") ... assert (len(ret) == 2) ... assert any(x[1] == 15169 for x in ret) ... >>> retry_test(_test) ###(134)=[passed] AS resolver - socket error This test checks that a failing resolver will not crash a script >>> class MockAS_resolver(object): ... def resolve(self, *ips): ... raise socket.error ... >>> asrm = AS_resolver_multi(MockAS_resolver()) >>> assert len(asrm.resolve(["8.8.8.8", "8.8.4.4"])) == 0 ###(135)=[passed] sendpfast >>> old_interactive = conf.interactive >>> conf.interactive = False >>> try: ... sendpfast([]) ... assert False ... except Exception: ... assert True ... PcapWriter: unknown LL type for NoneType. Using type 1 (Ethernet) Could not execute tcpreplay, is it installed? Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/sendrecv.py", line 586, in sendpfast cmd = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) File "/usr/lib64/python3.13/subprocess.py", line 1036, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pass_fds, cwd, env, ^^^^^^^^^^^^^^^^^^^ ...<5 lines>... gid, gids, uid, umask, ^^^^^^^^^^^^^^^^^^^^^^ start_new_session, process_group) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib64/python3.13/subprocess.py", line 1966, in _execute_child raise child_exception_type(errno_num, err_msg, err_filename) FileNotFoundError: [Errno 2] No such file or directory: 'tcpreplay' >>> conf.interactive = old_interactive >>> assert True ###### ## Generator tests ###### ###(136)=[passed] Implicit logic 1 >>> a = Ether() / IP(ttl=(5, 10)) / TCP(dport=[80, 443]) >>> ls(a) dst : DestMACField = None ('None') src : SourceMACField = '00:00:00:00:00:00' ('None') type : XShortEnumField = 2048 ('36864') -- version : BitField (4 bits) = 4 ('4') ihl : BitField (4 bits) = None ('None') tos : XByteField = 0 ('0') len : ShortField = None ('None') id : ShortField = 1 ('1') flags : FlagsField = ('') frag : BitField (13 bits) = 0 ('0') ttl : ByteField = (5, 10) ('64') proto : ByteEnumField = 6 ('0') chksum : XShortField = None ('None') src : SourceIPField = '127.0.0.1' ('None') dst : DestIPField = '127.0.0.1' ('None') options : PacketListField = [] ('[]') -- sport : ShortEnumField = 20 ('20') dport : ShortEnumField = [80, 443] ('80') seq : IntField = 0 ('0') ack : IntField = 0 ('0') dataofs : BitField (4 bits) = None ('None') reserved : BitField (3 bits) = 0 ('0') flags : FlagsField = ('') window : ShortField = 8192 ('8192') chksum : XShortField = None ('None') urgptr : ShortField = 0 ('0') options : TCPOptionsField = [] ("b''") >>> ls(a, verbose=True) dst : DestMACField = None ('None') src : SourceMACField = '00:00:00:00:00:00' ('None') type : XShortEnumField = 2048 ('36864') IPv4: 2048 X25: 2053 ARP: 2054 FR_ARP: 2056 BPQ: 2303 DEC: 24576 DNA_DL: 24577 DNA_RC: 24578 DNA_RT: 24579 LAT: 24580 DIAG: 24581 CUST: 24582 SCA: 24583 TEB: 25944 RAW_FR: 25945 RARP: 32821 ATALK: 32923 AARP: 33011 n_802_1Q: 33024 IPX: 33079 NetBEUI: 33169 IPv6: 34525 PPP: 34827 ATMMPOA: 34892 PPP_DISC: 34915 PPP_SES: 34916 ATMFATE: 34948 802_1AD: 34984 802_1AE: 35045 802_1AH: 35047 LOOP: 36864 -- version : BitField (4 bits) = 4 ('4') ihl : BitField (4 bits) = None ('None') tos : XByteField = 0 ('0') len : ShortField = None ('None') id : ShortField = 1 ('1') flags : FlagsField = ('') frag : BitField (13 bits) = 0 ('0') ttl : ByteField = (5, 10) ('64') proto : ByteEnumField = 6 ('0') chksum : XShortField = None ('None') src : SourceIPField = '127.0.0.1' ('None') dst : DestIPField = '127.0.0.1' ('None') options : PacketListField = [] ('[]') -- sport : ShortEnumField = 20 ('20') dport : ShortEnumField = [80, 443] ('80') seq : IntField = 0 ('0') ack : IntField = 0 ('0') dataofs : BitField (4 bits) = None ('None') reserved : BitField (3 bits) = 0 ('0') flags : FlagsField = ('') window : ShortField = 8192 ('8192') chksum : XShortField = None ('None') urgptr : ShortField = 0 ('0') options : TCPOptionsField = [] ("b''") >>> l = [p for p in a] >>> len(l) == 12 True ###(137)=[passed] Implicit logic 2 >>> a = IP(ttl=[1,2,(5,9)]) >>> ls(a) version : BitField (4 bits) = 4 ('4') ihl : BitField (4 bits) = None ('None') tos : XByteField = 0 ('0') len : ShortField = None ('None') id : ShortField = 1 ('1') flags : FlagsField = ('') frag : BitField (13 bits) = 0 ('0') ttl : ByteField = [1, 2, (5, 9)] ('64') proto : ByteEnumField = 0 ('0') chksum : XShortField = None ('None') src : SourceIPField = '127.0.0.1' ('None') dst : DestIPField = '127.0.0.1' ('None') options : PacketListField = [] ('[]') >>> ls(a, verbose=True) version : BitField (4 bits) = 4 ('4') ihl : BitField (4 bits) = None ('None') tos : XByteField = 0 ('0') len : ShortField = None ('None') id : ShortField = 1 ('1') flags : FlagsField = ('') MF, DF, evil frag : BitField (13 bits) = 0 ('0') ttl : ByteField = [1, 2, (5, 9)] ('64') proto : ByteEnumField = 0 ('0') chksum : XShortField = None ('None') src : SourceIPField = '127.0.0.1' ('None') dst : DestIPField = '127.0.0.1' ('None') options : PacketListField = [] ('[]') >>> l = [p for p in a] >>> len(l) == 7 True ###(138)=[passed] Implicit logic 3 >>> a = Ether()/IP(src="127.0.0.1", dst="127.0.0.1")/ICMP() >>> for i in a: ... i.sent_time = 1 ... >>> assert a.sent_time is None >>> >>> a = Ether()/IP(src="127.0.0.1", dst="127.0.0.1")/ICMP(seq=(0, 5)) >>> for i in a: ... i.sent_time = 1 ... >>> assert a.sent_time is None ###### ## Real usages ###### ###(145)=[passed] sniff() with socket failure GH issue 3631 >>> REFPACKET = Ether()/IP()/UDP() >>> >>> class OOPipe(ObjectPipe): ... def recv(self, x=MTU): ... self.i = getattr(self, "i", 0) + 1 ... if self.i == 11: ... self.close() ... raise OSError("Giant failure") ... pkt = super(OOPipe, self).recv(x) ... self.send(REFPACKET) ... return pkt ... >>> o = OOPipe() >>> o.send(REFPACKET) 1 >>> >>> pkts = sniff(opened_socket=[o], timeout=3) Socket failed with 'Giant failure'. It was closed. >>> assert len(pkts) == 10 ###(147)=[passed] Test SuperSocket.select >>> from unittest import mock >>> >>> @mock.patch("scapy.supersocket.select") ... def _test_select(select): ... def f(a, b, c, d): ... raise IOError(0) ... select.side_effect = f ... try: ... SuperSocket.select([]) ... return False ... except: ... return True ... >>> assert _test_select() ###(148)=[passed] Test L2ListenTcpdump socket >>> True True ###### ## ManuFDB tests ###### ###(153)=[passed] __repr__ >>> if conf.manufdb: ... len(conf.manufdb) ... else: ... True ... 50825 ###(154)=[passed] check _resolve_MAC >>> if conf.manufdb: ... assert conf.manufdb._resolve_MAC("00:00:17") == "Oracle" ... else: ... True ... ###### ## pcap / pcapng format support ###### ###(156)=[passed] Variable creations >>> from io import BytesIO >>> pcapfile = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacVo*\n\x00(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV_-\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\xf90\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00') >>> pcapngfile = BytesIO(b'\n\r\r\n\\\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00,\x00File created by merging: \nFile1: test.pcap \n\x04\x00\x08\x00mergecap\x00\x00\x00\x00\\\x00\x00\x00\x01\x00\x00\x00\\\x00\x00\x00e\x00\x00\x00\xff\xff\x00\x00\x02\x006\x00Unknown/not available in original file format(libpcap)\x00\x00\t\x00\x01\x00\x06\x00\x00\x00\x00\x00\x00\x00\\\x00\x00\x00\x06\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00\x8d*\x05\x00/\xfc[\xcd(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00H\x00\x00\x00\x06\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x8d*\x05\x00\x1f\xff[\xcd\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r<\x00\x00\x00\x06\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x8d*\x05\x00\xb9\x02\\\xcd\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00<\x00\x00\x00') >>> pcapnanofile = BytesIO(b"M<\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacV\xc9\xc1\xb5'(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV-;\xc1'\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\x9aL\xcf'\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00") >>> pcapwirelenfile = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x01\x00\x00\x00}\x87pZ.\xa2\x08\x00\x0f\x00\x00\x00\x10\x00\x00\x00\xff\xff\xff\xff\xff\xff GG\xee\xdd\xa8\x90\x00a') >>> pcapngdefaults = BytesIO(base64.b64decode(b'Cg0NChwAAABNPCsaAQAAAP//////////HAAAAAEAAAAgAAAAEgEAAP//AAAJAAEACUeZiQAAAAAgAAAAAQAAACAAAAASAQAA//8AAAkAAQAJAAAAAAAAACAAAAABAAAAIAAAABIBAAD//wAACQABAAkAAAAAAAAAIAAAAAEAAAAgAAAAEgEAAP//AAAJAAEACQAAAAAAAAAgAAAABgAAAIQBAAADAAAApO/bFdgJaeBiAQAAYgEAAFVVVVVVVVXV////////IMbr4D7PCABFAAFIlQkAAEAR5JwAAAAA/////wBEAEMBNJDsAQEGAFSpVwIACoAAAAAAAAAAAAAAAAAAAAAAACDG6+A+zwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjglNjNQEB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsOs+bAAAhAEAAAYAAACAAQAAAwAAAKTv2xXIDYznYAEAAGABAABVVVVVVVVV1QEAXn//+iDG6+A+zwgARQABRgGPAAAEEal3qf5wqO////rhbgdsATJi0U5PVElGWSAqIEhUVFAvMS4xDQpIT1NUOiAyMzkuMjU1LjI1NS4yNTA6MTkwMA0KQ0FDSEUtQ09OVFJPTDogbWF4LWFnZT0xODAwDQpMT0NBVElPTjogaHR0cDovLzE2OS4yNTQuMTEyLjE2ODo1NTAwMC9ucmMvZGRkLnhtbA0KTlQ6IHV1aWQ6NEQ0NTQ5MzAtMDIwMC0xMDAwLTgwMDEtMjBDNkVCRTAzRUNGDQpOVFM6IHNzZHA6YWxpdmUNClNFUlZFUjogRnJlZUJTRC84LjAgVVBuUC8xLjAgUGFuYXNvbmljLU1JTC1ETE5BLVNWLzEuMA0KVVNOOiB1dWlkOjRENDU0OTMwLTAyMDAtMTAwMC04MDAxLTIwQzZFQkUwM0VDRg0KDQpcQcvWgAEAAAYAAAC4AQAAAwAAAKTv2xV4Ao3nlQEAAJUBAABVVVVVVVVV1QEAXn//+iDG6+A+zwgARQABewGQAAAEEalBqf5wqO////rhbgdsAWfu+k5PVElGWSAqIEhUVFAvMS4xDQpIT1NUOiAyMzkuMjU1LjI1NS4yNTA6MTkwMA0KQ0FDSEUtQ09OVFJPTDogbWF4LWFnZT0xODAwDQpMT0NBVElPTjogaHR0cDovLzE2OS4yNTQuMTEyLjE2ODo1NTAwMC9ucmMvZGRkLnhtbA0KTlQ6IHVybjpwYW5hc29uaWMtY29tOmRldmljZTpwMDBSZW1vdGVDb250cm9sbGVyOjENCk5UUzogc3NkcDphbGl2ZQ0KU0VSVkVSOiBGcmVlQlNELzguMCBVUG5QLzEuMCBQYW5hc29uaWMtTUlMLURMTkEtU1YvMS4wDQpVU046IHV1aWQ6NEQ0NTQ5MzAtMDIwMC0xMDAwLTgwMDEtMjBDNkVCRTAzRUNGOjp1cm46cGFuYXNvbmljLWNvbTpkZXZpY2U6cDAwUmVtb3RlQ29udHJvbGxlcjoxDQoNCrLVKmoAAAC4AQAABgAAAHgBAAADAAAApO/bFVjbjedXAQAAVwEAAFVVVVVVVVXVAQBef//6IMbr4D7PCABFAAE9AZEAAAQRqX6p/nCo7///+uFuB2wBKaZATk9USUZZICogSFRUUC8xLjENCkhPU1Q6IDIzOS4yNTUuMjU1LjI1MDoxOTAwDQpDQUNIRS1DT05UUk9MOiBtYXgtYWdlPTE4MDANCkxPQ0FUSU9OOiBodHRwOi8vMTY5LjI1NC4xMTIuMTY4OjU1MDAwL25yYy9kZGQueG1sDQpOVDogdXBucDpyb290ZGV2aWNlDQpOVFM6IHNzZHA6YWxpdmUNClNFUlZFUjogRnJlZUJTRC84LjAgVVBuUC8xLjAgUGFuYXNvbmljLU1JTC1ETE5BLVNWLzEuMA0KVVNOOiB1dWlkOjRENDU0OTMwLTAyMDAtMTAwMC04MDAxLTIwQzZFQkUwM0VDRjo6dXBucDpyb290ZGV2aWNlDQoNCjagXoUAeAEAAAYAAAC0AQAAAwAAAKTv2xXYw47nkwEAAJMBAABVVVVVVVVV1QEAXn//+iDG6+A+zwgARQABeQGSAAAEEalBqf5wqO////rhbgdsAWWV4E5PVElGWSAqIEhUVFAvMS4xDQpIT1NUOiAyMzkuMjU1LjI1NS4yNTA6MTkwMA0KQ0FDSEUtQ09OVFJPTDogbWF4LWFnZT0xODAwDQpMT0NBVElPTjogaHR0cDovLzE2OS4yNTQuMTEyLjE2ODo1NTAwMC9ucmMvZGRkLnhtbA0KTlQ6IHVybjpwYW5hc29uaWMtY29tOnNlcnZpY2U6cDAwTmV0d29ya0NvbnRyb2w6MQ0KTlRTOiBzc2RwOmFsaXZlDQpTRVJWRVI6IEZyZWVCU0QvOC4wIFVQblAvMS4wIFBhbmFzb25pYy1NSUwtRExOQS1TVi8xLjANClVTTjogdXVpZDo0RDQ1NDkzMC0wMjAwLTEwMDAtODAwMS0yMEM2RUJFMDNFQ0Y6OnVybjpwYW5hc29uaWMtY29tOnNlcnZpY2U6cDAwTmV0d29ya0NvbnRyb2w6MQ0KDQovXKFrALQBAAAGAAAAqAEAAAMAAACk79sVuJKP54cBAACHAQAAVVVVVVVVVdUBAF5///ogxuvgPs8IAEUAAW0BkwAABBGpTKn+cKjv///64W4HbAFZRNJOT1RJRlkgKiBIVFRQLzEuMQ0KSE9TVDogMjM5LjI1NS4yNTUuMjUwOjE5MDANCkNBQ0hFLUNPTlRST0w6IG1heC1hZ2U9MTgwMA0KTE9DQVRJT046IGh0dHA6Ly8xNjkuMjU0LjExMi4xNjg6NTUwMDAvbnJjL2RkZC54bWwNCk5UOiB1cm46ZGlhbC1tdWx0aXNjcmVlbi1vcmc6c2VydmljZTpkaWFsOjENCk5UUzogc3NkcDphbGl2ZQ0KU0VSVkVSOiBGcmVlQlNELzguMCBVUG5QLzEuMCBQYW5hc29uaWMtTUlMLURMTkEtU1YvMS4wDQpVU046IHV1aWQ6NEQ0NTQ5MzAtMDIwMC0xMDAwLTgwMDEtMjBDNkVCRTAzRUNGOjp1cm46ZGlhbC1tdWx0aXNjcmVlbi1vcmc6c2VydmljZTpkaWFsOjENCg0KLn5A6QCoAQAA')) ###(157)=[passed] Read a pcap file >>> pktpcap = rdpcap(pcapfile) ###(158)=[passed] Read a pcapng file >>> pktpcapng = rdpcap(pcapngfile) >>> assert pktpcapng[0].time == 1454163407.666223 ###(159)=[passed] Read a pcap file with nanosecond precision >>> pktpcapnano = rdpcap(pcapnanofile) >>> assert pktpcapnano[0].time == 1454163407.666223049 ###(160)=[passed] Read a pcapng file with nanosecond precision and default tsresol >>> pktpcapngdefaults = rdpcap(pcapngdefaults) >>> assert pktpcapngdefaults[0].time == 1575115986.114775512 >>> assert Ether in pktpcapngdefaults[0] ###(161)=[passed] Read a pcapng with little-endian SHB >>> pktcapng = sniff(offline=scapy_path("/test/pcaps/macos.pcapng.gz")) >>> assert len(pktcapng) != 0 ###(162)=[passed] Write a pcapng >>> tmpfile = get_temp_file(autoext=".pcapng") >>> r = RawPcapNgWriter(tmpfile) >>> r._write_block_shb() >>> r._write_block_idb(linktype=DLT_EN10MB) >>> ts = 1632568366.384185 >>> r._write_block_epb(raw(Ether()/"Hello Scapy!!!"), ifid=0, timestamp=ts) MAC address to reach destination not found. Using broadcast. >>> r.f.close() >>> >>> assert os.stat(tmpfile).st_size == 108 >>> >>> l = rdpcap(tmpfile) >>> assert b"Scapy" in l[0][Raw].load >>> assert l[0].time == ts ###(163)=[passed] Check wrpcapng() >>> tmpfile = get_temp_file(autoext=".pcapng") >>> p = Ether()/"Hello Scapy!!!" >>> p.time = 1632568366.384185 >>> wrpcapng(tmpfile, p) MAC address to reach destination not found. Using broadcast. >>> >>> assert os.stat(tmpfile).st_size == 108 >>> >>> l = rdpcap(tmpfile) >>> assert b"Scapy" in l[0][Raw].load >>> assert l[0].time == ts >>> >>> p = Ether() / IPv6() / TCP() >>> p.comment = b"Hello Scapy!" >>> wrpcapng(tmpfile, p) >>> l = rdpcap(tmpfile) >>> assert l[0].comment == p.comment ###(164)=[passed] rdpcap on fifo >>> f = get_temp_file() >>> os.unlink(f) >>> os.mkfifo(f) >>> p = Ether(bytes(Ether(dst="ff:ff:ff:ff:ff:ff")/"Hello Scapy!!!")) >>> s = AsyncSniffer(offline=f) >>> s.start() >>> wrpcap(f, p) >>> s.join(timeout=1) >>> assert s.results[0] == p ###(165)=[passed] Check multiple packets with different combination of linktype,comment,direction,sniffed_on fields. test both wrpcap() and wrpcapng() >>> import random,string >>> random.seed(0x2807) >>> plist = [] >>> ptypes = [] >>> ptypes.append(Ether((Ether() / IPv6() / TCP()).build())) >>> ptypes.append(IP((IP() / IPv6() / TCP()).build())) >>> ifaces=[None,'','i','int0',''.join(random.choices(string.printable,k=20))] >>> comments=[None,'','a','abcd',''.join(random.choices(string.printable,k=20))] >>> directions=[None,0,1,2,3] >>> >>> for iface in ifaces: ... for comment in comments: ... if comment is not None: ... comment=comment.encode('utf-8') ... for direction in directions: ... for p in ptypes: ... if iface is not None and type(ptypes[ifaces.index(iface) % len(ptypes)]) != type(p): ... continue ... pnew = p.copy() ... pnew.time = 1632568366.384185 ... pnew.sniffed_on = iface ... pnew.direction = direction ... pnew.comment = comment ... plist.append(pnew) ... >>> random.shuffle(plist) >>> tmpfile = get_temp_file(autoext=".pcapng") >>> wrpcapng(tmpfile, plist) Inconsistent linktypes detected! The resulting file might contain invalid packets. Inconsistent linktypes detected! The resulting file might contain invalid packets. more Inconsistent linktypes detected! The resulting file might contain invalid packets. >>> plist_check = rdpcap(tmpfile) >>> assert len(plist_check) == len(plist) >>> for i in range(len(plist)): ... assert plist_check[i].comment == plist[i].comment ... assert plist_check[i].direction == plist[i].direction ... assert plist_check[i].sniffed_on == plist[i].sniffed_on ... assert plist_check[i].time == plist[i].time ... #if interface is unknown, verify pkt bytes integrity and that linktype was set to first packet ... if plist[i].sniffed_on is None: ... assert bytes(plist_check[i]) == bytes(plist[i]) ... assert type(plist_check[i]) == type(plist[0]) ... else: ... assert plist_check[i] == plist[i] ... >>> tmpfile = get_temp_file(autoext=".pcap") >>> wrpcap(tmpfile, plist) >>> plist_check = rdpcap(tmpfile) >>> for i in range(len(plist)): ... assert plist_check[i].time == plist[i].time ... assert type(plist_check[i]) == type(plist[0]) ... assert bytes(plist_check[i]) == bytes(plist[i]) ... ###(166)=[passed] PcapNg - Process Information Block >>> pib_pcapng_file = BytesIO(b'\n\r\r\n\xbc\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x02\x00\x05\x00arm64\x00\x00\x00\x03\x00f\x00Darwin Kernel Version 23.3.0: Thu Dec 21 02:29:41 PST 2023; root:xnu-10002.81.5~11/RELEASE_ARM64_T8122\x00\x00\x04\x00 \x00tcpdump (libpcap version 1.10.1)\x00\x00\x00\x00\xbc\x00\x00\x00\x01\x00\x00\x00 \x00\x00\x00\x01\x00\x00\x00\x00\x00\x08\x00\x02\x00\x03\x00en0\x00\x00\x00\x00\x00 \x00\x00\x00\x01\x00\x00\x80 \x00\x00\x00$\'\x00\x00\x02\x00\x06\x00trustd\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x01\x00\x00\x80$\x00\x00\x00")\x00\x00\x02\x00\x0c\x00mobileassetd\x00\x00\x00\x00$\x00\x00\x00\x06\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\xfb\x18\x06\x00EcqdB\x00\x00\x00B\x00\x00\x00\xe8\x9f\x80\xfa\x8c\xc6P\xa6\xd8\xd5\x83v\x08\x00E\x00\x004\x00\x00@\x00@\x06\x90T\nh\x01\xc3\xc0\xe5\xdd_\xf4\xb8\x00P\x95\xc3\xcb\x01\xcb\xeb\x11\xe8\x80\x11\x08\x00\x0c\xe6\x00\x00\x01\x01\x08\n\xbe\xb8\xd4\xb3\xbb\x9b4\xbc\x00\x00\x01\x80\x04\x00\x00\x00\x00\x00\x03\x80\x04\x00\x01\x00\x00\x00\x02\x00\x04\x00\x02\x00\x00\x00\x02\x80\x04\x00\x00\x00\x00\x00\x04\x80\x04\x00\x10\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00') >>> >>> l = rdpcap(pib_pcapng_file) >>> assert(len(l) == 1) >>> assert(TCP in l[0]) >>> assert(len(l[0].process_information) == 2) >>> assert(l[0].process_information["proc"]["name"] == "trustd") ###(167)=[passed] OSS-Fuzz Findings >>> from io import BytesIO >>> file = BytesIO(b"\n\r\r\n\x1c\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x1c\x00\x00\x00\x01\x00\x00\x00\x14\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x04\x00\x14\x00\x00\x00\x01\x00\x00\x00(\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x04\x00\x02\x00\t\x00b'ens16\xb0'\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x06\x00\x00\x004\x00\x00\x00\x01\x00\x00\x00}\x17\x06\x00\xb5t\x1d\x85\x14\x00\x00\x00\x14\x00\x00\x00E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x014\x00\x00\x00") >>> rdpcap(file) >>> >>> file = BytesIO(b'\n\r\r\n\xff\xfe\xfe\xffM<+\x1a') >>> try: ... rdpcap(file) ... except Scapy_Exception: ... pass ... PcapNg: Could not read major value >>> file = BytesIO(b"\n\r\r\n\x00\x00\x008\x1a+>> l = rdpcap(file) PcapNg: invalid option length 12 for end-of-option PcapNg: EPB invalid proc index(expected 4 bytes, got 0) ! >>> >>> file = BytesIO(b"\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x01\x00\x00\x00\x04{\xdcf\xc2\xa5\x07\x008\x00\x00\x008\x00\x00\x00A]+\xdb]\x04\x8e(6\n\x99\xcb\x08\x00E\x00\x00*\x00\x01\x00\x00@\x06\xe3V\x07\x87\xa5m\x17\x15\xd3m\x01\x85\x01\x85\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xc5_\x00\x000\x00") >>> l = rdpcap(file) >>> assert l[0][LDAP].summary() == "LDAP" >>> >>> file = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x01\x00\x00\x00%\xa8\xddfK\x1b\x05\x00\xca\xca\xca\xca*\x00\x00\x00\xff\xff\xff\xff\xff\xff\x86"\x11&\xab3\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01]\x80\x0f\x13*r\n\x00\x02\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> l = rdpcap(file) >>> assert len(l) == 0 or ARP in l[0] ###(168)=[passed] Read a pcap file with wirelen != captured len >>> pktpcapwirelen = rdpcap(pcapwirelenfile) ###(169)=[passed] Check all packet lists are the same >>> assert list(pktpcap) == list(pktpcapng) == list(pktpcapnano) >>> assert [float(p.time) for p in pktpcap] == [float(p.time) for p in pktpcapng] == [float(p.time) for p in pktpcapnano] ###(170)=[passed] Check packets from pcap file >>> assert all(IP in pkt for pkt in pktpcap) >>> assert all(any(proto in pkt for pkt in pktpcap) for proto in [ICMP, UDP, TCP]) ###(171)=[passed] Check wirelen value from pcap file >>> assert len(pktpcapwirelen) == 1 >>> assert pktpcapwirelen[0].wirelen is not None >>> assert len(pktpcapwirelen[0]) < pktpcapwirelen[0].wirelen ###(172)=[passed] Check wrpcap() then rdpcap() with wirelen >>> import os, tempfile >>> fdesc, filename = tempfile.mkstemp() >>> fdesc = os.fdopen(fdesc, "wb") >>> wrpcap(fdesc, pktpcapwirelen) >>> fdesc.close() >>> newpktpcapwirelen = rdpcap(filename) >>> assert len(newpktpcapwirelen) == 1 >>> assert newpktpcapwirelen[0].wirelen is not None >>> assert len(newpktpcapwirelen[0]) < newpktpcapwirelen[0].wirelen >>> assert newpktpcapwirelen[0].wirelen == pktpcapwirelen[0].wirelen ###(173)=[passed] Check wrpcap() then rdpcap() with sent_time on SndRcvList >>> f = get_temp_file() >>> s = Ether()/IP() >>> r = Ether()/IP() >>> s.sent_time = 1 >>> r.time = 2 >>> wrpcap(f, SndRcvList([(s, r)])) >>> pcap = rdpcap(f) >>> assert pcap[0].time == 1 >>> assert pcap[1].time == 2 ###(174)=[passed] Check wrpcap() >>> fdesc, filename = tempfile.mkstemp() >>> fdesc = os.fdopen(fdesc, "wb") >>> wrpcap(fdesc, pktpcap) >>> fdesc.close() ###(175)=[passed] Check offline sniff() (by PacketList) >>> l=sniff(offline=PacketList([IP()/TCP(),IP()/TCP()])) >>> assert len(l) == 2 >>> assert all(TCP in p for p in l) ###(176)=[passed] Check offline sniff() (by filename) >>> assert list(pktpcap) == list(sniff(offline=filename)) ###(177)=[passed] Check offline sniff() (by file object) >>> fdesc = open(filename, "rb") >>> assert list(pktpcap) == list(sniff(offline=fdesc)) >>> fdesc.close() ###(178)=[passed] Check offline sniff() with a filter (by filename) >>> pktpcap_flt = [(proto, sniff(offline=filename, filter=proto.__name__.lower())) ... for proto in [ICMP, UDP, TCP]] /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6350 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6351 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6352 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert all(list(pktpcap[proto]) == list(packets) for proto, packets in pktpcap_flt) ###(179)=[passed] Check offline sniff() with a filter (by file object) >>> fdesc = open(filename, "rb") >>> pktpcap_tcp = sniff(offline=fdesc, filter="tcp") /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6354 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> fdesc.close() >>> assert list(pktpcap[TCP]) == list(pktpcap_tcp) >>> os.unlink(filename) ###(180)=[passed] Check offline sniff() with a PcapNg file and a filter (by file object) >>> pcapng_data = b'\n\r\r\n`\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x04\x009\x00TShark (Wireshark) 3.2.3 (Git v3.2.3 packaged as 3.2.3-1)\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x01\x00\x00\x00\x14\x00\x00\x00\xe4\x00\x00\x00\xff\xff\x00\x00\x14\x00\x00\x00\x06\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x98\xcd\x05\x00\x19\x83\xf7\x9e\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r<\x00\x00\x00' >>> >>> if OPENBSD: ... # Note: OpenBSD tcpdump does not support PcapNg ... assert True ... else: ... fdesc, filename = tempfile.mkstemp() ... os.close(fdesc) ... fd = open(filename, "wb") ... fd.write(pcapng_data) ... fd.close() ... packets = sniff(offline=filename, filter="udp") ... os.unlink(filename) ... assert UDP in packets[0] ... 176 /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6356 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(181)=[passed] Check offline sniff() with Packets and tcpdump with a filter >>> l = sniff(offline=IP()/UDP(sport=(10000, 10001)), filter="udp") /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6358 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert len(l) == 2 >>> assert all(UDP in p for p in l) >>> >>> l = sniff(offline=[p for p in IP()/UDP(sport=(10000, 10001))], filter="udp") /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6359 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert len(l) == 2 >>> assert all(UDP in p for p in l) >>> >>> l = sniff(offline=IP()/UDP(sport=(10000, 10001)), filter="tcp") /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6360 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert len(l) == 0 ###(182)=[passed] Check offline sniff() with Packets, tcpdump and a bad filter >>> try: ... sniff(offline=IP()/UDP(), filter="bad filter") ... except Scapy_Exception: ... pass ... else: ... assert False ... ###(184)=[passed] Check offline sniff with lfilter >>> assert len(sniff(offline=[IP()/UDP(), IP()/TCP()], lfilter=lambda x: TCP in x)) == 1 ###(185)=[passed] Check offline sniff() without a tcpdump binary >>> from unittest import mock >>> >>> conf_prog_tcpdump = conf.prog.tcpdump >>> conf.prog.tcpdump = "tcpdump_fake" >>> >>> def _test_sniff_notcpdump(): ... try: ... sniff(offline="fake.pcap", filter="tcp") ... assert False ... except: ... assert True ... >>> _test_sniff_notcpdump() >>> conf.prog.tcpdump = conf_prog_tcpdump ###(186)=[passed] Check wrpcap(nano=True) >>> fdesc, filename = tempfile.mkstemp() >>> fdesc = os.fdopen(fdesc, "wb") >>> pktpcapnano[0].time += Decimal('1E-9') >>> wrpcap(fdesc, pktpcapnano, nano=True) >>> fdesc.close() >>> pktpcapnanoread = rdpcap(filename) >>> assert pktpcapnanoread[0].time == pktpcapnano[0].time >>> os.unlink(filename) ###(187)=[passed] Check PcapNg with nanosecond precision using obsolete packet block first packet from capture file icmp2.ntar -- https://wiki.wireshark.org/Development/PcapNg?action=AttachFile&do=view&target=icmp2.ntar >>> pcapngfile = BytesIO(b'\n\r\r\n\x1c\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x01\x00\x00\x00(\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00\r\x00\x01\x00\x04\x04K\x00\t\x00\x01\x00\tK=N\x00\x00\x00\x00(\x00\x00\x00\x02\x00\x00\x00n\x00\x00\x00\x00\x00\x00\x00e\x14\x00\x00)4\'ON\x00\x00\x00N\x00\x00\x00\x00\x12\xf0\x11h\xd6\x00\x13r\t{\xea\x08\x00E\x00\x00<\x90\xa1\x00\x00\x80\x01\x8e\xad\xc0\xa8M\x07\xc0\xa8M\x1a\x08\x00r[\x03\x00\xd8\x00abcdefghijklmnopqrstuvwabcdefghi\xeay$\xf6\x00\x00n\x00\x00\x00') >>> pktpcapng = rdpcap(pcapngfile) PcapNg: bad blocklen 110 (MUST be a multiple of 4. Ignored padding b'\x00\x00' ICMP.guess_payload_class() returned [None] >>> assert len(pktpcapng) == 1 >>> pkt = pktpcapng[0] >>> assert pkt.time == 22425.352221737 >>> assert isinstance(pkt, Ether) >>> pkt = pkt.payload >>> assert isinstance(pkt, IP) >>> pkt = pkt.payload >>> assert isinstance(pkt, ICMP) >>> pkt = pkt.payload >>> assert isinstance(pkt, Raw) and pkt.load == b'abcdefghijklmnopqrstuvwabcdefghi' >>> pkt = pkt.payload >>> assert isinstance(pkt, Padding) and pkt.load == b'\xeay$\xf6' >>> pkt = pkt.payload >>> assert isinstance(pkt, NoPayload) ###(188)=[passed] Check PcapNg using Simple Packet Block previous file with the (obsolete) packet block replaced by a Simple Packet Block >>> pcapngfile = BytesIO(b'\n\r\r\n\x1c\x00\x00\x00M<+\x1a\x01\x00\x00\x00\xa8\x03\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x01\x00\x00\x00(\x00\x00\x00\x01\x00\x00\x00\xff\xff\x00\x00\r\x00\x01\x00\x04\x04K\x00\t\x00\x01\x00\tK=N\x00\x00\x00\x00(\x00\x00\x00\x03\x00\x00\x00`\x00\x00\x00N\x00\x00\x00\x00\x12\xf0\x11h\xd6\x00\x13r\t{\xea\x08\x00E\x00\x00<\x90\xa1\x00\x00\x80\x01\x8e\xad\xc0\xa8M\x07\xc0\xa8M\x1a\x08\x00r[\x03\x00\xd8\x00abcdefghijklmnopqrstuvwabcdefghi\xeay$\xf6\x00\x00`\x00\x00\x00') >>> pktpcapng = rdpcap(pcapngfile) more ICMP.guess_payload_class() returned [None] >>> assert len(pktpcapng) == 1 >>> pkt = pktpcapng[0] >>> assert isinstance(pkt, Ether) >>> pkt = pkt.payload >>> assert isinstance(pkt, IP) >>> pkt = pkt.payload >>> assert isinstance(pkt, ICMP) >>> pkt = pkt.payload >>> assert isinstance(pkt, Raw) and pkt.load == b'abcdefghijklmnopqrstuvwabcdefghi' >>> pkt = pkt.payload >>> assert isinstance(pkt, Padding) and pkt.load == b'\xeay$\xf6' >>> pkt = pkt.payload >>> assert isinstance(pkt, NoPayload) ###(189)=[passed] Invalid pcapng files >>> from io import BytesIO >>> >>> try: ... invalid_pcapngfile_1 = BytesIO(b'\n\r\r\n\r\x00\x00\x00M<+\x1a\xb2<\xb2\xa1\x01\x00\x00\x00\r\x00\x00\x00M<+\x1a\x80\xaa\xb2\x02') ... rdpcap(invalid_pcapngfile_1) ... assert False ... except Scapy_Exception: ... pass ... PcapNg: Invalid Section Header Block length (13)! >>> invalid_pcapngfile_2 = BytesIO(b'\n\r\r\n\x00\x00\x00\x1c\x1a+>> assert len(rdpcap(invalid_pcapngfile_2)) == 0 PcapNg: IDB is too small 4/8 ! >>> >>> try: ... invalid_pcapngfile_3 = BytesIO(b'\n\n\n\x14\x00\x00\x00M<+\x1a \x14\x00\x00\x00\x03\x00\x00\x00\x14\x00\x00\x00 \x14\x00\x00\x00') ... rdpcap(invalid_pcapngfile_3) ... assert False ... except Scapy_Exception: ... pass ... >>> try: ... invalid_pcapngfile_4 = BytesIO(b'\n\n\n\x14\x00\x00\x00M<+\x1a \x14\x00\x00\x00\x01\x00\x00\x00\x14\x00\x00\x00 \x14\x00\x00\x00\x03\x00\x00\x00\x0c\x00\x00\x00\x0c\x00\x00\x00') ... rdpcap(invalid_pcapngfile_4) ... assert False ... except Scapy_Exception: ... pass ... ###(190)=[passed] Check PcapWriter on null write >>> f = BytesIO() >>> w = PcapWriter(f) >>> w.write([]) >>> assert len(f.getvalue()) == 0 >>> >>> with mock.patch.object(f, 'close') as cf: ... w.close() ... PcapWriter: unknown LL type for NoneType. Using type 1 (Ethernet) >>> cf.assert_called_once_with() >>> assert len(f.getvalue()) != 0 ###(191)=[passed] Check PcapWriter sets correct linktype after null write >>> f = BytesIO() >>> w = PcapWriter(f) >>> w.write([]) >>> assert len(f.getvalue()) == 0 >>> w.write(Ether()/IP()/ICMP()) >>> assert len(f.getvalue()) != 0 >>> >>> with mock.patch.object(f, 'close') as cf: ... w.close() ... >>> cf.assert_called_once_with() >>> f.seek(0) or None >>> assert len(f.getvalue()) != 0 >>> >>> r = PcapReader(f) >>> f.seek(0) or None >>> assert r.LLcls is Ether >>> assert r.linktype == DLT_EN10MB >>> >>> l = [ p for p in RawPcapReader(f) ] >>> assert len(l) == 1 ###(192)=[passed] Check RawPcapReader on pcap >>> fd = get_temp_file() >>> wrpcap(fd, [Ether()/IP()/ICMP()]) >>> assert len([p for p in RawPcapReader(fd)]) == 1 :2: ResourceWarning: unclosed file <_io.BufferedReader name='/tmp/scapy6stmfauk'> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> >>> for (x, y) in RawPcapReader(fd): ... pass ... :2: ResourceWarning: unclosed file <_io.BufferedReader name='/tmp/scapy6stmfauk'> ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(193)=[passed] Check RawPcapReader with a Context Manager >>> filename = get_temp_file(fd=False) >>> wrpcap(filename, [IP()/TCP(), IP()/UDP()]) >>> >>> try: ... with RawPcapReader(filename) as reader: ... packet = next(reader, None) ... assert True ... except TypeError: ... assert False ... ###(194)=[passed] Check RawPcapWriter >>> fd = get_temp_file() >>> with RawPcapWriter(fd, linktype=1) as w: ... w.write(b"test") ... >>> fd = get_temp_file() >>> with RawPcapWriter(fd) as w: ... w.write(b"test") ... assert w.linktype == 1 ... more RawPcapWriter: unknown LL type for bytes. Using type 1 (Ethernet) ###(195)=[passed] Check tcpdump() No very specific tests because we do not want to depend on tcpdump output Non existing tcpdump binary >>> from io import BytesIO >>> pcapfile = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x01\x00\x00\x000}$]\xff\\\t\x006\x00\x00\x006\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x000}$]\x87i\t\x00*\x00\x00\x00*\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r0}$]\xfbp\t\x00*\x00\x00\x00*\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00') >>> >>> data = tcpdump(pcapfile, dump=True, args=['-nn']).split(b'\n') :2: ResourceWarning: unclosed file <_io.BufferedReader name=19> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> print(data) [b'11:40:32.613631 IP 127.0.0.1.20 > 127.0.0.1.80: Flags [S], seq 0, win 8192, length 0', b'11:40:32.616839 IP 127.0.0.1.53 > 127.0.0.1.53: domain [length 0 < 12] (invalid)', b'11:40:32.618747 IP 127.0.0.1 > 127.0.0.1: ICMP echo request, id 0, seq 0, length 8', b''] >>> assert b'127.0.0.1.20 > 127.0.0.1.80:' in data[0] >>> assert b'127.0.0.1.53 > 127.0.0.1.53:' in data[1] >>> assert b'127.0.0.1 > 127.0.0.1:' in data[2] >>> >>> >>> from unittest import mock >>> >>> conf_prog_tcpdump = conf.prog.tcpdump >>> conf.prog.tcpdump = "tcpdump_fake" >>> >>> def _test_tcpdump_notcpdump(): ... try: ... tcpdump(IP()/TCP()) ... assert False ... except: ... assert True ... >>> _test_tcpdump_notcpdump() >>> conf.prog.tcpdump = conf_prog_tcpdump >>> >>> pcapfile.seek(0) or None >>> tempfile_count = len(conf.temp_files) >>> data = tcpdump(pcapfile, dump=True, args=['-nn'], use_tempfile=True).split(b'\n') :2: ResourceWarning: unclosed file <_io.BufferedReader name=11> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> print(data) [b'11:40:32.613631 IP 127.0.0.1.20 > 127.0.0.1.80: Flags [S], seq 0, win 8192, length 0', b'11:40:32.616839 IP 127.0.0.1.53 > 127.0.0.1.53: domain [length 0 < 12] (invalid)', b'11:40:32.618747 IP 127.0.0.1 > 127.0.0.1: ICMP echo request, id 0, seq 0, length 8', b''] >>> assert b'127.0.0.1.20 > 127.0.0.1.80:' in data[0] >>> assert b'127.0.0.1.53 > 127.0.0.1.53:' in data[1] >>> assert b'127.0.0.1 > 127.0.0.1:' in data[2] >>> assert len(conf.temp_files) > tempfile_count >>> >>> data = tcpdump([Ether()/IP()/ICMP()], dump=True, args=['-nn']).split(b'\n') :2: ResourceWarning: unclosed file <_io.BufferedReader name=19> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> print(data) [b'01:42:04.571371 IP 127.0.0.1 > 127.0.0.1: ICMP echo request, id 0, seq 0, length 8', b''] >>> assert b'127.0.0.1 > 127.0.0.1: ICMP' in data[0].upper() ###(196)=[passed] Check tcpdump() command with linktype >>> f = BytesIO() >>> pkt = Ether()/IP()/ICMP() >>> >>> with mock.patch('subprocess.Popen', return_value=Bunch( ... stdin=f, wait=lambda: None)) as popen: ... # Prevent closing the BytesIO ... with mock.patch.object(f, 'close'): ... tcpdump([pkt], linktype="DLT_EN10MB", use_tempfile=False) ... >>> expected_command = [conf.prog.tcpdump, '-y', 'EN10MB', '-U', '-r', '-'] >>> if OPENBSD: ... expected_command = [conf.prog.tcpdump, '-y', 'EN10MB', '-r', '-'] ... >>> popen.assert_called_once_with( ... expected_command, ... stdin=subprocess.PIPE, stdout=None, stderr=None) >>> >>> print(bytes_hex(f.getvalue())) b'd4c3b2a1020004000000000000000000ffff0000010000006cf9546793d208002a0000002a000000ffffffffffff00000000000008004500001c0001000040017cde7f0000017f0000010800f7ff00000000' >>> assert raw(pkt) in f.getvalue() >>> f.close() >>> del f, pkt ###(197)=[passed] Check tcpdump() command with linktype and args >>> f = BytesIO() >>> pkt = Ether()/IP()/ICMP() >>> >>> with mock.patch('subprocess.Popen', return_value=Bunch( ... stdin=f, wait=lambda: None)) as popen: ... # Prevent closing the BytesIO ... with mock.patch.object(f, 'close'): ... tcpdump([pkt], linktype=scapy.data.DLT_EN10MB, use_tempfile=False) ... >>> expected_command = [conf.prog.tcpdump, '-y', 'EN10MB', '-U', '-r', '-'] >>> if OPENBSD: ... expected_command = [conf.prog.tcpdump, '-y', 'EN10MB', '-r', '-'] ... >>> popen.assert_called_once_with( ... expected_command, ... stdin=subprocess.PIPE, stdout=None, stderr=None) >>> >>> print(bytes_hex(f.getvalue())) b'd4c3b2a1020004000000000000000000ffff0000010000006cf954670bf108002a0000002a000000ffffffffffff00000000000008004500001c0001000040017cde7f0000017f0000010800f7ff00000000' >>> assert raw(pkt) in f.getvalue() >>> f.close() >>> del f, pkt ###(198)=[passed] Check sniff() offline with linktype & 802.11 filter >>> fd = get_temp_file() >>> wrpcap(fd, [RadioTap()/Dot11()/Dot11ProbeReq(), RadioTap()/Dot11()]) >>> lst = sniff(offline=fd, filter="subtype probe-req") /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6381 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert len(lst) == 1 ###(199)=[passed] Check tcpdump() command rejects non-string input for prog >>> pkt = Ether()/IP()/ICMP() >>> >>> try: ... tcpdump([pkt], prog=+17607067425, args=['-nn']) ... except ValueError as e: ... if hasattr(e, 'args'): ... assert 'prog' in e.args[0] ... else: ... assert 'prog' in e.message ... else: ... assert False, 'expected exception' ... ###(200)=[passed] Check tcpdump() command with tshark >>> pcapfile = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00e\x00\x00\x00\xcf\xc5\xacVo*\n\x00(\x00\x00\x00(\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x06|\xcd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91|\x00\x00\xcf\xc5\xacV_-\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x11|\xce\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x08\x01r\xcf\xc5\xacV\xf90\n\x00\x1c\x00\x00\x00\x1c\x00\x00\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00') >>> tempfile_count = len(conf.temp_files) >>> values = [tuple(int(val) for val in line[:-1].split(b'\t')) for line in tcpdump(pcapfile, prog=conf.prog.tshark, getfd=True, args=['-T', 'fields', '-e', 'ip.ttl', '-e', 'ip.proto'])] /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6384 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert values == [(64, 6), (64, 17), (64, 1)] >>> assert len(conf.temp_files) == tempfile_count ###(201)=[passed] Check tdecode command directly for tshark >>> pkts = [ ... Ether()/IP(src='192.0.2.1', dst='192.0.2.2')/ICMP(type='echo-request')/Raw(b'X'*100), ... Ether()/IP(src='192.0.2.2', dst='192.0.2.1')/ICMP(type='echo-reply')/Raw(b'X'*100), ... ] >>> >>> tempfile_count = len(conf.temp_files) >>> >>> r = tdecode(pkts, dump=True) /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=19> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback getmacbyip failed on [Errno 1] Operation not permitted more MAC address to reach destination not found. Using broadcast. getmacbyip failed on [Errno 1] Operation not permitted /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6388 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> r b"Frame 1: 142 bytes on wire (1136 bits), 142 bytes captured (1136 bits)\n Encapsulation type: Ethernet (1)\n Arrival Time: Dec 8, 2024 01:42:04.843585000 UTC\n UTC Arrival Time: Dec 8, 2024 01:42:04.843585000 UTC\n Epoch Arrival Time: 1733622124.843585000\n [Time shift for this packet: 0.000000000 seconds]\n [Time delta from previous captured frame: 0.000000000 seconds]\n [Time delta from previous displayed frame: 0.000000000 seconds]\n [Time since reference or first frame: 0.000000000 seconds]\n Frame Number: 1\n Frame Length: 142 bytes (1136 bits)\n Capture Length: 142 bytes (1136 bits)\n [Frame is marked: False]\n [Frame is ignored: False]\n [Protocols in frame: eth:ethertype:ip:icmp:data]\nEthernet II, Src: 52:54:00:a3:0b:7c (52:54:00:a3:0b:7c), Dst: Broadcast (ff:ff:ff:ff:ff:ff)\n Destination: Broadcast (ff:ff:ff:ff:ff:ff)\n .... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)\n .... ...1 .... .... .... .... = IG bit: Group address (multicast/broadcast)\n Source: 52:54:00:a3:0b:7c (52:54:00:a3:0b:7c)\n .... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)\n .... ...0 .... .... .... .... = IG bit: Individual address (unicast)\n Type: IPv4 (0x0800)\n [Stream index: 0]\nInternet Protocol Version 4, Src: 192.0.2.1, Dst: 192.0.2.2\n 0100 .... = Version: 4\n .... 0101 = Header Length: 20 bytes (5)\n Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)\n 0000 00.. = Differentiated Services Codepoint: Default (0)\n .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)\n Total Length: 128\n Identification: 0x0001 (1)\n 000. .... = Flags: 0x0\n 0... .... = Reserved bit: Not set\n .0.. .... = Don't fragment: Not set\n ..0. .... = More fragments: Not set\n ...0 0000 0000 0000 = Fragment Offset: 0\n Time to Live: 64\n Protocol: ICMP (1)\n Header Checksum: 0xf678 [validation disabled]\n [Header checksum status: Unverified]\n Source Address: 192.0.2.1\n Destination Address: 192.0.2.2\n [Stream index: 0]\nInternet Control Message Protocol\n Type: 8 (Echo (ping) request)\n Code: 0\n Checksum: 0xb6be [correct]\n [Checksum Status: Good]\n Identifier (BE): 0 (0x0000)\n Identifier (LE): 0 (0x0000)\n Sequence Number (BE): 0 (0x0000)\n Sequence Number (LE): 0 (0x0000)\n Data (100 bytes)\n\n0000 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0010 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0020 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0030 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0040 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0050 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0060 58 58 58 58 XXXX\n Data: 58585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858\n [Length: 100]\n\nFrame 2: 142 bytes on wire (1136 bits), 142 bytes captured (1136 bits)\n Encapsulation type: Ethernet (1)\n Arrival Time: Dec 8, 2024 01:42:04.845759000 UTC\n UTC Arrival Time: Dec 8, 2024 01:42:04.845759000 UTC\n Epoch Arrival Time: 1733622124.845759000\n [Time shift for this packet: 0.000000000 seconds]\n [Time delta from previous captured frame: 0.002174000 seconds]\n [Time delta from previous displayed frame: 0.002174000 seconds]\n [Time since reference or first frame: 0.002174000 seconds]\n Frame Number: 2\n Frame Length: 142 bytes (1136 bits)\n Capture Length: 142 bytes (1136 bits)\n [Frame is marked: False]\n [Frame is ignored: False]\n [Protocols in frame: eth:ethertype:ip:icmp:data]\nEthernet II, Src: 52:54:00:a3:0b:7c (52:54:00:a3:0b:7c), Dst: Broadcast (ff:ff:ff:ff:ff:ff)\n Destination: Broadcast (ff:ff:ff:ff:ff:ff)\n .... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)\n .... ...1 .... .... .... .... = IG bit: Group address (multicast/broadcast)\n Source: 52:54:00:a3:0b:7c (52:54:00:a3:0b:7c)\n .... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)\n .... ...0 .... .... .... .... = IG bit: Individual address (unicast)\n Type: IPv4 (0x0800)\n [Stream index: 0]\nInternet Protocol Version 4, Src: 192.0.2.2, Dst: 192.0.2.1\n 0100 .... = Version: 4\n .... 0101 = Header Length: 20 bytes (5)\n Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)\n 0000 00.. = Differentiated Services Codepoint: Default (0)\n .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)\n Total Length: 128\n Identification: 0x0001 (1)\n 000. .... = Flags: 0x0\n 0... .... = Reserved bit: Not set\n .0.. .... = Don't fragment: Not set\n ..0. .... = More fragments: Not set\n ...0 0000 0000 0000 = Fragment Offset: 0\n Time to Live: 64\n Protocol: ICMP (1)\n Header Checksum: 0xf678 [validation disabled]\n [Header checksum status: Unverified]\n Source Address: 192.0.2.2\n Destination Address: 192.0.2.1\n [Stream index: 0]\nInternet Control Message Protocol\n Type: 0 (Echo (ping) reply)\n Code: 0\n Checksum: 0xbebe [correct]\n [Checksum Status: Good]\n Identifier (BE): 0 (0x0000)\n Identifier (LE): 0 (0x0000)\n Sequence Number (BE): 0 (0x0000)\n Sequence Number (LE): 0 (0x0000)\n [Request frame: 1]\n [Response time: 2.174 ms]\n Data (100 bytes)\n\n0000 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0010 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0020 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0030 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0040 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0050 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 XXXXXXXXXXXXXXXX\n0060 58 58 58 58 XXXX\n Data: 58585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858\n [Length: 100]\n\n" >>> assert b'Src: 192.0.2.1' in r >>> assert b'Src: 192.0.2.2' in r >>> assert b'Dst: 192.0.2.2' in r >>> assert b'Dst: 192.0.2.1' in r >>> assert b'Echo (ping) request' in r >>> assert b'Echo (ping) reply' in r >>> assert b'ICMP' in r >>> assert len(conf.temp_files) == tempfile_count ###(202)=[passed] Check tdecode with linktype >>> pkts = [ ... b'\xff\xff\xff\xff\xff\xff\xac"\x0b\xc5j\xdb\x08\x00E\x00\x00\x80\x00\x01\x00\x00@\x01\xf6x\xc0\x00\x02\x01\xc0\x00\x02\x02\x08\x00\xb6\xbe\x00\x00\x00\x00XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', ... b'\xff\xff\xff\xff\xff\xff\xac"\x0b\xc5j\xdb\x08\x00E\x00\x00\x80\x00\x01\x00\x00@\x01\xf6x\xc0\x00\x02\x02\xc0\x00\x02\x01\x00\x00\xbe\xbe\x00\x00\x00\x00XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', ... ] >>> >>> tempfile_count = len(conf.temp_files) >>> >>> r = tdecode(pkts, dump=True, linktype=DLT_EN10MB) /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=19> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6392 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert b'Src: 192.0.2.1' in r >>> assert b'Src: 192.0.2.2' in r >>> assert b'Dst: 192.0.2.2' in r >>> assert b'Dst: 192.0.2.1' in r >>> assert b'Echo (ping) request' in r >>> assert b'Echo (ping) reply' in r >>> assert b'ICMP' in r >>> assert len(conf.temp_files) == tempfile_count ###(204)=[passed] Check wireshark() >>> f = BytesIO() >>> pkt = Ether()/IP()/ICMP() >>> >>> with mock.patch('subprocess.Popen', return_value=Bunch(stdin=f)) as popen: ... # Prevent closing the BytesIO ... with mock.patch.object(f, 'close'): ... wireshark([pkt]) ... >>> popen.assert_called_once_with( ... [conf.prog.wireshark, '-ki', '-'], ... stdin=subprocess.PIPE, stdout=None, stderr=None) >>> >>> print(bytes_hex(f.getvalue())) b'd4c3b2a1020004000000000000000000ffff0000010000006df95467381f04002a0000002a000000ffffffffffff00000000000008004500001c0001000040017cde7f0000017f0000010800f7ff00000000' >>> assert raw(pkt) in f.getvalue() >>> f.close() >>> del f, pkt ###(205)=[passed] Check Raw IP pcap files >>> import tempfile >>> filename = tempfile.mktemp(suffix=".pcap") >>> wrpcap(filename, [IP()/UDP(), IPv6()/UDP()], linktype=DLT_RAW) >>> packets = rdpcap(filename) >>> assert isinstance(packets[0], IP) and isinstance(packets[1], IPv6) ###(206)=[passed] Check wrpcap() with no packet >>> import tempfile >>> filename = tempfile.mktemp(suffix=".pcap") >>> wrpcap(filename, []) >>> fstat = os.stat(filename) >>> assert fstat.st_size != 0 >>> os.remove(filename) ###(207)=[passed] Check wrpcap() with SndRcvList >>> import tempfile >>> filename = tempfile.mktemp(suffix=".pcap") >>> wrpcap(filename, SndRcvList(res=[(Ether()/IP(), Ether()/IP())])) >>> assert len(rdpcap(filename)) == 2 >>> os.remove(filename) ###(208)=[passed] Check wrpcap() with different packets types >>> from unittest import mock >>> import os >>> import tempfile >>> >>> with mock.patch("scapy.utils.warning") as warning: ... filename = tempfile.mktemp() ... wrpcap(filename, [IP(), Ether(), IP(), IP()]) ... os.remove(filename) ... assert any("Inconsistent" in arg for arg in warning.call_args[0]) ... ###(209)=[passed] Check wrpcap() with the Loopback layer >>> for cls in [Loopback, LoopbackOpenBSD]: ... filename = tempfile.mktemp(suffix=".pcap") ... wrpcap(filename, [cls()/IP()/ICMP()]) ... return_value = b"".join(line for line in tcpdump(filename, prog=conf.prog.tshark, getfd=True)) ... assert b"Echo (ping) request" in return_value ... /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=19> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6401 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=11> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 6404 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###### ## ERF Ethernet format support ###### ###(210)=[passed] Variable creations >>> erffile = BytesIO(b'3;!E_9\x92_\x02\x04\x00p\x00\x00\x00P\x00\x00\x00\x0fS?\xca\xc0\x1cjz\x18\x90\xed\x81\x00\x01:\x08\x00E\x00\x00(\xdf\xab@\x00;\x06\xb3s\n\x01]\xdb\n\xfb9\xda\xc3v\x84\xecD\x16\xb9\xab\xda\xa1b\xf9P\x10f\x98\x18\xcb\x00\x00\x00\x00\x90\x9e\xd7\xd2_\x929_\x0f\x9e\xcd\x1f\x01\x88\xb9\x15[/s<\x01\x88\xb9\x15[/\xcd\x1f\x01\x88\xb9\x15[/0\xcd"E_9\x92_\x02\x04\x00p\x00\x00\x00P\x00\x00\x1cjz\x18\x90\xed\x00\x0fS?\xca\xc0\x08\x00E\x00\x00(\xa2\xdd@\x00@\x06\xebA\n\xfb9\xda\n\x01]\xdb\x84\xec\xc3v\xda\xa1b\xf9D\x16\xb9\xacP\x10\x9a\xf0\xe4q\x00\x00\x00\x00\x00\x00\x00\x00o\xbc\xe2{_\x929_\x0f\x9f+3\x01\x88\xb9\x15u\x1e(^\x01\x88\xb9\x15u\x1e+3\x01\x88\xb9\x15u\x1e') >>> erffilewithheader = BytesIO(b'4;!E_9\x92_\x82\x00\x00x\x00\x00\x00P\x00\x00\x1a+>> pkterf = rderf(erffile) >>> assert pkterf[0].time == 1603418463.270038318 >>> assert pkterf[0][IP].src == "10.1.93.219" >>> assert pkterf[0][IP].dst == "10.251.57.218" >>> assert pkterf[0][Ether].src == "1c:6a:7a:18:90:ed" >>> assert pkterf[0][Ether].dst == "00:0f:53:3f:ca:c0" ###(212)=[passed] Check writing of ERF Ethernet file >>> import os, tempfile >>> fdesc, filename = tempfile.mkstemp() >>> fdesc = os.fdopen(fdesc, "wb") >>> wrerf(fdesc, pkterf) >>> fdesc.close() >>> newpkterf = rderf(filename) >>> >>> assert pkterf[1][Ether].src == newpkterf[1][Ether].src >>> >>> assert len(pkterf) == len(newpkterf) >>> assert newpkterf[0].time is not None >>> assert newpkterf[0].wirelen is not None >>> assert newpkterf[0].time == pkterf[0].time >>> assert newpkterf[0].wirelen == pkterf[0].wirelen >>> assert newpkterf[1].time is not None >>> assert newpkterf[1].wirelen is not None >>> assert newpkterf[1].time == pkterf[1].time >>> assert newpkterf[1].wirelen == pkterf[1].wirelen >>> >>> _, filename = tempfile.mkstemp() >>> wrerf(filename, pkterf, append=True) >>> wrerf(filename, pkterf, append=True) >>> newdoublepkterf = rderf(filename) >>> >>> assert len(newpkterf) * 2 == len(newdoublepkterf) ###(213)=[passed] Check rderf >>> pkterf = rderf(erffilewithheader) >>> assert pkterf[1].time == 1603418463.270062279 >>> assert pkterf[1][Ether].src == "00:0f:53:3f:ca:c0" ###### ## Mocked read_routes() and read_routes6() calls ###### ###(214)=[passed] Create patcher util >>> from unittest import mock >>> >>> from scapy.pton_ntop import inet_pton >>> import scapy.arch.bpf.pfroute >>> >>> og_afinet6 = socket.AF_INET6 >>> og_inet_pton = socket.inet_pton >>> def mock_inet_pton(af, data): ... if af in [24, 28, 30]: ... return og_inet_pton(og_afinet6, data) ... return og_inet_pton(af, data) ... >>> >>> og_inet_ntop = socket.inet_ntop >>> def mock_inet_ntop(af, data): ... if af in [24, 28, 30]: ... return og_inet_ntop(og_afinet6, data) ... return og_inet_ntop(af, data) ... >>> >>> class BSDLoader: ... def __init__(self, OPENBSD=False, FREEBSD=False, NETBSD=False, DARWIN=False, sysctldata=None, ifaces={}, AF_INET6=socket.AF_INET6): ... self.sysctldata = sysctldata ... self.ifaces = ifaces ... socket.AF_LINK = 18 ... self.loadpatches = [ ... mock.patch('socket.AF_INET6', AF_INET6), ... mock.patch('socket.inet_pton', side_effect=mock_inet_pton), ... mock.patch('socket.inet_ntop', side_effect=mock_inet_ntop), ... mock.patch('scapy.consts.OPENBSD', OPENBSD), ... # mock.patch('scapy.consts.FREEBSD', FREEBSD), ... mock.patch('scapy.consts.NETBSD', NETBSD), ... mock.patch('scapy.consts.DARWIN', DARWIN), ... ] ... def __enter__(self): ... # Apply patches that only occur when loading ... for p in self.loadpatches: ... p.start() ... # Reload module ... pfroute = importlib.reload(scapy.arch.bpf.pfroute) ... # Now apply post-load patches ... self.patches = [ ... mock.patch.object( ... pfroute, ... '_sr1_bsdsysctl', ... return_value=pfroute.pfmsghdrs(self.sysctldata) ... ), ... mock.patch.object( ... pfroute, ... '_get_if_list', ... return_value=self.ifaces, ... ), ... ] ... for p in self.patches: ... p.start() ... return pfroute ... def __exit__(self, *args, **kwargs): ... for p in self.loadpatches: ... p.stop() ... for p in self.patches: ... p.stop() ... ###(215)=[passed] OpenBSD 7.5 amd64 - read_routes() >>> import zlib >>> >>> _PFROUTE_DATA = zlib.decompress(bytes.fromhex('789c7bc1c0ca92c0c0c8c0c0c0c160cec2c0e0ccc10006de0f1850003f0376c08a431c06049830f96bc40f30e2925710626460636163c828cb3360108d6548e5c4aabf0bc6576248c9482ec8494d2c4e4dc1e78e03607f323380fd09243d71f853109be6067c2623dcf5008d5fcfc080e2cf0f48f20a42cc0c1240e7e4e41be0340f593fbafbbd71b81f2b20d2fdf504dcff9f2aee6704bbdf151873d8dc8f961ce0ee67c4264ec0bd18ee0702cadc0fe2b280ddefc8d880d5fdb80031ee07a66b747e1732ffff7f440a22359f5c80bb9f1912fe2ccc58ddcf03a5cd675f494316c71a2f98f6c1bd09761f1002dd26f4b900bb7ad4f820d73fd0f4c4a280d53f5c04dc4dc03f70fb88711f25fe3980ee1f0607acfe61a7c83fe7ffa3f2d1d317f9ee1f05a360148c8251300a46c128180543030000bd836967')) >>> >>> >>> with BSDLoader(OPENBSD=True, sysctldata=_PFROUTE_DATA, AF_INET6=24) as pfroute: ... routes = pfroute.read_routes() ... >>> >>> assert routes == [ ... (0, 0, '172.23.192.1', 'hvn0', '172.23.192.138', 1), ... (3758096384, 4026531840, '127.0.0.1', 'lo0', '127.0.0.1', 1), ... (2130706432, 4278190080, '127.0.0.1', 'lo0', '127.0.0.1', 1), ... (2130706433, 4294967295, '127.0.0.1', 'lo0', '127.0.0.1', 1), ... (2887237632, 4294963200, '172.23.192.138', 'hvn0', '172.23.192.138', 1), ... (2887237633, 4294967295, '0.0.0.0', 'hvn0', '172.23.192.138', 1), ... (2887237770, 4294967295, '0.0.0.0', 'hvn0', '172.23.192.138', 1), ... (2887241727, 4294967295, '172.23.192.138', 'hvn0', '172.23.192.138', 1) ... ] ###(216)=[passed] OpenBSD 7.5 amd64 - read_routes6() >>> import zlib >>> >>> _PFROUTE_DATA = zlib.decompress(bytes.fromhex('789ced96bb0dc2301086cf38481125a248411131011d3505a2600906406204325a4661040a6a4264f130d6c5b19c87e2f07f458adcd9be2f7fe190984647924414d3a67c1e6252dcf7544f56dfb24cbceac2ac171a7a633a979494e39fce6baffde9e32f94ff8e56eab5e9bfe076c98866ecf6eee7fbf8ebdfa03dffbef2ffcd6f38f977eb9f4eecf5aaf9347fb6311cff8bd77ce3f1bf7acdf7f5bfb18de1f8f3f9fd4bfe8f8a5e67ff9c5f1f8c7f6eaf57cdd79ffffbfe4fd5eb0ef297dcf9aef5a6f77fd5fe7de55f087bdd80f1e7d7b7977fa4fcb7af7bdaf467c7cff899b8f34b7f69abbbe4cfad0f26ffc6ff3ffcfa60f29f0c347f00000000000000000000306a9e0a72ae83')) >>> >>> >>> with BSDLoader(OPENBSD=True, sysctldata=_PFROUTE_DATA, AF_INET6=24) as pfroute: ... routes = pfroute.read_routes6() ... >>> >>> assert routes == [ ... ('::', 96, '::1', 'lo0', ['::1'], 1), ... ('::1', 128, '::1', 'lo0', ['::1'], 1), ... ('::ffff:0.0.0.0', 96, '::1', 'lo0', ['::1'], 1), ... ('2002::', 24, '::1', 'lo0', ['::1'], 1), ... ('2002:7f00::', 24, '::1', 'lo0', ['::1'], 1), ... ('2002:e000::', 20, '::1', 'lo0', ['::1'], 1), ... ('2002:ff00::', 24, '::1', 'lo0', ['::1'], 1), ... ('fe80::', 10, '::1', 'lo0', ['::1'], 1), ... ('fec0::', 10, '::1', 'lo0', ['::1'], 1), ... ('fe80:3::1', 128, 'fe80:3::1', 'lo0', ['fe80:3::1'], 1), ... ('ff01::', 16, '::1', 'lo0', ['::1'], 1), ... ('ff01:3::', 32, 'fe80:3::1', 'lo0', ['fe80:3::1'], 1), ... ('ff02::', 16, '::1', 'lo0', ['::1'], 1), ... ('ff02:3::', 32, 'fe80:3::1', 'lo0', ['fe80:3::1'], 1) ... ] ###(217)=[passed] FreeBSD 14.1 amd64 - read_routes() >>> import zlib >>> >>> from scapy.arch.bpf.pfroute import _bsd_iff_flags >>> _FREEBSD_IFACES = {1: {'name': 'lo0', 'index': 1, 'flags': FlagValue(32841, _bsd_iff_flags), 'mac': '00:00:00:00:00:00', 'ips': [{'af_family': 28, 'index': 1, 'address': '::1', 'scope': 16}, {'af_family': 28, 'index': 1, 'address': 'fe80::1', 'scope': 32}, {'af_family': 2, 'index': 1, 'address': '127.0.0.1'}]}, 2: {'name': 'hn0', 'index': 2, 'flags': FlagValue(34883, _bsd_iff_flags), 'mac': '00:15:5d:00:65:07', 'ips': [{'af_family': 28, 'index': 2, 'address': 'fe80::215:5dff:fe00:6507', 'scope': 32}, {'af_family': 2, 'index': 2, 'address': '172.23.198.182'}]}} >>> >>> _PFROUTE_DATA = zlib.decompress(bytes.fromhex('789c136064656162606060e660603067200ceeb012a18808c008a55970c80b3061f2d7881f60c4256f21c4c4c0c6ccc6909167c0201acb90ca4ea43b20e61edb8670182b0bc8125606010663620c7020d2220280118d46072077d623490b0831324820c95b80f8cc0c0c39f90624d98b612e343d3002fd3f10e98109873c34fe117c507ca3c9ffffff01cea77a7ae01898f4c08c431edd9de8e141adf40000e8611aa8')) >>> >>> >>> with BSDLoader(FREEBSD=True, sysctldata=_PFROUTE_DATA, ifaces=_FREEBSD_IFACES, AF_INET6=28) as pfroute: ... routes = pfroute.read_routes() ... >>> assert routes == [ ... (0, 0, '172.23.192.1', 'hn0', '172.23.198.182', 1), ... (2130706433, 4294967295, '0.0.0.0', 'lo0', '127.0.0.1', 1), ... (2887237632, 4294963200, '0.0.0.0', 'hn0', '172.23.198.182', 1), ... (2887239350, 4294967295, '0.0.0.0', 'lo0', '127.0.0.1', 1), ... (3758096384, 4026531840, '0.0.0.0', 'lo0', '127.0.0.1', 250), ... (3758096384, 4026531840, '0.0.0.0', 'hn0', '172.23.198.182', 250) ... ] ###(218)=[passed] FreeBSD 14.1 amd64 - read_routes6() >>> _PFROUTE_DATA = zlib.decompress(bytes.fromhex('789ce5553b0e8240109d593e62b72121b1a0e00824165a72042e40696261f40a1ecd837816101236c28461872801e36bb678f3797979bb9ba3e722006c0380030890498aecc0f6f4193e8ec7fb191e295f75d02d3c86083b07e0724b457aa57b93d64f2fd0b0970ccc26ad6781e4a4b0e9d68d1f1d622e7ff29fc95b3f2f6bcddbdafd2cefe33c33f6ede763b87f2e3fb3d64f04bd889f0ec3737e9a3e7a7f691ee9bc4ffd233ad0e858fafd530c6fd3fdedf78fdbd3e44b813c5f4f6fd27a16663f378ecb97f15387aa77d7edf9aaeb1d1fced714a2024e1ba14eaa43454555d6ed46c7d2f97219dea69bfaf7afff41c55c50f9ff3adc3f979f2f44725d78')) >>> >>> >>> with BSDLoader(FREEBSD=True, sysctldata=_PFROUTE_DATA, ifaces=_FREEBSD_IFACES, AF_INET6=28) as pfroute: ... routes = pfroute.read_routes6() ... >>> assert routes == [ ... ('::', 96, '::1', 'lo0', ['::1'], 1), ... ('::1', 128, '::', 'lo0', ['::1'], 1), ... ('::ffff:0.0.0.0', 96, '::1', 'lo0', ['::1'], 1), ... ('fe80::', 10, '::1', 'lo0', ['::1'], 1), ... ('fe80::', 64, '::', 'lo0', ['fe80::1'], 1), ... ('fe80::1', 128, '::', 'lo0', ['fe80::1'], 1), ... ('fe80::', 64, '::', 'hn0', ['fe80::215:5dff:fe00:6507'], 1), ... ('fe80::215:5dff:fe00:6507', 128, '::', 'lo0', ['::1'], 1), ... ('ff02::', 16, '::1', 'lo0', ['::1'], 1), ... ('ff00::', 8, '::', 'lo0', ['::1', 'fe80::1'], 250), ... ('ff00::', 8, '::', 'hn0', ['fe80::215:5dff:fe00:6507'], 250) ... ] ###(219)=[passed] NetBSD 10.0 amd64 - read_routes() >>> import zlib >>> >>> from scapy.arch.bpf.pfroute import _bsd_iff_flags >>> _NETBSD_IFACES = {1: {'name': 'hvn0', 'index': 1, 'flags': FlagValue(34883, _bsd_iff_flags), 'mac': '00:15:5d:00:65:0a', 'ips': [{'af_family': 24, 'index': 1, 'address': 'fe80:1::7184:2b50:9fbe:e337', 'scope': 32}, {'af_family': 2, 'index': 1, 'address': '172.23.207.191'}]}, 2: {'name': 'lo0', 'index': 2, 'flags': FlagValue(32841, _bsd_iff_flags), 'mac': '00:00:00:00:00:00', 'ips': [{'af_family': 2, 'index': 2, 'address': '127.0.0.1'}, {'af_family': 24, 'index': 2, 'address': '::1', 'scope': 16}, {'af_family': 24, 'index': 2, 'address': 'fe80:2::1', 'scope': 32}]}} >>> >>> _PFROUTE_DATA = zlib.decompress(bytes.fromhex('789c3bc1c0c2c2c8c0c0c00cc4e60ca8c08a91816640800993bf46fc00868d42428c0c6c2c6c0c196579060ca2b10ca95cc8eacfef87a93b00f407c8486e0e4c7f600311cd94b81ed5ddf5987cb83f58ff0301c85d424c0c12c040cec937c0aa6e07d4fdac0c2c0cc6f4773fdc1de8ee24e4ee0bd0f4c3c88819ee2c2cd471232e7703d30b9c0f4e2758d4b183c2ffff0792d311b1f1402d80ee0e5cfec1161fc8fa6640e383550592a769058cef5d4943e6a3e75f3eb0fb813e108d15fa5c404387e000001e173214')) >>> >>> >>> with BSDLoader(NETBSD=True, sysctldata=_PFROUTE_DATA, ifaces=_NETBSD_IFACES, AF_INET6=24) as pfroute: ... routes = pfroute.read_routes() ... >>> assert routes == [ ... (0, 0, '172.23.192.1', 'hvn0', '172.23.207.191', 1), ... (2130706432, 4294967040, '127.0.0.1', 'lo0', '127.0.0.1', 1), ... (2130706433, 4294967295, '0.0.0.0', 'lo0', '127.0.0.1', 1), ... (2887237632, 4294967295, '0.0.0.0', 'hvn0', '172.23.207.191', 1), ... (2887241663, 4294967295, '0.0.0.0', 'lo0', '172.23.207.191', 1), ... (2887237633, 4294967295, '0.0.0.0', 'hvn0', '', 1), ... (3758096384, 4026531840, '0.0.0.0', 'hvn0', '172.23.207.191', 250), ... (3758096384, 4026531840, '0.0.0.0', 'lo0', '127.0.0.1', 250) ... ] ###(220)=[passed] NetBSD 10.0 amd64 - read_routes6() >>> _PFROUTE_DATA = zlib.decompress(bytes.fromhex('789ced97b14ec3301445af4da8aa964a5544a50e1dd8592a31f01b8c2c1d2b31205017d65682ffe86f30213e8331123fd09109d3368a8127fbd9898c2c87de29ce4dac77749f1d0722cb24807e17b8845bd78f1e0f7968326ee48bea62a40cdadeefe712e323e0f67eea350f12e53f35e3d7e67f43c97f8c0c171e75ff31bfae8b72a49cebd2e1a3e57d5d387c38f837489b5f397cb43a7fa5787fafe0fbda07e2f29f89c133e713e9ba4f52e796bc4ff4bddfffc64e907bc9fa442de22e589fc8c0bd29c7c9712bd6276a4dde9f2bde27d275f72aead772dc847b3710c28f3b947e700b939fe7021dc3fd21f986ed9fcb3ab879b89b6234c3bc679e7ff1747eb57e79d78845cdf37928b9eab271db72b5cd53f5f3ce8c94abf18b65f1750fd07c196ee3fb75ffbb42c95597ef7f97edfdd8eb54897aeb949eb79aae53ddc79edca1f7e52d37dbc74441cf9b51f396ff346f1927ef830efa028ffb7c47')) >>> >>> >>> with BSDLoader(NETBSD=True, sysctldata=_PFROUTE_DATA, ifaces=_NETBSD_IFACES, AF_INET6=24) as pfroute: ... routes = pfroute.read_routes6() ... >>> assert routes == [ ... ('::', 104, '::1', 'lo0', ['::1'], 1), ... ('::', 96, '::1', 'lo0', ['::1'], 1), ... ('::1', 128, '::', 'lo0', ['::1'], 1), ... ('::127.0.0.0', 104, '::1', 'lo0', ['::1'], 1), ... ('::224.0.0.0', 100, '::1', 'lo0', ['::1'], 1), ... ('::255.0.0.0', 104, '::1', 'lo0', ['::1'], 1), ... ('::ffff:0.0.0.0', 96, '::1', 'lo0', ['::1'], 1), ... ('2001:db8::', 32, '::1', 'lo0', ['::1'], 1), ... ('2002::', 24, '::1', 'lo0', ['::1'], 1), ... ('2002:7f00::', 24, '::1', 'lo0', ['::1'], 1), ... ('2002:e000::', 20, '::1', 'lo0', ['::1'], 1), ... ('2002:ff00::', 24, '::1', 'lo0', ['::1'], 1), ... ('fe80::', 10, '::1', 'lo0', ['::1'], 1), ... ('fe80:1::', 64, '::', 'hvn0', ['fe80:1::7184:2b50:9fbe:e337'], 1), ... ('fe80:1::7184:2b50:9fbe:e337', ... 128, ... '::', ... 'lo0', ... ['fe80:1::7184:2b50:9fbe:e337'], ... 1), ... ('fe80:2::', 64, 'fe80:2::1', 'lo0', ['fe80:2::1'], 1), ... ('fe80:2::1', 128, '::', 'lo0', ['fe80:2::1'], 1), ... ('ff01:1::', 32, '::', 'hvn0', ['fe80:1::7184:2b50:9fbe:e337'], 1), ... ('ff01:2::', 32, '::1', 'lo0', ['::1'], 1), ... ('ff02:1::', 32, '::', 'hvn0', ['fe80:1::7184:2b50:9fbe:e337'], 1), ... ('ff02:2::', 32, '::1', 'lo0', ['::1'], 1), ... ('ff00::', 8, '::', 'hvn0', ['fe80:1::7184:2b50:9fbe:e337'], 250), ... ('ff00::', 8, '::', 'lo0', ['::1', 'fe80:2::1'], 250) ... ] ###(221)=[passed] Darwin 23.6 (MacOS 14.5) x86_64 - read_routes() >>> import zlib >>> >>> from scapy.arch.bpf.pfroute import _bsd_iff_flags >>> _DARWIN_IFACES = {1: {'name': 'lo0', 'index': 1, 'flags': FlagValue(32841, _bsd_iff_flags), 'mac': '00:00:00:00:00:00', 'ips': [{'af_family': 2, 'index': 1, 'address': '127.0.0.1'}, {'af_family': 30, 'index': 1, 'address': '::1', 'scope': 16}, {'af_family': 30, 'index': 1, 'address': 'fe80:1::1', 'scope': 32}]}, 2: {'name': 'gif0', 'index': 2, 'flags': FlagValue(32784, _bsd_iff_flags), 'mac': '00:00:00:00:00:00', 'ips': []}, 3: {'name': 'stf0', 'index': 3, 'flags': FlagValue(0, _bsd_iff_flags), 'mac': '00:00:00:00:00:00', 'ips': []}, 4: {'name': 'XHC2', 'index': 4, 'flags': FlagValue(0, _bsd_iff_flags), 'mac': '00:00:00:00:00:00', 'ips': []}, 5: {'name': 'en0', 'index': 5, 'flags': FlagValue(34915, _bsd_iff_flags), 'mac': '52:54:00:09:49:17', 'ips': [{'af_family': 30, 'index': 5, 'address': 'fe80:5::409:eec9:f06c:50ab', 'scope': 32}, {'af_family': 30, 'index': 5, 'address': 'fec0::89e:daf7:5cb1:f1f0', 'scope': 64}, {'af_family': 30, 'index': 5, 'address': 'fec0::c0c4:1f0b:61ba:ea8', 'scope': 64}, {'af_family': 2, 'index': 5, 'address': '10.0.2.15'}]}, 6: {'name': 'utun0', 'index': 6, 'flags': FlagValue(32849, _bsd_iff_flags), 'mac': '00:00:00:00:00:00', 'ips': [{'af_family': 30, 'index': 6, 'address': 'fe80:6::d36e:82de:94dc:84fc', 'scope': 32}]}, 7: {'name': 'utun1', 'index': 7, 'flags': FlagValue(32849, _bsd_iff_flags), 'mac': '00:00:00:00:00:00', 'ips': [{'af_family': 30, 'index': 7, 'address': 'fe80:7::7ce2:1f7b:2c29:a5ee', 'scope': 32}]}, 8: {'name': 'utun2', 'index': 8, 'flags': FlagValue(32849, _bsd_iff_flags), 'mac': '00:00:00:00:00:00', 'ips': [{'af_family': 30, 'index': 8, 'address': 'fe80:8::e4e0:bef:bf56:2605', 'scope': 32}]}, 9: {'name': 'utun3', 'index': 9, 'flags': FlagValue(32849, _bsd_iff_flags), 'mac': '00:00:00:00:00:00', 'ips': [{'af_family': 30, 'index': 9, 'address': 'fe80:9::ce81:b1c:bd2c:69e', 'scope': 32}]}} >>> >>> _PFROUTE_DATA = zlib.decompress(bytes.fromhex('789ccdd94d6813411400e0d9ddcc36e6608d4472a950a8e0d183e8a1a7da5a503008012948b11eaa78f0e6498b180a45c1802d08164f7ab3f4208817b1e84a0ff647ea0fd2832815a5e021018f518931dbce6c5e76df6cb2e36c3a0325bce936fbf5bdd96176669ad00c2584584963e060fd7382e0ed3315fc22a4ed3183718a98260df675f3b8c83c5dc41ceeab7f1acca6ca6366922f451ebf6596598c5d84b8b9f1fd3b01cb8bc58f17a35852e01b337b29b17dd774d5b65a4b97a1dee5c1305772db55f3bba6998b26cc7d6eedf2cc2872ed5ffe5f974df2671abd211eea7a4ce0d9403c59816703e963f7b2508f857b3a5037ef5e72751b34fa581fcf9305fe9ebb4a029785f4b17bd59a5d3661431bb5fbe700b76e2ae780eef2d4619f4f3807c43d1fa5b3e753da587ad7e7b4b11c583aad8d65fe50561bcbc29de7fa589e7c93b5a87ea6d30bcf6eca5a12c082cd77a2269aefd295d280ac45798d2aa541598b052c70edd3ca82ad93986548d612435e8ecb5a605e145986652deaf3f23ba19185c2b83d8b7d8caf61c2c6eedbf7f81a463876ab3d7fa25b62ca4bf5c81b8d2c6b1a59dee96339b9aa8f25b72c6b513ed755732bd12dc1671abe3b71cb9ae099c6deb3b62d97af47b7c455a3196dde03b2fd4e8f4696c72a2cd8781135d178a95bd655586093cfcbab823616e7fb2f590b7c0f505223a72cfd1e10836556d6a2be46e5872a2c2af27234f76053850536d9bc8c54c61fe96219bdf6e9be2e96b1f1a913ba582e5d397bbb5dcbddbac5bd3fdf631536a873d84f1b961bc1d81be6946d69fafb8bcc44492fe1f38cc7680ac24d4dd70a0cade2b035d529f0bdbc56b73ee06b2af7daa7be7abaf72ae6af5a30dec93da17b17266c184739eb1135d9bdf9b9bf8d18db9bb7d97e78a773e46c7e1983f14e3ee7af7fcc27dbb534ea5588e52ce52b88b17ab9cffa4fc4c573441393e02ca520744569cce5ed43ec6667290639b7d5dbe931dd38c18976def40fb15043e2')) >>> >>> >>> with BSDLoader(DARWIN=True, sysctldata=_PFROUTE_DATA, ifaces=_DARWIN_IFACES, AF_INET6=30) as pfroute: ... routes = pfroute.read_routes() ... >>> assert routes == [ ... (0, 0, '10.0.2.2', 'en0', '10.0.2.15', 1), ... (167772672, 4294967295, '0.0.0.0', 'en0', '10.0.2.15', 1), ... (167772674, 4294967295, '0.0.0.0', 'en0', '10.0.2.15', 1), ... (167772674, 4294967295, '0.0.0.0', 'en0', '10.0.2.15', 1), ... (167772675, 4294967295, '0.0.0.0', 'en0', '10.0.2.15', 1), ... (167772687, 4294967295, '0.0.0.0', 'en0', '10.0.2.15', 1), ... (167772927, 4294967295, '0.0.0.0', 'en0', '10.0.2.15', 1), ... (2130706432, 4294967040, '127.0.0.1', 'lo0', '127.0.0.1', 1), ... (2130706433, 4294967295, '127.0.0.1', 'lo0', '127.0.0.1', 1), ... (2851995648, 4294967295, '0.0.0.0', 'en0', '10.0.2.15', 1), ... (3758096384, 4043308800, '0.0.0.0', 'en0', '10.0.2.15', 1), ... (3758096635, 4294967295, '0.0.0.0', 'en0', '10.0.2.15', 1), ... (4294967295, 4294967295, '0.0.0.0', 'en0', '10.0.2.15', 1) ... ] ###(222)=[passed] Darwin 23.6 (MacOS 14.5) x86_64 - read_routes6() >>> _PFROUTE_DATA = zlib.decompress(bytes.fromhex('789cd5dd5f8c13451800f0d96dbbdb5e8fbbdaebfd114eaf08148fdc830124045f0a1581981062f48c8698c32022313c1925c2c381f8a0a28290887f728644e0d0aa60ce80e60897887fe08120f060cc051030218af74713088a60b73b5bda6e77f73a33fbcd7dfbc27667d2fefaddb7dfcc6cb7a58f84122142488028e9e9b97f8f90cadb60c8a1c1656bbddbbbed6637297e6635e4d01e8c0c1d1b797ed9a7c67e5fceac99e6f9d35d5edf47b3567c5c73683fbd76d3d91d839b6f58667d0ce695fe99f5e2e3ba43fb860b6deb3bda770f59e6f018cc277597463e73b8f878d8a1fdd2f9e8f091ce54c83247c660be1cf0cd1c293e1e71683fb131da7ab843eb31f6f7e7cc4aeedf503049a6b801d2c2cc0a4fdb7e5a3374a2cdb7bc46fd28ef6c9d7f43a7ceacaad69b5416772d56c94c7a784e715ba59ae1562faaf5fec9ed55d6417a39e23b9b1ec6125fea858d2f87770e32ef5c19de1106efd4e06a920e8669894f0620bd2cf14d91ad64f2dbf308894df8f9a9f4f65d38bcab9079d722f36e42e67d1f99770099f72832ef6554ded4d3130999747c70188db70399772632ef1a64deadc8bcfdc8bcc79179cf48f18eb278833db96585d26e8a6a4aae31f8edbdc4e2d5ee25eaac7f546dfd475757e8e159905e96f57c4a5b5438b63a9eb880cbdb08eabdc2ea8d516f22f0072e6f10d4cb9c0f96b729b810973704ea1de6f64eedc2e59d06ea651a8f4bbcb33b7179ef17e455171a5ec5c35bcd56d93bef075cde07047961c68b6ca6a1458c1726bed94ce345315e98f1229b69fe1dd2cb5b1fb299d41a482fef7891cdcc3826c6eb73fe26cdfdd513b5cd62bcfe7dde52ead541bdccf95bf086f7e1f24640bdcce75bc15bb71797b71ed4cb7bbe65338bbe87f4f2c6379b79380de9e53ddf72de51482ff3fc61b2b9ffe633eb6a9079a390deeb2c5efdef652430ed3962ce226a21bd4ce75ba977022e6f12597c93a0f13df5138337a92c21d763f4110922f14e43e64d21f35ab7c0a2f0aae180e5ba0b99f76e245eeb56752cf1b5ee2c9f24c66baee7831ede6ab6626fcd68e1700c85f7aa68af8f9f1f27952bd17385c30b20bdd718bc334862595a0fd36748aa905e96f90ef5d2af582441c70b96f531f5d6522fe8fd041cf1ad93e165591f9779c3905e8ef8d22bc0b0e71b4b3da3de06195e8ef85a5e0dd2cb91bf2dd45b87c43b917ab1d433cb0b9abf2cd7a3cabca0d7cf583e8f2df382e6ef632c5ee560ba462d4c8041f3e1257e2fe87c6711bf17743c6e64f56a9657d929c6ebdfe7b1796fb8105fd0f1ed04c3fa38ef6db29e5201bd7f5280f72f48efbfacf9db34629140c76301de00a49769be53eabd538cd7e7fad06279c9f85fbf957a41f3e11cb357cefc813dbe72e60fccf537791f3d2aaafefa7cbea5909d6fb7bd3aa497793e999233dfb9c9ea9d5fd76d8a60f3418017b49eb5f27b41c70b01f105adbf02bc2164def17fbd2fe76de832eb426e038daf002fb6f8828e6f02bca0d74b047823c8bca0d753057841ef4714e005bd5f4e8017f47e39015ed0ebebcff27beb21bd02e20b7a7f8900ef1d905ea6fb4bd4d45c73964e9f1ed0cbf47961a917b49e317d7ea1a646b46e53bcfce53def427a99ee8729f57e8bccfb1ba497e97e8d9c771bad0b5db1eba0eb0b015ed0f585002fe8fa428017747d21c00bbabe6862f72e34f69b17c37ae3fcde6648af80f80ababf1a2cbe6d90de667e6f1299773232ef3dc8bc539079a7427a1f62f686bb2909f4f7f038bcafcbf03eceed6d7e02d2cb11df2d9484251fb6c9f072e4c376f3119a7cf89a9240e39b64f6d6bf623e8a7f07e97d92dd4bebc383a0df2fe4f06e91e1e5c887f7cc47b0f9c03e5f6fd8489f612912ef6b32bcacd727735e29f3878becde3764787f65f7be23c3cb910fdb917977caf0b2cf771a3e301fc1ce7738ceb70f2909cbf9d623c3cb91bfbb647839f2618f0c2fc7f946bdb0e71b47feeea5242cf9db2bc3cb11df7d32bc1cf3c94fe83380ce27c9695e6f3be8fd041cde2c32ef67c8bc9fcbf0728c6f5f5012687de0882ff5a2c9870332bc1ce3c5979484251ffacc4768f2e12b64de8332bc1cf5ec102561c95fea858def7fccf16da4d74b26fc88c4db23c3cb743fad9aba463e26247b7e45a8bc6d9c7bf5f2b671eead41e6ad45e6ad47e68d61f12a4d86f72d34f940bd75d0de192cdee0d205e6afbc1a9bfe22a497e9f7b90cef1aeb68f055486f1bb7577f81c73b90f31a5f3c5188a24c27a4f02514db667b0763f7e65ed7f6b40e6df9fdd8add2cdad6f2ff5878249650a8c3fbf9f882ba4a58afe87685e28b9401b71561d5e93e7772bcafef6c47486cc2ff8166d2ef1b5e5472f7587826aa311dfe3f43df8e8566fbb35f248272904cbcb599c078e5b9adf59fcba05e7a324b2a4d9bbbf71be197f0feb7cf3290fcaffe4b6b6d36b379ddd31b8f986b1ef920fb6be4071b6bd6e22aed992ceadbf11676332ed15e7957c71d6bdda365c685bdfd1be7bc8d87789b3ad2f509c6daf9b88eb6e71b6f537e26c7c01c52bce276d91aaca19f66abb743e3a7ca43395ff6bbac4d9d61728ceb6d74dc4c36e71b6f537e26c7c11c52bce97035cce8857db898dd1d6c31d5afe5a804b9c6d7d81e26c7bdd443ce216675bffa2719af8569f07ec6d02c7e9427c15fac68bdf8397bbd2fb7570f38ed3c4b73ca0ce70cf2fd7961f181d2971561aa72bf487740e1c6d8baef8a6ae77accee2fefdd6fc5de956acff7045b4f3964b5bd996cfb88895b01efdfa0ae79abb9de75cab64af74ae553257cadf7e6bfe066c769beb38d86dfdfaad3991879d674ee461b7cd1f1cecb67efdd63cc3c3ce33cff0b0dbc66407bbad5fbf35767bd879c66e0fbb6d9c73b0dbfa81d4970aeb49b7ba515b614cacd40fa4be28635b7357324bab2f4a75eb4307bb9cfaa254b7e672b0cba92f4a75eb1807bb9cfaa254b73670b0cba92f2ae2faa222ac2f2ae2faa222ae2f2ae2faa2fa535ffe079dfe8806')) >>> >>> >>> with BSDLoader(DARWIN=True, sysctldata=_PFROUTE_DATA, ifaces=_DARWIN_IFACES, AF_INET6=30) as pfroute: ... routes = pfroute.read_routes6() ... >>> assert routes == [ ... ('::', 0, 'fe80:5::2', 'en0', ['fe80:5::409:eec9:f06c:50ab'], 1), ... ('::', 0, 'fe80:6::', 'utun0', ['fe80:6::d36e:82de:94dc:84fc'], 1), ... ('::', 0, 'fe80:7::', 'utun1', ['fe80:7::7ce2:1f7b:2c29:a5ee'], 1), ... ('::', 0, 'fe80:8::', 'utun2', ['fe80:8::e4e0:bef:bf56:2605'], 1), ... ('::', 0, 'fe80:9::', 'utun3', ['fe80:9::ce81:b1c:bd2c:69e'], 1), ... ('::1', 128, '::1', 'lo0', ['::1'], 1), ... ('fe80:1::', 64, 'fe80:1::1', 'lo0', ['fe80:1::1'], 1), ... ('fe80:1::1', 128, '::', 'lo0', ['fe80:1::1'], 1), ... ('fe80:5::', 64, '::', 'en0', ['fe80:5::409:eec9:f06c:50ab'], 1), ... ('fe80:5::2', 128, '::', 'en0', ['fe80:5::409:eec9:f06c:50ab'], 1), ... ('fe80:5::409:eec9:f06c:50ab', 128, '::', 'lo0', ['fe80:5::409:eec9:f06c:50ab'], 1), ... ('fe80:6::', 64, 'fe80:6::d36e:82de:94dc:84fc', 'utun0', ['fe80:6::d36e:82de:94dc:84fc'], 1), ... ('fe80:6::d36e:82de:94dc:84fc', 128, '::', 'lo0', ['fe80:6::d36e:82de:94dc:84fc'], 1), ... ('fe80:7::', 64, 'fe80:7::7ce2:1f7b:2c29:a5ee', 'utun1', ['fe80:7::7ce2:1f7b:2c29:a5ee'], 1), ... ('fe80:7::7ce2:1f7b:2c29:a5ee', 128, '::', 'lo0', ['fe80:7::7ce2:1f7b:2c29:a5ee'], 1), ... ('fe80:8::', 64, 'fe80:8::e4e0:bef:bf56:2605', 'utun2', ['fe80:8::e4e0:bef:bf56:2605'], 1), ... ('fe80:8::e4e0:bef:bf56:2605', 128, '::', 'lo0', ['fe80:8::e4e0:bef:bf56:2605'], 1), ... ('fe80:9::', 64, 'fe80:9::ce81:b1c:bd2c:69e', 'utun3', ['fe80:9::ce81:b1c:bd2c:69e'], 1), ... ('fe80:9::ce81:b1c:bd2c:69e', 128, '::', 'lo0', ['fe80:9::ce81:b1c:bd2c:69e'], 1), ... ('fec0::', 64, '::', 'en0', ['fe80:5::409:eec9:f06c:50ab'], 1), ... ('fec0::2', 128, '::', 'en0', ['fe80:5::409:eec9:f06c:50ab'], 1), ... ('fec0::89e:daf7:5cb1:f1f0', 128, '::', 'lo0', ['fec0::89e:daf7:5cb1:f1f0'], 1), ... ('fec0::c0c4:1f0b:61ba:ea8', 128, '::', 'lo0', ['fec0::c0c4:1f0b:61ba:ea8'], 1), ... ('ff00::', 8, '::1', 'lo0', ['::1'], 1), ... ('ff00::', 8, '::', 'en0', ['fe80:5::409:eec9:f06c:50ab'], 1), ... ('ff00::', 8, 'fe80:6::d36e:82de:94dc:84fc', 'utun0', ['fe80:6::d36e:82de:94dc:84fc'], 1), ... ('ff00::', 8, 'fe80:7::7ce2:1f7b:2c29:a5ee', 'utun1', ['fe80:7::7ce2:1f7b:2c29:a5ee'], 1), ... ('ff00::', 8, 'fe80:8::e4e0:bef:bf56:2605', 'utun2', ['fe80:8::e4e0:bef:bf56:2605'], 1), ... ('ff00::', 8, 'fe80:9::ce81:b1c:bd2c:69e', 'utun3', ['fe80:9::ce81:b1c:bd2c:69e'], 1), ... ('ff01:1::', 32, '::1', 'lo0', ['::1'], 1), ... ('ff01:5::', 32, '::', 'en0', ['fe80:5::409:eec9:f06c:50ab'], 1), ... ('ff01:6::', 32, 'fe80:6::d36e:82de:94dc:84fc', 'utun0', ['fe80:6::d36e:82de:94dc:84fc'], 1), ... ('ff01:7::', 32, 'fe80:7::7ce2:1f7b:2c29:a5ee', 'utun1', ['fe80:7::7ce2:1f7b:2c29:a5ee'], 1), ... ('ff01:8::', 32, 'fe80:8::e4e0:bef:bf56:2605', 'utun2', ['fe80:8::e4e0:bef:bf56:2605'], 1), ... ('ff01:9::', 32, 'fe80:9::ce81:b1c:bd2c:69e', 'utun3', ['fe80:9::ce81:b1c:bd2c:69e'], 1), ... ('ff02:1::', 32, '::1', 'lo0', ['::1'], 1), ... ('ff02:5::', 32, '::', 'en0', ['fe80:5::409:eec9:f06c:50ab'], 1), ... ('ff02:6::', 32, 'fe80:6::d36e:82de:94dc:84fc', 'utun0', ['fe80:6::d36e:82de:94dc:84fc'], 1), ... ('ff02:7::', 32, 'fe80:7::7ce2:1f7b:2c29:a5ee', 'utun1', ['fe80:7::7ce2:1f7b:2c29:a5ee'], 1), ... ('ff02:8::', 32, 'fe80:8::e4e0:bef:bf56:2605', 'utun2', ['fe80:8::e4e0:bef:bf56:2605'], 1), ... ('ff02:9::', 32, 'fe80:9::ce81:b1c:bd2c:69e', 'utun3', ['fe80:9::ce81:b1c:bd2c:69e'], 1) ... ] ###### ## Mocked _parse_tcpreplay_result(stdout, stderr, argv, results_dict) ###### ###(223)=[passed] Test mocked _parse_tcpreplay_result >>> from scapy.sendrecv import _parse_tcpreplay_result >>> >>> stdout = """Actual: 1024 packets (198929 bytes) sent in 67.88 seconds. ... Rated: 2930.6 bps, 0.02 Mbps, 15.09 pps ... Statistics for network device: mon0 ... Attempted packets: 1024 ... Successful packets: 1024 ... Failed packets: 0 ... Retried packets (ENOBUFS): 0 ... Retried packets (EAGAIN): 0""" >>> >>> stderr = """Warning in sendpacket.c:sendpacket_open_pf() line 669: ... Unsupported physical layer type 0x0323 on mon0. Maybe it works, maybe it won't. See tickets #123/318 ... sending out mon0 ... processing file: replay-example.pcap""" >>> >>> argv = ['tcpreplay', '--intf1=mon0', '--multiplier=1.00', '--timer=nano', 'replay-example.pcap'] >>> results_dict = _parse_tcpreplay_result(stdout, stderr, argv) >>> >>> results_dict {'packets': 1024, 'bytes': 198929, 'time': 67.88, 'bps': 2930.6, 'mbps': 0.02, 'pps': 15.09, 'attempted': 1024, 'successful': 1024, 'failed': 0, 'retried_enobufs': 0, 'retried_eagain': 0, 'command': 'tcpreplay --intf1=mon0 --multiplier=1.00 --timer=nano replay-example.pcap', 'warnings': ['Warning in sendpacket.c:sendpacket_open_pf() line 669:', "Unsupported physical layer type 0x0323 on mon0. Maybe it works, maybe it won't. See tickets #123/318", 'sending out mon0']} >>> >>> assert results_dict["packets"] == 1024 >>> assert results_dict["bytes"] == 198929 >>> assert results_dict["time"] == 67.88 >>> assert results_dict["bps"] == 2930.6 >>> assert results_dict["mbps"] == 0.02 >>> assert results_dict["pps"] == 15.09 >>> assert results_dict["attempted"] == 1024 >>> assert results_dict["successful"] == 1024 >>> assert results_dict["failed"] == 0 >>> assert results_dict["retried_enobufs"] == 0 >>> assert results_dict["retried_eagain"] == 0 >>> assert results_dict["command"] == " ".join(argv) >>> assert len(results_dict["warnings"]) == 3 ###(224)=[passed] Test more recent version with flows >>> data = """Actual: 1 packets (42 bytes) sent in 0.000278 seconds ... Rated: 151079.1 Bps, 1.20 Mbps, 3597.12 pps ... Flows: 1 flows, 3597.12 fps, 1 flow packets, 0 non-flow ... Statistics for network device: enp0s3 ... Successful packets: 1 ... Failed packets: 0 ... Truncated packets: 0 ... Retried packets (ENOBUFS): 0 ... Retried packets (EAGAIN): 0 ... """ >>> >>> results_dict = _parse_tcpreplay_result(data, "", []) >>> results_dict {'packets': 1, 'bytes': 42, 'time': 0.000278, 'bps': 151079.1, 'mbps': 1.2, 'pps': 3597.12, 'flows': 1, 'fps': 3597.12, 'flow_packets': 1, 'non_flow': 0, 'successful': 1, 'failed': 0, 'truncated': 0, 'retried_enobufs': 0, 'retried_eagain': 0, 'command': '', 'warnings': []} >>> >>> expected = { ... 'bps': 151079.1, ... 'bytes': 42, ... 'command': '', ... 'failed': 0, ... 'flow_packets': 1, ... 'flows': 1, ... 'fps': 3597.12, ... 'mbps': 1.2, ... 'non_flow': 0, ... 'packets': 1, ... 'pps': 3597.12, ... 'retried_eagain': 0, ... 'retried_enobufs': 0, ... 'successful': 1, ... 'time': 0.000278, ... 'truncated': 0, ... 'warnings': [] ... } >>> >>> assert results_dict == expected ###### ## Mocked route() calls ###### ###(225)=[passed] Mocked IPv4 routes calls >>> import scapy >>> >>> conf.ifaces._add_fake_iface("enp3s0") >>> conf.ifaces._add_fake_iface("lo") >>> >>> old_iface = conf.iface >>> old_loopback = conf.loopback_name >>> try: ... conf.iface = 'enp3s0' ... conf.loopback_name = 'lo' ... conf.route.invalidate_cache() ... conf.route.routes = [ ... (4294967295, 4294967295, '0.0.0.0', 'wlan0', '', 281), ... (4294967295, 4294967295, '0.0.0.0', 'lo', '', 291), ... (4294967295, 4294967295, '0.0.0.0', 'enp3s0', '192.168.0.119', 281), ... (3758096384, 4026531840, '0.0.0.0', 'lo', '', 291), ... (3758096384, 4026531840, '0.0.0.0', 'wlan0', '', 281), ... (3758096384, 4026531840, '0.0.0.0', 'enp3s0', '1.1.1.1', 281), ... (3232235775, 4294967295, '0.0.0.0', 'enp3s0', '2.2.2.2', 281), ... (3232235639, 4294967295, '0.0.0.0', 'enp3s0', '3.3.3.3', 281), ... (3232235520, 4294967040, '0.0.0.0', 'enp3s0', '4.4.4.4', 281), ... (0, 0, '192.168.0.254', 'enp3s0', '192.168.0.119', 25) ... ] ... assert conf.route.route("192.168.0.0-10") == ('enp3s0', '4.4.4.4', '0.0.0.0') ... assert conf.route.route("192.168.0.119") == ('lo', '192.168.0.119', '0.0.0.0') ... assert conf.route.route("224.0.0.0") == ('enp3s0', '1.1.1.1', '0.0.0.0') ... assert conf.route.route("255.255.255.255") == ('enp3s0', '192.168.0.119', '0.0.0.0') ... assert conf.route.route("*") == ('enp3s0', '192.168.0.119', '192.168.0.254') ... finally: ... conf.loopback_name = old_loopback ... conf.iface = old_iface ... conf.route.resync() ... conf.ifaces.reload() ... This interface is not specified in any provider ! See conf.ifaces output ###(226)=[passed] Mocked IPv6 routes calls >>> conf.ifaces._add_fake_iface("enp3s0") >>> conf.ifaces._add_fake_iface("lo") >>> >>> old_iface = conf.iface >>> old_loopback = conf.loopback_name >>> try: ... conf.route6.ipv6_ifaces = set(['enp3s0', 'wlan0', 'lo']) ... conf.iface = 'enp3s0' ... conf.loopback_name = 'lo' ... conf.route6.invalidate_cache() ... conf.route6.routes = [ ... ('fe80::dd17:1fa6:a123:ab4', 128, '::', 'lo', ['fe80::dd17:1fa6:a123:ab4'], 291), ... ('fe80::7101:5678:1234:da65', 128, '::', 'enp3s0', ['fe80::7101:5678:1234:da65'], 281), ... ('fe80::1f:ae12:4d2c:abff', 128, '::', 'wlan0', ['fe80::1f:ae12:4d2c:abff'], 281), ... ('fe80::', 64, '::', 'wlan0', ['fe80::1f:ae12:4d2c:abff'], 281), ... ('fe80::', 64, '::', 'lo', ['fe80::dd17:1fa6:a123:ab4'], 291), ... ('fe80::', 64, '::', 'enp3s0', ['fe80::7101:5678:1234:da65'], 281), ... ('2a01:e35:1e06:ab56:7010:6548:9646:fa77', 128, '::', 'enp3s0', ['2a01:e35:1e06:ab56:7010:6548:9646:fa77', '2a01:e35:1e06:ab56:512:8bb7:8ab8:14a8'], 281), ... ('2a01:e35:1e06:ab56:512:8bb7:8ab8:14a8', 128, '::', 'enp3s0', ['2a01:e35:1e06:ab56:7010:6548:9646:fa77', '2a01:e35:1e06:ab56:512:8bb7:8ab8:14a8'], 281), ... ('2a01:e35:1e06:ab56::', 64, '::', 'enp3s0', ['2a01:e35:1e06:ab56:7010:6548:9646:fa77', '2a01:e35:1e06:ab56:512:8bb7:8ab8:14a8'], 281), ... ('::', 0, 'fe80::160c:64aa:ef6f:fe14', 'enp3s0', ['2a01:e35:1e06:ab56:7010:6548:9646:fa77', '2a01:e35:1e06:ab56:512:8bb7:8ab8:14a8'], 281) ... ] ... assert conf.route6.route("2a01:e35:1e06:ab56:512:8bb7:8ab8:14a8") == ('enp3s0', '2a01:e35:1e06:ab56:7010:6548:9646:fa77', '::') ... assert conf.route6.route("::1") == ('enp3s0', '2a01:e35:1e06:ab56:7010:6548:9646:fa77', 'fe80::160c:64aa:ef6f:fe14') ... assert conf.route6.route("ff02::1") == ('enp3s0', 'fe80::7101:5678:1234:da65', '::') ... assert conf.route6.route("fe80::1") == ('enp3s0', 'fe80::7101:5678:1234:da65', '::') ... assert conf.route6.route("fe80::1", dev='lo') == ('lo', 'fe80::dd17:1fa6:a123:ab4', '::') ... finally: ... conf.loopback_name = old_loopback ... conf.iface = old_iface ... conf.route6.resync() ... conf.ifaces.reload() ... This interface is not specified in any provider ! See conf.ifaces output ###(227)=[passed] Windows: reset routes properly >>> if WINDOWS: ... from scapy.arch.windows import _route_add_loopback ... _route_add_loopback() ... ###### ## Tests of StreamSocket ###### ###(228)=[passed] Test with DNS over TCP >>> import socket >>> sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) >>> sck.connect(("8.8.8.8", 53)) >>> >>> class DNSTCP(Packet): ... name = "DNS over TCP" ... fields_desc = [ FieldLenField("len", None, fmt="!H", length_of="dns"), ... PacketLenField("dns", 0, DNS, length_from=lambda p: p.len)] ... >>> ssck = StreamSocket(sck, DNSTCP) >>> >>> r = ssck.sr1(DNSTCP(dns=DNS(rd=1, qd=DNSQR(qname="www.example.com"))), timeout=3) Received 1 packets, got 1 answers, remaining 0 packets >>> sck.close() >>> assert DNSTCP in r and len(r.dns.an) ###### ## Tests of SSLStreamContext ###### ###(229)=[passed] Test with recv() calls that return exact packet-length rawings >>> import socket >>> class MockSocket(object): ... def __init__(self): ... self.l = [ b'\x00\x00\x00\x01', b'\x00\x00\x00\x02', b'\x00\x00\x00\x03' ] ... def recv(self, x): ... if len(self.l) == 0: ... return b"" ... return self.l.pop(0) ... def fileno(self): ... return -1 ... def close(self): ... return ... >>> >>> class TestPacket(Packet): ... name = 'TestPacket' ... fields_desc = [ ... IntField('data', 0) ... ] ... def guess_payload_class(self, p): ... return conf.padding_layer ... >>> s = MockSocket() >>> ss = SSLStreamSocket(s, basecls=TestPacket) >>> >>> p = ss.recv() >>> assert p.data == 1 >>> p = ss.recv() >>> assert p.data == 2 >>> p = ss.recv() >>> assert p.data == 3 >>> try: ... ss.recv() ... ret = False ... except EOFError: ... ret = True ... >>> assert ret ###(230)=[passed] Test with recv() calls that return twice as much data as the exact packet-length >>> import socket >>> class MockSocket(object): ... def __init__(self): ... self.l = [ b'\x00\x00\x00\x01\x00\x00\x00\x02', b'\x00\x00\x00\x03\x00\x00\x00\x04' ] ... def recv(self, x): ... if len(self.l) == 0: ... return b"" ... return self.l.pop(0) ... def fileno(self): ... return -1 ... def close(self): ... return ... >>> >>> class TestPacket(Packet): ... name = 'TestPacket' ... fields_desc = [ ... IntField('data', 0) ... ] ... def guess_payload_class(self, p): ... return conf.padding_layer ... >>> s = MockSocket() >>> ss = SSLStreamSocket(s, basecls=TestPacket) >>> >>> p = ss.recv() >>> assert p.data == 1 >>> p = ss.recv() >>> assert p.data == 2 >>> p = ss.recv() >>> assert p.data == 3 >>> p = ss.recv() >>> assert p.data == 4 >>> try: ... ss.recv() ... ret = False ... except EOFError: ... ret = True ... >>> assert ret ###(231)=[passed] Test with recv() calls that return not enough data >>> import socket >>> class MockSocket(object): ... def __init__(self): ... self.l = [ b'\x00\x00', b'\x00\x01', b'\x00\x00\x00', b'\x02', b'\x00\x00', b'\x00', b'\x03' ] ... def recv(self, x): ... if len(self.l) == 0: ... return b"" ... return self.l.pop(0) ... def fileno(self): ... return -1 ... def close(self): ... return ... >>> >>> class TestPacket(Packet): ... name = 'TestPacket' ... fields_desc = [ ... IntField('data', 0) ... ] ... def guess_payload_class(self, p): ... return conf.padding_layer ... >>> s = MockSocket() >>> ss = SSLStreamSocket(s, basecls=TestPacket) >>> >>> p = ss.recv() >>> assert p.data == 1 >>> >>> p = ss.recv() >>> assert p.data == 2 >>> >>> p = ss.recv() >>> assert p.data == 3 >>> >>> try: ... ss.recv() ... ret = False ... except EOFError: ... ret = True ... >>> assert ret ###### ## Test correct conversion from binary to rawing of IPv6 addresses ###### ###(232)=[passed] IPv6 bin to rawing conversion >>> from scapy.pton_ntop import _inet6_ntop, inet_ntop >>> import socket >>> for binfrm, address in [ ... (b'\x00' * 16, '::'), ... (b'\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x66\x66\x77\x77\x88\x88', ... '1111:2222:3333:4444:5555:6666:7777:8888'), ... (b'\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x00\x00\x00\x00\x00\x00', ... '1111:2222:3333:4444:5555::'), ... (b'\x00\x00\x00\x00\x00\x00\x44\x44\x55\x55\x66\x66\x77\x77\x88\x88', ... '::4444:5555:6666:7777:8888'), ... (b'\x00\x00\x00\x00\x33\x33\x44\x44\x00\x00\x00\x00\x00\x00\x88\x88', ... '0:0:3333:4444::8888'), ... (b'\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ... '1::'), ... (b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', ... '::1'), ... (b'\x11\x11\x00\x00\x00\x00\x44\x44\x00\x00\x00\x00\x77\x77\x88\x88', ... '1111::4444:0:0:7777:8888'), ... (b'\x10\x00\x02\x00\x00\x30\x00\x04\x00\x05\x00\x60\x07\x00\x80\x00', ... '1000:200:30:4:5:60:700:8000'), ... ]: ... addr1 = inet_ntop(socket.AF_INET6, binfrm) ... addr2 = _inet6_ntop(binfrm) ... assert address == addr1 == addr2 ... ###(233)=[passed] IPv6 bin to rawing conversion - Zero-block of length 1 >>> binfrm = b'\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x66\x66\x00\x00\x88\x88' >>> addr1, addr2 = inet_ntop(socket.AF_INET6, binfrm), _inet6_ntop(binfrm) >>> assert(addr1 in ['1111:2222:3333:4444:5555:6666:0:8888', ... '1111:2222:3333:4444:5555:6666::8888']) >>> assert addr2 == '1111:2222:3333:4444:5555:6666:0:8888' ###(234)=[passed] IPv6 bin to rawing conversion - Illegal sizes >>> for binfrm in ["\x00" * 15, b"\x00" * 17]: ... rc = False ... try: ... inet_ntop(socket.AF_INET6, binfrm) ... except Exception as exc1: ... _exc1 = exc1 ... rc = True ... assert rc ... try: ... _inet6_ntop(binfrm) ... except Exception as exc2: ... rc = isinstance(exc2, type(_exc1)) ... assert rc ... ###### ## Addresses generators ###### ###(235)=[passed] Net >>> assert list(Net("192.168.0.0/31")) == ["192.168.0.0", "192.168.0.1"] >>> >>> assert "1.2.3.4" in Net("0.0.0.0/0") >>> >>> assert "192.168.0.0/25" in Net("192.168.0.0/24") >>> >>> assert "192.168.0.0/23" not in Net("192.168.0.0/24") >>> >>> assert "0.0.0.0/1" in Net("0.0.0.0/0") >>> >>> assert "0.0.0.0/0" not in Net("0.0.0.0/1") >>> >>> assert Net("1.2.3.0/24") == Net("1.2.3.0", "1.2.3.255") >>> >>> assert hash(Net("1.2.3.0/24")) == hash(Net("1.2.3.0", "1.2.3.255")) ###(236)=[passed] Net using name >>> ip = IP(dst="www.google.com") >>> n1 = ip.dst >>> assert isinstance(n1, Net) >>> ip.show() ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = hopopt chksum = None src = 192.168.122.109 dst = Net("www.google.com/32") \options \ ###(237)=[passed] Net using implicit format in IP >>> assert len(list(IP(dst=("192.168.0.100", "192.168.0.199")))) == 100 ###(238)=[passed] Multiple IP addresses test >>> ip = IP(dst=['192.168.0.1', 'www.google.fr'],ihl=(1,5)) >>> assert ip.dst[0] == '192.168.0.1' >>> assert isinstance(ip.dst[1], Net) >>> src = ip.src >>> assert src >>> assert isinstance(src, str) ###(239)=[passed] OID >>> oid = OID("1.2.3.4.5.6-8") >>> sum(1 for o in oid) == 3 True >>> assert oid.__iterlen__() == 3 ###(240)=[passed] Net6 >>> n1 = Net6("2001:db8::/127") >>> assert len(list(n1)) == 2 >>> assert len(n1) == 2 >>> >>> n2 = Net6("fec0::/110") >>> assert len(n2) == 262144 >>> >>> assert "ffff::ffff" in Net6("::/0") >>> >>> assert "::/1" in Net6("::/0") >>> >>> assert "::/0" not in Net6("::/1") >>> >>> assert Net6("::/120") == Net6("::", "::ff") >>> >>> assert hash(Net6("::/120")) == hash(Net6("::", "::ff")) >>> >>> assert Net6("::1.2.3.0/120") == Net6("::1.2.3.0", "::1.2.3.255") >>> >>> assert hash(Net6("::1.2.3.0/120")) == hash(Net6("::1.2.3.0", "::1.2.3.255")) >>> >>> assert Net6("::1.2.3.0/120") != Net("1.2.3.0/24") >>> >>> assert hash(Net6("::1.2.3.0/120")) != hash(Net("1.2.3.0/24")) ###(242)=[passed] Net6 using implicit format in IPv6 >>> assert len(list(IPv6(dst=("fe80::1", "fe80::1f")))) == 31 ###(244)=[passed] Test repr on Net >>> conf.color_theme = BlackAndWhite() >>> output = repr(IP(src="www.google.com")) >>> assert 'Net("www.google.com/32")' in output ###### ## IPv6 helpers ###### ###(246)=[passed] in6_getLocalUniquePrefix() >>> p = in6_getLocalUniquePrefix() >>> len(inet_pton(socket.AF_INET6, p)) == 16 and p.startswith("fd") True ###(247)=[passed] Misc addresses manipulation functions >>> teredoAddrExtractInfo("2001:0:0a0b:0c0d:0028:f508:f508:08f5") == ("10.11.12.13", 40, "10.247.247.10", 2807) True >>> >>> ip6 = IP6Field("test", None) >>> ip6.i2repr("", "2001:0:0a0b:0c0d:0028:f508:f508:08f5") == "2001:0:0a0b:0c0d:0028:f508:f508:08f5 [Teredo srv: 10.11.12.13 cli: 10.247.247.10:2807]" True >>> ip6.i2repr("", "2002:0102:0304::1") == "2002:0102:0304::1 [6to4 GW: 1.2.3.4]" True >>> >>> in6_iseui64("fe80::bae8:58ff:fed4:e5f6") == True True >>> >>> in6_isanycast("2001:db8::fdff:ffff:ffff:ff80") == True True >>> >>> a = inet_pton(socket.AF_INET6, "2001:db8::2807") >>> in6_xor(a, a) == b"\x00" * 16 True >>> >>> a = inet_pton(socket.AF_INET6, "fe80::bae8:58ff:fed4:e5f6") >>> r = inet_ntop(socket.AF_INET6, in6_getnsma(a)) >>> r == "ff02::1:ffd4:e5f6" True >>> >>> in6_isllsnmaddr(r) == True True >>> >>> in6_isdocaddr("2001:db8::2807") == True True >>> >>> in6_isaddrllallnodes("ff02::1") == True True >>> >>> in6_isaddrllallservers("ff02::2") == True True ###(248)=[passed] in6_getscope() >>> assert in6_getscope("2001:db8::2807") == IPV6_ADDR_GLOBAL >>> assert in6_getscope("fec0::2807") == IPV6_ADDR_SITELOCAL >>> assert in6_getscope("fe80::2807") == IPV6_ADDR_LINKLOCAL >>> assert in6_getscope("ff02::2807") == IPV6_ADDR_LINKLOCAL >>> assert in6_getscope("ff0e::2807") == IPV6_ADDR_GLOBAL >>> assert in6_getscope("ff05::2807") == IPV6_ADDR_SITELOCAL >>> assert in6_getscope("ff01::2807") == IPV6_ADDR_LOOPBACK >>> assert in6_getscope("::1") == IPV6_ADDR_LOOPBACK ###(249)=[passed] construct_source_candidate_set() >>> dev_addresses = [('fe80::', IPV6_ADDR_LINKLOCAL, "linklocal"),('fec0::', IPV6_ADDR_SITELOCAL, "sitelocal"),('ff0e::', IPV6_ADDR_GLOBAL, "global")] >>> >>> assert construct_source_candidate_set("2001:db8::2807", 0, dev_addresses) == ["ff0e::"] >>> assert construct_source_candidate_set("fec0::2807", 0, dev_addresses) == ["fec0::"] >>> assert construct_source_candidate_set("fe80::2807", 0, dev_addresses) == ["fe80::"] >>> assert construct_source_candidate_set("ff02::2807", 0, dev_addresses) == ["fe80::"] >>> assert construct_source_candidate_set("ff0e::2807", 0, dev_addresses) == ["ff0e::"] >>> assert construct_source_candidate_set("ff05::2807", 0, dev_addresses) == ["fec0::"] >>> assert construct_source_candidate_set("ff01::2807", 0, dev_addresses) == ["::1"] >>> assert construct_source_candidate_set("::", 0, dev_addresses) == ["ff0e::"] ###(250)=[passed] inet_pton() >>> from scapy.pton_ntop import _inet6_pton, inet_pton >>> import socket >>> >>> ip6_bad_addrs = ["fe80::2e67:ef2d:7eca::ed8a", ... "fe80:1234:abcd::192.168.40.12:abcd", ... "fe80:1234:abcd::192.168.40", ... "fe80:1234:abcd::192.168.400.12", ... "1234:5678:9abc:def0:1234:5678:9abc:def0:", ... "1234:5678:9abc:def0:1234:5678:9abc:def0:1234"] >>> for ip6 in ip6_bad_addrs: ... rc = False ... exc1 = None ... try: ... res1 = inet_pton(socket.AF_INET6, ip6) ... except Exception as e: ... rc = True ... exc1 = e ... assert rc ... rc = False ... try: ... res2 = _inet6_pton(ip6) ... except Exception as exc2: ... rc = isinstance(exc2, type(exc1)) ... assert rc ... >>> ip6_good_addrs = [("fe80:1234:abcd::192.168.40.12", ... b'\xfe\x80\x124\xab\xcd\x00\x00\x00\x00\x00\x00\xc0\xa8(\x0c'), ... ("fe80:1234:abcd::fe06", ... b'\xfe\x80\x124\xab\xcd\x00\x00\x00\x00\x00\x00\x00\x00\xfe\x06'), ... ("fe80::2e67:ef2d:7ece:ed8a", ... b'\xfe\x80\x00\x00\x00\x00\x00\x00.g\xef-~\xce\xed\x8a'), ... ("::ffff", ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff'), ... ("ffff::", ... b'\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), ... ('::', b'\x00' * 16)] >>> for ip6, res in ip6_good_addrs: ... res1 = inet_pton(socket.AF_INET6, ip6) ... res2 = _inet6_pton(ip6) ... assert res == res1 == res2 ... ###### ## Test Route class ###### ###(251)=[passed] make_route() >>> r4 = Route() >>> tmp_route = r4.make_route(host="10.12.13.14") >>> (tmp_route[0], tmp_route[1], tmp_route[2]) == (168561934, 4294967295, '0.0.0.0') True >>> >>> tmp_route = r4.make_route(net="10.12.13.0/24") >>> (tmp_route[0], tmp_route[1], tmp_route[2]) == (168561920, 4294967040, '0.0.0.0') True ###(252)=[passed] add() & delt() >>> r4 = Route() >>> len_r4 = len(r4.routes) >>> r4.add(net="192.168.1.0/24", gw="1.2.3.4") >>> len(r4.routes) == len_r4 + 1 True >>> r4.delt(net="192.168.1.0/24", gw="1.2.3.4") >>> len(r4.routes) == len_r4 True ###(253)=[passed] ifchange() >>> r4.add(net="192.168.1.0/24", gw="1.2.3.4", dev=get_dummy_interface()) >>> r4.ifchange(get_dummy_interface(), "5.6.7.8") >>> r4.routes[-1][4] == "5.6.7.8" True ###(254)=[passed] ifdel() >>> r4.ifdel(get_dummy_interface()) >>> len(r4.routes) == len_r4 True ###(255)=[passed] ifadd() & get_if_bcast() >>> r4 = Route() >>> len_r4 = len(r4.routes) >>> >>> r4.ifadd(get_dummy_interface(), "1.2.3.4/24") >>> len(r4.routes) == len_r4 +1 True >>> >>> r4.get_if_bcast(get_dummy_interface()) == "1.2.3.255" False >>> >>> r4.ifdel(get_dummy_interface()) >>> len(r4.routes) == len_r4 True >>> >>> dummy_interface = get_dummy_interface() >>> >>> bck_conf_route_routes = conf.route.routes >>> conf.route.routes = [ ... (0, 0, '172.21.230.1', dummy_interface, '172.21.230.10', 1), # 0.0.0.0 / 0.0.0.0 == 255.255.255.255 ... (2851995648, 4294901760, '0.0.0.0', dummy_interface, '172.21.230.10', 1), # 169.254.0.0 / 255.255.0.0 == 169.254.255.255 ... (2887116288, 4294967040, '0.0.0.0', dummy_interface, '172.21.230.10', 1), # 172.21.230.0 / 255.255.255.0 == 172.21.230.255 ... (2887116289, 4294967295, '0.0.0.0', dummy_interface, '172.21.230.10', 1), # 172.21.230.1 / 255.255.255.255 == 172.21.230.1 ... (3758096384, 4026531840, '0.0.0.0', dummy_interface, '172.21.230.10', 1), # 224.0.0.0 / 240.0.0.0 == 239.255.255.255 ... (3758096635, 4294967295, '0.0.0.0', dummy_interface, '172.21.230.10', 1), # 224.0.0.251 / 255.255.255.255 == 224.0.0.251 ... (4294967295, 4294967295, '0.0.0.0', dummy_interface, '172.21.230.10', 1), # 255.255.255.255 / 255.255.255.255 == 255.255.255.255 ... ] >>> >>> assert sorted(conf.route.get_if_bcast(dummy_interface)) == sorted(['169.254.255.255', '172.21.230.255', '239.255.255.255']) >>> conf.route.routes = bck_conf_route_routes ###(256)=[passed] Remove dummy interface >>> conf.ifaces.reload() ###### ## Flags ###### ###(257)=[passed] IP flags >>> pkt = IP(flags="MF") >>> assert pkt.flags.MF >>> assert not pkt.flags.DF >>> assert not pkt.flags.evil >>> assert repr(pkt.flags) == '' >>> pkt.flags.MF = 0 >>> pkt.flags.DF = 1 >>> assert not pkt.flags.MF >>> assert pkt.flags.DF >>> assert not pkt.flags.evil >>> assert repr(pkt.flags) == '' >>> pkt.flags |= 'evil+MF' >>> pkt.flags &= 'DF+MF' >>> assert pkt.flags.MF >>> assert pkt.flags.DF >>> assert not pkt.flags.evil >>> assert repr(pkt.flags) == '' >>> >>> pkt = IP(flags=3) >>> assert pkt.flags.MF >>> assert pkt.flags.DF >>> assert not pkt.flags.evil >>> assert repr(pkt.flags) == '' >>> pkt.flags = 6 >>> assert not pkt.flags.MF >>> assert pkt.flags.DF >>> assert pkt.flags.evil >>> assert repr(pkt.flags) == '' >>> >>> assert len({IP().flags, IP().flags}) == 1 >>> >>> pkt = IP() >>> pkt.flags = "" >>> assert pkt.flags == 0 ###(258)=[passed] TCP flags >>> pkt = TCP(flags="SA") >>> assert pkt.flags == 18 >>> assert pkt.flags.S >>> assert pkt.flags.A >>> assert pkt.flags.SA >>> assert not any(getattr(pkt.flags, f) for f in 'FRPUECN') >>> assert repr(pkt.flags) == '' >>> pkt.flags.U = True >>> pkt.flags.S = False >>> assert pkt.flags.A >>> assert pkt.flags.U >>> assert pkt.flags.AU >>> assert not any(getattr(pkt.flags, f) for f in 'FSRPECN') >>> assert repr(pkt.flags) == '' >>> pkt.flags &= 'SFA' >>> pkt.flags |= 'P' >>> assert pkt.flags.P >>> assert pkt.flags.A >>> assert pkt.flags.PA >>> assert not any(getattr(pkt.flags, f) for f in 'FSRUECN') >>> >>> pkt = TCP(flags=56) >>> assert all(getattr(pkt.flags, f) for f in 'PAU') >>> assert pkt.flags.PAU >>> assert not any(getattr(pkt.flags, f) for f in 'FSRECN') >>> assert repr(pkt.flags) == '' >>> pkt.flags = 50 >>> assert all(getattr(pkt.flags, f) for f in 'SAU') >>> assert pkt.flags.SAU >>> assert not any(getattr(pkt.flags, f) for f in 'FRPECN') >>> assert repr(pkt.flags) == '' ###(259)=[passed] Flag values mutation with .raw_packet_cache >>> pkt = IP(raw(IP(flags="MF")/TCP(flags="SA"))) >>> assert pkt.raw_packet_cache is not None >>> assert pkt[TCP].raw_packet_cache is not None >>> assert pkt.flags.MF >>> assert not pkt.flags.DF >>> assert not pkt.flags.evil >>> assert repr(pkt.flags) == '' >>> assert pkt[TCP].flags.S >>> assert pkt[TCP].flags.A >>> assert pkt[TCP].flags.SA >>> assert not any(getattr(pkt[TCP].flags, f) for f in 'FRPUECN') >>> assert repr(pkt[TCP].flags) == '' >>> pkt.flags.MF = 0 >>> pkt.flags.DF = 1 >>> pkt[TCP].flags.U = True >>> pkt[TCP].flags.S = False >>> pkt = IP(raw(pkt)) >>> assert not pkt.flags.MF >>> assert pkt.flags.DF >>> assert not pkt.flags.evil >>> assert repr(pkt.flags) == '' >>> assert pkt[TCP].flags.A >>> assert pkt[TCP].flags.U >>> assert pkt[TCP].flags.AU >>> assert not any(getattr(pkt[TCP].flags, f) for f in 'FSRPECN') >>> assert repr(pkt[TCP].flags) == '' ###(260)=[passed] Operations on flag values >>> p1, p2 = TCP(flags="SU"), TCP(flags="AU") >>> assert (p1.flags & p2.flags).U >>> assert not any(getattr(p1.flags & p2.flags, f) for f in 'FSRPAECN') >>> assert all(getattr(p1.flags | p2.flags, f) for f in 'SAU') >>> assert (p1.flags | p2.flags).SAU >>> assert not any(getattr(p1.flags | p2.flags, f) for f in 'FRPECN') >>> >>> assert TCP(flags="SA").flags & TCP(flags="S").flags == TCP(flags="S").flags >>> assert TCP(flags="SA").flags | TCP(flags="S").flags == TCP(flags="SA").flags ###### ## 802.3 ###### ###(261)=[passed] Test detection >>> assert isinstance(Dot3(raw(Ether())),Ether) >>> assert isinstance(Ether(raw(Dot3())),Dot3) >>> >>> a = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert isinstance(a,Dot3) >>> assert a.dst == 'ff:ff:ff:ff:ff:ff' >>> assert a.src == '00:00:00:00:00:00' >>> >>> a = Dot3(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x90\x00') >>> assert isinstance(a,Ether) >>> assert a.dst == 'ff:ff:ff:ff:ff:ff' >>> assert a.src == '00:00:00:00:00:00' ###### ## ASN.1 ###### ###(262)=[passed] MIB >>> import tempfile >>> fd, fname = tempfile.mkstemp() >>> os.write(fd, b"-- MIB test\nscapy OBJECT IDENTIFIER ::= {test 2807}\n") 58 >>> os.close(fd) >>> >>> load_mib(fname) >>> assert sum(1 for k in conf.mib.d.values() if "scapy" in k) == 1 >>> >>> assert sum(1 for oid in conf.mib) > 100 ###(263)=[passed] MIB - graph >>> from unittest import mock >>> >>> @mock.patch("scapy.asn1.mib.do_graph") ... def get_mib_graph(do_graph): ... def store_graph(graph, **kargs): ... assert graph.startswith("""digraph "mib" {""") ... assert """"test.2807" [ label="scapy" ];""" in graph ... do_graph.side_effect = store_graph ... conf.mib._make_graph() ... >>> get_mib_graph() ###(264)=[passed] MIB - test aliases >>> assert conf.mib._oidname("2.5.29.19") == "basicConstraints" ###(265)=[passed] DADict tests >>> a = DADict("test") >>> a[0] = "test_value1" >>> a["scapy"] = "test_value2" >>> >>> assert a.test_value1 == 0 >>> assert a.test_value2 == "scapy" >>> >>> with ContextManagerCaptureOutput() as cmco: ... a._show() ... outp = cmco.get_output() ... >>> assert "scapy = 'test_value2'" in outp >>> assert "0 = 'test_value1'" in outp ###(266)=[passed] Test ETHER_TYPES >>> assert ETHER_TYPES.IPv4 == 2048 >>> try: ... import warnings ... ... with warnings.catch_warnings(record=True) as w: ... warnings.simplefilter("always") ... ETHER_TYPES["BAOBAB"] = 0xffff ... assert ETHER_TYPES.BAOBAB == 0xffff ... assert issubclass(w[-1].category, DeprecationWarning) ... except DeprecationWarning: ... # -Werror is used ... pass ... ###(267)=[passed] MIB - Check that MIB OIDs are not duplicated >>> from scapy.asn1.mib import x509_oids_sets >>> >>> _dct = {} >>> for d in x509_oids_sets: ... for elt in d: ... if elt in _dct: ... raise ValueError("OID %s already exists" % elt) ... _dct.update(d) ... ###(268)=[passed] BER tests >>> BER_id_enc(42) == '*' False >>> BER_id_enc(2807) == b'\xbfw' True >>> >>> b = BERcodec_IPADDRESS() >>> r1 = b.enc("8.8.8.8") >>> r1 == b'@\x04\x08\x08\x08\x08' True >>> >>> r2 = b.dec(r1)[0] >>> r2.val == '8.8.8.8' True >>> >>> a = b'\x1f\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\x01\x01\x00C\x02\x01U0\x0f0\r\x06\x08+\x06\x01\x02\x01\x02\x01\x00\x02\x01!' >>> ret = False >>> try: ... BERcodec_Object.check_type(a) ... except BER_BadTag_Decoding_Error: ... ret = True ... else: ... ret = False ... >>> assert ret ###(269)=[passed] BER trigger failures >>> try: ... BERcodec_INTEGER.do_dec(b"\x02\x01") ... assert False ... except BER_Decoding_Error: ... pass ... ###### ## Fields ###### ###(270)=[passed] FieldLenField with BitField >>> class Test(Packet): ... name = "Test" ... fields_desc = [ ... FieldLenField("BitCount", None, fmt="H", count_of="Values"), ... FieldLenField("ByteCount", None, fmt="B", length_of="Values"), ... FieldListField("Values", [], BitField("data", 0x0, size=1), ... count_from=lambda pkt: pkt.BitCount), ... ] ... >>> pkt = Test(raw(Test(Values=[0, 0, 0, 0, 1, 1, 1, 1]))) >>> assert pkt.BitCount == 8 >>> assert pkt.ByteCount == 1 ###(271)=[passed] PacketListField >>> class TestPacket(Packet): ... name = 'TestPacket' ... fields_desc = [ PacketListField('list', [], 0) ] ... >>> a = TestPacket() >>> a.list.append(1) >>> assert len(a.list) == 1 >>> >>> b = TestPacket() >>> assert len(b.list) == 0 ###(272)=[passed] Test PacketListField deepcopy >>> class SubPacket(Packet): ... name = "SubPacket" ... fields_desc = [ ... ByteField("mem", 1), ... ] ... >>> class TestPacket(Packet): ... name = "TestPacket" ... fields_desc = [ ... PacketListField("packlist", SubPacket(), SubPacket), ... ] ... >>> a = TestPacket() >>> b = a.copy() >>> fuzz(b) ] |> >>> assert a.packlist[0].mem == 1 ###(273)=[passed] PacketField >>> class InnerPacket(Packet): ... fields_desc = [ StrField("f_name", "test") ] ... >>> class TestPacket(Packet): ... fields_desc = [ PacketField("inner", InnerPacket(), InnerPacket) ] ... >>> p = TestPacket() >>> print(p.inner.f_name) b'test' >>> assert p.inner.f_name == b"test" >>> >>> p = TestPacket() >>> p.inner.f_name = b"scapy" >>> assert p.inner.f_name == b"scapy" >>> >>> p = TestPacket() >>> assert p.inner.f_name == b"test" ###### ## UUIDField ###### ###(274)=[passed] Parsing a human-readable UUID >>> f = UUIDField('f', '01234567-89ab-cdef-0123-456789abcdef') >>> f.addfield(None, b'', f.default) == hex_bytes('0123456789abcdef0123456789abcdef') True ###(275)=[passed] Parsing a machine-encoded UUID >>> f = UUIDField('f', bytearray.fromhex('0123456789abcdef0123456789abcdef')) >>> f.addfield(None, b'', f.default) == hex_bytes('0123456789abcdef0123456789abcdef') True ###(276)=[passed] Parsing a tuple of values >>> f = UUIDField('f', (0x01234567, 0x89ab, 0xcdef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef)) >>> f.addfield(None, b'', f.default) == hex_bytes('0123456789abcdef0123456789abcdef') True ###(277)=[passed] Handle None values >>> f = UUIDField('f', None) >>> f.addfield(None, b'', f.default) == hex_bytes('00000000000000000000000000000000') True ###(278)=[passed] Get a UUID for dissection >>> from uuid import UUID >>> f = UUIDField('f', None) >>> f.getfield(None, bytearray.fromhex('0123456789abcdef0123456789abcdef01')) == (b'\x01', UUID('01234567-89ab-cdef-0123-456789abcdef')) True ###(279)=[passed] Verify little endian UUIDField The endianness of a UUIDField should be apply by block on each block in parenthesis '(01234567)-(89ab)-(cdef)-(01)(23)-(45)(67)(89)(ab)(cd)(ef)' >>> f = UUIDField('f', '01234567-89ab-cdef-0123-456789abcdef', uuid_fmt=UUIDField.FORMAT_LE) >>> f.addfield(None, b'', f.default) == hex_bytes('67452301ab89efcd0123456789abcdef') True ###(280)=[passed] Verify reversed UUIDField This should reverse the entire value as 128-bits >>> f = UUIDField('f', '01234567-89ab-cdef-0123-456789abcdef', uuid_fmt=UUIDField.FORMAT_REV) >>> f.addfield(None, b'', f.default) == hex_bytes('efcdab8967452301efcdab8967452301') True ###### ## RandUUID ###### ###(281)=[passed] RandUUID setup >>> RANDUUID_TEMPLATE = '01234567-89ab-*-01*-*****ef' >>> RANDUUID_FIXED = uuid.uuid4() ###(282)=[passed] RandUUID default behaviour >>> ru = RandUUID() >>> assert ru._fix().version == 4 >>> assert ru.command() == "RandUUID()" ###(283)=[passed] RandUUID incorrect implicit args >>> assert expect_exception(ValueError, lambda: RandUUID(node=0x1234, name="scapy")) >>> assert expect_exception(ValueError, lambda: RandUUID(node=0x1234, namespace=uuid.uuid4())) >>> assert expect_exception(ValueError, lambda: RandUUID(clock_seq=0x1234, name="scapy")) >>> assert expect_exception(ValueError, lambda: RandUUID(clock_seq=0x1234, namespace=uuid.uuid4())) >>> assert expect_exception(ValueError, lambda: RandUUID(name="scapy")) >>> assert expect_exception(ValueError, lambda: RandUUID(namespace=uuid.uuid4())) ###(284)=[passed] RandUUID v4 UUID (correct args) >>> u = RandUUID(version=4)._fix() >>> assert u.version == 4 >>> >>> u2 = RandUUID(version=4)._fix() >>> assert u2.version == 4 >>> >>> assert str(u) != str(u2) ###(285)=[passed] RandUUID v4 UUID (incorrect args) >>> assert expect_exception(ValueError, lambda: RandUUID(version=4, template=RANDUUID_TEMPLATE)) >>> assert expect_exception(ValueError, lambda: RandUUID(version=4, node=0x1234)) >>> assert expect_exception(ValueError, lambda: RandUUID(version=4, clock_seq=0x1234)) >>> assert expect_exception(ValueError, lambda: RandUUID(version=4, namespace=uuid.uuid4())) >>> assert expect_exception(ValueError, lambda: RandUUID(version=4, name="scapy")) ###(286)=[passed] RandUUID v1 UUID >>> u = RandUUID(version=1)._fix() >>> assert u.version in [1, 4] >>> >>> u = RandUUID(version=1, node=0x1234)._fix() >>> assert u.version == 1 >>> assert u.node == 0x1234 >>> >>> u = RandUUID(version=1, clock_seq=0x1234)._fix() >>> assert u.version == 1 >>> assert u.clock_seq == 0x1234 >>> >>> ru = RandUUID(version=1, node=0x1234, clock_seq=0x1bcd) >>> assert ru.command() == "RandUUID(node=4660, clock_seq=7117, version=1)" >>> u = ru._fix() >>> assert u.version == 1 >>> assert u.node == 0x1234 >>> assert u.clock_seq == 0x1bcd ###(287)=[passed] RandUUID v1 UUID (implicit version) >>> u = RandUUID(node=0x1234)._fix() >>> assert u.version == 1 >>> assert u.node == 0x1234 >>> >>> u = RandUUID(clock_seq=0x1234)._fix() >>> assert u.version == 1 >>> assert u.clock_seq == 0x1234 >>> >>> u = RandUUID(node=0x1234, clock_seq=0x1bcd)._fix() >>> assert u.version == 1 >>> assert u.node == 0x1234 >>> assert u.clock_seq == 0x1bcd ###(288)=[passed] RandUUID v1 UUID (incorrect args) >>> assert expect_exception(ValueError, lambda: RandUUID(version=1, template=RANDUUID_TEMPLATE)) >>> assert expect_exception(ValueError, lambda: RandUUID(version=1, namespace=uuid.uuid4())) >>> assert expect_exception(ValueError, lambda: RandUUID(version=1, name="scapy")) ###(289)=[passed] RandUUID v5 UUID >>> ru = RandUUID(version=5, namespace=RANDUUID_FIXED, name="scapy") >>> u = ru._fix() >>> assert u.version == 5 >>> assert ru.command() == "RandUUID(namespace=%r, name='scapy', version=5)" % RANDUUID_FIXED >>> >>> u2 = RandUUID(version=5, namespace=RANDUUID_FIXED, name="scapy")._fix() >>> assert u2.version == 5 >>> assert u.bytes == u2.bytes >>> >>> u2 = RandUUID(namespace=RANDUUID_FIXED, name="scapy")._fix() >>> assert u.bytes == u2.bytes ###(290)=[passed] RandUUID v5 UUID (incorrect args) >>> assert expect_exception(ValueError, lambda: RandUUID(version=5, template=RANDUUID_TEMPLATE)) >>> assert expect_exception(ValueError, lambda: RandUUID(version=5, node=0x1234)) >>> assert expect_exception(ValueError, lambda: RandUUID(version=5, clock_seq=0x1234)) ###(291)=[passed] RandUUID v3 UUID >>> u = RandUUID(version=3, namespace=RANDUUID_FIXED, name="scapy")._fix() >>> assert u.version == 3 >>> >>> u2 = RandUUID(version=3, namespace=RANDUUID_FIXED, name="scapy")._fix() >>> assert u2.version == 3 >>> assert u.bytes == u2.bytes >>> >>> u2 = RandUUID(namespace=RANDUUID_FIXED, name="scapy")._fix() >>> assert u.bytes != u2.bytes ###(292)=[passed] RandUUID v3 UUID (incorrect args) >>> assert expect_exception(ValueError, lambda: RandUUID(version=5, template=RANDUUID_TEMPLATE)) >>> assert expect_exception(ValueError, lambda: RandUUID(version=5, node=0x1234)) >>> assert expect_exception(ValueError, lambda: RandUUID(version=5, clock_seq=0x1234)) ###(293)=[passed] RandUUID looks like a UUID with str >>> assert re.match(r'[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}', str(RandUUID()), re.I) is not None ###(294)=[passed] RandUUID with a static part RandUUID template can contain static part such a 01234567-89ab-*-01*-*****ef >>> ru = RandUUID('01234567-89ab-*-01*-*****ef') >>> assert re.match(r'01234567-89ab-[0-9a-f]{4}-01[0-9a-f]{2}-[0-9a-f]{10}ef', str(ru), re.I) is not None >>> assert ru.command() == "RandUUID(template='01234567-89ab-*-01*-*****ef')" ###(295)=[passed] RandUUID with a range part RandUUID template can contain a part with a range of values such a 01234567-89ab-*-01*-****c0:c9ef >>> assert re.match(r'01234567-89ab-[0-9a-f]{4}-01[0-9a-f]{2}-[0-9a-f]{8}c[0-9]ef', str(RandUUID('01234567-89ab-*-01*-****c0:c9ef')), re.I) is not None ###### ## MPLS tests ###### ###(296)=[passed] MPLS - build/dissection >>> from scapy.contrib.mpls import EoMCW, MPLS >>> p1 = MPLS()/IP()/UDP() >>> assert p1[MPLS].s == 1 >>> p2 = MPLS()/MPLS()/IP()/UDP() >>> assert p2[MPLS].s == 0 >>> >>> p1[MPLS] >> >>> p1[IP] > >>> p2[MPLS] >>> >>> p2[MPLS:1] >>> >>> p2[IP] > ###(297)=[passed] MPLS encapsulated Ethernet with CW - build/dissection >>> p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") >>> p /= MPLS(label=1)/EoMCW(seq=1234) >>> p /= Ether(dst="33:33:33:33:33:33", src="44:44:44:44:44:44")/IP() >>> p = Ether(raw(p)) >>> assert p[EoMCW].zero == 0 >>> assert p[EoMCW].reserved == 0 >>> assert p[EoMCW].seq == 1234 ###(298)=[passed] MPLS encapsulated Ethernet without CW - build/dissection >>> p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") >>> p /= MPLS(label=2)/MPLS(label=1) >>> p /= Ether(dst="33:33:33:33:33:33", src="44:44:44:44:44:44")/IP() >>> p = Ether(raw(p)) >>> assert p[Ether:2].type == 0x0800 >>> >>> try: ... p[EoMCW] ... except IndexError: ... ret = True ... else: ... ret = False ... >>> assert ret >>> assert p[Ether:2].type == 0x0800 ###(299)=[passed] MPLS encapsulated IP - build/dissection >>> p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") >>> p /= MPLS(label=1)/IP() >>> p = Ether(raw(p)) >>> >>> try: ... p[EoMCW] ... except IndexError: ... ret = True ... else: ... ret = False ... >>> assert ret >>> >>> try: ... p[Ether:2] ... except IndexError: ... ret = True ... else: ... ret = False ... >>> assert ret >>> >>> p[IP] ###### ## PacketList methods ###### ###(300)=[passed] sr() >>> class Req(Packet): ... fields_desc = [ ... ByteField("raw", 0) ... ] ... def answers(self, other): ... return False ... >>> class Res(Packet): ... fields_desc = [ ... ByteField("raw", 0) ... ] ... def answers(self, other): ... return other.__class__ == Req and other.raw == self.raw ... >>> pl = PacketList([Req(b"1"), Res(b"1"), Req(b"2"), Req(b"3"), Req(b"4"), Res(b"3"), Res(b"1"), Res(b"1"), Res(b"4")]) >>> >>> srl, rl = pl.sr() >>> assert len(srl) == 3 >>> assert len(rl) == 3 >>> >>> srl, rl = pl.sr(lookahead=1) >>> assert len(srl) == 1 >>> assert len(rl) == 7 >>> >>> srl, rl = pl.sr(lookahead=2) >>> assert len(srl) == 2 >>> assert len(rl) == 5 >>> >>> srl, rl = pl.sr(lookahead=3) >>> assert len(srl) == 3 >>> assert len(rl) == 3 >>> >>> pl = PacketList([Req(b"\x05"), Res(b"1"), Res(b"2"), Res(b"3"), Res(b"4"), Res(b"3"), Res(b"1"), Res(b"1"), Res(b"\x05")]) >>> >>> srl, rl = pl.sr(lookahead=3) >>> assert len(srl) == 0 >>> assert len(rl) == 9 >>> >>> srl, rl = pl.sr(lookahead=7) >>> assert len(srl) == 0 >>> assert len(rl) == 9 >>> >>> srl, rl = pl.sr(lookahead=8) >>> assert len(srl) == 1 >>> assert len(rl) == 7 >>> >>> srl, rl = pl.sr(lookahead=0) >>> assert len(srl) == 1 >>> assert len(rl) == 7 >>> >>> srl, rl = pl.sr(lookahead=None) >>> assert len(srl) == 1 >>> assert len(rl) == 7 ###(301)=[passed] pickle test >>> import pickle >>> import io >>> >>> srl, rl = PacketList([Raw(b"1"), Raw(b"1"), Raw(b"2"), Raw(b"3"), Raw(b"4"), Raw(b"3"), Raw(b"1"), Raw(b"1"), Raw(b"4")]).sr() >>> assert len(srl) == 4 >>> >>> f = io.BytesIO() >>> >>> pickle.dump(srl, f) >>> >>> unp = pickle.loads(f.getvalue()) >>> >>> assert len(unp) == len(srl) >>> assert all(bytes(a[0]) == bytes(b[0]) for a, b in zip(unp, srl)) ###(302)=[passed] plot() >>> from unittest import mock >>> import scapy.libs.matplot Can't import matplotlib: No module named 'matplotlib'. Won't be able to plot. >>> >>> @mock.patch("scapy.libs.matplot.plt") ... def test_plot(mock_plt): ... def fake_plot(data, **kwargs): ... return data ... mock_plt.plot = fake_plot ... plist = PacketList([IP(id=i)/TCP() for i in range(10)]) ... lines = plist.plot(lambda p: (p.time, p.id)) ... assert len(lines) == 10 ... >>> test_plot() ###(303)=[passed] diffplot() >>> from unittest import mock >>> import scapy.libs.matplot >>> >>> @mock.patch("scapy.libs.matplot.plt") ... def test_diffplot(mock_plt): ... def fake_plot(data, **kwargs): ... return data ... mock_plt.plot = fake_plot ... plist = PacketList([IP(id=i)/TCP() for i in range(10)]) ... lines = plist.diffplot(lambda x,y: (x.time, y.id-x.id)) ... assert len(lines) == 9 ... >>> test_diffplot() ###(304)=[passed] multiplot() >>> from unittest import mock >>> import scapy.libs.matplot >>> >>> @mock.patch("scapy.libs.matplot.plt") ... def test_multiplot(mock_plt): ... def fake_plot(data, **kwargs): ... return data ... mock_plt.plot = fake_plot ... tmp = [IP(id=i)/TCP() for i in range(10)] ... plist = PacketList([tuple(tmp[i-2:i]) for i in range(2, 10, 2)]) ... lines = plist.multiplot(lambda x, y: (y[IP].src, (y.time, y[IP].id))) ... assert len(lines) == 1 ... assert len(lines[0]) == 4 ... >>> test_multiplot() ###(305)=[passed] rawhexdump() >>> def test_rawhexdump(): ... with ContextManagerCaptureOutput() as cmco: ... p = PacketList([IP()/TCP() for i in range(2)]) ... p.rawhexdump() ... result_pl_rawhexdump = cmco.get_output() ... assert len(result_pl_rawhexdump.split('\n')) == 7 ... assert result_pl_rawhexdump.startswith("0000 45 00 00 28") ... >>> test_rawhexdump() ###(306)=[passed] hexraw() >>> def test_hexraw(): ... with ContextManagerCaptureOutput() as cmco: ... p = PacketList([IP()/Raw(str(i)) for i in range(2)]) ... p.hexraw() ... result_pl_hexraw = cmco.get_output() ... assert len(result_pl_hexraw.split('\n')) == 5 ... assert "0000 30" in result_pl_hexraw ... >>> test_hexraw() ###(307)=[passed] hexdump() >>> def test_hexdump(): ... with ContextManagerCaptureOutput() as cmco: ... p = PacketList([IP()/Raw(str(i)) for i in range(2)]) ... p.hexdump() ... result_pl_hexdump = cmco.get_output() ... assert len(result_pl_hexdump.split('\n')) == 7 ... assert "0010 7F 00 00 01 31" in result_pl_hexdump ... >>> test_hexdump() ###(308)=[passed] import_hexcap() >>> @mock.patch("scapy.utils.input") ... def test_import_hexcap(mock_input): ... data = """ ... 0000 FF FF FF FF FF FF AA AA AA AA AA AA 08 00 45 00 ..............E. ... 0010 00 1C 00 01 00 00 40 01 7C DE 7F 00 00 01 7F 00 ......@.|....... ... 0020 00 01 08 00 F7 FF 00 00 00 00 .......... ... """[1:].split("\n") ... lines = iter(data) ... mock_input.side_effect = lambda: next(lines) ... return import_hexcap() ... >>> pkt = test_import_hexcap() >>> pkt = Ether(pkt) >>> assert pkt[Ether].dst == "ff:ff:ff:ff:ff:ff" >>> assert pkt[IP].dst == "127.0.0.1" >>> assert ICMP in pkt ###(309)=[passed] import_hexcap(input_string) >>> data = """ ... 0000 FF FF FF FF FF FF AA AA AA AA AA AA 08 00 45 00 ..............E. ... 0010 00 1C 00 01 00 00 40 01 7C DE 7F 00 00 01 7F 00 ......@.|....... ... 0020 00 01 08 00 F7 FF 00 00 00 00 .......... ... """[1:] >>> pkt = import_hexcap(data) >>> pkt = Ether(pkt) >>> assert pkt[Ether].dst == "ff:ff:ff:ff:ff:ff" >>> assert pkt[IP].dst == "127.0.0.1" >>> assert ICMP in pkt ###(310)=[passed] padding() >>> def test_padding(): ... with ContextManagerCaptureOutput() as cmco: ... p = PacketList([IP()/conf.padding_layer(str(i)) for i in range(2)]) ... p.padding() ... result_pl_padding = cmco.get_output() ... assert len(result_pl_padding.split('\n')) == 5 ... assert "0000 30" in result_pl_padding ... >>> test_padding() ###(311)=[passed] nzpadding() >>> def test_nzpadding(): ... with ContextManagerCaptureOutput() as cmco: ... p = PacketList([IP()/conf.padding_layer("AB"), IP()/conf.padding_layer("\x00\x00")]) ... p.nzpadding() ... result_pl_nzpadding = cmco.get_output() ... assert len(result_pl_nzpadding.split('\n')) == 3 ... assert "0000 41 42" in result_pl_nzpadding ... >>> test_nzpadding() ###(312)=[passed] conversations() >>> from unittest import mock >>> @mock.patch("scapy.plist.do_graph") ... def test_conversations(mock_do_graph): ... def fake_do_graph(graph, **kwargs): ... return graph ... mock_do_graph.side_effect = fake_do_graph ... plist = PacketList([IP(dst="127.0.0.2")/TCP(dport=i) for i in range(2)]) ... plist.extend([IP(src="127.0.0.2")/TCP(sport=i) for i in range(2)]) ... plist.extend([IPv6(dst="::2", src="::1")/TCP(sport=i) for i in range(2)]) ... plist.extend([IPv6(src="::2", dst="::1")/TCP(sport=i) for i in range(2)]) ... plist.extend([Ether()/ARP(pdst="127.0.0.1")]) ... result_conversations = plist.conversations() ... assert len(result_conversations.split('\n')) == 8 ... assert result_conversations.startswith('digraph "conv" {') ... assert "127.0.0.1" in result_conversations ... assert "::1" in result_conversations ... >>> test_conversations() ###(313)=[passed] sessions() >>> pl = PacketList([Ether()/IPv6()/ICMPv6EchoRequest(), Ether()/IPv6()/IPv6()]) >>> pl.extend([Ether()/IP()/IP(), Ether()/ARP()]) >>> pl.extend([Ether()/Ether()/IP()]) >>> assert len(pl.sessions().keys()) == 5 ###(314)=[passed] afterglow() >>> from unittest import mock >>> @mock.patch("scapy.plist.do_graph") ... def test_afterglow(mock_do_graph): ... def fake_do_graph(graph, **kwargs): ... return graph ... mock_do_graph.side_effect = fake_do_graph ... plist = PacketList([IP(dst="127.0.0.2")/TCP(dport=i) for i in range(2)]) ... plist.extend([IP(src="127.0.0.2")/TCP(sport=i) for i in range(2)]) ... result_afterglow = plist.afterglow() ... assert len(result_afterglow.split('\n')) == 19 ... assert result_afterglow.startswith('digraph "afterglow" {') ... >>> test_afterglow() ###(315)=[passed] psdump() >>> print("PYX: %d" % PYX) PYX: 0 >>> if PYX: ... import tempfile ... import os ... filename = tempfile.mktemp(suffix=".eps") ... plist = PacketList([IP()/TCP()]) ... plist.psdump(filename) ... assert os.path.exists(filename) ... os.unlink(filename) ... ###(316)=[passed] pdfdump() >>> print("PYX: %d" % PYX) PYX: 0 >>> if PYX: ... import tempfile ... import os ... filename = tempfile.mktemp(suffix=".pdf") ... plist = PacketList([IP()/TCP()]) ... plist.pdfdump(filename) ... assert os.path.exists(filename) ... os.unlink(filename) ... ###(317)=[passed] svgdump() >>> print("PYX: %d" % PYX) PYX: 0 >>> if PYX: ... import tempfile ... import os ... filename = tempfile.mktemp(suffix=".svg") ... plist = PacketList([IP()/TCP()]) ... plist.svgdump(filename) ... assert os.path.exists(filename) ... os.unlink(filename) ... ###(318)=[passed] __getstate__ / __setstate__ (used by pickle) >>> import pickle >>> >>> frm = Ether(src='00:11:22:33:44:55', dst='00:22:33:44:55:66')/Raw() >>> frm.time = EDecimal(123.45) >>> frm.sniffed_on = "iface" >>> frm.wirelen = 1 >>> pl = PacketList(res=[frm, frm], name='WhatAGreatName') >>> pickled = pickle.dumps(pl) >>> pl = pickle.loads(pickled) >>> assert pl.listname == "WhatAGreatName" >>> assert len(pl) == 2 >>> assert pl[0].time == 123.45 >>> assert pl[0].sniffed_on == "iface" >>> assert pl[0].wirelen == 1 >>> assert pl[0][Ether].src == '00:11:22:33:44:55' >>> assert pl[1][Ether].dst == '00:22:33:44:55:66' ###(319)=[passed] EDecimal >>> p1, p2 = EDecimal('1722417787.778435252'), EDecimal('1722417787.778435216') >>> assert p1 != p2 >>> assert p1 > p2 >>> assert not (p1 < p2) >>> assert p1 == 1722417787.778435252 # float test >>> assert p2 == 1722417787.778435216 >>> assert (p1, 0) > (p2, 1) ###### ## Scapy version ###### ###(320)=[passed] _version() >>> import os >>> from datetime import datetime, timezone >>> >>> version_filename = os.path.join(scapy._SCAPY_PKG_DIR, "VERSION") >>> mtime = datetime.fromtimestamp(os.path.getmtime(scapy.__file__), timezone.utc) >>> version = "2.0.0" >>> with open(version_filename, "w") as fd: ... fd.write(version) ... 5 >>> os.environ["SCAPY_VERSION"] = "9.9.9" >>> assert scapy._version() == "9.9.9" >>> del os.environ["SCAPY_VERSION"] >>> >>> assert scapy._version() == version >>> os.unlink(version_filename) >>> >>> from unittest import mock >>> with mock.patch("scapy._version_from_git_archive") as archive: ... archive.return_value = "4.4.4" ... assert scapy._version() == "4.4.4" ... archive.side_effect = ValueError() ... with mock.patch("scapy._version_from_git_describe") as git: ... git.return_value = "3.3.3" ... assert scapy._version() == "3.3.3" ... git.side_effect = Exception() ... assert scapy._version() == mtime.strftime("%Y.%m.%d") ... with mock.patch("os.path.getmtime") as getmtime: ... getmtime.side_effect = Exception() ... assert scapy._version() == "0.0.0" ... ###(321)=[passed] UTscapy HTML output >>> import tempfile, os >>> from scapy.tools.UTscapy import TestCampaign, pack_html_campaigns >>> test_campaign = TestCampaign("test") >>> test_campaign.output_file = tempfile.mktemp() >>> html = pack_html_campaigns([test_campaign], None, local=True) >>> dirname = os.path.dirname(test_campaign.output_file) >>> filename_js = "%s/UTscapy.js" % dirname >>> filename_css = "%s/UTscapy.css" % dirname >>> assert os.path.isfile(filename_js) >>> assert os.path.isfile(filename_css) >>> os.remove(filename_js) >>> os.remove(filename_css) ###(322)=[passed] test get_temp_dir >>> dname = get_temp_dir() >>> assert os.path.isdir(dname) ###(323)=[passed] test fragleak functions >>> from unittest import mock >>> >>> @mock.patch("scapy.layers.inet.conf.L3socket") ... @mock.patch("scapy.layers.inet.select.select") ... @mock.patch("scapy.layers.inet.sr1") ... def _test_fragleak(func, sr1, select, L3socket): ... packets = [IP(src="4.4.4.4")/ICMP()/IPerror(dst="8.8.8.8")/conf.padding_layer(load=b"greatdata")] ... iterator = iter(packets) ... ne = lambda *args, **kwargs: next(iterator) ... L3socket.side_effect = lambda: Bunch(recv=ne, send=lambda x: None) ... sr1.side_effect = ne ... select.side_effect = lambda a, b, c, d: a+b+c ... with ContextManagerCaptureOutput() as cmco: ... func("8.8.8.8", count=1) ... out = cmco.get_output() ... return "greatdata" in out ... >>> assert _test_fragleak(fragleak) >>> assert _test_fragleak(fragleak2) send, sniff, sr* tests for Scapy ━ Run at 01:42:06 from [test/sendsniff.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for TFTP ━ Run at 01:42:07 from [test/tftp.uts] by UTscapy in 0.10743474960327148 └ Passed=9 └ Failed=0 ###### ## TFTP coverage tests ###### ###(000)=[passed] Test answers >>> assert TFTP_DATA(block=1).answers(TFTP_RRQ()) >>> assert not TFTP_WRQ().answers(TFTP_RRQ()) >>> assert not TFTP_RRQ().answers(TFTP_WRQ()) >>> assert TFTP_ACK(block=1).answers(TFTP_DATA(block=1)) >>> assert not TFTP_ACK(block=0).answers(TFTP_DATA(block=1)) >>> assert TFTP_ACK(block=0).answers(TFTP_RRQ()) >>> assert not TFTP_ACK().answers(TFTP_ACK()) >>> assert TFTP_ERROR().answers(TFTP_DATA()) and TFTP_ERROR().answers(TFTP_ACK()) >>> assert TFTP_OACK().answers(TFTP_WRQ()) ###### ## TFTP Automatons ###### ###(001)=[passed] Utilities >>> from scapy.automaton import select_objects >>> >>> class MockTFTPSocket(object): ... packets = [] ... def recv(self, n=None): ... pkt = self.packets.pop(0) ... return pkt ... def send(self, *args, **kargs): ... pass ... def close(self): ... pass ... @classmethod ... def select(classname, inputs, remain): ... test = [s for s in inputs if isinstance(s, classname)] ... if test: ... if len(test[0].packets): ... return test ... else: ... inputs = [s for s in inputs if not isinstance(s, classname)] ... return select_objects(inputs, remain) ... ###(002)=[passed] TFTP_read() automaton >>> class MockReadSocket(MockTFTPSocket): ... packets = [IP(src="1.2.3.4") / UDP(dport=0x2807) / TFTP_DATA(block=1) / ("P" * 512), ... IP(src="1.2.3.4") / UDP(dport=0x2807) / TFTP_DATA(block=2) / "<3"] ... >>> tftp_read = TFTP_read("file.txt", "1.2.3.4", sport=0x2807, ... ll=MockReadSocket, ... recvsock=MockReadSocket, debug=5) Starting control thread [tid=140736108228864] >>> >>> res = tftp_read.run() Received command RUN ## state=[BEGIN] SENT : IP / UDP 192.168.122.109:10247 > 1.2.3.4:tftp / TFTP / RRQ b'file.txt' switching from [BEGIN] to [WAITING] ## state=[WAITING] Select on [, ] Selected [] Looking at RECVD: IP / UDP 1.2.3.4:domain > 127.0.0.1:10247 / DATA 1 / Raw Trying Receive condition [receive_data] Receive condition [receive_data] taken to state [RECEIVING] + Running action [send_ack] SENT : IP / UDP 192.168.122.109:10247 > 1.2.3.4:domain / TFTP / ACK 1 switching from [WAITING] to [RECEIVING] ## state=[RECEIVING] switching from [RECEIVING] to [WAITING] ## state=[WAITING] Select on [, ] Selected [] Looking at RECVD: IP / UDP 1.2.3.4:domain > 127.0.0.1:10247 / DATA 2 / Raw Trying Receive condition [receive_data] Receive condition [receive_data] taken to state [RECEIVING] + Running action [send_ack] SENT : IP / UDP 192.168.122.109:10247 > 1.2.3.4:domain / TFTP / ACK 2 switching from [WAITING] to [RECEIVING] ## state=[RECEIVING] switching from [RECEIVING] to [END] ## state=[END] Stopping control thread (tid=140736108228864) >>> assert res == (b"P" * 512 + b"<3") ###(003)=[passed] TFTP_read() automaton error >>> class MockReadSocket(MockTFTPSocket): ... packets = [IP(src="1.2.3.4") / UDP(dport=0x2807) / TFTP_ERROR(errorcode=2, errormsg="Fatal error")] ... >>> tftp_read = TFTP_read("file.txt", "1.2.3.4", sport=0x2807, ... ll=MockReadSocket, ... recvsock=MockReadSocket) >>> >>> try: ... tftp_read.run() ... assert False ... except Automaton.ErrorState as e: ... assert "Reached ERROR" in str(e) ... assert "ERROR Access violation" in str(e) ... ###(004)=[passed] TFTP_write() automaton >>> data_received = b"" >>> >>> class MockWriteSocket(MockTFTPSocket): ... packets = [IP(src="1.2.3.4") / UDP(dport=0x2807) / TFTP_ACK(block=0), ... IP(src="1.2.3.4") / UDP(dport=0x2807) / TFTP_ACK(block=1) ] ... def send(self, *args, **kargs): ... if len(args) and Raw in args[0]: ... global data_received ... data_received += args[0][Raw].load ... >>> tftp_write = TFTP_write("file.txt", "P" * 767 + "Scapy <3", "1.2.3.4", sport=0x2807, ... ll=MockWriteSocket, ... recvsock=MockWriteSocket) >>> >>> tftp_write.run() >>> assert data_received == (b"P" * 767 + b"Scapy <3") ###(005)=[passed] TFTP_write() automaton error >>> class MockWriteSocket(MockTFTPSocket): ... packets = [IP(src="1.2.3.4") / UDP(dport=0x2807) / TFTP_ERROR(errorcode=2, errormsg="Fatal error")] ... >>> tftp_write = TFTP_write("file.txt", "P" * 767 + "Scapy <3", "1.2.3.4", sport=0x2807, ... ll=MockWriteSocket, ... recvsock=MockWriteSocket) >>> >>> try: ... tftp_write.run() ... assert False ... except Automaton.ErrorState as e: ... assert "Reached ERROR" in str(e) ... assert "ERROR Access violation" in str(e) ... ###(006)=[passed] TFTP_WRQ_server() automaton >>> class MockWRQSocket(MockTFTPSocket): ... packets = [IP(dst="1.2.3.4") / UDP(dport=0x2807) / TFTP() / TFTP_WRQ(filename="scapy.txt"), ... IP(dst="1.2.3.4") / UDP(dport=0x2807) / TFTP() / TFTP_DATA(block=1) / ("P" * 512), ... IP(dst="1.2.3.4") / UDP(dport=0x2807) / TFTP() / TFTP_DATA(block=2) / "<3"] ... >>> tftp_wrq = TFTP_WRQ_server(ip="1.2.3.4", sport=0x2807, ... ll=MockWRQSocket, ... recvsock=MockWRQSocket) >>> assert tftp_wrq.run() == (b"scapy.txt", (b"P" * 512 + b"<3")) ###(007)=[passed] TFTP_WRQ_server() automaton with options >>> class MockWRQSocket(MockTFTPSocket): ... packets = [IP(dst="1.2.3.4") / UDP(dport=0x2807) / TFTP() / TFTP_WRQ(filename="scapy.txt") / TFTP_Options(options=[TFTP_Option(oname="blksize", value="100")]), ... IP(dst="1.2.3.4") / UDP(dport=0x2807) / TFTP() / TFTP_DATA(block=1) / ("P" * 100), ... IP(dst="1.2.3.4") / UDP(dport=0x2807) / TFTP() / TFTP_DATA(block=2) / "<3"] ... >>> tftp_wrq = TFTP_WRQ_server(ip="1.2.3.4", sport=0x2807, ... ll=MockWRQSocket, ... recvsock=MockWRQSocket) >>> assert tftp_wrq.run() == (b"scapy.txt", (b"P" * 100 + b"<3")) ###(008)=[passed] TFTP_RRQ_server() automaton >>> sent_data = "P" * 512 + "<3" >>> import tempfile >>> filename = tempfile.mktemp(suffix=".txt") >>> fdesc = open(filename, "w") >>> fdesc.write(sent_data) 514 >>> fdesc.close() >>> >>> received_data = "" >>> >>> class MockRRQSocket(MockTFTPSocket): ... packets = [IP(dst="1.2.3.4") / UDP(dport=0x2807) / TFTP() / TFTP_RRQ(filename="scapy.txt") / TFTP_Options(options=[TFTP_Option(oname="blksize", value="100")]), ... IP(dst="1.2.3.4") / UDP(dport=0x2807) / TFTP() / TFTP_RRQ(filename=filename[5:]) / TFTP_Options(), ... IP(dst="1.2.3.4") / UDP(dport=0x2807) / TFTP() / TFTP_ACK(block=1), ... IP(dst="1.2.3.4") / UDP(dport=0x2807) / TFTP() / TFTP_ACK(block=2) ] ... def send(self, *args, **kargs): ... if len(args): ... pkt = args[0] ... if TFTP_DATA in pkt: ... global received_data ... received_data += pkt[Raw].load.decode("utf-8") ... >>> tftp_rrq = TFTP_RRQ_server(ip="1.2.3.4", sport=0x2807, dir="/tmp/", serve_one=True, ... ll=MockRRQSocket, ... recvsock=MockRRQSocket) >>> tftp_rrq.run() >>> assert received_data == sent_data >>> >>> import os >>> os.unlink(filename) tuntap tests for Scapy ━ Run at 01:42:07 from [test/tuntap.uts] by UTscapy in 0.1129310131072998 └ Passed=2 └ Failed=0 ###### ## Test Linux-specific protocol headers for TunTap ###### ###(000)=[passed] Linux-specific protocol headers >>> p = LinuxTunPacketInfo()/IP() >>> assert p.type == 2048 >>> >>> p = LinuxTunPacketInfo(raw(p)) >>> assert p.type == 2048 >>> assert isinstance(p.payload, IP) >>> >>> p = LinuxTunPacketInfo()/IPv6() >>> assert p.type == 0x86dd >>> >>> p = LinuxTunPacketInfo(raw(p)) >>> assert p.type == 0x86dd >>> >>> assert isinstance(p.payload, IPv6) ###### ## Refresh interfaces ###### ###(014)=[passed] Cleanup >>> conf.ifaces.reload() >>> conf.route.resync() >>> conf.route6.resync() Tests for generic ASN.1 encoding ━ Run at 01:42:07 from [test/scapy/layers/asn1.uts] by UTscapy in 0.07175016403198242 └ Passed=35 └ Failed=0 ###### ## ASN.1 Generalized Time ###### ###(000)=[passed] short HH >>> repr(ASN1_GENERALIZED_TIME("1999123123")).startswith("1999-12-31 23:00:00 <") True ###(001)=[passed] short HH (invalid) >>> "invalid" in repr(ASN1_GENERALIZED_TIME("1999123124")) True ###(002)=[passed] short HHMM >>> repr(ASN1_GENERALIZED_TIME("199912312359")).startswith("1999-12-31 23:59:00 <") True ###(003)=[passed] short HHMM (invalid) >>> "invalid" in repr(ASN1_GENERALIZED_TIME("199912312360")) True ###(004)=[passed] full >>> repr(ASN1_GENERALIZED_TIME("19991231235959")).startswith("1999-12-31 23:59:59 <") True ###(005)=[passed] full (invalid) >>> "invalid" in repr(ASN1_GENERALIZED_TIME("19991231235960")) True ###(006)=[passed] with microseconds >>> repr(ASN1_GENERALIZED_TIME("19991231235959.999")).startswith("1999-12-31 23:59:59.999 <") True ###(007)=[passed] with microseconds (invalid) >>> assert "invalid" in repr(ASN1_GENERALIZED_TIME("1999123125959.99")) >>> assert "invalid" in repr(ASN1_GENERALIZED_TIME("1999123125959.99x")) >>> assert "invalid" in repr(ASN1_GENERALIZED_TIME("1999123125959.9999")) ###### ## ASN.1 Generalized Time (Zulu) ###### ###(008)=[passed] Z short HH >>> repr(ASN1_GENERALIZED_TIME("1999123123Z")).startswith("1999-12-31 23:00:00 UTC <") True ###(009)=[passed] Z short HHMM >>> repr(ASN1_GENERALIZED_TIME("199912312359Z")).startswith("1999-12-31 23:59:00 UTC <") True ###(010)=[passed] Z full >>> repr(ASN1_GENERALIZED_TIME("19991231235959Z")).startswith("1999-12-31 23:59:59 UTC <") True ###(011)=[passed] Z with microseconds >>> repr(ASN1_GENERALIZED_TIME("19991231235959.999Z")).startswith("1999-12-31 23:59:59.999 UTC <") True ###### ## ASN.1 Generalized Time (Timezone Offset) ###### ###(012)=[passed] offset short HH >>> ASN1_GENERALIZED_TIME("1999123123+0100") 1999-12-31 23:00:00 +0100 >>> repr(ASN1_GENERALIZED_TIME("1999123123+0100")).startswith("1999-12-31 23:00:00 +0100 <") True ###(013)=[passed] offset short HHMM >>> repr(ASN1_GENERALIZED_TIME("199912312359+0100")).startswith("1999-12-31 23:59:00 +0100 <") True ###(014)=[passed] offset full >>> repr(ASN1_GENERALIZED_TIME("19991231235959+0100")).startswith("1999-12-31 23:59:59 +0100 <") True ###(015)=[passed] offset with microseconds >>> repr(ASN1_GENERALIZED_TIME("19991231235959.999+0100")).startswith("1999-12-31 23:59:59.999 +0100 <") True ###(016)=[passed] offset negative >>> repr(ASN1_GENERALIZED_TIME("19991231235959-2359")).startswith("1999-12-31 23:59:59 -2359 <") True ###(017)=[passed] offset invalid (offset >= 24h) >>> assert "invalid" in repr(ASN1_GENERALIZED_TIME("19991231235959-2400")) >>> assert "invalid" in repr(ASN1_GENERALIZED_TIME("19991231235959+2400")) ###### ## ASN.1 UTC Time ###### ###(018)=[passed] UTC short HHMM >>> repr(ASN1_UTC_TIME("9912312359Z")).startswith("1999-12-31 23:59:00 UTC <") True ###(019)=[passed] UTC short HHMM (no Z) >>> "invalid" in repr(ASN1_UTC_TIME("9912312359")) True ###(020)=[passed] UTC short HHMM (invalid) >>> "invalid" in repr(ASN1_UTC_TIME("99123160")) True ###(021)=[passed] UTC full >>> repr(ASN1_UTC_TIME("991231235959Z")).startswith("1999-12-31 23:59:59 UTC <") True ###(022)=[passed] UTC full (no Z) >>> "invalid" in repr(ASN1_UTC_TIME("991231235959")) True ###(023)=[passed] UTC full (invalid) >>> "invalid" in repr(ASN1_UTC_TIME("9912315960")) True ###### ## ASN.1 Generalized Time (datetime member) ###### ###(024)=[passed] prepare >>> class TZ(tzinfo): ... def __init__(self, delta): self.delta = delta ... def utcoffset(self, dt): return self.delta ... def dst(self, dt): return None ... ###(025)=[passed] short HH datetime >>> ASN1_GENERALIZED_TIME("1999123123").datetime == datetime(1999, 12, 31, 23) True ###(026)=[passed] short HHMM datetime >>> ASN1_GENERALIZED_TIME("199912312359").datetime == datetime(1999, 12, 31, 23, 59) True ###(027)=[passed] full datetime >>> ASN1_GENERALIZED_TIME("19991231235959").datetime == datetime(1999, 12, 31, 23, 59, 59) True ###(028)=[passed] datetime assignment >>> x = ASN1_GENERALIZED_TIME("19991231235959.999") >>> x.datetime = datetime(2020, 12, 31) >>> assert x.val == "20201231000000" >>> x.datetime = x.datetime.replace(tzinfo=timezone.utc) >>> x.val == "20201231000000Z" True ###(029)=[passed] datetime construction >>> ASN1_GENERALIZED_TIME(datetime(2020, 12, 31)).val == "20201231000000" True ###(030)=[passed] datetime construction (UTC) >>> ASN1_GENERALIZED_TIME(datetime(2020, 12, 31, tzinfo=timezone.utc)).val == "20201231000000Z" True ###(031)=[passed] datetime construction (offset) >>> ASN1_GENERALIZED_TIME(datetime(2020, 12, 31, tzinfo=timezone(timedelta(hours=-23, minutes=-59)))).val == "20201231000000-2359" True ###### ## ASN.1 UTC Time (datetime member) ###### ###(032)=[passed] UTC datetime construction >>> ASN1_UTC_TIME(datetime(2020, 12, 31)).val == "201231000000" True ###(033)=[passed] UTC datetime construction (Z) >>> ASN1_UTC_TIME(datetime(2020, 12, 31, tzinfo=timezone.utc)).val == "201231000000Z" True ###(034)=[passed] UTC datetime construction (offset) >>> ASN1_UTC_TIME(datetime(2020, 12, 31, tzinfo=timezone(timedelta(hours=-23, minutes=-59)))).val == "201231000000-2359" True Scapy Bluetooth layer tests ━ Run at 01:42:07 from [test/scapy/layers/bluetooth.uts] by UTscapy in 0.23332548141479492 └ Passed=58 └ Failed=0 ###### ## Bluetooth tests ###### ###(000)=[passed] HCI layers >>> hci_cmd_hdr = HCI_Command_Hdr() >>> assert hci_cmd_hdr.ogf == 0 >>> assert hci_cmd_hdr.ocf == 0 >>> assert hci_cmd_hdr.len == None >>> assert raw(hci_cmd_hdr) == b'\x00\x00\x00' >>> >>> hci_cmd_hdr = HCI_Command_Hdr(raw(hci_cmd_hdr)) >>> assert hci_cmd_hdr.ogf == 0 >>> assert hci_cmd_hdr.ocf == 0 >>> assert hci_cmd_hdr.len == 0 >>> >>> hci_cmd_inquiry = HCI_Command_Hdr() / HCI_Cmd_Inquiry() >>> assert hci_cmd_inquiry.ogf == 0x01 >>> assert hci_cmd_inquiry.ocf == 0x01 >>> assert hci_cmd_inquiry.len == None >>> assert hci_cmd_inquiry.lap == 0x9e8b33 >>> assert hci_cmd_inquiry.inquiry_length == 0 >>> assert hci_cmd_inquiry.num_responses == 0 >>> >>> hci_cmd_inquiry = HCI_Command_Hdr(raw(hci_cmd_inquiry)) >>> assert hci_cmd_inquiry.ogf == 0x01 >>> assert hci_cmd_inquiry.ocf == 0x01 >>> assert hci_cmd_inquiry.len == 5 >>> assert hci_cmd_inquiry.lap == 0x9e8b33 >>> assert hci_cmd_inquiry.inquiry_length == 0 >>> assert hci_cmd_inquiry.num_responses == 0 >>> >>> hci_cmd_inquiry = HCI_Command_Hdr(len = 10) / HCI_Cmd_Inquiry() >>> assert hci_cmd_inquiry.ogf == 0x01 >>> assert hci_cmd_inquiry.ocf == 0x01 >>> assert hci_cmd_inquiry.len == 10 >>> assert hci_cmd_inquiry.lap == 0x9e8b33 >>> assert hci_cmd_inquiry.inquiry_length == 0 >>> assert hci_cmd_inquiry.num_responses == 0 >>> >>> assert raw(hci_cmd_inquiry)[2] == 10 >>> >>> hci_cmd_inquiry = HCI_Command_Hdr(raw(hci_cmd_inquiry)) >>> assert hci_cmd_inquiry.ogf == 0x01 >>> assert hci_cmd_inquiry.ocf == 0x01 >>> assert hci_cmd_inquiry.len == 10 >>> assert hci_cmd_inquiry.lap == 0x9e8b33 >>> assert hci_cmd_inquiry.inquiry_length == 0 >>> assert hci_cmd_inquiry.num_responses == 0 >>> >>> hci_cmd_inquiry_cancel = HCI_Command_Hdr() / HCI_Cmd_Inquiry_Cancel() >>> assert hci_cmd_inquiry_cancel.ogf == 0x01 >>> assert hci_cmd_inquiry_cancel.ocf == 0x02 >>> assert hci_cmd_inquiry_cancel.len == None >>> >>> hci_cmd_inquiry_cancel = HCI_Command_Hdr(raw(hci_cmd_inquiry_cancel)) >>> assert hci_cmd_inquiry_cancel.ogf == 0x01 >>> assert hci_cmd_inquiry_cancel.ocf == 0x02 >>> assert hci_cmd_inquiry_cancel.len == 0 >>> >>> >>> hci_cmd_hold_mode = HCI_Command_Hdr() / HCI_Cmd_Hold_Mode() >>> assert hci_cmd_hold_mode.ogf == 0x02 >>> assert hci_cmd_hold_mode.ocf == 0x01 >>> assert hci_cmd_hold_mode.len == None >>> >>> hci_cmd_hold_mode = HCI_Command_Hdr(raw(hci_cmd_hold_mode)) >>> assert hci_cmd_hold_mode.ogf == 0x02 >>> assert hci_cmd_hold_mode.ocf == 0x01 >>> assert hci_cmd_hold_mode.len == 6 >>> >>> hci_cmd_set_event_mask = HCI_Command_Hdr() / HCI_Cmd_Set_Event_Mask() >>> assert hci_cmd_set_event_mask.ogf == 0x03 >>> assert hci_cmd_set_event_mask.ocf == 0x01 >>> assert hci_cmd_set_event_mask.len == None >>> >>> hci_cmd_set_event_mask = HCI_Command_Hdr(raw(hci_cmd_set_event_mask)) >>> assert hci_cmd_set_event_mask.ogf == 0x03 >>> assert hci_cmd_set_event_mask.ocf == 0x01 >>> assert hci_cmd_set_event_mask.len == 8 >>> >>> hci_cmd_read_bd_addr = HCI_Command_Hdr() / HCI_Cmd_Read_BD_Addr() >>> assert hci_cmd_read_bd_addr.ogf == 0x04 >>> assert hci_cmd_read_bd_addr.ocf == 0x09 >>> assert hci_cmd_read_bd_addr.len == None >>> >>> hci_cmd_read_bd_addr = HCI_Command_Hdr(raw(hci_cmd_read_bd_addr)) >>> assert hci_cmd_read_bd_addr.ogf == 0x04 >>> assert hci_cmd_read_bd_addr.ocf == 0x09 >>> assert hci_cmd_read_bd_addr.len == 0 >>> >>> >>> hci_cmd_read_link_quality = HCI_Command_Hdr() / HCI_Cmd_Read_Link_Quality() >>> assert hci_cmd_read_link_quality.ogf == 0x05 >>> assert hci_cmd_read_link_quality.ocf == 0x03 >>> assert hci_cmd_read_link_quality.len == None >>> >>> hci_cmd_read_link_quality = HCI_Command_Hdr(raw(hci_cmd_read_link_quality)) >>> assert hci_cmd_read_link_quality.ogf == 0x05 >>> assert hci_cmd_read_link_quality.ocf == 0x03 >>> assert hci_cmd_read_link_quality.len == 2 >>> >>> >>> hci_cmd_read_loopback_mode = HCI_Command_Hdr() / HCI_Cmd_Read_Loopback_Mode() >>> assert hci_cmd_read_loopback_mode.ogf == 0x06 >>> assert hci_cmd_read_loopback_mode.ocf == 0x01 >>> assert hci_cmd_read_loopback_mode.len == None >>> >>> hci_cmd_read_loopback_mode = HCI_Command_Hdr(raw(hci_cmd_read_loopback_mode)) >>> assert hci_cmd_read_loopback_mode.ogf == 0x06 >>> assert hci_cmd_read_loopback_mode.ocf == 0x01 >>> assert hci_cmd_read_loopback_mode.len == 0 >>> >>> >>> hci_cmd_le_read_buffer_size_v1 = HCI_Command_Hdr() / HCI_Cmd_LE_Read_Buffer_Size_V1() >>> assert hci_cmd_le_read_buffer_size_v1.ogf == 0x08 >>> assert hci_cmd_le_read_buffer_size_v1.ocf == 0x02 >>> assert hci_cmd_le_read_buffer_size_v1.len == None >>> >>> hci_cmd_le_read_buffer_size_v1 = HCI_Command_Hdr(raw(hci_cmd_le_read_buffer_size_v1)) >>> assert hci_cmd_le_read_buffer_size_v1.ogf == 0x08 >>> assert hci_cmd_le_read_buffer_size_v1.ocf == 0x02 >>> assert hci_cmd_le_read_buffer_size_v1.len == 0 ###### ## Bluetooth Transport Layers ###### ###(001)=[passed] Test HCI_PHDR_Hdr >>> pkt = HCI_PHDR_Hdr()/HCI_Hdr()/HCI_ACL_Hdr()/L2CAP_Hdr()/L2CAP_CmdHdr()/L2CAP_InfoReq() >>> assert raw(pkt) == b'\x00\x00\x00\x00\x02\x00\x00\n\x00\x06\x00\x05\x00\n\x00\x02\x00\x00\x00' >>> pkt = HCI_PHDR_Hdr(raw(pkt)) >>> >>> assert HCI_Hdr in pkt >>> assert L2CAP_InfoReq in pkt ###### ## HCI Commands ###### ###(002)=[passed] Create Connection >>> cmd = HCI_Hdr(hex_bytes("0105040d76d56f95010018cc0200000001")) >>> assert HCI_Cmd_Create_Connection in cmd >>> assert cmd[HCI_Cmd_Create_Connection].bd_addr == "00:01:95:6f:d5:76" >>> assert cmd[HCI_Cmd_Create_Connection].packet_type == 52248 >>> assert cmd[HCI_Cmd_Create_Connection].page_scan_repetition_mode == 2 >>> assert cmd[HCI_Cmd_Create_Connection].reserved == 0 >>> assert cmd[HCI_Cmd_Create_Connection].clock_offset == 0 >>> assert cmd[HCI_Cmd_Create_Connection].allow_role_switch == 1 ###(003)=[passed] Authentication Requested >>> cmd = HCI_Hdr(hex_bytes("011104020001")) >>> assert HCI_Cmd_Authentication_Requested in cmd >>> assert cmd[HCI_Cmd_Authentication_Requested].handle == 256 ###(004)=[passed] Link Key Request Reply >>> cmd = HCI_Hdr(hex_bytes("010b041676d56f9501006c9016a48a009180086a39200f03d3dd")) >>> assert HCI_Cmd_Link_Key_Request_Reply in cmd >>> assert cmd[HCI_Cmd_Link_Key_Request_Reply].bd_addr == "00:01:95:6f:d5:76" >>> assert cmd[HCI_Cmd_Link_Key_Request_Reply].link_key == 0x6c9016a48a009180086a39200f03d3dd ###(005)=[passed] Set Connection Encryption >>> cmd = HCI_Hdr(hex_bytes("01130403000101")) >>> assert HCI_Cmd_Set_Connection_Encryption in cmd >>> assert cmd[HCI_Cmd_Set_Connection_Encryption].handle == 256 >>> assert cmd[HCI_Cmd_Set_Connection_Encryption].encryption_enable == 1 ###(006)=[passed] Remote Name Request >>> cmd = HCI_Hdr(hex_bytes("0119040a76d56f95010002000000")) >>> assert HCI_Cmd_Remote_Name_Request in cmd >>> assert cmd[HCI_Cmd_Remote_Name_Request].bd_addr == "00:01:95:6f:d5:76" >>> assert cmd[HCI_Cmd_Remote_Name_Request].page_scan_repetition_mode == 2 >>> assert cmd[HCI_Cmd_Remote_Name_Request].reserved == 0 >>> assert cmd[HCI_Cmd_Remote_Name_Request].clock_offset == 0 ###(007)=[passed] 7.3.12 Read Local Name >>> cmd = HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_Read_Local_Name() >>> assert raw(cmd) == hex_bytes("01140c00") >>> >>> response = HCI_Hdr(hex_bytes("040efc01140c00546865726d6973746f7200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) >>> assert HCI_Cmd_Complete_Read_Local_Name in response >>> assert response[HCI_Cmd_Complete_Read_Local_Name].local_name.decode('utf-8').rstrip('\x00') == 'Thermistor' >>> assert response.answers(cmd) ###(008)=[passed] 7.4.1 Read Local Version Information >>> cmd = HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_Read_Local_Version_Information() >>> assert raw(cmd) == hex_bytes("01011000") >>> >>> response = HCI_Hdr(hex_bytes("040e0c010110000900100931010c22")) >>> assert HCI_Cmd_Complete_Read_Local_Version_Information in response >>> assert response[HCI_Cmd_Complete_Read_Local_Version_Information].hci_version == 9 >>> assert response[HCI_Cmd_Complete_Read_Local_Version_Information].hci_subversion == 4096 >>> assert response[HCI_Cmd_Complete_Read_Local_Version_Information].lmp_version == 9 >>> assert response[HCI_Cmd_Complete_Read_Local_Version_Information].company_identifier == 0x0131 >>> assert response[HCI_Cmd_Complete_Read_Local_Version_Information].lmp_subversion == 8716 >>> assert response.answers(cmd) ###(009)=[passed] 7.4.4 Read Local Extended Features >>> cmd = HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_Read_Local_Extended_Features(page_number=1) >>> assert raw(cmd) == hex_bytes("0104100101") >>> >>> response = HCI_Hdr(hex_bytes("040e0e0104100001020000000000000000")) >>> assert HCI_Cmd_Complete_Read_Local_Extended_Features in response >>> assert response[HCI_Cmd_Complete_Read_Local_Extended_Features].page == 1 >>> assert response[HCI_Cmd_Complete_Read_Local_Extended_Features].max_page == 2 >>> assert response[HCI_Cmd_Complete_Read_Local_Extended_Features].extended_features == 0 >>> assert response.answers(cmd) ###(010)=[passed] LE Create Connection >>> cmd = HCI_Hdr(hex_bytes("010d2019600060000001123456677890001800280000002a0000000000")) >>> assert HCI_Cmd_LE_Create_Connection in cmd >>> assert cmd[HCI_Cmd_LE_Create_Connection].paddr == '90:78:67:56:34:12' >>> assert cmd[HCI_Cmd_LE_Create_Connection].patype == 1 >>> >>> pending = HCI_Hdr(hex_bytes("040f0400020d20")) >>> assert pending.answers(cmd) >>> >>> complete = HCI_Hdr(hex_bytes("043e1301020000000112345667789000000000000000")) >>> assert HCI_LE_Meta_Connection_Complete in complete >>> assert complete[HCI_LE_Meta_Connection_Complete].paddr == '90:78:67:56:34:12' >>> assert complete.answers(cmd) >>> >>> assert not cmd.answers(cmd) >>> assert not pending.answers(pending) >>> assert not complete.answers(complete) >>> assert not pending.answers(complete) >>> assert not complete.answers(pending) ###(011)=[passed] LE Create Connection Cancel >>> expected_cmd_raw_data = hex_bytes("010e2000") >>> cmd = HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_LE_Create_Connection_Cancel() >>> assert expected_cmd_raw_data == raw(cmd) >>> assert raw(HCI_Hdr(expected_cmd_raw_data)) == expected_cmd_raw_data >>> >>> other_raw_data = hex_bytes("01060403341213") >>> other_cmd = HCI_Hdr(other_raw_data) >>> >>> for p in ( ... HCI_Event_Command_Complete(opcode=0x200e), ... HCI_Event_Command_Status(opcode=0x200e), ... ): ... res = HCI_Hdr() / HCI_Event_Hdr() / p ... # For debugging ... res ... # Check that the response packet thinks it is an answer to the request ... assert res.answers(cmd) ... # Check that it self isn't a match ... assert not res.answers(res) ... # Check that another request wouldn't match ... assert not res.answers(other_cmd) ... "OK!" ... >> 'OK!' >> 'OK!' ###(012)=[passed] Disconnect >>> expected_cmd_raw_data = hex_bytes("01060403341213") >>> cmd_raw_data = raw(HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_Disconnect(handle=0x1234)) >>> assert expected_cmd_raw_data == cmd_raw_data ###(013)=[passed] LE Connection Update Command >>> expected_cmd_raw_data = hex_bytes("0113200e47000a00140001003c000100ffff") >>> cmd_raw_data = raw( ... HCI_Hdr() / HCI_Command_Hdr() / HCI_Cmd_LE_Connection_Update( ... handle=0x47, min_interval=10, max_interval=20, latency=1, timeout=60, ... min_ce=1, max_ce=0xffff)) >>> assert expected_cmd_raw_data == cmd_raw_data ###### ## HCI Events ###### ###(014)=[passed] Inquiry Complete >>> evt_raw_data = hex_bytes("04010100") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Inquiry_Complete in evt_pkt >>> assert evt_pkt[HCI_Event_Inquiry_Complete].status == 0 ###(015)=[passed] Inquiry Result >>> evt_pkt = HCI_Event_Inquiry_Result(b'\x01\xcb\x7f\xdbn\x8c\x9c\x01\x00\x00<\x04\x08\x8di') >>> assert HCI_Event_Inquiry_Result in evt_pkt >>> assert evt_pkt[HCI_Event_Inquiry_Result].num_response == 1 >>> assert evt_pkt[HCI_Event_Inquiry_Result].addr[0] == '9c:8c:6e:db:7f:cb' >>> assert evt_pkt[HCI_Event_Inquiry_Result].page_scan_repetition_mode[0] == 1 >>> assert evt_pkt[HCI_Event_Inquiry_Result].device_class[0] == 0x8043c >>> assert evt_pkt[HCI_Event_Inquiry_Result].clock_offset[0] == 27021 ###(016)=[passed] Connection Complete >>> evt_raw_data = hex_bytes("04030b000b00093491e5b7540100") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Connection_Complete in evt_pkt >>> assert evt_pkt[HCI_Event_Connection_Complete].status == 0 >>> assert evt_pkt[HCI_Event_Connection_Complete].handle == 0x000b >>> assert evt_pkt[HCI_Event_Connection_Complete].bd_addr == "54:b7:e5:91:34:09" >>> assert evt_pkt[HCI_Event_Connection_Complete].link_type == 1 >>> assert evt_pkt[HCI_Event_Connection_Complete].encryption_enabled == 0 ###(017)=[passed] Disconnection Complete >>> evt_raw_data = hex_bytes("04050400400016") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Disconnection_Complete in evt_pkt >>> assert evt_pkt[HCI_Event_Disconnection_Complete].status == 0 >>> assert evt_pkt[HCI_Event_Disconnection_Complete].handle == 0x0040 >>> assert evt_pkt[HCI_Event_Disconnection_Complete].reason == 0x16 ###(018)=[passed] Remote Name Request Complete >>> evt_raw_data = hex_bytes("0407ff0076d56f950100746573742d6c6170746f70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Remote_Name_Request_Complete in evt_pkt >>> assert evt_pkt[HCI_Event_Remote_Name_Request_Complete].status == 0 >>> assert evt_pkt[HCI_Event_Remote_Name_Request_Complete].bd_addr == "00:01:95:6f:d5:76" >>> assert evt_pkt[HCI_Event_Remote_Name_Request_Complete].remote_name == b"test-laptop".ljust(248, b"\x00") ###(019)=[passed] Encryption Change >>> evt_raw_data = hex_bytes("040804000b0001") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Encryption_Change in evt_pkt >>> assert evt_pkt[HCI_Event_Encryption_Change].status == 0 >>> assert evt_pkt[HCI_Event_Encryption_Change].handle == 0x000b >>> assert evt_pkt[HCI_Event_Encryption_Change].enabled == 1 ###(020)=[passed] Read Remote Supported Features Complete >>> evt_raw_data = hex_bytes("040b0b000b00fffe8ffedbff5b87") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Read_Remote_Supported_Features_Complete in evt_pkt >>> assert evt_pkt[HCI_Event_Read_Remote_Supported_Features_Complete].status == 0 >>> assert evt_pkt[HCI_Event_Read_Remote_Supported_Features_Complete].handle == 0x000b >>> assert evt_pkt[HCI_Event_Read_Remote_Supported_Features_Complete].lmp_features == 0x875bffdbfe8ffeff ###(021)=[passed] Read Remote Version Information Complete >>> evt_raw_data = hex_bytes("040c080002000bb0022c04") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Read_Remote_Version_Information_Complete in evt_pkt >>> assert evt_pkt[HCI_Event_Read_Remote_Version_Information_Complete].status == 0 >>> assert evt_pkt[HCI_Event_Read_Remote_Version_Information_Complete].handle == 0x0002 >>> assert evt_pkt[HCI_Event_Read_Remote_Version_Information_Complete].version == 0x0b >>> assert evt_pkt[HCI_Event_Read_Remote_Version_Information_Complete].manufacturer_name == 0x02b0 >>> assert evt_pkt[HCI_Event_Read_Remote_Version_Information_Complete].subversion == 1068 ###(022)=[passed] Command Complete >>> evt_raw_data = hex_bytes("040e0a010b04002587ceedd668") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Command_Complete in evt_pkt >>> assert evt_pkt[HCI_Event_Command_Complete].number == 1 >>> assert evt_pkt[HCI_Event_Command_Complete].opcode == 0x040b >>> assert evt_pkt[HCI_Event_Command_Complete].status == 0 ###(023)=[passed] Command Status >>> evt_raw_data = hex_bytes("040f0400011904") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Command_Status in evt_pkt >>> assert evt_pkt[HCI_Event_Command_Status].status == 0 >>> assert evt_pkt[HCI_Event_Command_Status].number == 1 >>> assert evt_pkt[HCI_Event_Command_Status].opcode == 0x0419 ###(024)=[passed] Number Of Completed Packets >>> evt_raw_data = hex_bytes("0413050103000300") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Number_Of_Completed_Packets in evt_pkt >>> assert evt_pkt[HCI_Event_Number_Of_Completed_Packets].num_handles == 1 >>> assert evt_pkt[HCI_Event_Number_Of_Completed_Packets].connection_handle_list[0] == 0x0003 >>> assert evt_pkt[HCI_Event_Number_Of_Completed_Packets].num_completed_packets_list[0] == 3 ###(025)=[passed] Link Key Request >>> evt_raw_data = hex_bytes("041706093491e5b754") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Link_Key_Request in evt_pkt >>> assert evt_pkt[HCI_Event_Link_Key_Request].bd_addr == '54:b7:e5:91:34:09' ###(026)=[passed] Inquiry Result with RSSI >>> ###(027)=[passed] Read Remote Extended Features Complete >>> evt_raw_data = hex_bytes("04230d000b0001020300000000000000") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Read_Remote_Extended_Features_Complete in evt_pkt >>> assert evt_pkt[HCI_Event_Read_Remote_Extended_Features_Complete].status == 0 >>> assert evt_pkt[HCI_Event_Read_Remote_Extended_Features_Complete].handle == 0x000b >>> assert evt_pkt[HCI_Event_Read_Remote_Extended_Features_Complete].page == 1 >>> assert evt_pkt[HCI_Event_Read_Remote_Extended_Features_Complete].max_page == 2 >>> assert evt_pkt[HCI_Event_Read_Remote_Extended_Features_Complete].extended_features == 0x0000000000000003 ###(028)=[passed] Extended Inquiry Result >>> evt_raw_data = hex_bytes("042fff01093491e5b75401001404247c37c2091001000a00ffffffff020a040b020d110b110a110e110f110c095354414e4d4f524520494900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_Extended_Inquiry_Result in evt_pkt >>> assert evt_pkt[HCI_Event_Extended_Inquiry_Result].num_response == 1 >>> assert evt_pkt[HCI_Event_Extended_Inquiry_Result].bd_addr == '54:b7:e5:91:34:09' >>> assert evt_pkt[HCI_Event_Extended_Inquiry_Result].page_scan_repetition_mode == 1 >>> assert evt_pkt[HCI_Event_Extended_Inquiry_Result].device_class == 0x240414 >>> assert evt_pkt[HCI_Event_Extended_Inquiry_Result].clock_offset == 0x377c >>> assert evt_pkt[HCI_Event_Extended_Inquiry_Result].rssi == -62 >>> assert EIR_Hdr in evt_pkt[HCI_Event_Extended_Inquiry_Result].eir_data[0] >>> assert Raw in evt_pkt[HCI_Event_Extended_Inquiry_Result].eir_data[-1] >>> assert len(evt_pkt[HCI_Event_Extended_Inquiry_Result].eir_data[-1].load) == 200 ###(029)=[passed] IO Capability Response >>> evt_raw_data = hex_bytes("043209093491e5b754030002") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_IO_Capability_Response in evt_pkt >>> assert evt_pkt[HCI_Event_IO_Capability_Response].bd_addr == '54:b7:e5:91:34:09' >>> assert evt_pkt[HCI_Event_IO_Capability_Response].io_capability == 0x03 >>> assert evt_pkt[HCI_Event_IO_Capability_Response].oob_data_present == 0 >>> assert evt_pkt[HCI_Event_IO_Capability_Response].authentication_requirements == 0x02 ###(030)=[passed] LE Meta >>> evt_raw_data = hex_bytes("043e0414400000") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert HCI_Event_LE_Meta in evt_pkt >>> assert evt_pkt[HCI_Event_LE_Meta].event == 0x14 ###(031)=[passed] LE Connection Update Event >>> evt_raw_data = hex_bytes("043e0a03004800140001003c00") >>> evt_pkt = HCI_Hdr(evt_raw_data) >>> assert evt_pkt[HCI_LE_Meta_Connection_Update_Complete].handle == 0x48 >>> assert evt_pkt[HCI_LE_Meta_Connection_Update_Complete].interval == 20 >>> assert evt_pkt[HCI_LE_Meta_Connection_Update_Complete].latency == 1 >>> assert evt_pkt[HCI_LE_Meta_Connection_Update_Complete].timeout == 60 ###### ## Bluetooth LE Advertising / Scan Response Data Parsing ###### ###(032)=[passed] Parse EIR_IncompleteList32BitServiceUUIDs >>> p = HCI_Hdr(hex_bytes('042fff019cc888f640c401000c025af32cb09904f6dc73222396f640c40c025a40dbca09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')) >>> assert EIR_IncompleteList32BitServiceUUIDs in p >>> assert len(p[EIR_IncompleteList32BitServiceUUIDs].svc_uuids) == 38 ###(033)=[passed] Parse EIR_CompleteList32BitServiceUUIDs >>> p = HCI_Hdr(hex_bytes('042fff0106ec883aef1801003c04285758b30e0954562064656c2073616cc3b36e09030a110c110e1100120105810700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')) >>> assert EIR_CompleteList32BitServiceUUIDs in p >>> assert p[EIR_CompleteList32BitServiceUUIDs].svc_uuids == [] ###(034)=[passed] Parse EIR_ClassOfDevice >>> p = HCI_Hdr(hex_bytes('043e2b020100000a1bb44ce0001f02010503ff000106084d4920524303021218040d040500020a0004fe06ec88a2')) >>> assert EIR_ClassOfDevice in p >>> assert p[EIR_ClassOfDevice].major_service_classes == 0 >>> assert p[EIR_ClassOfDevice].major_device_class == 5 >>> assert p[EIR_ClassOfDevice].minor_device_class == 1 ###(035)=[passed] Parse EIR_ServiceData32BitUUID >>> p = HCI_Hdr(hex_bytes('042fff01c47c80894df801000c0128a269a30c4a125d13f30196894df80c012820f61a1a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')) >>> assert EIR_ServiceData32BitUUID in p >>> assert p[EIR_ServiceData32BitUUID].svc_uuid == 0x001a1af6 ###(036)=[passed] Parse EIR_Flags, EIR_CompleteList16BitServiceUUIDs, EIR_CompleteLocalName and EIR_TX_Power_Level >>> ad_report_raw_data = \ ... hex_bytes("043e2b020100016522c00181781f0201020303d9fe1409" \ ... "506562626c652054696d65204c452037314536020a0cde") >>> scapy_packet = HCI_Hdr(ad_report_raw_data) >>> >>> assert scapy_packet[EIR_Flags].flags == 0x02 >>> assert scapy_packet[EIR_CompleteList16BitServiceUUIDs].svc_uuids == [0xfed9] >>> assert scapy_packet[EIR_CompleteLocalName].local_name == b'Pebble Time LE 71E6' >>> assert scapy_packet[EIR_TX_Power_Level].level == 12 ###(037)=[passed] Parse EIR_Manufacturer_Specific_Data >>> scan_resp_raw_data = \ ... hex_bytes("043e2302010401be5e0eb9f04f1716ff5401005f423331" \ ... "3134374432343631fc00030c0000de") >>> scapy_packet = HCI_Hdr(scan_resp_raw_data) >>> >>> assert raw(scapy_packet[EIR_Manufacturer_Specific_Data].payload) == b'\x00_B31147D2461\xfc\x00\x03\x0c\x00\x00' >>> assert scapy_packet[EIR_Manufacturer_Specific_Data].company_id == 0x154 ###(038)=[passed] Parse EIR_Manufacturer_Specific_Data with magic >>> class ScapyManufacturerPacket(Packet): ... magic = b'SCAPY!' ... fields_desc = [ ... StrFixedLenField("header", magic, len(magic)), ... ShortField("x", None), ... ] ... >>> class ScapyManufacturerPacket2(Packet): ... magic = b'!SCAPY' ... fields_desc = [ ... StrFixedLenField("header", magic, len(magic)), ... ShortField("y", None), ... ] ... @classmethod ... def magic_check(cls, payload): ... return payload.startswith(cls.magic) ... >>> EIR_Manufacturer_Specific_Data.register_magic_payload( ... ScapyManufacturerPacket, lambda p: p.startswith(ScapyManufacturerPacket.magic)) >>> EIR_Manufacturer_Specific_Data.register_magic_payload(ScapyManufacturerPacket2) >>> >>> p = EIR_Hdr(b'\x0b\xff\xff\xffSCAPY!\xab\x12') >>> >>> p.show() ###[ EIR Header ]### len = 11 type = mfg_specific_data ###[ EIR Manufacturer Specific Data ]### company_id= 0xffff ###[ ScapyManufacturerPacket ]### header = b'SCAPY!' x = 43794 >>> assert p[EIR_Manufacturer_Specific_Data].company_id == 0xffff >>> assert p[ScapyManufacturerPacket].x == 0xab12 >>> >>> p = EIR_Hdr(b'\x0b\xff\xff\xff!SCAPY\x12\x34') >>> >>> p.show() ###[ EIR Header ]### len = 11 type = mfg_specific_data ###[ EIR Manufacturer Specific Data ]### company_id= 0xffff ###[ ScapyManufacturerPacket2 ]### header = b'!SCAPY' y = 4660 >>> assert p[EIR_Manufacturer_Specific_Data].company_id == 0xffff >>> assert p[ScapyManufacturerPacket2].y == 0x1234 >>> >>> p = EIR_Hdr()/EIR_Manufacturer_Specific_Data(company_id=0xffff)/ScapyManufacturerPacket(x=0x5678) >>> assert raw(p) == b'\x0b\xff\xff\xffSCAPY!\x56\x78' >>> >>> try: ... EIR_Manufacturer_Specific_Data.register_magic_payload(conf.raw_layer) ... except TypeError: ... pass ... else: ... assert False, "expected exception" ... ###(039)=[passed] Parse EIR_ServiceData16BitUUID >>> d = hex_bytes("043e1902010001abcdef7da97f0d020102030350fe051650fee6c2ac") >>> p = HCI_Hdr(d) >>> >>> p.show() ###[ HCI header ]### type = Event ###[ HCI Event header ]### code = 0x3e len = 25 ###[ HCI_LE_Meta ]### event = advertising_report ###[ Advertising Reports ]### len = 1 \reports \ |###[ Advertising Report ]### | type = conn_und | atype = random | addr = 7f:a9:7d:ef:cd:ab | len = 13 | \data \ | |###[ EIR Header ]### | | len = 2 | | type = flags | |###[ Flags ]### | | flags = general_disc_mode | |###[ EIR Header ]### | | len = 3 | | type = complete_list_16_bit_svc_uuids | |###[ Complete list of 16-bit service UUIDs ]### | | svc_uuids = [0xfe50] | |###[ EIR Header ]### | | len = 5 | | type = svc_data_16_bit_uuid | |###[ EIR Service Data - 16-bit UUID ]### | | svc_uuid = 0xfe50 | |###[ Raw ]### | | load = b'\xe6\xc2' | rssi = -84 >>> assert p[EIR_CompleteList16BitServiceUUIDs].svc_uuids == [0xfe50] >>> assert p[EIR_ServiceData16BitUUID].svc_uuid == 0xfe50 >>> assert raw(p[EIR_ServiceData16BitUUID].payload) == hex_bytes("e6c2") ###(040)=[passed] Basic L2CAP dissect >>> a = L2CAP_Hdr(b'\x08\x00\x06\x00\t\x00\xf6\xe5\xd4\xc3\xb2\xa1') >>> assert a[SM_Identity_Address_Information].address == 'a1:b2:c3:d4:e5:f6' >>> assert a[SM_Identity_Address_Information].atype == 0 >>> a.show() ###[ L2CAP header ]### len = 8 cid = 6 ###[ SM header ]### sm_command= 9 ###[ Identity Address Information ]### atype = public address = a1:b2:c3:d4:e5:f6 ###(041)=[passed] Basic HCI_ACL_Hdr build & dissect >>> a = HCI_Hdr()/HCI_ACL_Hdr(handle=0xf4c, PB=2, BC=2, len=20)/L2CAP_Hdr(len=16)/L2CAP_CmdHdr(code=8, len=12)/L2CAP_EchoReq(data="AAAAAAAAAAAA") >>> assert raw(a) == b'\x02L\xaf\x14\x00\x10\x00\x05\x00\x08\x00\x0c\x00AAAAAAAAAAAA' >>> b = HCI_Hdr(raw(a)) >>> assert a == b ###(042)=[passed] Complex HCI - L2CAP build >>> a = HCI_Hdr()/HCI_ACL_Hdr()/L2CAP_Hdr()/L2CAP_CmdHdr()/L2CAP_ConnReq(scid=1) >>> assert raw(a) == b'\x02\x00\x00\x0c\x00\x08\x00\x05\x00\x02\x00\x04\x00\x00\x00\x01\x00' >>> a.show() ###[ HCI header ]### type = ACL Data ###[ HCI ACL header ]### BC = 0 PB = 0 handle = 0 len = None ###[ L2CAP header ]### len = None cid = 5 ###[ L2CAP command header ]### code = conn_req id = 0 len = None ###[ L2CAP Conn Req ]### psm = 0 scid = 1 ###(043)=[passed] Complex HCI - L2CAP dissect >>> a = HCI_Hdr(b'\x02\x00\x00\x11\x00\r\x00\x05\x00\x0b\x00\t\x00\x01\x00\x00\x00debug') >>> assert a[L2CAP_InfoResp].result == 0 >>> assert a[L2CAP_InfoResp].data == b"debug" ###(044)=[passed] HCI - L2CAP Echo test >>> rq = HCI_Hdr()/HCI_ACL_Hdr()/L2CAP_Hdr()/L2CAP_CmdHdr()/L2CAP_EchoReq(data=b"data") >>> assert bytes(rq) == b'\x02\x00\x00\x0c\x00\x08\x00\x05\x00\x08\x00\x04\x00data' >>> >>> rsp = HCI_Hdr()/HCI_ACL_Hdr()/L2CAP_Hdr()/L2CAP_CmdHdr()/L2CAP_EchoResp(data=b"data") >>> assert bytes(rsp) == b'\x02\x00\x00\x0c\x00\x08\x00\x05\x00\t\x00\x04\x00data' >>> assert rsp.answers(rq) ###(045)=[passed] HCI - L2CAP Create Channel request >>> p = HCI_Hdr()/HCI_ACL_Hdr()/L2CAP_Hdr()/L2CAP_CmdHdr()/L2CAP_Create_Channel_Request(psm="SDP") >>> assert bytes(p) == b'\x02\x00\x00\r\x00\t\x00\x05\x00\x0c\x00\x05\x00\x01\x00\x00\x00\x00' >>> >>> p = HCI_Hdr(bytes(p)) >>> assert p[L2CAP_Create_Channel_Request].psm == 1 ###(046)=[passed] L2CAP Conn Answers >>> a = HCI_Hdr(b'\x02\x00\x00\x0c\x00\x08\x00\x05\x00\x02\x00\x04\x00\x00\x00\x9a;') >>> b = HCI_Hdr(b'\x02\x00\x00\x10\x00\x0c\x00\x05\x00\x03\x00\x08\x00\xff\xff\x9a;\x00\x00\x01\x00') >>> assert b.answers(a) >>> assert not a.answers(b) >>> >>> a = HCI_Hdr(b'\x02\x00\x00\x0c\x00\x08\x00\x05\x00\x04\x00\x04\x00\x15\x00\x00\x00') >>> b = HCI_Hdr(b'\x02\x00\x00\x0e\x00\n\x00\x05\x00\x05\x00\x06\x00\x15\x00\x00\x00\x02\x00') >>> assert b.answers(a) >>> assert not a.answers(b) ###(047)=[passed] EIR_Hdr - HCI_LE_Meta_Advertising_Report (single report) >>> a = HCI_Hdr()/HCI_Event_Hdr()/HCI_Event_LE_Meta()/HCI_LE_Meta_Advertising_Reports(reports=[ ... HCI_LE_Meta_Advertising_Report( ... addr="a1:b2:c3:d4:e5:f6", ... data=[ ... EIR_Hdr()/EIR_Flags(flags=['br_edr_not_supported']), ... EIR_Hdr()/EIR_CompleteLocalName(local_name="scapy"), ... ] ... ) ... ]) >>> assert raw(a) == b'\x04>\x16\x02\x01\x00\x00\xf6\xe5\xd4\xc3\xb2\xa1\n\x02\x01\x04\x06\tscapy\x00' >>> b = HCI_Hdr(raw(a)) >>> b.show() ###[ HCI header ]### type = Event ###[ HCI Event header ]### code = 0x3e len = 22 ###[ HCI_LE_Meta ]### event = advertising_report ###[ Advertising Reports ]### len = 1 \reports \ |###[ Advertising Report ]### | type = conn_und | atype = public | addr = a1:b2:c3:d4:e5:f6 | len = 10 | \data \ | |###[ EIR Header ]### | | len = 2 | | type = flags | |###[ Flags ]### | | flags = br_edr_not_supported | |###[ EIR Header ]### | | len = 6 | | type = complete_local_name | |###[ Complete Local Name ]### | | local_name= b'scapy' | rssi = 0 >>> assert b[HCI_Event_Hdr].len > 0 >>> assert b[EIR_CompleteLocalName].local_name == b"scapy" >>> assert b[HCI_LE_Meta_Advertising_Report].addr == "a1:b2:c3:d4:e5:f6" >>> >>> assert a.summary() == "HCI Event / HCI_Event_Hdr / HCI_Event_LE_Meta / HCI_LE_Meta_Advertising_Reports" ###(048)=[passed] EIR_Hdr - HCI_LE_Meta_Advertising_Report (duplicate reports) >>> a = HCI_Hdr()/HCI_Event_Hdr()/HCI_Event_LE_Meta()/HCI_LE_Meta_Advertising_Reports(reports=[ ... HCI_LE_Meta_Advertising_Report( ... addr="a1:b2:c3:d4:e5:f6", ... data=[ ... EIR_Hdr()/EIR_Flags(flags=['br_edr_not_supported']), ... EIR_Hdr()/EIR_CompleteLocalName(local_name="scapy"), ... ] ... ), ... HCI_LE_Meta_Advertising_Report( ... type=4, # Scan Response ... addr="a1:b2:c3:d4:e5:f6", ... data=[ ... EIR_Hdr()/EIR_Manufacturer_Specific_Data( ... company_id=0xffff, ... )/Raw(b"ypacs"), ... EIR_Hdr()/EIR_TX_Power_Level(level=10), ... EIR_Hdr()/EIR_CompleteList128BitServiceUUIDs(svc_uuids=[ ... "01234567-89ab-cdef-1023-456789abcdfe", ... ]) ... ] ... ) ... ]) >>> assert raw(a) == b'\x04>>\x02\x02\x00\x00\xf6\xe5\xd4\xc3\xb2\xa1\n\x02\x01\x04\x06\tscapy\x00\x04\x00\xf6\xe5\xd4\xc3\xb2\xa1\x1e\x08\xff\xff\xffypacs\x02\n\n\x11\x07\xfe\xcd\xab\x89gE#\x10\xef\xcd\xab\x89gE#\x01\x00' >>> >>> b = HCI_Hdr(raw(a)) >>> b.show() ###[ HCI header ]### type = Event ###[ HCI Event header ]### code = 0x3e len = 62 ###[ HCI_LE_Meta ]### event = advertising_report ###[ Advertising Reports ]### len = 2 \reports \ |###[ Advertising Report ]### | type = conn_und | atype = public | addr = a1:b2:c3:d4:e5:f6 | len = 10 | \data \ | |###[ EIR Header ]### | | len = 2 | | type = flags | |###[ Flags ]### | | flags = br_edr_not_supported | |###[ EIR Header ]### | | len = 6 | | type = complete_local_name | |###[ Complete Local Name ]### | | local_name= b'scapy' | rssi = 0 |###[ Advertising Report ]### | type = scan_rsp | atype = public | addr = a1:b2:c3:d4:e5:f6 | len = 30 | \data \ | |###[ EIR Header ]### | | len = 8 | | type = mfg_specific_data | |###[ EIR Manufacturer Specific Data ]### | | company_id= 0xffff | |###[ Raw ]### | | load = b'ypacs' | |###[ EIR Header ]### | | len = 2 | | type = tx_power_level | |###[ TX Power Level ]### | | level = 10 | |###[ EIR Header ]### | | len = 17 | | type = complete_list_128_bit_svc_uuids | |###[ Complete list of 128-bit service UUIDs ]### | | svc_uuids = [UUID('01234567-89ab-cdef-1023-456789abcdfe')] | rssi = 0 >>> assert b[HCI_Event_Hdr].len > 0 >>> assert b[EIR_CompleteLocalName].local_name == b"scapy" >>> assert b[HCI_LE_Meta_Advertising_Report].addr == "a1:b2:c3:d4:e5:f6" >>> assert b[EIR_Manufacturer_Specific_Data].company_id == 0xffff >>> assert raw(b[EIR_Manufacturer_Specific_Data].payload) == b"ypacs" >>> assert b[EIR_TX_Power_Level].level == 10 >>> assert b[EIR_CompleteList128BitServiceUUIDs].svc_uuids[0] == UUID("01234567-89ab-cdef-1023-456789abcdfe") >>> >>> assert a.summary() == "HCI Event / HCI_Event_Hdr / HCI_Event_LE_Meta / HCI_LE_Meta_Advertising_Reports" ###(049)=[passed] ATT_Hdr - misc >>> a = HCI_Hdr()/HCI_ACL_Hdr()/L2CAP_Hdr()/ATT_Hdr()/ATT_Read_By_Type_Request_128bit(uuid1=0xa14, uuid2=0xa24) >>> a = HCI_Hdr(raw(a)) >>> a.show() ###[ HCI header ]### type = ACL Data ###[ HCI ACL header ]### BC = 0 PB = 0 handle = 0 len = 25 ###[ L2CAP header ]### len = 21 cid = attribute ###[ ATT header ]### opcode = 0x8 ###[ Read By Type Request ]### start = 0x1 end = 0xffff uuid1 = 0xa14 uuid2 = 0xa24 >>> a.mysummary() 'HCI ACL Data' >>> assert ATT_Read_By_Type_Request_128bit in a >>> assert not Raw in a >>> >>> b = HCI_Hdr()/HCI_ACL_Hdr()/L2CAP_Hdr()/ATT_Hdr()/ATT_Read_By_Type_Request(uuid=0xa14) >>> b = HCI_Hdr(raw(b)) >>> b.show() ###[ HCI header ]### type = ACL Data ###[ HCI ACL header ]### BC = 0 PB = 0 handle = 0 len = 11 ###[ L2CAP header ]### len = 7 cid = attribute ###[ ATT header ]### opcode = 0x8 ###[ Read By Type Request ]### start = 0x1 end = 0xffff uuid = 0xa14 >>> b.mysummary() 'HCI ACL Data' >>> assert ATT_Read_By_Type_Request in b >>> assert not Raw in b ###(050)=[passed] ATT Read_By_Type_Response >>> pkt = HCI_Hdr(hex_bytes('0248201b001700040009070200020300002a0400020500012a0600020700042a')) >>> >>> assert pkt[ATT_Read_By_Type_Response].len == 7 >>> assert len(pkt.handles) == 3 >>> assert pkt.handles[0].handle == 0x2 >>> assert pkt.handles[1].handle == 0x4 >>> assert pkt.handles[2].handle == 0x6 >>> >>> pkt.handles[0].value == b'\x02\x03\x00\x00*' True >>> pkt.handles[1].value == b'\x02\x05\x00\x01*' True >>> pkt.handles[2].value == b'\x02\x07\x00\x04*' True ###(051)=[passed] SM_Public_Key() tests >>> r = raw(SM_Hdr()/SM_Public_Key(key_x="sca", key_y="py")) >>> assert r == b'\x0csca\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00py\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> p = SM_Hdr(r) >>> assert SM_Public_Key in p and p.key_x[:3] == b"sca" and p.key_y[:2] == b"py" ###(052)=[passed] SM_DHKey_Check() tests >>> r = raw(SM_Hdr()/SM_DHKey_Check(dhkey_check="scapy")) >>> assert r == b'\rscapy\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> p = SM_Hdr(r) >>> assert SM_DHKey_Check in p and p.dhkey_check[:5] == b"scapy" ###### ## HCIMon tests ###### ###(053)=[passed] HCI_Mon - Bluetooth Monitor Pcap Header >>> p = HCI_Mon_Pcap_Hdr(hex_bytes("00000008")) >>> assert HCI_Mon_Pcap_Hdr in p >>> assert p[HCI_Mon_Pcap_Hdr].adapter_id == 0 >>> assert p[HCI_Mon_Pcap_Hdr].opcode == 8 ###(054)=[passed] HCI_Mon - Bluetooth Monitor HCI_Mon_New_Index >>> p = HCI_Mon_Pcap_Hdr(hex_bytes("0000000000030000109a81206863693000000000")) >>> assert HCI_Mon_New_Index in p >>> assert p[HCI_Mon_New_Index].bus == 0 >>> assert p[HCI_Mon_New_Index].type == 3 >>> assert p[HCI_Mon_New_Index].addr == '20:81:9a:10:00:00' >>> assert p[HCI_Mon_New_Index].devname.decode('utf-8').rstrip('\x00') == 'hci0' ###(055)=[passed] HCI_Mon - Bluetooth Monitor HCI_Mon_Delete_Index >>> p = HCI_Mon_Pcap_Hdr(hex_bytes("00000001")) >>> assert HCI_Mon_Pcap_Hdr in p >>> assert p[HCI_Mon_Pcap_Hdr].opcode == 1 ###(056)=[passed] HCI_Mon - Bluetooth Monitor HCI_Mon_Index_Info >>> p = HCI_Mon_Pcap_Hdr(hex_bytes("0000000a0000109a81203101")) >>> assert HCI_Mon_Index_Info in p >>> assert p[HCI_Mon_Index_Info].addr == '20:81:9a:10:00:00' >>> assert p[HCI_Mon_Index_Info].manufacturer == 0x131 ###(057)=[passed] HCI_Mon - Bluetooth Monitor HCI_Mon_System_Note >>> p = HCI_Mon_Pcap_Hdr(hex_bytes("ffff000c426c7565746f6f74682073756273797374656d2076657273696f6e20322e323200")) >>> assert HCI_Mon_System_Note in p >>> assert p[HCI_Mon_System_Note].note == b'Bluetooth subsystem version 2.22' Regression tests for the bluetooth4LE layer ━ Run at 01:42:07 from [test/scapy/layers/bluetooth4LE.uts] by UTscapy in 0.20473718643188477 └ Passed=37 └ Failed=0 ###### ## BTLE tests ###### ###(000)=[passed] Default build >>> a = BTLE()/BTLE_ADV()/BTLE_ADV_IND() >>> assert raw(a) == b'\xd6\xbe\x89\x8e\x00\x06\x00\x00\x00\x00\x00\x00Z9`' ###(001)=[passed] Basic dissection >>> b = BTLE(raw(a)) >>> assert b.crc == 0x5a3960 >>> assert b[BTLE_ADV_IND].AdvA == '00:00:00:00:00:00' ###(002)=[passed] BTLE_DATA build >>> a = BTLE(access_addr=0)/BTLE_DATA()/"toto" >>> a = BTLE(raw(a)) >>> assert a[BTLE_DATA].len == 4 >>> assert a[Raw].load == b"toto" ###(003)=[passed] Longer BTLE_ADV >>> a = BTLE()/BTLE_ADV()/BTLE_CONNECT_REQ()/(b"X"*200) >>> assert raw(a) == b'\xd6\xbe\x89\x8e\x05\xea\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXI\xfc\xcf' >>> pkt = BTLE(raw(a)) >>> assert pkt.Length == 0xea >>> assert pkt.load == b"X" * 200 ###(004)=[passed] BTLE_DATA + EIR_ShortenedLocalName >>> test1 = BTLE() / BTLE_ADV() / BTLE_ADV_IND() / EIR_Hdr() / EIR_ShortenedLocalName(local_name= 'wussa') >>> test1e = BTLE(raw(test1)) >>> assert test1e[EIR_ShortenedLocalName].local_name == b"wussa" ###(005)=[passed] LL_CONNECTION_UPDATE_IND >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CONNECTION_UPDATE_IND(win_size=2, win_offset=5, interval=0x400, timeout=500, instant=0xFEFE) >>> test = BTLE(raw(test)) >>> assert test[LL_CONNECTION_UPDATE_IND].win_size == 2 >>> assert test[LL_CONNECTION_UPDATE_IND].win_offset == 5 >>> assert test[LL_CONNECTION_UPDATE_IND].interval == 0x400 >>> assert test[LL_CONNECTION_UPDATE_IND].timeout == 500 >>> assert test[LL_CONNECTION_UPDATE_IND].instant == 0xFEFE ###(006)=[passed] LL_CHANNEL_MAP_IND >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CHANNEL_MAP_IND(chM=0x1A1B1C1D1E, instant=0xFEFE) >>> test = BTLE(raw(test)) >>> assert test[LL_CHANNEL_MAP_IND].chM == 0x1A1B1C1D1E >>> assert test[LL_CHANNEL_MAP_IND].instant == 0xFEFE ###(007)=[passed] LL_TERMINATE_IND >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_TERMINATE_IND(code=0x16) >>> test = BTLE(raw(test)) >>> assert test[LL_TERMINATE_IND].code == 0x16 ###(008)=[passed] LL_ENC_REQ >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_ENC_REQ(rand=0x1112131415161718, ediv=0x4321, ... skdm=0x1817161514131211, ivm=0x87654321) >>> test = BTLE(raw(test)) >>> assert test[LL_ENC_REQ].rand == 0x1112131415161718 >>> assert test[LL_ENC_REQ].ediv == 0x4321 >>> assert test[LL_ENC_REQ].skdm == 0x1817161514131211 >>> assert test[LL_ENC_REQ].ivm == 0x87654321 ###(009)=[passed] LL_ENC_RSP >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_ENC_RSP(skds=0x1817161514131211, ivs=0x87654321) >>> test = BTLE(raw(test)) >>> assert test[LL_ENC_RSP].skds == 0x1817161514131211 >>> assert test[LL_ENC_RSP].ivs == 0x87654321 ###(010)=[passed] LL_START_ENC_REQ >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_START_ENC_REQ() >>> test = BTLE(raw(test)) >>> assert test[BTLE_CTRL].opcode == 5 ###(011)=[passed] LL_START_ENC_RSP >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_START_ENC_RSP() >>> test = BTLE(raw(test)) >>> assert test[BTLE_CTRL].opcode == 6 ###(012)=[passed] LL_UNKNOWN_RSP >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_UNKNOWN_RSP(code=4) >>> test = BTLE(raw(test)) >>> assert test[LL_UNKNOWN_RSP].code == 4 ###(013)=[passed] LL_FEATURE_REQ >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_FEATURE_REQ(feature_set=0x011234) >>> test = BTLE(raw(test)) >>> assert test[LL_FEATURE_REQ].feature_set == \ ... "ext_reject_ind+le_ping+le_data_len_ext+tx_mod_idx+le_ext_adv+conn_cte_req" ###(014)=[passed] LL_FEATURE_RSP >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_FEATURE_RSP(feature_set=0x104321) >>> test = BTLE(raw(test)) >>> print(test[LL_FEATURE_RSP].feature_set) le_encryption+le_data_len_ext+le_2m_phy+tx_mod_idx+ch_sel_alg+antenna_switching_cte_aod_tx >>> assert test[LL_FEATURE_RSP].feature_set == \ ... "le_encryption+le_data_len_ext+le_2m_phy+tx_mod_idx+ch_sel_alg+antenna_switching_cte_aod_tx" ###(015)=[passed] LL_PAUSE_ENC_REQ >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_PAUSE_ENC_REQ() >>> test = BTLE(raw(test)) >>> assert test[BTLE_CTRL].opcode == 10 ###(016)=[passed] LL_PAUSE_ENC_RSP >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_PAUSE_ENC_RSP() >>> test = BTLE(raw(test)) >>> assert test[BTLE_CTRL].opcode == 11 ###(017)=[passed] LL_VERSION_IND >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_VERSION_IND(version=7, company=0x59, subversion=1) >>> test = BTLE(raw(test)) >>> assert test[LL_VERSION_IND].version == 7 >>> assert test[LL_VERSION_IND].company == 0x59 >>> assert test[LL_VERSION_IND].subversion == 1 ###(018)=[passed] LL_REJECT_IND >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_REJECT_IND(code=4) >>> test = BTLE(raw(test)) >>> assert test[LL_REJECT_IND].code == 4 ###(019)=[passed] LL_SLAVE_FEATURE_REQ >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_SLAVE_FEATURE_REQ(feature_set=0x1234) >>> test = BTLE(raw(test)) >>> assert test[LL_SLAVE_FEATURE_REQ].feature_set == \ ... "ext_reject_ind+le_ping+le_data_len_ext+tx_mod_idx+le_ext_adv" ###(020)=[passed] LL_CONNECTION_PARAM_REQ >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CONNECTION_PARAM_REQ(interval_min=10, interval_max=12, latency=1, timeout=2, ... preferred_periodicity=3, reference_conn_evt_count=4, ... offset0=5, offset1=6, offset2=7, offset3=8, offset4=9, offset5=10) >>> test = BTLE(raw(test)) >>> assert test[LL_CONNECTION_PARAM_REQ].interval_min == 10 >>> assert test[LL_CONNECTION_PARAM_REQ].interval_max == 12 >>> assert test[LL_CONNECTION_PARAM_REQ].latency == 1 >>> assert test[LL_CONNECTION_PARAM_REQ].timeout == 2 >>> assert test[LL_CONNECTION_PARAM_REQ].preferred_periodicity == 3 >>> assert test[LL_CONNECTION_PARAM_REQ].reference_conn_evt_count == 4 >>> assert test[LL_CONNECTION_PARAM_REQ].offset0 == 5 >>> assert test[LL_CONNECTION_PARAM_REQ].offset1 == 6 >>> assert test[LL_CONNECTION_PARAM_REQ].offset2 == 7 >>> assert test[LL_CONNECTION_PARAM_REQ].offset3 == 8 >>> assert test[LL_CONNECTION_PARAM_REQ].offset4 == 9 >>> assert test[LL_CONNECTION_PARAM_REQ].offset5 == 10 ###(021)=[passed] LL_CONNECTION_PARAM_RSP >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CONNECTION_PARAM_RSP(interval_min=10, interval_max=12, latency=1, timeout=2, ... preferred_periodicity=3, reference_conn_evt_count=4, ... offset0=5, offset1=6, offset2=7, offset3=8, offset4=9, offset5=10) >>> test = BTLE(raw(test)) >>> assert test[LL_CONNECTION_PARAM_RSP].interval_min == 10 >>> assert test[LL_CONNECTION_PARAM_RSP].interval_max == 12 >>> assert test[LL_CONNECTION_PARAM_RSP].latency == 1 >>> assert test[LL_CONNECTION_PARAM_RSP].timeout == 2 >>> assert test[LL_CONNECTION_PARAM_RSP].preferred_periodicity == 3 >>> assert test[LL_CONNECTION_PARAM_RSP].reference_conn_evt_count == 4 >>> assert test[LL_CONNECTION_PARAM_RSP].offset0 == 5 >>> assert test[LL_CONNECTION_PARAM_RSP].offset1 == 6 >>> assert test[LL_CONNECTION_PARAM_RSP].offset2 == 7 >>> assert test[LL_CONNECTION_PARAM_RSP].offset3 == 8 >>> assert test[LL_CONNECTION_PARAM_RSP].offset4 == 9 >>> assert test[LL_CONNECTION_PARAM_RSP].offset5 == 10 ###(022)=[passed] LL_REJECT_EXT_IND >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_REJECT_EXT_IND(reject_opcode=2, error_code=4) >>> test = BTLE(raw(test)) >>> assert test[LL_REJECT_EXT_IND].reject_opcode == 2 >>> assert test[LL_REJECT_EXT_IND].error_code == 4 ###(023)=[passed] LL_PING_REQ >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_PING_REQ() >>> test = BTLE(raw(test)) >>> assert test[BTLE_CTRL].opcode == 18 ###(024)=[passed] LL_PING_RSP >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / LL_PING_RSP() >>> test = BTLE(raw(test)) >>> assert test[BTLE_CTRL].opcode == 19 ###(025)=[passed] LL_LENGTH_REQ >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_LENGTH_REQ(max_rx_bytes=28, max_rx_time=329, max_tx_bytes=29, max_tx_time=330) >>> test = BTLE(raw(test)) >>> assert test[LL_LENGTH_REQ].max_rx_bytes == 28 >>> assert test[LL_LENGTH_REQ].max_rx_time == 329 >>> assert test[LL_LENGTH_REQ].max_tx_bytes == 29 >>> assert test[LL_LENGTH_REQ].max_tx_time == 330 ###(026)=[passed] LL_LENGTH_RSP >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_LENGTH_RSP(max_tx_bytes=28, max_tx_time=329, max_rx_bytes=29, max_rx_time=330) >>> test = BTLE(raw(test)) >>> assert test[LL_LENGTH_RSP].max_tx_bytes == 28 >>> assert test[LL_LENGTH_RSP].max_tx_time == 329 >>> assert test[LL_LENGTH_RSP].max_rx_bytes == 29 >>> assert test[LL_LENGTH_RSP].max_rx_time == 330 ###(027)=[passed] LL_PHY_REQ >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_PHY_REQ(tx_phys="phy_1m+phy_2m", rx_phys="phy_coded") >>> test = BTLE(raw(test)) >>> assert test[LL_PHY_REQ].tx_phys == "phy_1m+phy_2m" >>> assert test[LL_PHY_REQ].rx_phys == "phy_coded" ###(028)=[passed] LL_PHY_RSP >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_PHY_RSP(tx_phys="phy_1m+phy_2m", rx_phys="phy_coded") >>> test = BTLE(raw(test)) >>> assert test[LL_PHY_RSP].tx_phys == "phy_1m+phy_2m" >>> assert test[LL_PHY_RSP].rx_phys == "phy_coded" ###(029)=[passed] LL_PHY_UPDATE_IND >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_PHY_UPDATE_IND(tx_phy="phy_2m", rx_phy="phy_coded", instant=1234) >>> test = BTLE(raw(test)) >>> assert test[LL_PHY_UPDATE_IND].tx_phy == "phy_2m" >>> assert test[LL_PHY_UPDATE_IND].rx_phy == "phy_coded" >>> assert test[LL_PHY_UPDATE_IND].instant == 1234 >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_MIN_USED_CHANNELS_IND(phys="phy_1m+phy_2m", min_used_channels=3) >>> test = BTLE(raw(test)) >>> assert test[LL_MIN_USED_CHANNELS_IND].phys == "phy_1m+phy_2m" >>> assert test[LL_MIN_USED_CHANNELS_IND].min_used_channels == 3 >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CTE_REQ(min_cte_len_req=20, rfu=1, cte_type_req=2) >>> test = BTLE(raw(test)) >>> assert test[LL_CTE_REQ].min_cte_len_req == 20 >>> assert test[LL_CTE_REQ].rfu == 1 >>> assert test[LL_CTE_REQ].cte_type_req == 2 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CTE_RSP() >>> test = BTLE(raw(test)) >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_PERIODIC_SYNC_IND(id=2, ... sync_info=12345, ... conn_event_count=0x4321, ... last_pa_event_counter=0xabcd, sid=0xF, ... a_type=1, sca=3, phy=2, AdvA="cc:bb:bb:bb:bb:bb", ... sync_conn_event_count=32) >>> test = BTLE(raw(test)) >>> assert test[LL_PERIODIC_SYNC_IND].id == 2 >>> assert test[LL_PERIODIC_SYNC_IND].sync_info == 12345 >>> assert test[LL_PERIODIC_SYNC_IND].conn_event_count == 0x4321 >>> assert test[LL_PERIODIC_SYNC_IND].last_pa_event_counter == 0xabcd >>> assert test[LL_PERIODIC_SYNC_IND].sid == 0xF >>> assert test[LL_PERIODIC_SYNC_IND].a_type == 1 >>> assert test[LL_PERIODIC_SYNC_IND].sca == 3 >>> assert test[LL_PERIODIC_SYNC_IND].phy == 2 >>> assert test[LL_PERIODIC_SYNC_IND].AdvA == "cc:bb:bb:bb:bb:bb" >>> assert test[LL_PERIODIC_SYNC_IND].sync_conn_event_count == 32 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CLOCK_ACCURACY_REQ(sca=2) >>> test = BTLE(raw(test)) >>> assert test[LL_CLOCK_ACCURACY_REQ].sca == 2 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CLOCK_ACCURACY_RSP(sca=3) >>> test = BTLE(raw(test)) >>> assert test[LL_CLOCK_ACCURACY_RSP].sca == 3 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CIS_REQ(cig_id=3, cis_id=2, phy_c_to_p=1, phy_p_to_c=2, ... max_sdu_c_to_p=123, max_sdu_p_to_c=321, ... sdu_interval_c_to_p=234, framed=1, sdu_interval_p_to_c=432, ... max_pdu_c_to_p=123, max_pdu_p_to_c=234, ... nse=10, subinterval=4567, ... bn_c_to_p=3, bn_p_to_c=2, ... ft_c_to_p=15, ft_p_to_c=16, ... iso_interval=12345, ... cis_offset_min=1, cis_offset_max=999, ... conn_event_count=2) >>> test = BTLE(raw(test)) >>> assert test[LL_CIS_REQ].cig_id == 3 >>> assert test[LL_CIS_REQ].cis_id == 2 >>> assert test[LL_CIS_REQ].phy_c_to_p == 1 >>> assert test[LL_CIS_REQ].phy_p_to_c == 2 >>> assert test[LL_CIS_REQ].max_sdu_c_to_p == 123 >>> assert test[LL_CIS_REQ].framed == 1 >>> assert test[LL_CIS_REQ].max_sdu_p_to_c == 321 >>> assert test[LL_CIS_REQ].sdu_interval_c_to_p == 234 >>> assert test[LL_CIS_REQ].sdu_interval_p_to_c == 432 >>> assert test[LL_CIS_REQ].max_pdu_c_to_p == 123 >>> assert test[LL_CIS_REQ].max_pdu_p_to_c == 234 >>> assert test[LL_CIS_REQ].nse == 10 >>> assert test[LL_CIS_REQ].subinterval == 4567 >>> assert test[LL_CIS_REQ].bn_c_to_p == 3 >>> assert test[LL_CIS_REQ].bn_p_to_c == 2 >>> assert test[LL_CIS_REQ].ft_c_to_p == 15 >>> assert test[LL_CIS_REQ].ft_p_to_c == 16 >>> assert test[LL_CIS_REQ].iso_interval == 12345 >>> assert test[LL_CIS_REQ].cis_offset_min == 1 >>> assert test[LL_CIS_REQ].cis_offset_max == 999 >>> assert test[LL_CIS_REQ].conn_event_count == 2 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CIS_RSP(cis_offset_min=1, cis_offset_max=999, conn_event_count=400) >>> test = BTLE(raw(test)) >>> assert test[LL_CIS_RSP].cis_offset_min == 1 >>> assert test[LL_CIS_RSP].cis_offset_max == 999 >>> assert test[LL_CIS_RSP].conn_event_count == 400 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CIS_IND(AA=0x12345678, cis_offset=1, ... cig_sync_delay=999, cis_sync_delay=400, conn_event_count=300) >>> test = BTLE(raw(test)) >>> assert test[LL_CIS_IND].AA == 0x12345678 >>> assert test[LL_CIS_IND].cis_offset == 1 >>> assert test[LL_CIS_IND].cig_sync_delay == 999 >>> assert test[LL_CIS_IND].cis_sync_delay == 400 >>> assert test[LL_CIS_IND].conn_event_count == 300 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CIS_TERMINATE_IND(cig_id=33, cis_id=44, error_code=55) >>> test = BTLE(raw(test)) >>> assert test[LL_CIS_TERMINATE_IND].cig_id == 33 >>> assert test[LL_CIS_TERMINATE_IND].cis_id == 44 >>> assert test[LL_CIS_TERMINATE_IND].error_code == 55 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_POWER_CONTROL_REQ(phy=3, delta=-34, tx_power=55) >>> test = BTLE(raw(test)) >>> assert test[LL_POWER_CONTROL_REQ].phy == 3 >>> assert test[LL_POWER_CONTROL_REQ].delta == -34 >>> assert test[LL_POWER_CONTROL_REQ].tx_power == 55 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_POWER_CONTROL_RSP(min=0, max=1, delta=-34, tx_power=55, apr=4) >>> test = BTLE(raw(test)) >>> assert test[LL_POWER_CONTROL_RSP].min == 0 >>> assert test[LL_POWER_CONTROL_RSP].max == 1 >>> assert test[LL_POWER_CONTROL_RSP].delta == -34 >>> assert test[LL_POWER_CONTROL_RSP].tx_power == 55 >>> assert test[LL_POWER_CONTROL_RSP].apr == 4 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_POWER_CHANGE_IND(phy=3, min=0, max=1, delta=-34, tx_power=55) >>> test = BTLE(raw(test)) >>> assert test[LL_POWER_CHANGE_IND].phy == 3 >>> assert test[LL_POWER_CHANGE_IND].min == 0 >>> assert test[LL_POWER_CHANGE_IND].max == 1 >>> assert test[LL_POWER_CHANGE_IND].delta == -34 >>> assert test[LL_POWER_CHANGE_IND].tx_power == 55 >>> >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_SUBRATE_REQ(subrate_factor_min=3, subrate_factor_max=0, ... max_latency=1, continuation_number=123, timeout=55) >>> test = BTLE(raw(test)) >>> assert test[LL_SUBRATE_REQ].subrate_factor_min == 3 >>> assert test[LL_SUBRATE_REQ].subrate_factor_max == 0 >>> assert test[LL_SUBRATE_REQ].max_latency == 1 >>> assert test[LL_SUBRATE_REQ].continuation_number == 123 >>> assert test[LL_SUBRATE_REQ].timeout == 55 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_SUBRATE_IND(subrate_factor=3, subrate_base_event=0, ... latency=1, continuation_number=123, timeout=55) >>> test = BTLE(raw(test)) >>> assert test[LL_SUBRATE_IND].subrate_factor == 3 >>> assert test[LL_SUBRATE_IND].subrate_base_event == 0 >>> assert test[LL_SUBRATE_IND].latency == 1 >>> assert test[LL_SUBRATE_IND].continuation_number == 123 >>> assert test[LL_SUBRATE_IND].timeout == 55 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CHANNEL_REPORTING_IND(enable=1, min_spacing=123, max_delay=124) >>> test = BTLE(raw(test)) >>> assert test[LL_CHANNEL_REPORTING_IND].enable == 1 >>> assert test[LL_CHANNEL_REPORTING_IND].min_spacing == 123 >>> assert test[LL_CHANNEL_REPORTING_IND].max_delay == 124 >>> >>> >>> >>> test = BTLE(access_addr=1) / BTLE_DATA() / BTLE_CTRL() / \ ... LL_CHANNEL_STATUS_IND(channel_classification=123456789012345) >>> test = BTLE(raw(test)) >>> assert test[LL_CHANNEL_STATUS_IND].channel_classification == 123456789012345 ###(030)=[passed] BTLE_DATA + BTLE_EMPTY_PDU >>> test = BTLE(access_addr=1)/BTLE_DATA(LLID=1, len=0)/BTLE_EMPTY_PDU() >>> a = BTLE(raw(test)) >>> print(dir(a)) ['_PickleType', '__all_slots__', '__bool__', '__bytes__', '__class__', '__class_getitem__', '__contains__', '__deepcopy__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__div__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__iterlen__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__new__', '__nonzero__', '__orig_bases__', '__parameters__', '__rdiv__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__rtruediv__', '__setattr__', '__setitem__', '__setstate__', '__signature__', '__sizeof__', '__slots__', '__static_attributes__', '__str__', '__subclasshook__', '__truediv__', '__weakref__', '_answered', '_command', '_do_summary', '_name', '_overload_fields', '_pkt', '_raw_packet_cache_field_value', '_resolve_alias', '_show_or_dump', '_superdir', 'access_addr', 'add_parent', 'add_payload', 'add_underlayer', 'aliastypes', 'answers', 'build', 'build_done', 'build_padding', 'build_ps', 'canvas_dump', 'class_default_fields', 'class_default_fields_ref', 'class_dont_cache', 'class_fieldtype', 'class_packetfields', 'clear_cache', 'clone_with', 'command', 'comment', 'compute_crc', 'copy', 'copy_field_value', 'copy_fields_dict', 'crc', 'decode_payload_as', 'default_fields', 'default_payload_class', 'delfieldval', 'deprecated_fields', 'direction', 'display', 'dissect', 'dissection_done', 'do_build', 'do_build_payload', 'do_build_ps', 'do_dissect', 'do_dissect_payload', 'do_init_cached_fields', 'do_init_fields', 'explicit', 'extract_padding', 'fields', 'fields_desc', 'fieldtype', 'firstlayer', 'fragment', 'from_hexcap', 'get_field', 'getfield_and_val', 'getfieldval', 'getlayer', 'guess_payload_class', 'hashret', 'haslayer', 'hide_defaults', 'init_fields', 'iterpayloads', 'json', 'lastlayer', 'layers', 'lower_bonds', 'match_subclass', 'mysummary', 'name', 'original', 'overload_fields', 'overloaded_fields', 'packetfields', 'parent', 'payload', 'payload_guess', 'pdfdump', 'post_build', 'post_dissect', 'post_dissection', 'post_transforms', 'pre_dissect', 'prepare_cached_fields', 'process_information', 'psdump', 'raw_packet_cache', 'raw_packet_cache_fields', 'remove_parent', 'remove_payload', 'remove_underlayer', 'route', 'self_build', 'sent_time', 'setfieldval', 'show', 'show2', 'show_indent', 'show_summary', 'sniffed_on', 'sprintf', 'stop_dissection_after', 'summary', 'svgdump', 'time', 'underlayer', 'upper_bonds', 'wirelen'] >>> print(a.layers) >> >>> print(a[BTLE_DATA].len, a[BTLE_DATA].LLID) 0 1 >>> assert a[BTLE_DATA].len == 0 ###(031)=[passed] BTLE_DATA + ATT_PrepareWriteReq >>> test3 = BTLE(access_addr=1) / BTLE_DATA() / L2CAP_Hdr() / ATT_Hdr() / ATT_Prepare_Write_Request(gatt_handle = 0xa, data="test") >>> test3e = BTLE(raw(test3)) >>> assert test3e[ATT_Prepare_Write_Request].data == b"test" >>> assert test3e[ATT_Prepare_Write_Request].gatt_handle == 0xa >>> assert test3e[ATT_Hdr].opcode == 0x16 ###(032)=[passed] BTLE layers >>> pkt = BTLE()/BTLE_ADV()/BTLE_ADV_DIRECT_IND()/BTLE_ADV_IND()/BTLE_ADV_NONCONN_IND()/BTLE_ADV_SCAN_IND()/BTLE_CONNECT_REQ()/BTLE_DATA()/BTLE_PPI()/BTLE_SCAN_REQ()/BTLE_SCAN_RSP() >>> assert BTLE in pkt.layers() >>> assert BTLE_ADV in pkt.layers() >>> assert BTLE_ADV_DIRECT_IND in pkt.layers() >>> assert BTLE_ADV_IND in pkt.layers() >>> assert BTLE_ADV_NONCONN_IND in pkt.layers() >>> assert BTLE_ADV_SCAN_IND in pkt.layers() >>> assert BTLE_CONNECT_REQ in pkt.layers() >>> assert BTLE_DATA in pkt.layers() >>> assert BTLE_PPI in pkt.layers() >>> assert BTLE_SCAN_REQ in pkt.layers() >>> assert BTLE_SCAN_RSP in pkt.layers() ###(033)=[passed] BTLE_RF link >>> a = BTLE_RF()/BTLE()/BTLE_ADV()/BTLE_SCAN_REQ() >>> a.ScanA = "aa:aa:aa:aa:aa:aa" >>> a.AdvA = "bb:bb:bb:bb:bb:bb" >>> a.reference_access_address_valid = 1 >>> a.reference_access_address = 0x8e89bed6 >>> a.phy = 3 >>> a.type = 5 >>> a.noise = -90 >>> a.signal = -75 >>> a.rf_channel = 6 >>> a.access_address_offenses = 10 >>> assert raw(a) == b'\x06\xb5\xa6\n\xd6\xbe\x89\x8e\x90\xc2\xd6\xbe\x89\x8e\x03\x0c\xaa\xaa\xaa\xaa\xaa\xaa\xbb\xbb\xbb\xbb\xbb\xbb\x07\xb2a' >>> >>> a = BTLE_RF(raw(a)) >>> >>> assert a.noise == -90 >>> assert a.signal == -75 >>> assert a.phy == 3 >>> assert a.type == 5 >>> assert a.reference_access_address_valid == 1 >>> assert a[BTLE_SCAN_REQ].ScanA == "aa:aa:aa:aa:aa:aa" ###### ## Specific tests after issue GH#1673 ###### ###(034)=[passed] DLT_USER0 with PPI >>> pkt = PPI(b'\x00\x00\x18\x00\x93\x00\x00\x006u\x0c\x00\x00b\t\x00\xe1\xcf\x01\x00\xf1\xe3\x92\x00\xd6\xbe\x89\x8e@\x14M\x95P\x16\xfev\x02\x01\x1a\n\xffL\x00\x10\x05\x0b\x1c\x0e\xa86Z\xf0\x04') >>> assert BTLE_PPI in pkt.headers[0].payload >>> >>> assert BTLE not in pkt ###(035)=[passed] DLT_BLUETOOTH_LE_LL with PPI >>> pkt = PPI(b'\x00\x00\x18\x00\xfb\x00\x00\x006u\x0c\x00\x00b\t\x00\xe1\xcf\x01\x00\xf1\xe3\x92\x00\xd6\xbe\x89\x8e@\x14M\x95P\x16\xfev\x02\x01\x1a\n\xffL\x00\x10\x05\x0b\x1c\x0e\xa86Z\xf0\x04') >>> assert BTLE_PPI in pkt.headers[0].payload >>> >>> assert BTLE in pkt ###(036)=[passed] DLT_BLUETOOTH_LE_LL without PPI >>> pkt = BTLE_RF(b'\x00\xc6\x80\x00\xd6\xbe\x89\x8e7\x00\xd6\xbe\x89\x8e@\x14\x03g\xa6+\xcbi\x00\x01\x1a\n\xffL\x00\x12E\x03\x18y\x9e\x96\x07\xfa%') >>> assert BTLE_RF in pkt >>> assert BTLE in pkt Regression tests for the CAN layer ━ Run at 01:42:08 from [test/scapy/layers/can.uts] by UTscapy in 1.1647138595581055 └ Passed=71 └ Failed=0 ###### ## Basic operations ###### ###(000)=[passed] Load module >>> import math >>> import random >>> >>> random.seed() >>> >>> load_layer("can", globals_dict=globals()) ###(001)=[passed] Build a packet >>> pkt = CAN(flags="error", identifier=1234, data="test") ###(002)=[passed] Dissect & parse >>> pkt = CAN(raw(pkt)) >>> pkt.flags == "error" and pkt.identifier == 1234 and pkt.length == 4 and pkt.data == b"test" True ###(003)=[passed] Check flags values >>> pkt = CAN(flags="remote_transmission_request") >>> pkt.flags == 0x2 True >>> pkt = CAN(flags="extended") >>> pkt.flags == 0x4 True ###### ## Example PCAP file ###### ###(004)=[passed] Read PCAP file From https://wiki.wireshark.org/SampleCaptures?action=AttachFile&do=get&target=CANopen.pca >>> conf.contribs['CAN']['swap-bytes'] = False >>> >>> from io import BytesIO >>> pcap_fd = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\xe3\x00\x00\x00\xe2\xf3mT\x93\x8c\x03\x00\t\x00\x00\x00\t\x00\x00\x00\x00\x00\x073\x01\x00\x00\x00\x00\xe2\xf3mT\xae\x8c\x03\x00\n\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x02\x7f\x00\x00\x81\x00\xe2\xf3mTI\x8f\x03\x00\t\x00\x00\x00\t\x00\x00\x00\x00\x00\x07B\x01\x00\x00\x00\x00\xe2\xf3mTM\x8f\x03\x00\t\x00\x00\x00\t\x00\x00\x00\x00\x00\x07c\x01\x00\x00\x00\x00\xe2\xf3mTN\x8f\x03\x00\t\x00\x00\x00\t\x00\x00\x00\x00\x00\x07!\x01\x00\x00\x00\x00\xf8\xf3mTv\x98\x04\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x7f\x00\x00@\x08\x10\x00\x00\x00\x00\x00\xf8\xf3mT\x96\x98\x04\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x05\xc2\x08\x7f\x00\x00A\x08\x10\x00\x15\x00\x00\x00\xf8\xf3mT\xd4\x98\x04\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\xf8\xf3mT\x12\x99\x04\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x00\x00\x00\x80\x00\x00\x00!\x00\x00\x08\xf8\xf3mTC\x99\x04\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x05\xc2\x08\x7f\x00\x00\x00UltraHi\xf8\xf3mTx\x99\x04\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x00\x00\x00\x80\x00\x00\x00!\x00\x00\x08\xf8\xf3mT\xce\x99\x04\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00\xf8\xf3mT\xe0\x99\x04\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x00\x00\x00\x80\x00\x00\x00!\x00\x00\x08\xf8\xf3mT \x9a\x04\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x00\x00\x00\x80\x00\x00\x00!\x00\x00\x08\xf8\xf3mTo\x9a\x04\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x05\xc2\x08\x00\x00\x00\x80\x00\x00\x00!\x00\x00\x083\xf4mTw\xbe\t\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x7f\x00\x00@\x08\x10*\x00\x00\x00\x003\xf4mT4\xc0\t\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x05\xc2\x08\x00\x00\x00\x80\x08\x10*\x11\x00\t\x06i\xf4mT\xb0\x88\x0c\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x07\xe5\x08\x7f\x00\x00L\x00\x00\x00\x00\x00\x00\x00i\xf4mT+\x89\x0c\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x07\xe4\x08\x7f\x00\x00P\x00\x00\x00\x00\x00\x00\x00i\xf4mT-\x89\x0c\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x07\xe4\x08\x7f\x00\x00P\x00\x00\x00\x00\x00\x00\x00i\xf4mTS\x89\x0c\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x07\xe4\x08\x7f\x00\x00P\x00\x00\x00\x00\x00\x00\x00i\xf4mT\x99\x89\x0c\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x07\xe4\x08\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x8e\xf4mT\x86\xc4\x04\x00\n\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01B\x92\xf4mT\xae\xf0\x07\x00\n\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\xba\xf4mT%\xaa\x0b\x00\n\x00\x00\x00\n\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02c\xe8\xf4mT\xbc\x0f\x06\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x7f\x00\x00#\x00b\x01asdf\xe8\xf4mT\x07\x10\x06\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x05\xc2\x08\x00\x00\x00\x80\x00b\x01\x00\x00\x02\x06\x0f\xf5mT\x1c\x81\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x7f\x00\x00@\x00b\x01\x00\x00\x00\x00\x0f\xf5mT\xfe\x81\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x05\xc2\x08\x00\x00\x00\x80\x00b\x01\x00\x00\x02\x068\xf5mT\x19\xc3\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x7f\x00\x00\xa0\x08\x10\x00\x10\x00\x00\x008\xf5mTg\xc3\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x05\xc2\x08\x7f\x00\x00\xc2\x08\x10\x00\x15\x00\x00\x008\xf5mT\xd8\xc3\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x00\x00\x00\x80\x00\x00\x00!\x00\x00\x088\xf5mT\x17\xc4\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x06B\x08\x7f\x00\x00\xa3\x00\x00\x00\x00\x00\x00\x008\xf5mT\xca\xc4\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00\x00\x00\x05\xc2\x08\x00\x00\x00\x80\x00\x00\x00!\x00\x00\x08') >>> packets = rdpcap(pcap_fd) ###(005)=[passed] Check if parsing worked: each packet has a CAN layer >>> assert all(CAN in pkt for pkt in packets) ###(006)=[passed] Check if parsing worked: no packet has a Raw or Padding layer >>> not any(Raw in pkt or Padding in pkt for pkt in packets) True ###(007)=[passed] Identifiers >>> assert set(pkt.identifier for pkt in packets) == {0, 1474, 1602, 1825, 1843, 1858, 1891, 2020, 2021} ###(008)=[passed] Flags >>> assert set(pkt.flags for pkt in packets) == {0} ###(009)=[passed] Data length >>> set(pkt.length for pkt in packets) == {1, 2, 8} True ###(010)=[passed] read PCAP of a CookedLinux/SocketCAN capture with CANFD frames >>> conf.contribs['CAN']['swap-bytes'] = True >>> >>> packets = rdpcap(scapy_path("/test/pcaps/canfd.pcap.gz")) ###(011)=[passed] Check if parsing worked: each packet has a CANFD layer >>> assert all(CANFD in pkt[1] for pkt in packets) >>> >>> assert all(pkt.identifier == 0x123 for pkt in packets) >>> assert len(packets) == 4 ###### ## swap-bytes and remove-padding functionality (for PF_CAN socket interactions) ###### ###(012)=[passed] read PCAP of a CookedLinux/SocketCAN capture (CAN standard and extended) >>> conf.contribs['CAN']['swap-bytes'] = True >>> conf.contribs['CAN']['remove-padding'] = False >>> pcap_fd_can_a = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00q\x00\x00\x00\x15f`Zv\xde\n\x00 \x00\x00\x00 \x00\x00\x00\x00\x01\x01\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\xdf\x07\x00\x00\x03\x00\x00\x00\x02\x01\r\x00\x00\x00\x00\x00') >>> packets_can_a = rdpcap(pcap_fd_can_a) >>> pcap_fd_can_b = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00q\x00\x00\x00\xf4i`Z\xf3\x99\x07\x00 \x00\x00\x00 \x00\x00\x00\x00\x01\x01\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\xf13\xdb\x98\x03\x00\x00\x00\x02\x01\r\x00\x00\x00\x00\x00') >>> packets_can_b = rdpcap(pcap_fd_can_b) ###(013)=[passed] check CAN is detected over CookedLinux (each packet has both layers) >>> all(CAN in pkt for pkt in packets_can_a) True >>> all(CAN in pkt for pkt in packets_can_b) True >>> all(CookedLinux in pkt for pkt in packets_can_a) True >>> all(CookedLinux in pkt for pkt in packets_can_b) True ###(014)=[passed] Check if parsing worked: no packet has a Raw or Padding layer >>> not any(Raw in pkt or Padding in pkt for pkt in packets) True ###(015)=[passed] Check byte swap for dissection >>> packets_can_a[0].identifier == 0x7df True >>> packets_can_a[0].flags == 0x0 True >>> packets_can_b[0].identifier == 0x18db33f1 True >>> packets_can_b[0].flags == "extended" True ###(016)=[passed] Check byte swap-back for building >>> raw(packets_can_a[0]) == b'\x00\x01\x01\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\xdf\x07\x00\x00\x03\x00\x00\x00\x02\x01\r\x00\x00\x00\x00\x00' True >>> raw(packets_can_b[0]) == b'\x00\x01\x01\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\xf13\xdb\x98\x03\x00\x00\x00\x02\x01\r\x00\x00\x00\x00\x00' True >>> >>> conf.contribs['CAN']['swap-bytes'] = False ###(017)=[passed] Check building CAN packet with not padded data field check building check padding handling >>> p = CAN(flags='error', identifier=1234, data=b'') >>> bytes(p) b' \x00\x04\xd2\x00\x00\x00\x00' >>> p = CAN(flags='error', identifier=1234, data=b'\x0a\x0b') >>> bytes(p) b' \x00\x04\xd2\x02\x00\x00\x00\n\x0b' >>> >>> p_too_much_data = CAN(flags='error', length=1, identifier=1234, data=b'\x01\x02') >>> p = CAN(bytes(p_too_much_data)) >>> p.haslayer('Padding') and p['Padding'].load == b'\x02' True ###### ## rdcandump ###### ###(018)=[passed] Check rdcandump default default reading >>> conf.contribs['CAN']['remove-padding'] = True >>> >>> pcap_fd = BytesIO(b'''(1539191392.761779) vcan0 123#11223344 ... (1539191470.820239) vcan0 123#11223344 ... (1539191471.503168) vcan0 123#11223344 ... (1539191471.891423) vcan0 123#11223344 ... (1539191492.026403) vcan0 1F334455#1122334455667788 ... (1539191494.084177) vcan0 1F334455#1122334455667788 ... (1539191494.724228) vcan0 1F334455#1122334455667788 ... (1539191495.148182) vcan0 1F334455#1122334455667788 ... (1539191495.563320) vcan0 1F334455#1122334455667788 ... (1539191470.820239) vcan0 123##1112233445566778899aabbccddeeff ... (1539191495.563320) vcan0 1F334455##1112233445566778899aabbccddeeff''') >>> packets = rdcandump(pcap_fd) >>> assert len(packets) == 11 >>> assert packets[0].identifier == 0x123 >>> assert packets[8].identifier == 0x1F334455 >>> assert packets[8].flags == 0b100 >>> assert packets[0].length == 4 >>> assert packets[8].length == 8 >>> assert packets[0].data == b'\x11\x22\x33\x44' >>> assert packets[8].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[9].identifier == 0x123 >>> assert packets[10].identifier == 0x1F334455 >>> assert packets[9].data == b'\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff' >>> assert packets[10].data == b'\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff' ###(019)=[passed] Check rdcandump_iterable default default reading >>> pcap_fd = BytesIO(b'''(1539191392.761779) vcan0 123#11223344 ... (1539191470.820239) vcan0 123#11223344 ... (1539191471.503168) vcan0 123#11223344 ... (1539191471.891423) vcan0 123#11223344 ... (1539191492.026403) vcan0 1F334455#1122334455667788 ... (1539191494.084177) vcan0 1F334455#1122334455667788 ... (1539191494.724228) vcan0 1F334455#1122334455667788 ... (1539191495.148182) vcan0 1F334455#1122334455667788 ... (1539191495.563320) vcan0 1F334455#1122334455667788 ... (1539191470.820239) vcan0 123##1112233445566778899aabbccddeeff ... (1539191495.563320) vcan0 1F334455##1112233445566778899aabbccddeeff''') >>> packets = [x for x in CandumpReader(pcap_fd)] >>> assert len(packets) == 11 >>> assert packets[0].identifier == 0x123 >>> assert packets[8].identifier == 0x1F334455 >>> assert packets[8].flags == 0b100 >>> assert packets[0].length == 4 >>> assert packets[8].length == 8 >>> assert packets[0].data == b'\x11\x22\x33\x44' >>> assert packets[8].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[9].identifier == 0x123 >>> assert packets[10].identifier == 0x1F334455 >>> assert packets[9].data == b'\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff' >>> assert packets[10].data == b'\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff' ###(020)=[passed] Check rdcandump filter interface filter 1 interface filter 2 interface filter 3 interface filter 4 >>> pcap_fd = BytesIO(b'''(1539191392.761779) vcan0 123#11223344 ... (1539191470.820239) vcan1 123#11223344 ... (1539191471.503168) vcan1 123#11223344 ... (1539191471.891423) vcan0 123#11223344 ... (1539191492.026403) vcan0 1F334455#1122334455667788 ... (1539191494.084177) vcan1 1F334455#1122334455667788 ... (1539191494.724228) vcan1 1F334455#1122334455667788 ... (1539191495.148182) vcan0 1F334455#1122334455667788 ... (1539191495.563320) vcan1 1F334455#1122334455667788''') >>> packets = rdcandump(pcap_fd, interface="vcan0") >>> assert len(packets) == 4 >>> assert packets[0].identifier == 0x123 >>> assert packets[-1].identifier == 0x1F334455 >>> assert packets[-1].flags == 0b100 >>> assert packets[0].length == 4 >>> assert packets[-1].length == 8 >>> assert packets[0].data == b'\x11\x22\x33\x44' >>> assert packets[-1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> >>> pcap_fd = BytesIO(b'''(1539191392.761779) vcan0 123#11223344 ... (1539191470.820239) vcan0 123#11223344 ... (1539191471.503168) vcan0 123#11223344 ... (1539191471.891423) vcan0 123#11223344 ... (1539191492.026403) vcan1 1F334455#1122334455667788 ... (1539191494.084177) vcan1 1F334455#1122334455667788 ... (1539191494.724228) vcan1 1F334455#1122334455667788 ... (1539191495.148182) vcan1 1F334455#1122334455667788 ... (1539191495.563320) vcan1 1F334455#1122334455667788''') >>> packets = rdcandump(pcap_fd, interface="vcan0") >>> assert len(packets) == 4 >>> assert packets[0].identifier == 0x123 >>> assert packets[0].length == 4 >>> assert packets[0].data == b'\x11\x22\x33\x44' >>> >>> pcap_fd = BytesIO(b'''(1539191392.761779) vcan0 123#11223344 ... (1539191470.820239) vcan0 123#11223344 ... (1539191471.503168) vcan0 123#11223344 ... (1539191471.891423) vcan0 123#11223344 ... (1539191492.026403) vcan1 1F334455#1122334455667788 ... (1539191494.084177) vcan1 1F334455#1122334455667788 ... (1539191494.724228) vcan1 1F334455#1122334455667788 ... (1539191495.148182) vcan1 1F334455#1122334455667788 ... (1539191495.563320) vcan1 1F334455#1122334455667788''') >>> packets = rdcandump(pcap_fd, interface="vcan1") >>> assert len(packets) == 5 >>> assert packets[-1].identifier == 0x1F334455 >>> assert packets[-1].flags == 0b100 >>> assert packets[-1].length == 8 >>> assert packets[-1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> >>> pcap_fd = BytesIO(b'''(1539191392.761779) vcan2 123#11223344 ... (1539191470.820239) vcan0 123#11223344 ... (1539191471.503168) vcan2 123#11223344 ... (1539191471.891423) vcan0 123#11223344 ... (1539191492.026403) vcan1 1F334455#1122334455667788 ... (1539191494.084177) vcan1 1F334455#1122334455667788 ... (1539191494.724228) vcan2 1F334455#1122334455667788 ... (1539191495.148182) vcan1 1F334455#1122334455667788 ... (1539191495.563320) vcan2 1F334455#1122334455667788''') >>> packets = rdcandump(pcap_fd, interface=["vcan1", "vcan0"]) >>> assert len(packets) == 5 >>> assert packets[0].identifier == 0x123 >>> assert packets[-1].identifier == 0x1F334455 >>> assert packets[-1].flags == 0b100 >>> assert packets[0].length == 4 >>> assert packets[-1].length == 8 >>> assert packets[0].data == b'\x11\x22\x33\x44' >>> assert packets[-1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' ###### ## Check rdcandump not log file format ###### ###(021)=[passed] interface not log file format >>> pcap_fd = BytesIO(b''' vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F334455 [4] 11 22 33 44 ... vcan0 1F3 [4] 11 22 33 44 ... vcan0 1F334455 [09] 11 22 33 44 55 66 77 88 99 ... vcan0 1F3 [09] 11 22 33 44 55 66 77 88 99 ... ''') >>> packets = rdcandump(pcap_fd) >>> assert len(packets) == 10 >>> packets[-1].show() ###[ CANFD ]### flags = identifier= 0x1f3 length = 9 fd_flags = None reserved = 0 data = b'\x11"3DUfw\x88\x99' >>> assert packets[-3].identifier == 0x1F3 >>> assert packets[1].identifier == 0x1F3 >>> assert packets[0].identifier == 0x1F334455 >>> assert packets[0].flags == 0b100 >>> assert packets[-3].length == 4 >>> assert packets[0].length == 8 >>> assert packets[1].length == 8 >>> assert packets[-1].length == 9 >>> assert packets[8].length == 9 >>> assert packets[-3].data == b'\x11\x22\x33\x44' >>> assert packets[0].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[8].data == b'\x11\x22\x33\x44\x55\x66\x77\x88\x99' >>> assert packets[-1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88\x99' ###(022)=[passed] interface not log file format filtered 1 >>> pcap_fd = BytesIO(b''' vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan1 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan1 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan1 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan1 1F334455 [4] 11 22 33 44 ... vcan0 1F3 [4] 11 22 33 44 ... vcan0 1F334455 [09] 11 22 33 44 55 66 77 88 99 ... vcan1 1F3 [09] 11 22 33 44 55 66 77 88 99 ... ''') >>> packets = rdcandump(pcap_fd, interface="vcan0") >>> assert len(packets) == 5 >>> assert packets[-2].identifier == 0x1F3 >>> assert packets[2].identifier == 0x1F3 >>> assert packets[0].identifier == 0x1F334455 >>> assert packets[-1].identifier == 0x1F334455 >>> assert packets[0].flags == 0b100 >>> assert packets[-2].length == 4 >>> assert packets[0].length == 8 >>> assert packets[2].length == 8 >>> assert packets[-1].length == 9 >>> assert packets[-2].data == b'\x11\x22\x33\x44' >>> assert packets[0].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[2].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[-1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88\x99' ###(023)=[passed] interface not log file format filtered 2 >>> pcap_fd = BytesIO(b''' vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan1 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan2 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan1 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan2 1F334455 [4] 11 22 33 44 ... vcan0 1F3 [4] 11 22 33 44 ... ''') >>> packets = rdcandump(pcap_fd, interface=["vcan0", "vcan1"]) >>> assert len(packets) == 6 >>> assert packets[-1].identifier == 0x1F3 >>> assert packets[1].identifier == 0x1F3 >>> assert packets[0].identifier == 0x1F334455 >>> assert packets[0].flags == 0b100 >>> assert packets[-1].length == 4 >>> assert packets[0].length == 8 >>> assert packets[1].length == 8 >>> assert packets[-1].data == b'\x11\x22\x33\x44' >>> assert packets[0].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' ###### ## Check rdcandump count ###### ###(024)=[passed] interface not log file format filtered 2 count 1 >>> pcap_fd = BytesIO(b''' vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan1 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan2 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan2 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan2 1F334455 [4] 11 22 33 44 ... vcan0 1F3 [4] 11 22 33 44 ... ''') >>> packets = rdcandump(pcap_fd, interface=["vcan2"], ... count=2) >>> assert len(packets) == 2 >>> assert packets[0].identifier == 0x1F3 >>> assert packets[-1].identifier == 0x1F334455 >>> assert packets[-1].flags == 0b100 >>> assert packets[-1].length == 8 >>> assert packets[0].length == 8 >>> assert packets[1].length == 8 >>> assert packets[0].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' ###(025)=[passed] interface not log file format filtered 2 count 2 >>> pcap_fd = BytesIO(b''' vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan1 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan2 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan2 1F334455 [8] 11 22 33 44 55 66 77 88 ... vcan2 1F334455 [4] 11 22 33 44 ... vcan0 1F3 [4] 11 22 33 44 ... ''') >>> packets = rdcandump(pcap_fd, count=2) >>> assert len(packets) == 2 >>> assert packets[1].identifier == 0x1F3 >>> assert packets[0].identifier == 0x1F334455 >>> assert packets[0].flags == 0b100 >>> assert packets[-1].length == 8 >>> assert packets[0].length == 8 >>> assert packets[1].length == 8 >>> assert packets[0].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' ###(026)=[passed] default reading >>> pcap_fd = BytesIO(b'''(1539191392.761779) vcan0 123#11223344 ... (1539191470.820239) vcan0 123#11223344 ... (1539191471.503168) vcan0 123#11223344 ... (1539191471.891423) vcan0 123#11223344 ... (1539191492.026403) vcan0 1F334455#1122334455667788 ... (1539191494.084177) vcan0 1F334455#1122334455667788 ... (1539191494.724228) vcan0 1F334455#1122334455667788 ... (1539191495.148182) vcan0 1F334455#1122334455667788 ... (1539191495.563320) vcan0 1F334455#1122334455667788''') >>> packets = rdcandump(pcap_fd, count=5) >>> assert len(packets) == 5 >>> assert packets[0].identifier == 0x123 >>> assert packets[-1].identifier == 0x1F334455 >>> assert packets[-1].flags == 0b100 >>> assert packets[0].length == 4 >>> assert packets[-1].length == 8 >>> assert packets[0].data == b'\x11\x22\x33\x44' >>> assert packets[-1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' ###### ## Check rdcandump default extended frames id < 0x7ff ###### ###(027)=[passed] default reading >>> pcap_fd = BytesIO(b'''(1539191392.761779) vcan0 123#11223344 ... (1539191470.820239) vcan0 123#11223344 ... (1539191471.503168) vcan0 123#11223344 ... (1539191471.891423) vcan0 123#11223344 ... (1539191492.026403) vcan0 00000055#1122334455667788 ... (1539191494.084177) vcan0 00000055#1122334455667788 ... (1539191494.724228) vcan0 00000055#1122334455667788 ... (1539191495.148182) vcan0 00000055#1122334455667788 ... (1539191495.563320) vcan0 00000055#1122334455667788 ... (1539191494.724228) vcan0 00000055##1112233445566778899''') >>> packets = rdcandump(pcap_fd) >>> assert len(packets) == 10 >>> assert packets[0].identifier == 0x123 >>> assert packets[8].identifier == 0x55 >>> assert packets[8].flags == 0b100 >>> assert packets[0].length == 4 >>> assert packets[8].length == 8 >>> assert packets[0].data == b'\x11\x22\x33\x44' >>> assert packets[8].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[8].identifier == 0x55 >>> assert packets[8].flags == 0b100 >>> assert packets[9].length == 9 >>> assert packets[9].data == b'\x11\x22\x33\x44\x55\x66\x77\x88\x99' ###(028)=[passed] interface not log file format >>> pcap_fd = BytesIO(b''' vcan0 00000055 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan0 00000055 [8] 11 22 33 44 55 66 77 88 ... vcan0 1F3 [8] 11 22 33 44 55 66 77 88 ... vcan0 00000055 [8] 11 22 33 44 55 66 77 88 ... vcan0 00000055 [4] 11 22 33 44 ... vcan0 1F3 [4] 11 22 33 44''') >>> packets = rdcandump(pcap_fd) >>> assert len(packets) == 8 >>> packets[-1].show() ###[ CAN ]### flags = identifier= 0x1f3 length = 4 reserved = 0 data = b'\x11"3D' >>> assert packets[-1].identifier == 0x1F3 >>> assert packets[1].identifier == 0x1F3 >>> assert packets[0].identifier == 0x55 >>> assert packets[0].flags == 0b100 >>> assert packets[-1].length == 4 >>> assert packets[0].length == 8 >>> assert packets[1].length == 8 >>> assert packets[-1].data == b'\x11\x22\x33\x44' >>> assert packets[0].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' >>> assert packets[1].data == b'\x11\x22\x33\x44\x55\x66\x77\x88' ###### ## CAN Signals ###### ###(029)=[passed] Test invalid fields_desc >>> class testFrame1(SignalPacket): ... fields_desc = [ ... ByteField("sig0", 0), ... SignalField("sig1", default=0, start=7, size=6, fmt=">B") ... ] ... >>> passed = False >>> >>> try: ... testFrame1(b"\xff\xff") ... except Scapy_Exception: ... passed = True ... >>> assert passed ###(030)=[passed] Test invalid fields_desc with ConditionalField >>> class testFrame1(SignalPacket): ... fields_desc = [ ... ConditionalField(ByteField("sig0", 0), lambda x: True), ... SignalField("sig1", default=0, start=7, size=6, fmt=">B") ... ] ... >>> passed = False >>> try: ... testFrame1(b"\xff\xff") ... except Scapy_Exception: ... passed = True ... >>> assert passed ###(031)=[passed] Motorola byte order (Big Endian) dissect test >>> class testFrame1(SignalPacket): ... fields_desc = [ ... SignalField("sig0", default=0, start=1, size=2, fmt=">B"), ... SignalField("sig1", default=0, start=7, size=6, fmt=">B"), ... SignalField("sig2", default=0, start=15, size=11, fmt=">B"), ... SignalField("sig3", default=0, start=20, size=12, fmt=">B"), ... SignalField("sig4", default=0, start=24, size=9, fmt=">B"), ... SignalField("sig7", default=0, start=47, size=10, fmt=">B"), ... SignalField("sig5", default=0, start=50, size=3, fmt=">B"), ... SignalField("sig6", default=0, start=53, size=3, fmt=">B"), ... SignalField("sig8", default=0, start=58, size=3, fmt=">B"), ... SignalField("sig9", default=0, start=61, size=3, fmt=">B"), ... SignalField("sig10", default=0, start=63, size=2, fmt=">B") ... ] ... >>> pkt = testFrame1(b'\xff\xff\xff\xff\xff\xff\xff\xff') >>> assert pkt.sig0 == 3 >>> assert pkt.sig1 == 0x3f >>> assert pkt.sig2 == 0x7ff >>> assert pkt.sig3 == 0xfff >>> assert pkt.sig4 == 0x1ff >>> assert pkt.sig7 == 0x3ff >>> assert pkt.sig5 == 7 >>> assert pkt.sig6 == 7 >>> assert pkt.sig8 == 7 >>> assert pkt.sig9 == 7 >>> assert pkt.sig10 == 3 >>> >>> >>> pkt = testFrame1(struct.pack(">> assert pkt.sig0 == 1 >>> assert pkt.sig1 == 21 >>> assert pkt.sig2 == 15 >>> assert pkt.sig3 == 0x7f >>> assert pkt.sig4 == 0x1 >>> assert pkt.sig7 == 0x203 >>> assert pkt.sig5 == 5 >>> assert pkt.sig6 == 2 >>> assert pkt.sig8 == 5 >>> assert pkt.sig9 == 2 >>> assert pkt.sig10 == 2 ###(032)=[passed] Motorola byte order (Big Endian) build test >>> pkt = testFrame1() >>> pkt.sig0 = 1 >>> pkt.sig1 = 21 >>> pkt.sig2 = 15 >>> pkt.sig3 = 0x7f >>> pkt.sig4 = 0x1 >>> pkt.sig7 = 0x203 >>> pkt.sig5 = 5 >>> pkt.sig6 = 2 >>> pkt.sig8 = 5 >>> pkt.sig9 = 2 >>> pkt.sig10 = 2 >>> >>> test = bytes(pkt) >>> assert bytes(test) == b'U\x01\xe0\xfe\x01\x80\xd5\x95' ###(033)=[passed] Motorola byte order (Big Endian) dissect test with mixed field order >>> class testFrame1(SignalPacket): ... fields_desc = [ ... SignalField("sig10", default=0, start=63, size=2, fmt=">B"), ... SignalField("sig0", default=0, start=1, size=2, fmt=">B"), ... SignalField("sig9", default=0, start=61, size=3, fmt=">B"), ... SignalField("sig5", default=0, start=50, size=3, fmt=">B"), ... SignalField("sig4", default=0, start=24, size=9, fmt=">B"), ... SignalField("sig7", default=0, start=47, size=10, fmt=">B"), ... SignalField("sig3", default=0, start=20, size=12, fmt=">B"), ... SignalField("sig6", default=0, start=53, size=3, fmt=">B"), ... SignalField("sig2", default=0, start=15, size=11, fmt=">B"), ... SignalField("sig8", default=0, start=58, size=3, fmt=">B"), ... SignalField("sig1", default=0, start=7, size=6, fmt=">B"), ... ] ... >>> pkt = testFrame1(struct.pack(">> assert pkt.sig0 == 1 >>> assert pkt.sig1 == 21 >>> assert pkt.sig2 == 15 >>> assert pkt.sig3 == 0x7f >>> assert pkt.sig4 == 0x1 >>> assert pkt.sig7 == 0x203 >>> assert pkt.sig5 == 5 >>> assert pkt.sig6 == 2 >>> assert pkt.sig8 == 5 >>> assert pkt.sig9 == 2 >>> assert pkt.sig10 == 2 ###(034)=[passed] Motorola byte order (Big Endian) build test with mixed field order >>> class testFrame1(SignalPacket): ... fields_desc = [ ... SignalField("sig3", default=0, start=20, size=12, fmt=">B"), ... SignalField("sig4", default=0, start=24, size=9, fmt=">B"), ... SignalField("sig10", default=0, start=63, size=2, fmt=">B"), ... SignalField("sig2", default=0, start=15, size=11, fmt=">B"), ... SignalField("sig5", default=0, start=50, size=3, fmt=">B"), ... SignalField("sig1", default=0, start=7, size=6, fmt=">B"), ... SignalField("sig6", default=0, start=53, size=3, fmt=">B"), ... SignalField("sig7", default=0, start=47, size=10, fmt=">B"), ... SignalField("sig9", default=0, start=61, size=3, fmt=">B"), ... SignalField("sig0", default=0, start=1, size=2, fmt=">B"), ... SignalField("sig8", default=0, start=58, size=3, fmt=">B"), ... ] ... >>> pkt = testFrame1() >>> pkt.sig0 = 1 >>> pkt.sig1 = 21 >>> pkt.sig2 = 15 >>> pkt.sig3 = 0x7f >>> pkt.sig4 = 0x1 >>> pkt.sig7 = 0x203 >>> pkt.sig5 = 5 >>> pkt.sig6 = 2 >>> pkt.sig8 = 5 >>> pkt.sig9 = 2 >>> pkt.sig10 = 2 >>> >>> test = bytes(pkt) >>> print(test) b'U\x01\xe0\xfe\x01\x80\xd5\x95' >>> assert bytes(test) == b'U\x01\xe0\xfe\x01\x80\xd5\x95' ###(035)=[passed] Intel byte order (Little Endian) dissect test >>> class testFrame2(SignalPacket): ... fields_desc = [ ... SignalField("secSig12", default=0, start=0, size=8, fmt=">> pkt = testFrame2(b'\xff\xff\xff\xff\xff\xff\xff\xff') >>> assert pkt.secSig1 == 0x3 >>> assert pkt.secSig2 == 0x1 >>> assert pkt.secSig3 == 0xf >>> assert pkt.secSig4 == 0x3 >>> assert pkt.secSig7 == 0x1 >>> assert pkt.secSig5 == 7 >>> assert pkt.secSig6 == 7 >>> assert pkt.secSig8 == 7 >>> assert pkt.secSig9 == 7 >>> assert pkt.secSig10 == 0xfff >>> assert pkt.secSig11 == 0x3ff >>> assert pkt.secSig12 == 0xff >>> >>> >>> pkt = testFrame2(struct.pack(">> >>> assert pkt.secSig1 == 0x1 >>> assert pkt.secSig2 == 0x1 >>> assert pkt.secSig3 == 0xe >>> assert pkt.secSig4 == 0x2 >>> assert pkt.secSig7 == 0x0 >>> assert pkt.secSig5 == 0 >>> assert pkt.secSig6 == 0 >>> assert pkt.secSig8 == 5 >>> assert pkt.secSig9 == 5 >>> assert pkt.secSig10 == 1 >>> assert pkt.secSig11 == 0x1fe >>> assert pkt.secSig12 == 0xA5 ###(036)=[passed] Intel byte order (Little Endian) build test >>> pkt = testFrame2() >>> >>> pkt.secSig12 = 0xA5 >>> pkt.secSig10 = 1 >>> pkt.secSig3 = 14 >>> pkt.secSig11 = 0x1fe >>> pkt.secSig5 = 0 >>> pkt.secSig6 = 0 >>> pkt.secSig9 = 5 >>> pkt.secSig2 = 1 >>> pkt.secSig8 = 5 >>> pkt.secSig7 = 0 >>> pkt.secSig1 = 1 >>> pkt.secSig4 = 2 >>> >>> assert bytes(pkt) == b'\xa5\x01\xe0\xfe\x01\x00\xd0\x95' ###(037)=[passed] Intel byte order (Little Endian) build test with mixed field order >>> class testFrame2(SignalPacket): ... fields_desc = [ ... SignalField("secSig1", default=0, start=60, size=2, fmt=">> pkt = testFrame2() >>> >>> pkt.secSig12 = 0xA5 >>> pkt.secSig10 = 1 >>> pkt.secSig3 = 14 >>> pkt.secSig11 = 0x1fe >>> pkt.secSig5 = 0 >>> pkt.secSig6 = 0 >>> pkt.secSig9 = 5 >>> pkt.secSig2 = 1 >>> pkt.secSig8 = 5 >>> pkt.secSig7 = 0 >>> pkt.secSig1 = 1 >>> pkt.secSig4 = 2 >>> >>> assert bytes(pkt) == b'\xa5\x01\xe0\xfe\x01\x00\xd0\x95' ###(038)=[passed] Intel byte order (Little Endian) build test with short package >>> class testFrame2(SignalPacket): ... fields_desc = [ ... SignalField("secSig12", default=0, start=0, size=8, fmt=">> pkt = testFrame2() >>> >>> pkt.secSig12 = 0xA5 >>> pkt.secSig10 = 1 >>> pkt.secSig3 = 14 >>> pkt.secSig11 = 0x1fe >>> >>> assert bytes(pkt) == b'\xa5\x01\xe0\xfe\x01' >>> assert len(pkt) == 5 >>> >>> pkt.secSig11 = 0x0fe >>> >>> assert bytes(pkt) == b'\xa5\x01\xe0\xfe\x00' >>> assert len(pkt) == 5 ###(039)=[passed] Packet with mixed endianness fields build test >>> class testFrame3(SignalPacket): ... fields_desc = [ ... SignalField("myMuxer", default=0, start=53, size=3, fmt=">> pkt = testFrame3() >>> >>> pkt.myMuxer = 0x7 >>> pkt.muxSig5 = 0x72 >>> pkt.muxSig6 = 0x10f >>> pkt.muxSig7 = 0xA5 >>> pkt.muxSig8 = 0x03 >>> pkt.muxSig9 = 0x11 >>> >>> assert bytes(pkt) == b'\x1d\x28\x80\x1c\x0f\x23\xe0' >>> assert len(pkt) == 7 ###(040)=[passed] Muxed Packet with mixed endianness fields build test >>> class testFrame3(SignalPacket): ... fields_desc = [ ... SignalField("myMuxer", default=0, start=53, size=3, fmt=">> pkt = testFrame3() >>> >>> pkt.myMuxer = 0x0 >>> pkt.muxSig5 = 0x72 >>> pkt.muxSig6 = 0x10f >>> pkt.muxSig7 = 0xA5 >>> pkt.muxSig8 = 0x03 >>> pkt.muxSig9 = 0x11 >>> >>> assert bytes(pkt) == b'\x1d\x28\x00\x00\x00\x00\x00' >>> assert len(pkt) == 7 >>> >>> pkt.myMuxer = 0x1 >>> >>> assert bytes(pkt) == b'\x00\x00\x80\x1c\x0f\x23\x20' >>> assert len(pkt) == 7 ###(041)=[passed] Muxed Packet build test >>> class testFrame3(SignalPacket): ... fields_desc = [ ... SignalField("myMuxer", default=0, start=0, size=8, fmt=">> pkt = testFrame3(b'\x01\xff\xff\xff\xff\xff\xff') >>> >>> assert pkt.myMuxer == 0x1 >>> assert pkt.muxSig5 == 0xff >>> assert pkt.muxSig7 == 0xff >>> >>> pkt = testFrame3(b'\x00\xff\xff\xff\xff\xff\xff') >>> >>> assert pkt.myMuxer == 0x0 >>> assert pkt.muxSig6 == 0xffff >>> assert pkt.muxSig8 == 0xff >>> assert pkt.muxSig9 == 0xff >>> >>> pkt = testFrame3() >>> pkt.myMuxer = 0x1 >>> pkt.muxSig5 = 0xaa >>> pkt.muxSig7 = 0xaa >>> >>> assert bytes(pkt) == b'\x01\xaa\xaa' >>> assert len(pkt) == 3 >>> >>> pkt = testFrame3() >>> pkt.myMuxer = 0x0 >>> pkt.muxSig5 = 0xaa >>> pkt.muxSig6 = 0xbb >>> pkt.muxSig7 = 0xaa >>> pkt.muxSig8 = 0xbb >>> pkt.muxSig9 = 0xbb >>> >>> assert bytes(pkt) == b'\x00\xbb\x00\xbb\xbb' >>> assert len(pkt) == 5 ###(042)=[passed] SignalHeader Muxed Packet build test >>> conf.contribs['CAN']['swap-bytes'] = False >>> >>> class testFrame3(SignalPacket): ... fields_desc = [ ... SignalField("myMuxer", default=0, start=0, size=8, fmt=">> bind_layers(SignalHeader, testFrame3, identifier=0x123) >>> >>> pkt = SignalHeader(b'\x00\x00\x01#\x00\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff') >>> >>> assert pkt.myMuxer == 0x1 >>> assert pkt.muxSig5 == 0xff >>> assert pkt.muxSig7 == 0xff >>> >>> pkt = SignalHeader(b'\x00\x00\x01#\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff') >>> >>> assert pkt.myMuxer == 0x0 >>> assert pkt.muxSig6 == 0xffff >>> assert pkt.muxSig8 == 0xff >>> assert pkt.muxSig9 == 0xff >>> >>> pkt = SignalHeader()/testFrame3() >>> pkt.myMuxer = 0x1 >>> pkt.muxSig5 = 0xaa >>> pkt.muxSig7 = 0xaa >>> >>> assert bytes(pkt) == b'\x00\x00\x01#\x03\x00\x00\x00\x01\xaa\xaa' >>> assert len(pkt) == 8 + 3 >>> >>> pkt = SignalHeader()/testFrame3() >>> pkt.myMuxer = 0x0 >>> pkt.muxSig5 = 0xaa >>> pkt.muxSig6 = 0xbb >>> pkt.muxSig7 = 0xaa >>> pkt.muxSig8 = 0xbb >>> pkt.muxSig9 = 0xbb >>> >>> assert bytes(pkt) == b'\x00\x00\x01#\x05\x00\x00\x00\x00\xbb\x00\xbb\xbb' >>> assert len(pkt) == 8 + 5 ###(043)=[passed] Intel byte order (Little Endian) SignalPacket dissect test >>> class testFrame2(SignalPacket): ... fields_desc = [ ... SignalField("secSig12", default=0, start=0, size=8, fmt=">> pkt = testFrame2(b'\xff\xff\xff\xff\xff\xff\xff\xff') >>> assert pkt.secSig1 == 0x3 >>> assert pkt.secSig2 == 0x1 >>> assert pkt.secSig3 == 0xf >>> assert pkt.secSig4 == 0x3 >>> assert pkt.secSig7 == 0x1 >>> assert pkt.secSig5 == 7 >>> assert pkt.secSig6 == 7 >>> assert pkt.secSig8 == 7 >>> assert pkt.secSig9 == 7 >>> assert pkt.secSig10 == 0xfff >>> assert pkt.secSig11 == 0x3ff >>> assert pkt.secSig12 == 0xff >>> >>> assert len(pkt) == 8 >>> >>> pkt = testFrame2(struct.pack(">> >>> assert pkt.secSig1 == 0x1 >>> assert pkt.secSig2 == 0x1 >>> assert pkt.secSig3 == 0xe >>> assert pkt.secSig4 == 0x2 >>> assert pkt.secSig7 == 0x0 >>> assert pkt.secSig5 == 0 >>> assert pkt.secSig6 == 0 >>> assert pkt.secSig8 == 5 >>> assert pkt.secSig9 == 5 >>> assert pkt.secSig10 == 1 >>> assert pkt.secSig11 == 0x1fe >>> assert pkt.secSig12 == 0xA5 >>> >>> assert len(pkt) == 8 ###(044)=[passed] Intel byte order (Little Endian) short SignalPacket dissect test >>> class testFrame2(SignalPacket): ... fields_desc = [ ... SignalField("secSig12", default=0, start=0, size=8, fmt=">> pkt = testFrame2(b'\xff\xff\xff\xff\xff') >>> assert pkt.secSig3 == 0xf >>> assert pkt.secSig5 == 7 >>> assert pkt.secSig6 == 7 >>> assert pkt.secSig10 == 0xfff >>> assert pkt.secSig11 == 0x3ff >>> assert pkt.secSig12 == 0xff >>> >>> assert len(pkt) == 5 >>> >>> pkt = testFrame2(struct.pack(">> >>> assert pkt.secSig3 == 0xe >>> assert pkt.secSig5 == 0 >>> assert pkt.secSig6 == 0 >>> assert pkt.secSig10 == 1 >>> assert pkt.secSig11 == 0x1fe >>> assert pkt.secSig12 == 0xA5 >>> >>> assert len(pkt) == 5 ###(045)=[passed] Intel byte order (Little Endian) short SignalPacket dissect test mixed field order >>> class testFrame2(SignalPacket): ... fields_desc = [ ... SignalField("secSig3", default=0, start=20, size=4, fmt=">> pkt = testFrame2(b'\xff\xff\xff\xff\xff') >>> assert pkt.secSig3 == 0xf >>> assert pkt.secSig5 == 7 >>> assert pkt.secSig6 == 7 >>> assert pkt.secSig10 == 0xfff >>> assert pkt.secSig11 == 0x3ff >>> assert pkt.secSig12 == 0xff >>> >>> assert len(pkt) == 5 >>> >>> pkt = testFrame2(struct.pack(">> >>> assert pkt.secSig3 == 0xe >>> assert pkt.secSig5 == 0 >>> assert pkt.secSig6 == 0 >>> assert pkt.secSig10 == 1 >>> assert pkt.secSig11 == 0x1fe >>> assert pkt.secSig12 == 0xA5 >>> >>> assert len(pkt) == 5 ###(046)=[passed] Packet with mixed endianness fields build test >>> class testFrame3(SignalPacket): ... fields_desc = [ ... SignalField("myMuxer", default=0, start=53, size=3, fmt=">> pkt = testFrame3() >>> >>> pkt.myMuxer = 0x7 >>> pkt.muxSig5 = 0x72 >>> pkt.muxSig6 = 0x10f >>> pkt.muxSig7 = 0xA5 >>> pkt.muxSig8 = 0x03 >>> pkt.muxSig9 = 0x11 >>> >>> assert bytes(pkt) == b'\x1d\x28\x80\x1c\x0f\x23\xe0' >>> assert len(pkt) == 7 ###(047)=[passed] Packet with mixed endianness fields build test, mixed field order >>> class testFrame3(SignalPacket): ... fields_desc = [ ... SignalField("myMuxer", default=0, start=53, size=3, fmt=">> pkt = testFrame3() >>> >>> pkt.myMuxer = 0x7 >>> pkt.muxSig5 = 0x72 >>> pkt.muxSig6 = 0x10f >>> pkt.muxSig7 = 0xA5 >>> pkt.muxSig8 = 0x03 >>> pkt.muxSig9 = 0x11 >>> >>> assert bytes(pkt) == b'\x1d\x28\x80\x1c\x0f\x23\xe0' >>> assert len(pkt) == 7 ###(048)=[passed] Packet with mixed endianness fields dissect test, mixed field order >>> pkt = testFrame3(b'\x1d\x28\x80\x1c\x0f\x23\xe0') >>> assert len(pkt) == 7 >>> assert pkt.myMuxer == 0x7 >>> assert pkt.muxSig5 == 0x72 >>> assert pkt.muxSig6 == 0x10f >>> assert pkt.muxSig7 == 0xA5 >>> assert pkt.muxSig8 == 0x03 >>> assert pkt.muxSig9 == 0x11 ###(049)=[passed] Packet with mixed endianness fields dissect test, mixed field order and scaling >>> class testFrame3(SignalPacket): ... fields_desc = [ ... SignalField("myMuxer", default=0, start=53, size=3, scaling=0.1, fmt=">> pkt = testFrame3(b'\x1d\x28\x80\x1c\x0f\x23\xe0') >>> assert len(pkt) == 7 >>> assert pkt.myMuxer == 0.7 >>> assert pkt.muxSig5 == 1.14 >>> assert pkt.muxSig6 == 0x10f << 1 >>> assert pkt.muxSig7 == 82.5 >>> assert pkt.muxSig8 == 30 >>> assert pkt.muxSig9 == 1700 ###(050)=[passed] Packet with mixed endianness fields dissect test, mixed field order and scaling >>> class testFrame3(SignalPacket): ... fields_desc = [ ... SignalField("myMuxer", default=0, start=53, size=3, scaling=0.1, fmt=">> pkt = testFrame3(b'\x1d\x28\x80\x1c\x0f\x23\xe0') >>> assert len(pkt) == 7 >>> assert pkt.myMuxer == 0.7 >>> assert pkt.muxSig5 == 1.14 >>> assert pkt.muxSig6 == 0x10f << 1 >>> assert pkt.muxSig7 == 82.5 >>> assert pkt.muxSig8 == 30 >>> assert pkt.muxSig9 == 1700 ###(051)=[passed] Packet with mixed endianness fields dissect test, mixed field order and scaling and offset >>> class testFrame3(SignalPacket): ... fields_desc = [ ... SignalField("myMuxer", default=0, start=53, size=3, scaling=0.1, offset=5, fmt=">> pkt = testFrame3(b'\x1d\x28\x80\x1c\x0f\x23\xe0') >>> assert len(pkt) == 7 >>> assert pkt.myMuxer == 5.7 >>> assert pkt.muxSig5 == 1.14 >>> assert pkt.muxSig6 == 532 >>> assert pkt.muxSig7 == 82.6 >>> assert pkt.muxSig8 == 130 >>> assert pkt.muxSig9 == 1701 ###(052)=[passed] Packet with mixed endianness fields dissect test, mixed field order and scaling and offset >>> class testFrame3(SignalPacket): ... fields_desc = [ ... LEUnsignedSignalField("myMuxer", default=0, start=53, size=3, scaling=0.1, offset=5), ... LEUnsignedSignalField("muxSig9", default=0, start=41, size=7, scaling=100, offset=1), ... LEUnsignedSignalField("muxSig6", default=0, start=32, size=9, scaling=2, offset=-10), ... BEUnsignedSignalField("muxSig7", default=0, start=2, size=8, scaling=0.5, offset=0.1), ... LEUnsignedSignalField("muxSig8", default=0, start=3, size=3, scaling=10, offset=100), ... LEUnsignedSignalField("muxSig5", default=0, start=22, size=7, scaling=0.01), ... ] ... >>> pkt = testFrame3(b'\x1d\x28\x80\x1c\x0f\x23\xe0') >>> assert len(pkt) == 7 >>> assert pkt.myMuxer == 5.7 >>> assert pkt.muxSig5 == 1.14 >>> assert pkt.muxSig6 == 532 >>> assert pkt.muxSig7 == 82.6 >>> assert pkt.muxSig8 == 130 >>> assert pkt.muxSig9 == 1701 ###(053)=[passed] Packet with mixed endianness fields dissect test, mixed field order and scaling with signed values >>> class testFrame3(SignalPacket): ... fields_desc = [ ... SignalField("myMuxer", default=0, start=53, size=3, scaling=0.1, fmt=">> pkt = testFrame3(b'\x1d\x28\x80\x1c\x0f\x23\xe0') >>> assert len(pkt) == 7 >>> assert pkt.myMuxer == 0.7 >>> assert pkt.muxSig5 == -0.14 >>> assert pkt.muxSig6 == 0x10f << 1 >>> assert pkt.muxSig7 == -45.5 >>> assert pkt.muxSig8 == 30 >>> assert pkt.muxSig9 == 1700 ###(054)=[passed] Packet with mixed endianness fields dissect test, mixed field order and scaling with signed values >>> class testFrame3(SignalPacket): ... fields_desc = [ ... LEUnsignedSignalField("myMuxer", default=0, start=53, size=3, scaling=0.1), ... LEUnsignedSignalField("muxSig9", default=0, start=41, size=7, scaling=100), ... LEUnsignedSignalField("muxSig6", default=0, start=32, size=9, scaling=2), ... BESignedSignalField("muxSig7", default=0, start=2, size=8, scaling=0.5), ... LESignedSignalField("muxSig8", default=0, start=3, size=3, scaling=10), ... LESignedSignalField("muxSig5", default=0, start=22, size=7, scaling=0.01), ... ] ... >>> pkt = testFrame3(b'\x1d\x28\x80\x1c\x0f\x23\xe0') >>> assert len(pkt) == 7 >>> assert pkt.myMuxer == 0.7 >>> assert pkt.muxSig5 == -0.14 >>> assert pkt.muxSig6 == 0x10f << 1 >>> assert pkt.muxSig7 == -45.5 >>> assert pkt.muxSig8 == 30 >>> assert pkt.muxSig9 == 1700 ###(055)=[passed] Packet with big endianness signals >>> class testFrame4(SignalPacket): ... fields_desc = [ ... SignalField("sig0", default=0, start=1, size=2, fmt=">B"), ... SignalField("sig1", default=0, start=7, size=6, fmt=">B"), ... SignalField("sig2", default=0, start=15, size=11, fmt=">B"), ... SignalField("sig3", default=0, start=20, size=12, fmt=">B"), ... SignalField("sig4", default=0, start=24, size=9, fmt=">B"), ... SignalField("sig5", default=0, start=50, size=3, fmt=">B"), ... SignalField("sig6", default=0, start=53, size=3, fmt=">B"), ... SignalField("sig7", default=0, start=47, size=10, fmt=">B"), ... SignalField("sig8", default=0, start=58, size=3, fmt=">B"), ... SignalField("sig9", default=0, start=61, size=3, fmt=">B"), ... SignalField("sig10", default=0, start=63, size=2, fmt=">B") ... ] ... >>> pkt = testFrame4() >>> >>> pkt.sig0 = 1 >>> pkt.sig1 = 35 >>> pkt.sig2 = 0 >>> pkt.sig3 = 2048 >>> pkt.sig4 = 256 >>> pkt.sig5 = 1 >>> pkt.sig6 = 0 >>> pkt.sig7 = 520 >>> pkt.sig8 = 0 >>> pkt.sig9 = 0 >>> pkt.sig10 = 0 >>> >>> assert bytes(pkt) == b'\x8d\x00\x10\x01\x00\x82\x01\x00' ###(056)=[passed] Packet with little endianness signals >>> class testFrame5(SignalPacket): ... fields_desc = [ ... SignalField("secSig1", default=0, start=60, size=2, fmt=">> pkt = testFrame5() >>> >>> pkt.secSig1 = 0 >>> pkt.secSig2 = 0 >>> pkt.secSig3 = 0 >>> pkt.secSig4 = 2 >>> pkt.secSig5 = 0 >>> pkt.secSig6 = 0 >>> pkt.secSig7 = 0 >>> pkt.secSig8 = 3 >>> pkt.secSig9 = 1 >>> pkt.secSig10 = 1280 >>> pkt.secSig11 = -144 >>> pkt.secSig12 = 12 >>> >>> assert bytes(pkt) == b'\x0c\x00\x05p\x03\x00\x10\x83' ###(057)=[passed] Packet with float signals build test >>> class testFrame6(SignalPacket): ... fields_desc = [ ... SignalField("floatSignal2", default=0, start=32, size=32, fmt=">> pkt = testFrame6() >>> >>> pkt.floatSignal1 = 5.424999835668132e-05 >>> pkt.floatSignal2 = 6.176799774169922 >>> >>> assert bytes(pkt) == b'8c\x8a~X\xa8\xc5@' ###(058)=[passed] Packet with float signals dissect test >>> pkt = testFrame6(b'8c\x8a~X\xa8\xc5@') >>> >>> assert pkt.floatSignal1 == 5.424999835668132e-05 >>> assert pkt.floatSignal2 == 6.176799774169922 ###(059)=[passed] Packet with float signals build test 2 >>> class testFrame6(SignalPacket): ... fields_desc = [ ... LEFloatSignalField("floatSignal2", default=0, start=32), ... BEFloatSignalField("floatSignal1", default=0, start=7) ... ] ... >>> pkt = testFrame6() >>> >>> pkt.floatSignal1 = 5.424999835668132e-05 >>> pkt.floatSignal2 = 6.176799774169922 >>> >>> assert bytes(pkt) == b'8c\x8a~X\xa8\xc5@' ###(060)=[passed] Packet with float signals dissect test 2 >>> pkt = testFrame6(b'8c\x8a~X\xa8\xc5@') >>> >>> assert pkt.floatSignal1 == 5.424999835668132e-05 >>> assert pkt.floatSignal2 == 6.176799774169922 ###(061)=[passed] Packet with float signals randval >>> assert pkt.fields_desc[0].randval() != 6.176799774169922 >>> assert pkt.fields_desc[1].randval() != 5.424999835668132e-05 ###(062)=[passed] Packet with float signals fuzz >>> pkt = testFrame6() >>> >>> f = fuzz(pkt) >>> assert bytes(f) != bytes(f) ###(063)=[passed] Test signal fuzzing offset 1 >>> test_offset = 100 >>> >>> class testFrame3(SignalPacket): ... fields_desc = [ ... BEUnsignedSignalField("muxSig7", default=0, start=2, size=8, scaling=1, offset=test_offset), ... ] ... >>> pkt = testFrame3() >>> pkt = fuzz(pkt) >>> >>> li = [pkt.muxSig7._fix() for x in range(100000)] >>> >>> assert abs(round(sum(li) / len(li)) - 128 - test_offset) < 2 ###(064)=[passed] Test signal fuzzing offset 2 and scaling >>> test_offset = 100 >>> >>> class testFrame3(SignalPacket): ... fields_desc = [ ... BEUnsignedSignalField("muxSig7", default=0, start=2, size=8, scaling=0.1, offset=test_offset), ... ] ... >>> pkt = testFrame3() >>> pkt = fuzz(pkt) >>> >>> li = [pkt.muxSig7._fix() for x in range(100000)] >>> >>> assert abs(round(sum(li) / len(li)) - 12.8 - test_offset) < 2 ###(065)=[passed] Test signal fuzzing offset 3 >>> test_offset = -100 >>> >>> class testFrame3(SignalPacket): ... fields_desc = [ ... BESignedSignalField("muxSig7", default=0, start=2, size=8, scaling=1, offset=test_offset), ... ] ... >>> pkt = testFrame3() >>> pkt = fuzz(pkt) >>> >>> li = [pkt.muxSig7._fix() for x in range(100000)] >>> >>> assert abs(round(sum(li) / len(li)) - test_offset) < 2 ###(066)=[passed] Test signal fuzzing offset 4 and scaling >>> test_offset = 10 >>> >>> class testFrame3(SignalPacket): ... fields_desc = [ ... LESignedSignalField("muxSig7", default=0, start=2, size=8, scaling=10, offset=test_offset), ... ] ... >>> pkt = testFrame3() >>> pkt = fuzz(pkt) >>> >>> li = [pkt.muxSig7._fix() for x in range(100000)] >>> >>> assert abs(round(sum(li) / len(li)) - test_offset) < 20 ###(067)=[passed] Test signal fuzzing offset 5 and scaling >>> test_offset = 10 >>> >>> class testFrame3(SignalPacket): ... fields_desc = [ ... BESignedSignalField("muxSig7", default=0, start=2, size=8, scaling=0.271, offset=test_offset), ... ] ... >>> pkt = testFrame3() >>> pkt = fuzz(pkt) >>> >>> li = [pkt.muxSig7._fix() for x in range(100000)] >>> >>> assert abs(round(sum(li) / len(li)) - test_offset) < 2 ###(068)=[passed] Test FloatSignal fuzzing 1 >>> class testFrame3(SignalPacket): ... fields_desc = [ ... BEFloatSignalField("muxSig7", default=0, start=7), ... ] ... >>> pkt = testFrame3() >>> pkt = fuzz(pkt) >>> >>> testlen = 10000 >>> >>> li = [pkt.muxSig7._fix() for x in range(testlen)] >>> gz = [x for x in li if math.isnan(x) == False and x >= 0] >>> lz = [x for x in li if math.isnan(x) == False and x < 0] >>> nan = [x for x in li if math.isnan(x)] >>> >>> assert len(nan) >= 0 >>> assert abs(len(gz) - len(lz)) < (testlen // 10) ###### ## SECOC CANFD ###### ###(069)=[passed] Load SecOC_CANFD >>> load_contrib("automotive.autosar.secoc_canfd", globals_dict=globals()) ###(070)=[passed] Test SecOC_CANFD build >>> pkt = SecOC_CANFD(identifier=0x123, pdu_payload=bytes.fromhex("1122334455667788AABBCCDDEEFF0011")) >>> pkt.show2() ###[ CANFD ]### flags = identifier= 0x123 length = 20 fd_flags = fd_frame reserved = 0 data = b'\x11"3DUfw\x88\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x00\x00\x00\x00' >>> canfd = CANFD(bytes(pkt)) >>> canfd.show2() ###[ CANFD ]### flags = identifier= 0x123 length = 20 fd_flags = fd_frame reserved = 0 data = b'\x11"3DUfw\x88\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x00\x00\x00\x00' >>> pkt = SecOC_CANFD(bytes(pkt)) >>> >>> assert pkt.identifier == canfd.identifier >>> assert pkt.data == canfd.data >>> assert pkt.length == canfd.length >>> >>> SecOC_CANFD.register_secoc_protected_pdu(0x123) >>> >>> pkt = CANFD(identifier=0x123, data=bytes.fromhex("1122334455667788AABBCCDDEEFF001122334455")) >>> canfd = CANFD(bytes(pkt)) >>> canfd.show2() ###[ CANFD ]### flags = identifier= 0x123 length = 20 fd_flags = fd_frame reserved = 0 data = b'\x11"3DUfw\x88\xaa\xbb\xcc\xdd\xee\xff\x00\x11"3DU' >>> pkt = SecOC_CANFD(bytes(pkt)) >>> pkt.show2() ###[ SecOC_CANFD ]### flags = identifier= 0x123 length = 20 fd_flags = fd_frame reserved = 0 \pdu_payload\ |###[ Raw ]### | load = b'\x11"3DUfw\x88\xaa\xbb\xcc\xdd\xee\xff\x00\x11' tfv = 0x22 tmac = 334455 >>> >>> assert pkt.identifier == canfd.identifier >>> assert bytes(pkt.pdu_payload) == bytes(canfd.data)[:-4] >>> assert pkt.length == canfd.length >>> assert pkt.tfv == 0x22 >>> assert pkt.tmac == b"\x33\x44\x55" >>> >>> pkt.secoc_authenticate() >>> >>> assert pkt.tfv == 0 >>> assert pkt.tmac != b"\x33\x44\x55" >>> >>> if conf.crypto_valid: ... from cryptography.hazmat.primitives import cmac ... from cryptography.hazmat.primitives.ciphers import algorithms ... c = cmac.CMAC(algorithms.AES128(b"\x00" * 16)) ... c.update(bytes.fromhex("1122334455667788AABBCCDDEEFF0011") + bytes.fromhex("00000000")) ... mac = c.finalize() ... assert pkt.tmac == mac[:3] ... Same as in dcerpc.rst ━ Run at 01:42:10 from [test/scapy/layers/dcerpc.uts] by UTscapy in 1.792107105255127 └ Passed=54 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the DCE/RPC layer >>> import re >>> from scapy.layers.dcerpc import * >>> from uuid import UUID >>> >>> conf.debug_dissector = 2 ###### ## Check EField ###### ###(001)=[passed] Little Endian IntField getfield >>> f = EField(IntField('f', 0), '<') >>> f.getfield(None, hex_bytes('0102030405')) == (b'\x05', 0x04030201) True ###(002)=[passed] Little Endian IntField addfield >>> f = EField(IntField('f', 0), '<') >>> f.addfield(None, b'\x01', 0x05040302) == hex_bytes('0102030405') True ###(003)=[passed] Big Endian IntField getfield >>> f = EField(IntField('f', 0), '>') >>> f.getfield(None, hex_bytes('0102030405')) == (b'\x05', 0x01020304) True ###(004)=[passed] Big Endian IntField addfield >>> f = EField(IntField('f', 0), '>') >>> f.addfield(None, b'\x01', 0x02030405) == hex_bytes('0102030405') True ###(005)=[passed] Little Endian StrField getfield >>> f = EField(StrField('f', 0), '<') >>> f.getfield(None, '0102030405') == (b'', '0102030405') True ###(006)=[passed] Little Endian StrField addfield >>> f = EField(StrField('f', 0), '<') >>> f.addfield(None, b'01', '02030405') == b'0102030405' True ###(007)=[passed] Big Endian StrField getfield >>> f = EField(StrField('f', 0), '>') >>> f.getfield(None, '0102030405') == (b'', '0102030405') True ###(008)=[passed] Big Endian StrField addfield >>> f = EField(StrField('f', 0), '>') >>> f.addfield(None, b'01', '02030405') == b'0102030405' True ###(009)=[passed] Little Endian UUIDField getfield The endianness of a UUIDField should be apply by block on each block in parenthesis '(01234567)-(89ab)-(cdef)-(01)(23)-(45)(67)(89)(ab)(cd)(ef)' >>> f = EField(UUIDField('f', None), '<') >>> f.getfield(None, hex_bytes('0123456789abcdef0123456789abcdef')) == (b'', UUID('67452301-ab89-efcd-0123-456789abcdef')) True ###(010)=[passed] Little Endian UUIDField addfield >>> f = EField(UUIDField('f', '01234567-89ab-cdef-0123-456789abcdef'), '<') >>> f.addfield(None, b'', f.default) == hex_bytes('67452301ab89efcd0123456789abcdef') True ###(011)=[passed] Big Endian UUIDField getfield >>> f = EField(UUIDField('f', None), '>') >>> f.getfield(None, hex_bytes('0123456789abcdef0123456789abcdef')) == (b'', UUID('01234567-89ab-cdef-0123456789abcdef')) True ###(012)=[passed] Big Endian UUIDField addfield >>> f = EField(UUIDField('f', '01234567-89ab-cdef-0123-456789abcdef'), '>') >>> f.addfield(None, b'', f.default) == hex_bytes('0123456789abcdef0123456789abcdef') True ###### ## DCE/RPC v5 ###### ###(013)=[passed] Dissect DCE/RPC v5 Request with Kerberos GSSAPI/RFC1964 >>> pkt = DceRpc(b"\x05\x00\x00\x03\x10\x00\x00\x00\xcd\x00-\x00\x01\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00j\x87\xb4\xa8DrE3\xfa\xc1\x1d\x9e\xb7\x8a_\xffr\xbe\x13\xc4<\x85\xf0\xf2'y\x84t%u|e\xef/\x04\xb0m\x98\xb1\xd2\x00KwW#P\x8f2\xecB\x81\x19\xf3g\xd2o[\x07L-\xb8\x89\x05\xcf?\xcf\t\xeb\xb3&&6\xb7\x84\xb6\xcd8Ao\x8c\x94\xca\x03\xe3\x0e\x86'-\xfaHj\xcez\xf0A\x83\x9dX\r\xe8\x96\x07Bs\xaf\x9c[=2\x9eS\xb1\x18\x84 \xb4y\n9\xdf\x92\x1c\xd8\xe2e\xd3^,\t\x06\x08\x00pj\x8f\x04`+\x06\t*\x86H\x86\xf7\x12\x01\x02\x02\x02\x01\x11\x00\x10\x00\xff\xffp\xc0\\m\xfe\xa4\xe1!\xf7\xdf\xbf\xa4\xad\xdf\xcb\x16\x1e\xb5+{\x97\xaf\xd5~") >>> assert pkt.auth_verifier.auth_type == 9 >>> pkt.show() ###[ DCE/RPC v5 ]### rpc_vers = 5 (connection-oriented) rpc_vers_minor= 0 ptype = request pfc_flags = PFC_FIRST_FRAG+PFC_LAST_FRAG endian = little encoding = ASCII float = IEEE reserved1 = 0 reserved2 = 0 frag_len = 205 auth_len = 45 call_id = 1 \auth_verifier\ |###[ Common Authentication Verifier ]### | auth_type = GSS_NEGOTIATE | auth_level= PKT_PRIVACY | auth_pad_length= 8 | auth_reserved= 0 | auth_context_id= 0x48f6a70 | \auth_value\ | |###[ GSSAPI_BLOB_SIGNATURE ]### | | MechType = | | \innerToken\ | | |###[ Kerberos v5 InnerToken ]### | | | TOK_ID = b'\x02\x01' (GSS_Wrap-RFC1964) | | | \root \ | | | |###[ Kerberos v5 GSS_Wrap (RFC1964) ]### | | | | SGN_ALG = HMAC | | | | SEAL_ALG = RC4 | | | | Filler = 0xffff | | | | SND_SEQ = 70c05c6dfea4e121 | | | | SGN_CKSUM = f7dfbfa4addfcb16 | | | | CONFOUNDER= 1eb52b7b97afd57e auth_padding= b'\x92\x1c\xd8\xe2e\xd3^,' vt_trailer= None ###[ DCE/RPC v5 - Request ]### alloc_hint= 120 cont_id = 0 opnum = 0 ###[ Raw ]### load = b"j\x87\xb4\xa8DrE3\xfa\xc1\x1d\x9e\xb7\x8a_\xffr\xbe\x13\xc4<\x85\xf0\xf2'y\x84t%u|e\xef/\x04\xb0m\x98\xb1\xd2\x00KwW#P\x8f2\xecB\x81\x19\xf3g\xd2o[\x07L-\xb8\x89\x05\xcf?\xcf\t\xeb\xb3&&6\xb7\x84\xb6\xcd8Ao\x8c\x94\xca\x03\xe3\x0e\x86'-\xfaHj\xcez\xf0A\x83\x9dX\r\xe8\x96\x07Bs\xaf\x9c[=2\x9eS\xb1\x18\x84 \xb4y\n9\xdf" >>> assert pkt.auth_verifier.auth_value.MechType.oidname == 'Kerberos 5' >>> assert isinstance(pkt.auth_verifier.auth_value.innerToken, KRB_InnerToken) >>> assert DceRpc5Request in pkt >>> assert pkt[DceRpc5Request].alloc_hint == 120 >>> assert pkt[DceRpc5Request].opnum == 0 ###(014)=[passed] Dissect DCE/RPC v5 Request EPM map request >>> pkt = Ether(b'\x00\x0c)\xe1\xde{\x00\x0c)\x05\xe0\xd9\x08\x00E\x00\x00\xc4"\x92@\x00\x80\x06\xb3\x86\n\x01\x0f\x19\n\x01\x01\x01\x05=\x00\x87\x1e\x1b\x8f\x12\x02\x8ee\x19P\x18\xff\xb7 ^\x00\x00\x05\x00\x00\x03\x10\x00\x00\x00\x9c\x00\x00\x00\x01\x00\x00\x00\x84\x00\x00\x00\x00\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00K\x00\x00\x00K\x00\x00\x00\x05\x00\x13\x00\r5BQ\xe3\x06K\xd1\x11\xab\x04\x00\xc0O\xc2\xdc\xd2\x04\x00\x02\x00\x00\x00\x13\x00\r\x04]\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00+\x10H`\x02\x00\x02\x00\x00\x00\x01\x00\x0b\x02\x00\x00\x00\x01\x00\x07\x02\x00\x00\x87\x01\x00\t\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00') >>> assert pkt.auth_verifier is None >>> assert pkt[DceRpc5Request].alloc_hint == 132 >>> assert pkt[DceRpc5Request].opnum == 3 ###(015)=[passed] Dissect DCE/RPC v5 Bind request with NETLOGON secure channel >>> pkt = DceRpc(b'\x05\x00\x0b\x07\x10\x00\x00\x00\xe4\x00(\x00\x02\x00\x00\x00\xd0\x16\xd0\x16\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x01\x00xV4\x124\x12\xcd\xab\xef\x00\x01#Eg\xcf\xfb\x01\x00\x00\x00\x04]\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00+\x10H`\x02\x00\x00\x00\x01\x00\x01\x00xV4\x124\x12\xcd\xab\xef\x00\x01#Eg\xcf\xfb\x01\x00\x00\x003\x05qq\xba\xbe7I\x83\x19\xb5\xdb\xef\x9c\xcc6\x01\x00\x00\x00\x02\x00\x01\x00xV4\x124\x12\xcd\xab\xef\x00\x01#Eg\xcf\xfb\x01\x00\x00\x00,\x1c\xb7l\x12\x98@E\x03\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00D\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00\x00\x00DOMAIN\x00WIN1\x00\x06domain\x05local\x00\x04WIN1\x00') >>> >>> assert pkt.auth_verifier.auth_value.NetbiosDomainName == b"DOMAIN" >>> assert pkt.auth_verifier.auth_value.DnsDomainName == b"domain.local." >>> >>> assert pkt.n_context_elem == 3 >>> assert pkt[DceRpc5Bind].context_elem[0].transfer_syntaxes[0].sprintf("%if_uuid%") == 'NDR 2.0' >>> assert pkt[DceRpc5Bind].context_elem[1].transfer_syntaxes[0].sprintf("%if_uuid%") == 'NDR64' >>> assert pkt[DceRpc5Bind].context_elem[2].transfer_syntaxes[0].sprintf("%if_uuid%") == 'Bind Time Feature Negotiation' ###(016)=[passed] Dissect DCE/RPC v5 Bind Response with NETLOGON secure channel >>> pkt = DceRpc(b'\x05\x00\x0c\x07\x10\x00\x00\x00\x80\x00\x0c\x00\x02\x00\x00\x00\xd0\x16\xd0\x16=F\x00\x00\x06\x0049676\x00\x03\x00\x00\x00\x02\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003\x05qq\xba\xbe7I\x83\x19\xb5\xdb\xef\x9c\xcc6\x01\x00\x00\x00\x03\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00D\x06\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert pkt[DceRpc5BindAck].sec_addr.port_spec == b'49676\x00' >>> assert pkt[DceRpc5BindAck].results[1].result == 0 >>> assert pkt[DceRpc5BindAck].results[1].transfer_syntax.sprintf("%if_uuid%") == 'NDR64' ###(017)=[passed] Dissect DCE/RPC v5 Response with NETLOGON secure channel >>> pkt = DceRpc(b'\x05\x00\x02\x03\x10\x00\x00\x00\x98\x038\x00\x02\x00\x00\x004\x03\x00\x00\x01\x00\x00\x00\x88\xd6k\xac\xab^\xafqA^\xee\x8e\xce\x16\x86i\xe5A\xafK#\xeb%\'l\x88\xd4A\x0f\xa6>\xaf\xed\xf65\xf0\xf9\xf25\x89\xf5\xc5r\xe6;t\xf5\x80 \x80~\xf6\x0cRQ\x0b\xea\xc2}\x8a>\x08\xc9\x04\x9c\xdcOj\xa3\x0c\x82~\xfe\xa6\xa3\x01^ \xee\xd3\xd2yf\xfa\xfbL\xec&\x8b60\xb9\x83j\x84\xa0\xbc*G\xe25\x1a\r\xf3\xc8\xa6ib9\x87\xcbt%\x17\xf8g\x17\x1cIR\xd5\'wW\xbedZbXv\xb7\xe5?#$(\xae\x06\x9e\xce\xe1K\xd9\'\x9fG\xde\xff\xc9j\xd7\xa4\x04\xcb]-\xbcr\xb9+\xdax\xee\xa3\xce\x9c\x15\x0c/\xb2\xcb\xaaF\t\x07/AQM\x18t\xdc\xea\x019\x11TOy\xf7\x7f\xd1\x87\xc7m\xea>\x84Y\xc3\xef\xd0\xa6e\xb0g\xc3\x12\xd9\xc4~$\xb8\xfc/0\x86\x0e0\x8c`5lU\xd1\xbf8\xd2\xcb\xb1%\xfa\xfabr\x10\x9a\xf8\xb7\xb1\x01$wU\x17r\x03Z\xdc\xdd^\xecU\xc1\xf1\x87\xad\xa1\xea\xd8\xf2\x82\xa8\x95\xd4\xd2\xc6\x8e\xf1\xcfN1k\xdc\xc3\xf7o]q\'a\xa3Y\r97\xfe.8O\xf9\xa7\x93\xd3\x99?K\x8bv.\xac=t\r\xba\xca\xd0\x82\xd8\x81\xaf\xe6cv\xbe\xcbN\x93\x9d\x0e\xd4\x119d\x83/u\xc8\xb2\x1c/q\xf0"\xc4\x04\xadB\xe3N\xed\xbbR\xc4yO\x1fQ\xdd}\xd2\xe3c\x1e\xec\xc7\xc4\xf8\xf6OV\xe5\x00*\xb0\t\xbd\xf0\xe5j\xbf\xa3\xe0\x85\xa0\x81\xc6\xb96\xb9\xec\xd7I\x16_\xe7K\xb2D\xad\xb5\x7fG\xb9\x9by\xe2\xd9\xcf\xe7J\x83Y-\xa7:\xa3\x16\xe7\xce\xf9\xf5\xeb\x88z&Je\xcb\x94\'\xdc?\xbf\xed!\x1a\xb3sI\xb5o\x00\x8dJ\xd9\xed\x160+\x11nD\xd0QIo]A\xc0\x89\xa8\xb2\xc9\xb6\xc7,\xf0V\x8a\xae\xa6\x97\x8e\x91tO\x8c\x94\x08\xf1ru\x87e\x0bq6\x8aZ\xb9\xf3\xb7\xbb\xaf;\x89\xdf\x8b\xbf\tA\xef\xe3\x07\x0fT\xed\xbb\x072\x8eQ\xf4\xce\x194A\\w\xb4\x88\xff[\xcf\x91N\x1b\xfb\xe3\xcb~\xe9\xfc\x195\x0f&96\x05\x9a\xe4\xc0~\xd9\x0b\xfd\xbc\xc9\x8fTXY\x9f\xe4\x87e!\x93$$\x0b\xfc\xe7Jm8\x18\xb5\xad\xff\x85\xc3\xe2%\xd5{\x8bs\xa7\xb0\x1e\x0ei>> assert pkt.auth_verifier.auth_value.sprintf("%SignatureAlgorithm%") == 'HMAC-SHA256' >>> assert pkt.auth_verifier.auth_value.SequenceNumber == b'\xd2\xd27\xc2sC\xc4"' >>> assert len(pkt.load) == pkt.alloc_hint >>> assert len(pkt.auth_padding) == pkt.auth_verifier.auth_pad_length >>> assert pkt.alloc_hint == 820 ###(018)=[passed] Build and dissect DCE/RPC with auth_pad >>> pkt = DceRpc(b'\x05\x00\x00\x03\x10\x00\x00\x00\xa8\x038\x00\x03\x00\x00\x00L\x03\x00\x00\x01\x000\x00C\x00\x8e\xa5mX*\xf4\xaa\x0c\xfd\xf3\x182\xbe\x96\xbe\xfa\xad%\xa4\x85\x10nz\xa1t\xe5\xd7&Vl\xcd8X,\x82\xb4:D\x8ff\x9ft\x07\xa9W\x01#\x92t~\x15\xf0\n\xa7|\xae\xe3\xe6\xf6(J\x80\'\'\xc5\xe0\x9cm[\\\x94\x9at\x14\xf3\x03qFV:\xd5\xd6\xa5\x85\x12\x1e\xd6\x81\xa4#\xe1\x80\xf4r\x82\x82]\xb1\xddK!\x0b\xba\xf6\x9e\xa9\xc7\xd0\x16^\xaa\x9e\xe5\xb8\x9c\xf2M\x00\xebZ\xdb\xe4\xe8\xeb\x01\x1e\x90\xd4hE\x04\xd9\xc5\xb7\x8eL7\x0c\x058u\xd2\xdf\x91DJ\x0c;\xb8\x80\x84\xe0J\x8f\xcc\xa5TR\xd4\xf8\x16Xd\x93\x1a\x8a\xa4=\x96\xc7\x97\xado\xdb\x8b5\x8e\x0f\xc8\xa9\x93\xdd\xa2\xa0\xc54\xea\x0c4b\x8a\xb0r.\xeb=o8\xe3\xd4\x1d\xe4o\x83Pf_GJU\x9d&\xdf\x1c\xa2\xfd,\xcd\xd4\xbe\\Hh\x17\xbe\x02\xc5\xa0\xd53(\xc9\xbbI\xbd\x1e\xf1\xb0\xe5|\x1d\x03\xc0\xab\xae\'NU\xf2\xc5\xc5\xfe\xabs\x8c\xc2-\x04\xd9\xac|\xb0\xf4\xd9\x00\x8b\xa8\x1d+\x01[\x98\xc9\x98L\x9a\xd464\xe0\x02\x07F\xff\xa1t\xa0VQX\xb9\xfa\xcdg\xed\x87\x8e\xe3\xceh\x9f\xd3:`}z\xb0\n\xdc\xeb=\x1a\x98\x06\xcb,\xba\x18\xa3>\xfc\xc2\x9d\x95\xd4\x83\xba"\x80\xee7^\xda\x02\x8b\x01\'\xe5e\x18\xa9}i\xbe\x86\xf4\x93\x9c\xe6\xe5\xf3\xd2\xa8\x8dH\\\x14\x89+yc\xa7kZ\x80\xe0\xb1\xc3\xd1\xa5\x8a9\xd9\xe7\x8d\xfd\x90\x04B\xce0\xeaK\xa1\xbc\xc1*\x8a\xfd*oX\xa0\x8b\x04D\xbc\x87\xacH\x97\x89\x85\xb2b\xf4F\xa2\xf1m\x06\xfe\x01\xd2\xcbT\x01+\x89<\x05q0ibL\x99[C\xeb\xcfx#i4\x8b\xbb\xb5ZP\x12?\x8b\xa5\x0e\x91"@aJ\t\t\x86\xa5*\t\xbf\x01Q\xa5\x85y\xad\xc0\xa7\xb2l5R\xd4\x85\xf4\xab\n\t\rJb\xf2\x875\xfcL\x16\xb0e\x17\xe1\xdc<\xd1\xee\x86\x01\xefHD\x1eb\xd1\xd1\xbby\xd41\xb7#\xef$DN\xda)\x8f\xb9\xffEa\xfe\xd8C\xb9\xff}\x85ra\xca\xec\xe1\xf6\x99\t\xa1\xc9H\x97\xd7\xc2\xa7\xbbW_\x1a\x92\xed\xb7\xde\xba*\r\x1e%h\xbdu)/\xd8m\xc0\xa9\xfb\xa1\xb5\xa3\xc3\x81\x18\xcd6\xd8t\x06\xa7\xd8\x84\xf5\x80\xb3\xaaX&\x8a\x7fPZ\x04\xcbsn.,b\xdfW\xd0\x7f\xc5\xc90 \x95S\x13*42R\x16fY\xeb\xd2\x05\xbd\x18Wm\xc0\xa1\x9dpYk\xaa\xd9\xd9+\x030\x9a\xe4IMlbfL\x81\xef[H]\xc6:\x88\x9cjE\x11\xce%\xd6\xe2<\x7f\xaaDO\x06\xaf\x13g&FX\x05\x90\xefl\x14\x12P;\xdc\xe7N\x0fU1C\xd1u#\xca\xf9\x12\xe6\xf7\x1bT\x17z\x97\xf2\xf5GH\xe3e\xbe\xe0\xeb?\xc2u\x9e#\x1c\xed\xcf7\x04c\x14\x90\xfc\x07\x1b\xedX\x1a\xd4\xbf\x96T\xee\xe7\x01^@\xcfSG\xd5\x899\x01\xf9\xc3\xf3(\xc2?^\xcd[,\xd85*\xdd\xab\xb6t\xc7p\xc4\xd3\x95\x9d\x02 \x9a^\x81\xb1.y\x9d\xc8\xe7\xb46\xfc\xc7,\x9fI\x03\\R\x83Y3+\xa7\x1f\x00\xd0\x16J\x10\x9a\xc5\'9)\xab\x93\x05\xd7\xb6\x12\xde \r\xc5b\x8bKo36\xfej\xa7\t\xd1{}a\x7f\xa4\xc3\xdc\xaaA\xe5\xe3\x91Uzw\xb2w\xee^\xcd\xd0i\xb7\xc0\xff`D\x06\x04\x00\x00\x00\x00\x00\x13\x00\x1a\x00\xff\xff\x00\x00\xb6\xb0D"\x11h\x92_\xe2 +\x06b%\x7f\xf5\x87O\x00\x08\x81\ro\xcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert pkt.auth_verifier.auth_pad_length == 4 >>> >>> pkt.auth_verifier.auth_pad_length = None >>> pkt.auth_padding = None >>> pkt = DceRpc(bytes(pkt)) >>> assert pkt.auth_verifier.auth_pad_length == 4 ###(019)=[passed] Build and dissect DCE/RPC with vt_trailer >>> pkt = DceRpc(b'\x05\x00\x00\x83\x10\x00\x00\x00\x80\x00\x10\x00\x02\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00t\xc0\xd8\xcc\xe5\xd0@J\x92\xb4\xd0t\xfa\xa6\xba(\x8a\xe3\x13q\x02\xf46q\x01\x00\x04\x00\x01\x00\x00\x00\x02@(\x00t\xc0\xd8\xcc\xe5\xd0@J\x92\xb4\xd0t\xfa\xa6\xba(\x01\x00\x01\x00\x04]\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00+\x10H`\x02\x00\x00\x00\x00\x00\x00\x00\n\x05\x04\x00\x00\x00\x00\x00\x01\x00\x00\x00\xbe\x1a\xfd*\x9c\xd3R \x00\x00\x00\x00') >>> >>> assert pkt.auth_padding == b"\x00\x00\x00\x00" >>> assert len(pkt.vt_trailer.commands) == 2 >>> assert pkt.vt_trailer.commands[0].sprintf("%Command%") == "SEC_VT_COMMAND_BITMASK_1" >>> assert pkt.vt_trailer.commands[0].bits == 1 >>> assert pkt.vt_trailer.commands[1].sprintf("%Command%") == "SEC_VT_COMMAND_PCONTEXT" >>> assert pkt.vt_trailer.commands[1].InterfaceId == pkt[DceRpc5Request].object >>> assert pkt.vt_trailer.commands[1].Version == 0x10001 >>> assert DCE_RPC_TRANSFER_SYNTAXES[pkt.vt_trailer.commands[1].TransferSyntax] == "NDR 2.0" >>> assert pkt.vt_trailer.commands[1].TransferVersion == 2 >>> >>> pkt.auth_padding = None >>> pkt.auth_verifier.auth_pad_length = None >>> pkt = DceRpc(bytes(pkt)) >>> assert pkt.auth_padding == b"\x00\x00\x00\x00" >>> assert pkt.auth_verifier.auth_pad_length == 4 >>> assert pkt.vt_trailer.commands[1].TransferVersion == 2 ###(020)=[passed] Dissect DCE/RPC containing two fragments: Auth3 and a Request >>> pkt = DceRpc(b'\x05\x00\x10\x07\x10\x00\x00\x00\xe2\x01\xc6\x01\x02\x00\x00\x00\xd0\x16\xd0\x16\n\x05\x00\x00\x00\x00\x00\x00NTLMSSP\x00\x03\x00\x00\x00\x18\x00\x18\x00z\x00\x00\x00$\x01$\x01\x92\x00\x00\x00\x0c\x00\x0c\x00X\x00\x00\x00\x0c\x00\x0c\x00d\x00\x00\x00\n\x00\n\x00p\x00\x00\x00\x10\x00\x10\x00\xb6\x01\x00\x00\x15\x82\x88\xe2\n\x00aJ\x00\x00\x00\x0f\x857\xcfG\xcc\x98\x029\x01\n\xedc\x18\xea\xec\xc3D\x00O\x00M\x00A\x00I\x00N\x00W\x00I\x00N\x001\x000\x00$\x00W\x00I\x00N\x001\x000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\xa4\x829p_\xa8\xdc\x15+7+\xb4\x8d\x97~\x01\x01\x00\x00\x00\x00\x00\x00\xe0\x91\xd8\xa5\x91\x82\xd9\x01\xb8/\xcf\xac\t\x1c$\xb3\x00\x00\x00\x00\x02\x00\x0c\x00D\x00O\x00M\x00A\x00I\x00N\x00\x01\x00\n\x00W\x00I\x00N\x001\x000\x00\x04\x00\x18\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\x03\x00$\x00W\x00I\x00N\x001\x000\x00.\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\x05\x00\x18\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\x07\x00\x08\x00\xe0\x91\xd8\xa5\x91\x82\xd9\x01\x06\x00\x04\x00\x06\x00\x00\x00\x08\x000\x000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00Z3!\xf8xx\x02\xa0\xcc\xcb\xa0\xbb|\xa5\x0c\xd3\x93Ib_\x8f\xa6j\xe1\x82\xd3\xec?\xaa\xae\x0e\x8a\n\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x12\x00C\x00I\x00F\x00S\x00/\x00t\x00r\x00u\x00c\x00\x00\x00\x00\x00\x00\x00\x00\x00!\xdc\xa8\xa5\x96\xd0k7\xdd\x84\xdb\x029\x1e+\x97\x05\x00\x00\x83\x10\x00\x00\x00\x80\x00\x10\x00\x02\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00t\xc0\xd8\xcc\xe5\xd0@J\x92\xb4\xd0t\xfa\xa6\xba(\x8a\xe3\x13q\x02\xf46q\x01\x00\x04\x00\x01\x00\x00\x00\x02@(\x00t\xc0\xd8\xcc\xe5\xd0@J\x92\xb4\xd0t\xfa\xa6\xba(\x01\x00\x01\x00\x04]\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00+\x10H`\x02\x00\x00\x00\x00\x00\x00\x00\n\x05\x04\x00\x00\x00\x00\x00\x01\x00\x00\x00/L\xb5\\\xfc\x83\xecF\x00\x00\x00\x00') >>> assert DceRpc5Auth3 in pkt >>> assert pkt.pad == b'\xd0\x16\xd0\x16' >>> assert pkt.auth_verifier.auth_value.UserName == "WIN10$" >>> assert pkt.auth_verifier.auth_value.NtChallengeResponse.getAv(9).Value == 'CIFS/truc' >>> >>> pkt2 = DceRpc(pkt[conf.padding_layer].load) >>> assert DceRpc5Request in pkt2 >>> assert conf.padding_layer not in pkt2 >>> assert pkt2.vt_trailer.commands[1].InterfaceId == pkt2.object ###### ## Check DCE/RPC 4 layer ###### ###(021)=[passed] DCE/RPC 4 default values >>> assert bytes(DceRpc4()) == b'\x04\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00' ###(022)=[passed] DCE/RPC 4: payload length computation >>> assert bytes(DceRpc4() / b'\x00\x01\x02\x03') == b'\x04\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x04\x00\x00\x00\x00\x00\x00\x01\x02\x03' ###(023)=[passed] DCE/RPC 4: Guess payload class fallback with no possible payload >>> p = DceRpc(hex_bytes('04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000ffffffff00040000000000010203')) DCE/RPC payload class not found or undefined (using Raw) >>> p.payload.__class__ == conf.raw_layer True ###(024)=[passed] DCE/RPC 4: Guess payload class to a registered heuristic payload A payload to be valid must implement the method can_handle and be registered to DceRpcPayload >>> from scapy.layers.dcerpc import *; import binascii, re >>> class DummyPayload(Packet): ... fields_desc = [StrField('load', '')] ... @classmethod ... def can_handle(cls, pkt, dce): ... if pkt[0] in [b'\x01', 1]: # support for py3 bytearray ... return True ... else: ... return False ... >>> DceRpc4Payload.register_possible_payload(DummyPayload) >>> p = DceRpc(hex_bytes('04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000ffffffff00040000000001020304')) >>> p.payload.__class__ == DummyPayload True ###(025)=[passed] DCE/RPC 4: Guess payload class fallback with possible payload classes >>> p = DceRpc(hex_bytes('04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000ffffffff00040000000000010203')) DCE/RPC payload class not found or undefined (using Raw) >>> p.payload.__class__ == conf.raw_layer True ###(026)=[passed] DCE/RPC 4: little-endian build >>> bytes(DceRpc4(ptype='response', endian='little', opnum=3) / b'\x00\x01\x02\x03') == hex_bytes('04020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000300ffffffff04000000000000010203') True ###(027)=[passed] DCE/RPC 4: little-endian dissection >>> p = DceRpc(hex_bytes('04020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000300ffffffff04000000000000010203')) more DCE/RPC payload class not found or undefined (using Raw) >>> p.ptype == 2 and p.opnum == 3 and p.len == 4 True ###### ## NDR tests ###### ###(028)=[passed] DCE/RPC 5 NDR: Create NDR Packet >>> class LPSHARE_INFO_1(NDRPacket): ... ALIGNMENT = (4, 8) ... fields_desc = [ ... NDRFullPointerField( ... NDRConfVarStrNullFieldUtf16("shi1_netname", ""), ... ), ... NDRIntField("shi1_type", 0), ... NDRFullPointerField( ... NDRConfVarStrNullFieldUtf16("shi1_remark", ""), ... ), ... ] ... ###(029)=[passed] DCE/RPC 5 NDR: Check user friendliness >>> pkt = LPSHARE_INFO_1(shi1_netname=b"ADMIN1$", ndr64=True) >>> val = pkt.fields['shi1_netname'] >>> assert isinstance(val, NDRPointer) >>> assert isinstance(val.value, NDRConformantArray) >>> assert isinstance(val.value.value[0], NDRVaryingArray) >>> assert val.value.value[0].value == b"ADMIN1$" ###(030)=[passed] DCE/RPC 5 NDR: Try building it >>> assert bytes(pkt) == b'\x00\x00\x02\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00A\x00D\x00M\x00I\x00N\x001\x00$\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' ###(031)=[passed] DCE/RPC 5 NDR: Re-dissect >>> z = LPSHARE_INFO_1(bytes(pkt), ndr64=True) >>> val = z.fields['shi1_netname'] >>> assert val.value.max_count == 8 >>> assert val.value.value[0].actual_count == 8 >>> assert val.value.value[0].value == b"ADMIN1$" ###(032)=[passed] DCE/RPC 5 NDR: Same thing with NDR32 >>> pkt = LPSHARE_INFO_1(shi1_netname=b"ADMIN1$", ndr64=False) >>> assert bytes(pkt) == b'\x00\x00\x02\x00\x08\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00A\x00D\x00M\x00I\x00N\x001\x00$\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> z = LPSHARE_INFO_1(bytes(pkt), ndr64=False) >>> val = z.fields['shi1_netname'] >>> assert val.value.max_count == 8 >>> assert val.value.value[0].actual_count == 8 >>> assert val.value.value[0].value == b"ADMIN1$" ###### ## Real tests on complex packets ###### ###(033)=[passed] DCE/RPC 5 NDR: Define structs >>> class LPWKSTA_USER_INFO_0(NDRPacket): ... ALIGNMENT = (4, 8) ... fields_desc = [ ... NDRFullPointerField( ... NDRConfVarStrNullFieldUtf16("wkui0_username", ""), deferred=True ... ) ... ] ... >>> >>> class LPWKSTA_USER_INFO_0_CONTAINER(NDRPacket): ... ALIGNMENT = (4, 8) ... fields_desc = [ ... NDRIntField("EntriesRead", 0), ... NDRFullPointerField( ... NDRConfPacketListField( ... "Buffer", ... [LPWKSTA_USER_INFO_0()], ... LPWKSTA_USER_INFO_0, ... count_from=lambda pkt: pkt.EntriesRead, ... ), ... deferred=True, ... ), ... ] ... >>> >>> class LPWKSTA_USER_INFO_1(NDRPacket): ... ALIGNMENT = (4, 8) ... fields_desc = [ ... NDRFullPointerField( ... NDRConfVarStrNullFieldUtf16("wkui1_username", ""), deferred=True ... ), ... NDRFullPointerField( ... NDRConfVarStrNullFieldUtf16("wkui1_logon_domain", ""), deferred=True ... ), ... NDRFullPointerField( ... NDRConfVarStrNullFieldUtf16("wkui1_oth_domains", ""), deferred=True ... ), ... NDRFullPointerField( ... NDRConfVarStrNullFieldUtf16("wkui1_logon_server", ""), deferred=True ... ), ... ] ... >>> >>> class LPWKSTA_USER_INFO_1_CONTAINER(NDRPacket): ... ALIGNMENT = (4, 8) ... fields_desc = [ ... NDRIntField("EntriesRead", 0), ... NDRFullPointerField( ... NDRConfPacketListField( ... "Buffer", ... [LPWKSTA_USER_INFO_1()], ... LPWKSTA_USER_INFO_1, ... count_from=lambda pkt: pkt.EntriesRead, ... ), ... deferred=True, ... ), ... ] ... >>> >>> class LPWKSTA_USER_ENUM_STRUCT(NDRPacket): ... ALIGNMENT = (4, 8) ... fields_desc = [ ... NDRIntField("Level", 0), ... NDRUnionField( ... [ ... ( ... NDRFullPointerField( ... NDRPacketField( ... "WkstaUserInfo", ... LPWKSTA_USER_INFO_0_CONTAINER(), ... LPWKSTA_USER_INFO_0_CONTAINER, ... ), ... deferred=True, ... ), ... ( ... (lambda pkt: getattr(pkt, "Level", None) == 0), ... (lambda _, val: val.tag == 0), ... ), ... ), ... ( ... NDRFullPointerField( ... NDRPacketField( ... "WkstaUserInfo", ... LPWKSTA_USER_INFO_1_CONTAINER(), ... LPWKSTA_USER_INFO_1_CONTAINER, ... ), ... deferred=True, ... ), ... ( ... (lambda pkt: getattr(pkt, "Level", None) == 1), ... (lambda _, val: val.tag == 1), ... ), ... ), ... ], ... StrFixedLenField("WkstaUserInfo", "", length=0), ... align=(4, 8), ... switch_fmt=("L", "L"), ... ), ... ] ... >>> >>> class NetrWkstaUserEnum_Request(NDRPacket): ... fields_desc = [ ... NDRFullPointerField(NDRConfVarStrNullFieldUtf16("ServerName", "")), ... NDRPacketField( ... "UserInfo", LPWKSTA_USER_ENUM_STRUCT(), LPWKSTA_USER_ENUM_STRUCT ... ), ... NDRIntField("PreferredMaximumLength", 0), ... NDRFullPointerField(NDRIntField("ResumeHandle", 0)), ... ] ... >>> >>> class NetrWkstaUserEnum_Response(NDRPacket): ... fields_desc = [ ... NDRPacketField( ... "UserInfo", LPWKSTA_USER_ENUM_STRUCT(), LPWKSTA_USER_ENUM_STRUCT ... ), ... NDRIntField("TotalEntries", 0), ... NDRFullPointerField(NDRIntField("ResumeHandle", 0)), ... NDRIntField("status", 0), ... ] ... ###(034)=[passed] DCE/RPC 5 NDR: Build test >>> pkt = NetrWkstaUserEnum_Request( ... ServerName="test", ... UserInfo=LPWKSTA_USER_ENUM_STRUCT( ... WkstaUserInfo=NDRUnion( ... tag=0, ... value=LPWKSTA_USER_INFO_0_CONTAINER( ... EntriesRead=1, ... Buffer=[ ... LPWKSTA_USER_INFO_0(wkui0_username="test") ... ] ... ) ... ) ... ), ... ndr64=True ... ) >>> >>> print(repr(bytes(pkt))) b'\x00\x00\x02\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00t\x00e\x00s\x00t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00t\x00e\x00s\x00t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> assert bytes(pkt) == b'\x00\x00\x02\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00t\x00e\x00s\x00t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00t\x00e\x00s\x00t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' ###(035)=[passed] DCE/RPC 5 NDR: Dissect test >>> pkt = NetrWkstaUserEnum_Request(bytes(pkt), ndr64=True) >>> pkt.ServerName ] |> |> >>> assert pkt.ServerName.value.value[0].value == b"test" >>> assert pkt.UserInfo.WkstaUserInfo.value.value.Buffer.value.value[0].wkui0_username.value.value[0].value == b"test" >>> assert pkt.PreferredMaximumLength == 0 >>> assert pkt.ResumeHandle is None ###(036)=[passed] DCE/RPC 5 NDR: Dissect packet with NDRVarStrLenField >>> from scapy.layers.msrpce.raw.ept import ept_lookup_Response >>> from scapy.layers.msrpce.ept import protocol_tower_t >>> import zlib >>> data = zlib.decompress(b'x\x9c\xed\x9dw\x9c\x13\xd5\xfa\xffg\xe9K\xdb\x05D\x8a\x94(Udq2-\x13@$uY\xb6\xb2K\x17\x81\xc9\xccd\t[\x12\x92\xb0\x14\x15dY\x90*\xbdw\x10iJG\xe9 ^T@DDl\xc0\x15\xb9(`\xa1\xd8\x81\x8b~\x93%\x08\t$\xcf\x9c3s\xff\xf9\xfd\xc8\xeb\xb5\xafA?\x9fy\xe7\xccs\xce<\xcf\xcc\x99\x12\x82\xb8\xff\xb3>\x8e ~\x8d\xbb\xfb\xef\x9d3\xb3\x8bv\xf7\xdf\xdei\xfa\xa5\xf1\xb7\x86\x14-\x9a\x16\x92\x88;\xcbH\xbd\x0c\xa0\x97\x05\xf4r\x11\xfae\xd7\xd8\x8d\xdb&\xad\xb4,\xadS\xf2W\xf0\xbf\xcb\x03z\x05@\xaf\x18\xa1\x1f<\xd2}1\xf3]\xaey\xd4\xab\x7f\xaf:\xfd\xcd\x8d\xb1\x95\x00=\x1e\xd0+\x03z\x15@\xaf\n\xe8\xd5\x00\xbd:\xa0\'\x00z"\xa0\xd7\x88\xd0#?5\x01\xbd\x16\xa0?\x02\xe8\xb5\x01\xfdQ@\xaf\x03\xe8u\x01\xbd\x1e\xa0\xd7\x8f\xd0\x85\x1fz\x9cZ^\xbfB\xca\x8c\xd9M.n/\x93F=\x06\xe8\r\x00\xbd!\xa07\x02\xf4\xc6\x80\xae\x03\xf4\xc7\x01\xfd\t >M\x00\xbd)\xa07\x03\xf4\xe6\x80\xde\x02\xd0[\x02\xfa\x93\x80\xde*B\x9f\xf0\xfa\xa7/\xf6\xcd\xca\xb3mjt\xb8h\xe5\x99\x94\x06O\x01zk@O\x02\xf46\x80\xfe4\xa0\x93\x80\xae\x07\xb6\x9f\x02t\x1a\xd0\x19@g\x01\x9d\x03t\x03\xa0\xf3\x80n\x04\xf4\xb6\x80\xde\x0e\xd0\xdb\x03\xfa3\x80\xde\x01\xd0\x9f\x05\xf4\x8e\x80n\x02t3\xa0[\x00\xdd\n\xe86@\xb7\x03z2\xa0w\x02\xf4\x14@\xef\x0c\xe8\xa9\x80\x9e\x06\xe8\xe9\x80\x9e\x01\xe8\x99\x80\x9e\x05\xe8]\x00=\x1b\xd0s\x00\xbd+\xa0w\x03\xf4\xee\x80\xde\x03\xd0{\x02z/@\xef\r\xe8\xcf\x01z\x1f@\x7f\x1e\xd0\xfb\x02z?@\xef\x0f\xe8\x02\xa0;\x00]\x04t\t\xd0e@w\x02z.\xa0\x0f\x00t\x17\xa0\x0f\x04\xf4<@\xcf\x07\xf4\x02@/\x04t7\xa0{\x00}\x10\xa0{\x01\xdd\x07\xe8~@\x1f\x0c\xe8E\x80>\x04\xd0\x87\x02\xfa0@\x1f\x0e\xe8/D\xe8~\xd9[\xe0\xf3\x16\xfd\xa3\xbf\x18Z\x06\xcf\x93R\n<\xf9:\xa7\xd7%\x17J\xf9\xc3t\x85B\x81|\xdf\xf9l\xdcK\xc0\xf7\x8d\x08-\x83\xc7\xa5\x19\xb2\x7f\x88\xdb\x9b\xa7\xb3\xb8\x0b\x0be\xd1\xefr\x17\xea\xcc^w\x9e\xec\xd5\xf9doQ`\x11\xf8"\x8f\xdbU\xe8\x7f\x00g\xa4F\x9c\x975\xe2\x8c\xd2\x88S\x1cZ\x06\xcf\x1bSMY)\xba\x9c\xc0*.Q\x8e\xb5\xceh\x8cuJ0\xd6\x19\x83\xb1\xce\xd8\xd0\xf2Y\x94\xb8\xe8\x9cn\xaf.\xc3b\xd6e\xcb>\xd9\xaf+pK\x83\xf3\xe5\xfb\xd9\xafh\xc8~o\xde\xc7\xb7*|].e\xf4\xd6\xd5\xc3[Lm\xef\x19\x17bG\x1b\xc7\xe3\x01}B\x84~\xe5\xe4\x87\xdbxs\x15\xeb\xae\xa5\xf3\x96\x14Oi\xf0\xd7D`\xfdI\xa1ep\xfe!#;\x0b\x1c9\x93\xef\xf5\xe7\xa4\x80\xfeWC\xcb\xe0\xfc\x8a\xadH\x0e\xc4%\xdf\x9d\xab\xebj\xc9J\xc9\xba\xcf;\x05\xc1;\x15\xc1;-\xb4\x0c\xce1X;Y\xb2\x8a8\x9d%\xdf\x15\\\'-;\xcb\xa2\xb3Ek\xfbt\xcc\xf5f\x84\x96\xf5C\xebE[\xeb\xfd?\x8e7\xddP\xd42s\xe1\xd1\x91\xf9o\xd9\xc7\xc6\xcd\x0c\xad\x17\x9c+I\xf6\xba\x07{tY\xee|\x978L\x17\\/\xa50\x902\x9d\x82\x18\x18C\xb9\x1e\xb1\x14x\xe7\xfbf\x85\x96\xd1r\xa7\xc7\xebv\xba\xf2\xe5;%\x88\x98\r\xf8}r\xe1?\xde\xe0g\x0e\xa2\x7f.\xe0\x8f\xfc\xcc\x0b-\xa3\x8d\xd1\xf9\x80\xbe\x00\xd0\x17\x02\xfa"@_\x0c\xe8K\x00})\xa0/\x03\xf4\xe5\x80\xbe\x02\xd0_\x03\xf4\x95\x80\xfe:\xa0\xaf\x02\xf4\xd5\x80\xbe\x06\xd0\xd7\x02\xfa:@\x7f#\xb4\x0c\xeeW=\\\x85\x9d\xfc~\x8f\xce4\xd8\xefN\xca\xf2\xba\x87\x0e\xbbS]\xee_\xefM\xcc\xf5\xd6\x87\x96\xc19\xefn\x81\x04\x99\x9e\xeb\rd\x80\xfb}\x1b\x14\xfa6*\xf4mR\xe8\xdb\x1cZ\x06\xe7\xfc\xedCt\x81\n\xeb\xbb\xcf\xb3E\x81g\xab\x02\xcf6\x05\x9e\xb7\x14x\xdeV\xe0\xd9\xae\xc0\xb3C\x81g\xa7\x02\xcf\xae\xd028/n\x16|\xb2\xce\xee\xf2\xcaC\x84\xfc\xfc@\x82\xcfu\x15\xca\xc1\xb5\xee[)\xf0\xd9\x1dZ\x06\xafWX\x9d>\xab\xaf\xb4\x82>p\x18\x11{\x10\xbc{C\xcb\xe0\x0e-\x83\xd7/n\xa7\xcdt\xa1P\xc8\r\x1c2\xde>\x86Qp\xaaB\x1c\xd7\x80\xf1\x89\x06\x8c\x13\xa1e\x8b\xfb\x18\x81#\xac"\x97\xa4\xe4\xc4\xebS\r\x18\'5`|vO\r\xd0\xa7\x87\x84\xd2\xfb\xc2\xd2\xfb\xf5p\x15J\xee!\xa1K\xf0\xd9Y\x96>\xd1\xee\x96\x99\x01pg\x02\xfa\xac\x90\x10\xbc\xe7\xa2\xbb\xa70\xea=\x17\xb3\x15\xfa\xe6(\xf4\xcd\x8d\xe2s\xaei\x917zz\xcf\xb4U\xe3\xc7\xfe\xfdJ\xe2\xce\xc5\xf3"\xda\x1f\xa9\xcf\x8f\xd0OU\x95\xcc\xcf\xb3\xc6\xcc\x05sV\xd1S+V\x18\xbf B\xb7\x97;;|\x89\xef-[\xf1\x91W\xe6\x0cJ\x1c;la\x84\xce2\xba\xdcn\xee\xda\xb6\x89SV1\x1b\x9b?\xfa\xc8" ~\x8b\x01}\t\xa0/\x05\xf4e\x80\xbe\x1c\xd0WD\xe8K{\x9dj\xc7}nM\x9f\xea\x7f\'xi4\xee5`\xfd\x95\x80\xfe:\xa0\xaf\x02\xf4\xd5\x80\xbe&B\xaf\xf8\xd3;\xcf\xfd\xf6[\xbfN\x8bn\xb9?~\xe3\xfa\xf2\xf6kCB\xf0Y~\xbb\xd7G\xdd{\xe1,\xd2\xbb.\x867\xf2\xf3\x06\xd0\xae7\x01}}H\x08^\x1f\xc9\x12\x85\x9c"\xf1\xf6\xf3\x8a\xc1\xbf\xf2\x81\x8c]\xcd\xf3W\xef/O\xbe\xde\xcb\\\xdc\xa6u\xc9W\rOU\x8b#\x82\xaf{\x08\x08\xe5\x9e\x1f7\xe1\x87\x06\x87j,\xb9X\x89x*\xb1S\xff2\xa5B\x1cQ\xe5\xf6\xa2b\x19\xe2@`\x11_\x8e\xd8\xbf\x9a\x90J\x9f1\x0c\xfe\x95\xc3bV\xbd\xbdHL$n\'\x1c_\xce\x80\xc1\xfe\xc0\xb2\xb0\xf4\xd9\xb7\xbej\xdb\x9aP\x8b\xe8\x93\x95\x92e\xeb\x93R\xe8\xf2\xff\x83\x8e#jT \xfa\xf4\xb1Z\x82\xcf?g\x86\xfe\xd4\xb5?!\x903}\xb9\xa9\xd9\x1e\x914P\x06\x03I\x84\xc7\xe5\xdd\xe6?\x17=\xf2c3\xcb\x84y\x03\xedLI\xdd\rZ\xc5\x05\x99\x8b\x19\x17\xec\xf6\xdf\x1f\x97\xe03\xb9\x9d\xeep\xb7\xfd{\xc1\xc7\x83\x04\xa6\xf3\xbes\x15n\x14\xcb\xcd\x06(\xe6V"D\x9f\xec\xf0\x0cv\x94>\xe3\xd9S5\xaf.\x11|\x8e!\xc9\xc1\xc92/K\x94\x91eX\x916:EN[\xbe\xec4R\x06=\xe948E\x07\xc5\x18)J\xd0\x96op2<\'\x91F\xbdL3\x06R\xefp\x8a\xda\xf2Y\x92\xe2\x1c\x92\xc0\x93\x1c-R$GQFm\xf9zFt\xb2\x06\xd6\xe1`$Jp\xf2\xa2\x91)}\x86\xb5\xbfj\xbe\x8e\xc8L\xb3\xd9(\x1bI[\xf4\x9c\x89\xb2\x1b\xf5\xa4\xc1\xce\x1b,,e\xd2\xdb\xedv\x9e\xd7v;H#gt\xb2N\'\xa9\xa7\x05#\xc7\x8b4\xd6\xd5\xf2\xa1\xb1\xae\x96\x0f\x8dul>\xe2XW\xbb\x1d\xd0X\xc7\xe6\xc7\x18\xeb\xd8\xcc\xffQ^\x7f\x98w\x1f\xe6]\x15y7\x8c\xf7X\xc5^gjS\xbd\xd2JF\xcdi\xf3\xd5\xe9\x84\x81jy/\xc4%Wk\xb7\xe5M\xfb\xe2\xba\x7f\xcd\xb6\xe5g\rU\xcb\xab\xe2\xee8\xcb\xb8\xb9\xaee\xda\xae\x8fV\xbc\xe6\xbezZ-\xef\xc3u_d\x9c\xbb6\xd12\xb7\xf1\xae\xea\x13v\xc7UU\xcb\xb3\xff~-aW\xad\xca\x1d\xd7e\xcd\x1f\xfa\xf3\xdb\xab{\xab\xe5\x15.-v\x9d\xeb\xb7\xc9\xbee\xe1\xf2\x83\xb6}K]jy\x83\x98V\x95\xde\xd2\xb72\xef\xd0\xaf\xb4\xc6\xcd\xae\xeaP\xcb\xdb\xc8\x9d\xbf!m\x7f\xa5\xf3\xe2\xaf\x9e\x1c\x93|\xb4\xf8g\xb5\xbc\xc33\x9f\xf9V\xf2\x1b;m\xb4\xc6/\xbf9\xb1\xed\xb7jy{K&\xd7\x996}fJ\xf1{\xcfN\x9d\x7f\xb8wY\xb5<\xe7\xa57\xd2-\xcb\xb3\xac\xeb\x9f]\xf0\xc2\x91\x9c\xda\xdb\xcb\xa8\xe4\xfd\xbe\x9b\xaa\xbb\xfd\xf0\xa7\xa61\x9f\x1c2U\x94\xfeP=^\x8e\xddx\xfc\xe0\x9a\xf8\x83\xe6M\xdd\xbc\xfc\x98YG\xae\x12*y\x1f}9\xb2u\x85\x0b\x1dS\xb7\xd6\x9c\xa5\xafxe\xc1F\x0c^X\x8e}\xf7\xc8\xbaq\xdf3\xeb\x8b\x8ak\x17\r\xd6\xc9\xbd\x9b(\xe6)\xacEj\xf9P-\xc2\xe6#\xd6"\xb5\xdb\x01\xd5"l~\x8cZ\x84\xcd\x8c2Vv\xd79P\xb4\xf5\x838\xf3*\x9b\xa1\xed\x97e\x9f\xaa\xaf\xf5q\x8bZ>4V\xb0\xf9\x88cE\xedv@c\x05\x9b\x1fc\xac`3\xa3\x8c\x15j\xc7w\xdd\x86\xd5\xfb\xcc6\xf5\xe0H\x87\xc7k\xaa\xa9\xf5XQ\xcb\x87\xc6\n6\x1fq\xac\xa8\xdd\x0eh\xac`\xf3c\x8c\x15lf\x94\xb1\xb2w\xd3\xc81\x99\x95\xb6en[\x98\xda:\xf5\xdb\xab\xc7\xb4\xeeKl>b_\xaa\xdd\x0e\xa8/\xb1\xf91\xfa\x12\x9b\x19\xa5/7\x9c:\xbc=\xf5\xe2\x0e{\xc9\xcf\xeeA\xfb\x9f]\xdcM\xeb\xbe\xc4\xe6#\xf6\xa5\xda\xed\x80\xfa\x12\x9b\x1f\xa3/\xb1\x99Q\xfarV\x99\x7f\xe9vN\xfe\xae\xd3\xfa}\x1d\x86^i\xb7\xc9\xaau_b\xf3\x11\xfbR\xedv@}\x89\xcd\x8f\xd1\x97\xd8\xcch9vw\xadf\x9f\xe6w\xb2\x8c\xe9;\xe2f{\xba\xe0\x84\xe69\x16\x97\x8f\x9acUn\x07\x98cq\xf9\xb1r,.3J_\xb2-:T[\xfa\xd1\x87\x19k\xce\x99\x96\x7fQ\xff\xa7\x0c\xadc\x80\xcd\x8f\x11\x03lf\x94\x18\xdc\xbc^\xfe\xbd\x15W[e,\xf5\xf9\xba\'L^\xdcA\xeb\x18`\xf3c\xc4\x00\x9b\x19%\x06\xd3\x0e\x1b\x1e\xdbT\xd47s\xc5\xfb\xad\xf6\xbd\xd7\xf8\xa9\x8dZ\xc7\x00\x9b\x1f#\x06\xd8\xcc(1\xf8\xa6\xdd\x7f\'^)H\xca\xd8\xe0\x7f1\xf9h\xe5\x7fw\xd6:\x06\xd8\xfc\x181\xc0fF\x89A\xc7Us\x93\x1a\xf6\xdcaZ[m\xf5\xc4E}.\xf1Z\xc7\x00\x9b\x1f#\x06\xd8\xcc(\xf3b3\xd7\x0be\x1f-\x9b\x9f6\xe1\x8b\x833\r=\x89sjy\xedF7\xedY\xbf\xfd\'\x9d\xf7\xdcz\xb7a\xbds\x1dp\xee\x15\x08\xe3y\xe2\xd7\xeeig\xea\xd0y\xf1\xf3\xbf\x9f^4\xa2b\x7f\xb5\xbc\xf1\x93\xe9v7\xf2\xb7[KF\xe4\xd4\xd6\xef\x9e7]-o\xc7\x89\xe2W\xf6\xfc`\xb5\xaf\xf8\xe2\xa27g\xd4\xb4\x05jyL\xd9\xe7*u=?-}\xc1$\x13s\xfd\xc2\x8c_\xd4\xf2\xb6\xe7\xfd\x98z`\x9b;u\xf3;\xcf\xaf<6\xfd\xe3/U_\xe3+x\xe3\xd0\xdb\xc5\xdd2\xd6O8/\xfd\xf4\x82y\x08\xf2\xf5l\x03O\xd12)\x89N\x92b$F\x14\xc4\xff\xc1\xbd\x95\xacE\xaf\x8fhw\x8f\x17\x12\xce7\x1b~"m\x19;\xf2\xa5g\xae\x1f\xcfCm7\xcf3NQ\x12DR&I\x9a\xd4\x0b\x066\xfc8\x0e\x9b_z\x1c\xc7\x1a\r\xbc\x9e4Q6\x83\x9d\xb2\x9bi\x13G\xf2&\x83\x81d9\x96\xa4\xb4\xdd\x0e\x87\x18\x8c?\xcd\xf1\x0e\x86%e\x9a\xa7Hm\xf9\xfa@\xb7\x8a,K\xb1\x94\x9118\x1c\x923\xe2\x9e\xd4\xbe\'\x13\xc6\xed\xb0\x9c\xad\xb1i\xf5\xb1\x8c\xaf?\xd7\x8d\xd1\xba\x1f\xb0\xf9\x88\xfd\xa0v;\xa0~P\xcb\x87\xfa\xa1q\xf1\x13\xd9\xe7N\x8e\xe9Tr\xad\x9f0f\xe9\x8f&\xad\xdb\xaf\x96\x0f\xb5_\xf5\xb5z\x80\xff\xde\xa7\xc4\xca\xe3\xd5,\xb6\xddUO^g\xc6~\xff\'\xfa\xb1A\xe0\xc4\xcf)\xf2\x92\x93"I\xc9\xc8\x90Fm\xf92\'3\x12-\x08\xa4\xd1ht\xca\x02\xad\xd7\xf8\x1e8\x88_\xf5\xe0\x9b\xe4\xee>\x1f\xd9\xe7W\x9f6-y\xfc\xb9\xf6\xa8|\'\xc3\x1aE\x07\xcd\xf3N\x83\x81rH")\x85\xf3\x8fUY5bC\xa7\x81\x99\xe3\x07\x0c\xb4V\xecz\xf2\x06r\xffR\x82(r\xa4^b\x04\')\xcb\x81\x7f\x87?\xef\xf1\xc7\x86\xbd\xbf\xd7k\xb4+s\xc9\x94\xed\x8buu\xe9\x17\x95>+\x10|\xde#\xee\xee\xf3\x1e\xc1\xdfD\xea\xad\x96\x99\x90@\xf4\xf1\xb8\xac\xfd\x1b\xb3_5\xac\xd9\x7f\xacFq\x12\xb1\x96\xe8r>A\xeb\xb1\x83\xccGl\x7fq\x85?\x1aw\xa9|\x91\xacX\xe0\xafr\xf1\xa3K\x13\xb5n?2\x1fq\xec7\xb8\xe2\xaf\xfc\x9a\xa9B\xc6\xe8\xf5\xa7\xfd7\x1b\x9c\xc9\xd1\x80\x1f|HZ\xbe\xc3O?\xe3c\xc6\xb5\xa9\xd0q\xe1\xce\'z\xc4\xc7\x9fI,\x1f\xc0\xc4)\xe17#H\xd9IR2\xcf\'\xc9\x0e\x9aNb\x18=\x97\xc4S\x14\x95\x148\xb3&\r$\xed\x08\xeck\xc2}\xc7L\xd8\xdfw\xe7\xdcHp\xf2\x1c-\x88\xce\xc0\x169dJd\xd8p\xbend\xfbj\x93\x1bt\xb5/\xdb\xd2\xa5{\xbb\'\'~\x85|\xcc\xc4p\x06\x03\xc712\xeb`\x03Gd\x8c\xde\x18>G\x80\xcd\xbf}\xcd\xcd\xc22\x16\xcefb\xad\xac\xd1`dm\xa4EO\x1b\xf5\xb4IO[#\x9e\xe9{k\xe7\x94M\x7fv/\x93\\r\xd6T\x9e\x9a\xb1Z\xf9=\xaf\n\xb7\x03\x9b\x8f\xb8\x1d\xc5\xcdw<=O>m^_kO\xeb\xd5\x0b\x8e7@\xae\x9bFY\x12D\x81!y\xde@\xd3\xbc\xc09\xb5\xe5;\x04\x87@\n\xb23p$\xaeg\xf5\xa4\xc0;\xb4\xe5\x8b\x0c/\xd1\x0c\xcbI\xa4\x9ebX)\xb01\xda\xf2\xe9 \x94"%\xde\x118\xc6\xd7\x1beg\xe4\xbd\xa0\xb4\xff\xd7E\x1dz\x98\xd6~:zm\xe3>IiZ\xc7G-\x1f\x8a\x8fZ>\x14\x9f}5\x16\x8d\xdc12\xcf\xb2\xba\xe6\xe6\x93U\x9fOS~o\xb4\xc2\xf6\xab\xe5C\xedoV.\xe5L\xb3\x1c\xd9\xf6\xb6\x7fD\x8b\xcf\xf6/l\xaa!\xbf\xb4~\xfee\xa95rMV\x8b\x94UC\xab\xf6\xec\xd5\xe5\x857\x14\xd7\xcfj\xa1\xfa9$\xcf\x17Q@\xc3\xda\x8f\xcc\x8f\x8c\xbf^\x96\x1c<\x1f8\xbbu\n\xc1\x19\'*"\xffT\xab_\xe9\x87\xcb\x89\x13\x92\x97\x9d\xc9\x9a\x97=\xfa\xc2\xea\xb2\x1a\xf3\xe3\xb7\x1e\xfa\xf9\xd0;\x84i\xac\xf1\x8bu\x8f\x8cu!_\x0b\x85\xf8g\xb6\x1d?0\xeaF\x7f\xeb\xa2\xcf.\xc8\x13\xc7\xd8R\x91\xf9\xb2\xc8K\x0e\x87S\xa6(\x89\x97E\x83\x1cQ\x07\xb0\xf9\xa5u\xc0L\x19\x18\xbd\x9e\xe2\xf4V\x0be5\x18H\xd2\xa6\xe7X\xab\x857\xd9-\x11\xe3t\x83#\xe3\xd7M_\x1d\xb0\xbe\\\xab\xdc\xfcE\xe7\xeb(\x9f\xd3Q\xb8\x1d\xd8|\xc4\xed(\x9f\xfb\xc3\xf0\xef\xda\xd6O\x1e\x97\xf4\xcb\xc2\xc4\xc5\xa7\x91\xef\x1d\x85\xb6\x03\x9b\x8f\xb8\x1d\x8c\xf0\xc7\x85\xdf\x16\xa7\xa4,\xff\x8c\x1e\xf0a\xfc8\xe5\xd7\n\x15n\x076\x1fq;*O\x1d\xb9\xe5\xfc\xf7\xe5,\xcb\xd7\xd5\xdc\xe5\x9c\x147N\xeb\xed\xc0\xe6#n\xc7\x8a\xfc\x9b\xeb\xfaVe\x92\xa7\x8f\xa9|\xd9\xfb\xd7d\xf4\xe3\x0c`;\xb0\xf9\xf0v\x84}\x8f\xa7\xf7\xfc\x7f\x8d\x9c\xe0\xc9\xd8\xf9h\xa3)\x8d\xebu\xb8\x86\xf6=V+\xc3\xf1\xa4\xd9\xcc[\xadz\xce@2F\x93\xc1\x1c8\xb0\xd4\x9b)J\x1f>w\x89\xfd=\xd5\x89\xae\xb2W\x96\xdc\x16w\xa1\xdf\xeb\x0e\xde#\x91\x1d\xfaS\xc7\xad\x19\xe2Z]Bn\xa1\xdb\xe7w\x89>"\xe2\xdc\x07\x9b}\xe7\xba\x87\xcc\xd0\x06\x9ee\x9d\x92\xa4g\x04V\x16\xc5\xf0\x98\x0c9\x9b\xf7n\xea7\x972\'\xec\xbe\xd8\xfdJf9\xe5\xe7\xa2@L\xb0\xb9\nb\x82\xcdV\x18\x93\xcdl\xff6\xd7.\xae2-\xb5\xcay\x96\x85i\x8cV1\xc1\xe6*\x88\t6;zL\xc2\xf8\x03+&u{\xf2\x885c\xe2\xc0\xe3}{\x9d\xdb\xaf\xfc>\x89\xe8\xfc\xb0\xf9\xd7\xf5-\x96wy\xae\xf8g\xd3\xd65\xf5\x0fu\x1b\x9eX\x17e\xfe\xb5\xe6\xdd\xf9\xd7\xb0~Df\xde\xed\xc7\x0c[\xd7\xb4\xcc\xe4\xcc\x8c~\xc1\xc6\x13\x84vm\xad|\xb7\xad\x8e\xc0\xfft\xa8e&\xd4\t]\xcb\xd3;8Q\x96\xf4F#+\xc8\x82\x931\x84M?i\xd3\xfe\xc6\x81\xf6\xc7\xdfm\x7f\xd8\xb52\xecX\xc7\x13\x19]\xad9\xfd\xd2J\xc3\x1c^\x17\xb0\x99\xa5u\xc1nd\xecf\xc6h\xb0\x99\x98@\x0cL\xb4\xd1\xce\xf06\xcaH2v\xce\xa6]\x7f\x96\xbd\x1b\x8f\xb0k\x9c\xd8m\xafL\xf8\x84\x02\x9fO\x97\xef\t^<\xbc3/\xa9\x8eY\x87\xc8qI\xc1\x9f\x15Ks\x8bB\xf0\xe7\x84%]\xd6\xed_\xe0\x0c\xcbO\xd8\xfc\x9a\xc1\xdf\x83\xf7\xcb\xa2_\x96\xfa\xf9\xfcn\xaf\x90+\xdf3\xe6\xd4\xb1\xab\x10\xf9>\xc1\xe7\xf3\xb8\xbc\xc1\x80\x84\xbd\xd7\x0f\x9b\x99\x18dz\xdc\xf9.qX\xbe\xdb\x9d7\xd8Ct\t\x08]Tsk\x10i9\xa6~6SN?[\x865+3%#x\xb9\x80H\x0e\xfd\xa9cW\x0c\xb6Y\x14<\xda\xc5 \xd0\xd6@r\xbb\xdbT\xadr\xa7O\x16\x07{]\xfea\xa5\xd7\xff\x03\xff\xd3\x1e\xfaS\xc7\xad@\x08\x83%\x97\xff\x9e}B]\xde\xac\x1a\xca\x9b\xa5\xa3+,Y\x86\xe5\x06k\xf2\xdbS\xfe\xdeL\xa4\xed\xad\xb6\xf8\xfa\xb2i\x7f=\xa6E]Bf*\xacKj\xda\x1a\xad.\xe12q\xea\x12\xeew\xc5\xaaK\xd8\xb1\x8eQ\x97\xb0\x99\x88uIM\x7fF\xabK\xd8m\x8fQ\x97\xb0\x99\n\xeb\x126_A]\xc2f\xc7\xa8K\xd8L\xa0.as\x15\xd4%lv\x94\xba\xa4"\x061\xeb\x92\x8a\xdc\x19\xb3.as\xa3\xd4%\xec\xbc\xa9\xb0.\xed\xcb\xee\xbd\xf9\xcc\xb7\x9d3\xd7\xbf>iU\x8bV\xd5\xc7*\xbdG V]Bf*\xacKj\xda\x1a\xad.\xe12q\xea\x12\xeew\xc5\xaaK\xd8\xb1\x8eQ\x97\xb0\x99\x88uIM\x7fF\xabK\xd8m\x8fQ\x97\xb0\x99\n\xeb\x126_A]\xc2f\xc7\xa8K\xd8L\xa0.as\x15\xd4%lv\x94\xba\xa4"\x061\xeb\x92\x8a\xdc\x19\xb3.as\xa3\xd4%\xec\xbc\xa9\xb0.\r\xed\xce\xd4dj\x1e]w\x85\x88kb\xcb=vS\x8b\xf3%d\xa6\xc2\xba\xa4\xa6\xad\xd1\xea\x12.\x13\xa7.\xe1~W\xac\xba\x84\x1d\xeb\x18u\t\x9b\x89X\x97\xd4\xf4g\xb4\xba\x84\xdd\xf6\x18u\t\x9b\xa9\xb0.a\xf3\x15\xd4%lv\x8c\xba\x84\xcd\x04\xea\x126WA]\xc2fG\xa9K*b\x10\xb3.\xa9\xc8\x9d1\xeb\x1267J]\xc2\xce\x9b\xd1\xebR\xf8\xb5\xdf\xc7\x1bT\xa1zT\xcf\x98t\xe2\xcbM\xeev%\x9f+~\xc7\x1ePC\x90\xb9\nj\x08.\x13\xa7\x86\xe0~W\xac\x1a\x82\x1d\xeb\x185\x04\x9b\x89XC\xd4\xf4g\xb4\x1a\x82\xdd\xf6\x185\x04\x9b\xa9\xb0\x86`\xf3\x15\xd4\x10lv\x8c\x1a\x82\xcd\x04j\x086WA\r\xc1fG\xa9!*b\x10\xb3\x86\xa8\xc8\x9d1k\x0867J\r\xc1\xce\x9b\x0fk\xc8\xc3\x1a\xf2\xb0\x86<\xac!\x0fk\xc8\xc3\x1a\xa2}\r\t\x9f\xa3\xe8q\xefy\xce\xf8uZ\xe4z\\&\xd6\x9c\x13\xe6w\xc5\x9csBe*\x99s\xc2e\xa2\xce9\xa9\xe8\xcf\xa8sN\xb8m\x8f5\xe7\x84\xcbT:\xe7\x84\xcbW2\xe7\x84\xcb\x8e5\xe7\x84\xcb\x84\xe6\x9cp\xb9J\xe6\x9cp\xd9\xd1\xe6\x9c\xf0c\x10{\xce\t\x97\x0b\xcd9\xe1r\xa3\xcd9\xe1\xe6M\xbc\\\xaf\xf898\x84\\\xaf\xfc\xd9:\xf5\xb9^\xf1w!\xe4z\xe5\xcf\xee)\xcf\xf5\xca\x99\xear=R\x7f*\xcc\xf5\xca\xdb\xae<\xd7+g\xe2\xe5z\xe5|\xf4\\\xaf\x9c\xad<\xd7+g\xa2\xe5z\xe5\\\xf4\\\xaf\x9c\xad,\xd7\xa3\xc4\x00%\xd7+\xe7\xa2\xe5z\xe5\\e\xb9^y\xde\x8c\x9e\xeb\xc3\xf22k\xee\xf2\x9f\n\xa9\xc7k\xac\x0b\xec\xe4\x99\x07N\x7fR\xee\x7f\x98\x97q\xbf+V^Ff*\xc8\xcb\xd8L\xc4\xbc\x8c\x1b\x8fXy\x19\xbb\xed1\xf226Sa^\xc6\xe6+\xc8\xcb\xd8\xec\x18y\x19\x9b\t\xe4el\xae\x82\xbc\x8c\xcd\x8e\x92\x97U\xc4 f^\xc6\xe6\x02y\x19\x9b\x1b%/c\xe7\xcd\xe8y9,\x07a\xbf\xf7\x0f1\x07!\x7f\x8f\x82\x1c\x84\xdd\xf6\x189\x08\x9b\xa90\x07a\xf3\x15\xe4 lv\x8c\x1c\x84\xcd\x04r\x106WA\x0e\xc2fG\xc9A*b\x103\x07\xa9xWh\xcc\x1c\x84\xcd\x8d\x92\x83p\xf7\xdd\x189(\xec\xd9\xe9\x84\xb8j\xf5\xe9\x06\xad-\x1b\x7f\x9b\xf4\xeb\xc5\xf2\xe4<\xd4g\xa7%I\xe4%\xd6!\x1b\x05J`E#GG\xbc\x07\xa2l\xc1\xa0\xb9o\x8c\x7f\xdf\xbakR\xcb\x9eM\xbfm\x80\xfc>\x99\x07\xf0\xc3r\xdb\xecg\xaf\x16\xdd:\xfa_\xeb\xf2\xd6\xd2\xac\xcaD\xcdx\x94\xdcV5\xca\xbb1\x91\x99\x11m\x96%#/Q\xa2$8I\x96\xd1\xb32\x15\xf1<\xb9\xd0\xdc\xd6yj1\x97:e\xef\xc8\x8e3\xd6\xa4\xc0\xbf\x9f\xac\xa0\xcd\xc8L\xc46/\xa8@\xaf_\xbd\xfc\xb2}9{\xe6\x16\xbd\xe0\xdc(-\xda\x8c\xccDl\xf3\x8dS\x85U\x9av~/sB\x93\x99O5:,\x1f\xd7\xa2\xcd\xc8L\xc46\x87\xdfk6~\x9d\x16mFf\xc2m\x0e\xe3\xb7\xfd#\xfd\xeb\xa4\x83m3^.[b\xb8\xf5\'\xd9\n\xf5wm)\xd9)\xc9\xb2\x835\xb0N\xbdS\x08\xec\xee\x11\xef\x8cl\xb3t\xc2\xb6\x92\x96s2F\x15e\x9c-\x18f*An?\xcd\xf1\xa4\xdeH\x8a\x82$Q\x1c)\x91dx\xccG\xed\x1a\xceY\xe7^c\xdf\xa4\xe6^\xe5\x89\xc4\xb2e\x10b\x9e\x10%\xe6\xcdGT\x96\xb7\x7fOw\xfb\xc8\xb2\xb0\xe1\x7f\xbf\xa9]\x03\xb9\xcdFV\xe4\r$ep\x90<\xcb;E\'\x1f~\xfc\x85\xcd\xafLt\xf7\x14\xba\xf2\xe4\xec\xd2\xe3\xaf\xb0c\x18lf\x15"[\xf0\x15\x08\x85i\xa5\xc70a\xef[CfF\xbeo-;\xb3[W[6\x11\xed}kg\xab\xe6M\xad\xf2~n\xe2\x96:\xc4\x99\xb8\n\x0e\xe4\xf7c\n\x06\x07\xc7J\x8c\xe0\xe0i\x89b\xf4F\x86\x0f?F\xc7\xe6\x97\x1e\xa3\xf3\x8c\x85\xb4r6\xd2`\xb0\x18\x18\xbb\xc5j\xb5\xd8lV=\xa3\xa7h\xde\xac\xedv\xe8\x8d\x9cAtr\x0e\xdeh\xe0i\x83\xc3@S\xffo\xf1\x1b\x15\x1d\x9d\xfb\xd2\x85\x0fL+\xf6\'\xbc\xdd\xfd\xcb\xea\x07P\xf9\x9c(\xb1\xa4\xa4\xd7;\x04Jd\r\x82DF\xbc\x97\xee\xca\xac\x96\x9f\xfc\xba\xe1\xa0y\xe5\xe6MV\xe7\x89\xce[\xb5\xe6\xf7\xcf\x99\xf2\x1f\xef\x98\x0e\xc9o\xcd~\xcc\xfeJ\xbb\xcb\xc89\x18\xe2\x7f\xd07~\xd6\xf7\xd4\xc6\x8c\x15\xe7\xca5\x9e\xb3E@\xfe\x8d\x0b\x88\xff\xd4\x85\x89\xb7\x8e\xaei\x9d\xba\xe6p\xfaOM\x9f\xde\x9b\xae5\xbf\xde\xbeEi\x8bO\xecH\x9dzy\xca\xa0a\x9b\xcb\x8c\xd6\x9a\x7fk\xc9\xd5_\x8e\xdd\x9cf\x9e\x99\xeey\xb3\xb0\xbao\x172_\xef\xe0\r2\'\tFI\xa6h\x92\x95\x9c\xe15DW\xa7\xf8\xb9v\xbf\x7f\\c\xed\'\xc4\xfe\xccw\x9b\x9eB\xa9\xdb\xb5\xee\xd6\x90\xb0\xdc\x83\xcc\x0c\xcb=\x94\x99\xa5H\x93\x853\x99\x8d&=i\xe3\xcc\xb4\xcdn\xd4\xf3\x16\x8e7\xe9\xc3\xdb>\xf7\xe3\xbf\xf3j.K\xe4\xe6\xd2\xf6w\xff\xf4\xe7$i\xd1vd&f\xdb_;\xb0.+\xbd\xc7\x96\x8e\x8b\x9c\x973O\xde\\ZT\x1e\xa1\xedu\xef\xb6=\x8c\xd9\xaf\xcd\x88\xf1\xbf\xcc(\xb2,\\x\xeb\x89!)}Z\xa0\xc4\xa3e\x94x 3\xc3\xe2\xc1\xf2f+e\xb5\x18\xacV\xdef\xe3Y;\xcf\xb0\xb4\x91\xe5X\xbdIO\x87\x8f\xf3\x9a\x87\xd2\xf7=\xfdm\xb9\x94W\xf7\xce\xa8\xf3\xce\x9eO\xe7\xa0\x8es\xd6H2\x12)\x894\xcd\x18YI\x10\xe4\x88\xdf\x94\xc2\xe6\x97n\x87\xc1h0q\x94\x8d\xa5-\xa4\xcd`\xe7\xcd\x81\xe3I\xda\xac7\x98)\x13e\x0f\xdf\x0enin\xc5\'\xaa\xad\xed\xb4\xd3\xf5V\xbdN\t\xfc\x11\xe4wz\x91T`\x1f%9\xbd s\xb2\x18\xf8W\xe9\xab\xbb\x89\xff\x03\x056\xf1\x00') >>> >>> conf.max_list_count = 500 >>> pkt = ept_lookup_Response(data) >>> towers = [protocol_tower_t(x.valueof("tower").tower_octet_string) for x in pkt.valueof("entries")] >>> >>> assert len(towers) == 430 >>> assert [x.floors[3].rhs.decode().rstrip("\x00") for x in towers if x.floors[3].protocol_identifier == 15] == [ ... '\\PIPE\\InitShutdown', ... '\\PIPE\\InitShutdown', ... '\\pipe\\eventlog', ... '\\PIPE\\atsvc', ... '\\PIPE\\atsvc', ... '\\PIPE\\atsvc', ... '\\PIPE\\atsvc', ... '\\PIPE\\atsvc', ... '\\PIPE\\wkssvc', ... '\\pipe\\1b6ced1995aeaf47', ... '\\pipe\\lsass', ... '\\pipe\\1b6ced1995aeaf47', ... '\\pipe\\lsass', ... '\\pipe\\1b6ced1995aeaf47', ... '\\pipe\\lsass', ... '\\pipe\\1b6ced1995aeaf47', ... '\\pipe\\lsass', ... '\\pipe\\1b6ced1995aeaf47', ... '\\pipe\\lsass', ... '\\pipe\\1b6ced1995aeaf47', ... '\\pipe\\lsass', ... '\\pipe\\1b6ced1995aeaf47', ... '\\pipe\\lsass', ... '\\pipe\\1b6ced1995aeaf47', ... '\\pipe\\lsass', ... '\\pipe\\1b6ced1995aeaf47', ... '\\pipe\\lsass', ... '\\pipe\\lsass', ... '\\PIPE\\ROUTER', ... ] >>> >>> tower = next(x for x in towers if x.floors[3].protocol_identifier == 15 and x.floors[3].rhs == b"\\PIPE\\ROUTER\x00") >>> assert tower.floors[0].uuid ###(037)=[passed] DCE/RPC 5 NDR: Test DEPORTED_CONFORMANTS with offsetted padding >>> class EEUString(NDRPacket): ... ALIGNMENT = (4, 8) ... fields_desc = [ ... NDRSignedShortField("nLength", None, size_of="pString"), ... NDRFullPointerField( ... NDRConfStrLenFieldUtf16("pString", "", size_is=lambda pkt: pkt.nLength), ... deferred=True, ... ), ... ] ... >>> >>> class ExtendedErrorParamTypesInternal(IntEnum): ... eeptiLongVal = 3 ... >>> >>> class ExtendedErrorParam(NDRPacket): ... ALIGNMENT = (8, 8) ... fields_desc = [ ... NDRInt3264EnumField("Type", 0, ExtendedErrorParamTypesInternal), ... NDRUnionField( ... [ ... ( ... NDRSignedIntField("value", 0), ... ( ... (lambda pkt: getattr(pkt, "Type", None) == 3), ... (lambda _, val: val.tag == 3), ... ), ... ), ... ], ... StrFixedLenField("value", "", length=0), ... align=(2, 8), ... switch_fmt=("H", "I"), ... ), ... ] ... >>> >>> class EEComputerNamePresent(IntEnum): ... eecnpPresent = 1 ... eecnpNotPresent = 2 ... >>> >>> class EEComputerName(NDRPacket): ... ALIGNMENT = (4, 8) ... fields_desc = [ ... NDRInt3264EnumField("Type", 0, EEComputerNamePresent), ... NDRUnionField( ... [ ... ( ... NDRPacketField("value", EEUString(), EEUString), ... ( ... (lambda pkt: getattr(pkt, "Type", None) == 1), ... (lambda _, val: val.tag == 1), ... ), ... ), ... ( ... StrFixedLenField("value", "", length=0), ... ( ... (lambda pkt: getattr(pkt, "Type", None) == 2), ... (lambda _, val: val.tag == 2), ... ), ... ), ... ], ... StrFixedLenField("value", "", length=0), ... align=(2, 8), ... switch_fmt=("H", "I"), ... ), ... ] ... >>> >>> class ExtendedErrorInfo(NDRPacket): ... ALIGNMENT = (8, 8) ... DEPORTED_CONFORMANTS = ["Params"] ... fields_desc = [ ... NDRRecursiveField("Next"), ... NDRPacketField("ComputerName", EEComputerName(), EEComputerName), ... NDRIntField("ProcessID", 0), ... NDRLongField("TimeStamp", 0), ... NDRIntField("GeneratingComponent", 0), ... NDRIntField("Status", 0), ... NDRShortField("DetectionLocation", 0), ... NDRShortField("Flags", 0), ... NDRSignedShortField("nLen", None, size_of="Params"), ... NDRConfPacketListField( ... "Params", ... [], ... ExtendedErrorParam, ... size_is=lambda pkt: pkt.nLen, ... conformant_in_struct=True, ... ), ... ] ... >>> pkt = ndr_deserialize1(b'\x01\x10\x08\x00\xcc\xcc\xcc\xcc\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x04\x00\x02\x00\x01\x00\x01\x00\x04\x00\x00\x00\x08\x00\x02\x00\xc0\x03\x00\x00\x00\x00\x00\x00\xa5\xcfq`,\xea\xd9\x01\x02\x00\x00\x00!\x07\x00\x00L\x06\x00\x00\x01\x00\x00\x00\x03\x00\x03\x00\xc4\xfe\xfc\x99\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x00\xc0\x03\x00\x00\x00\x00\x00\x00)fo`,\xea\xd9\x01\x03\x00\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x03\x00\x00\x00\x03\x00\x03\x00\n\x00\x00\x00\x03\x00\x03\x00\x06\x00\x00\x00\x03\x00\x03\x00!\x07\x00\x00\x04\x00\x00\x00D\x00C\x001\x00\x00\x00\x00\x00\x00\x00', ExtendedErrorInfo) >>> >>> assert isinstance(pkt.value, ExtendedErrorInfo) >>> assert pkt.value.max_count == 1 >>> assert pkt.value.Next.value.ProcessID == 960 >>> assert pkt.value.Next.value.TimeStamp == 133395140301514281 >>> assert [x.Type for x in pkt.value.Next.value.Params] == [3, 3, 3] >>> >>> assert pkt.value.ComputerName.value.value.valueof("pString") == b'D\x00C\x001\x00\x00\x00' >>> assert pkt.value.ProcessID == 960 >>> assert pkt.value.TimeStamp == 133395140301672357 >>> assert pkt.value.Status == 1825 >>> assert pkt.value.DetectionLocation == 1612 >>> assert pkt.value.Params[0].Type == 3 ###### ## [PASSIVE] Passive sniffing ###### ###(038)=[passed] [PASSIVE] Passive sniffing of DCE/RPC packets encrypted with SPNEGOSSP[NTLMSSP] >>> from scapy.libs.rfc3961 import * >>> >>> bind_bottom_up(TCP, DceRpc5, dport=49679) >>> bind_bottom_up(TCP, DceRpc5, sport=49679) >>> >>> conf.dcerpc_session_enable = True >>> conf.winssps_passive = [ ... SPNEGOSSP( ... [ ... NTLMSSP( ... IDENTITIES={ ... "Administrator": MD4le("Password123!"), ... }, ... ) ... ] ... ) ... ] >>> pkts = sniff(offline=scapy_path('test/pcaps/dcerpc_privacy_ntlm.pcapng.gz'), session=TCPSession) Unknown RPC interface 367abb81-9844-35f1-ad32-98f038001003. Try loading the IDL Unknown RPC interface 367abb81-9844-35f1-ad32-98f038001003. Try loading the IDL >>> pkts.show() 0000 Ether / IP / TCP 192.168.0.101:49757 > 192.168.0.100:epmap S 0001 Ether / IP / TCP 192.168.0.100:epmap > 192.168.0.101:49757 SA 0002 Ether / IP / TCP 192.168.0.101:49757 > 192.168.0.100:epmap A 0003 Ether / IP / TCP 192.168.0.101:49757 > 192.168.0.100:epmap PA / DceRpc5 / DceRpc5Bind 0004 Ether / IP / TCP 192.168.0.100:epmap > 192.168.0.101:49757 PA / DceRpc5 / DceRpc5BindAck 0005 Ether / IP / TCP 192.168.0.101:49757 > 192.168.0.100:epmap PA / DceRpc5 / DceRpc5Request / Raw 0006 Ether / IP / TCP 192.168.0.100:epmap > 192.168.0.101:49757 PA / DceRpc5 / DceRpc5Response / Raw 0007 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 S 0008 Ether / IP / TCP 192.168.0.100:49679 > 192.168.0.101:49758 SA 0009 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 A 0010 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 PA / DceRpc5 / DceRpc5Bind 0011 Ether / IP / TCP 192.168.0.100:49679 > 192.168.0.101:49758 PA / DceRpc5 / DceRpc5BindAck 0012 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 PA / DceRpc5 / DceRpc5Auth3 0013 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 PA / DceRpc5 / DceRpc5Request / Raw 0014 Ether / IP / TCP 192.168.0.100:49679 > 192.168.0.101:49758 A 0015 Ether / IP / TCP 192.168.0.100:49679 > 192.168.0.101:49758 PA / DceRpc5 / DceRpc5Fault / Raw 0016 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 PA / DceRpc5 / DceRpc5Request / Raw 0017 Ether / IP / TCP 192.168.0.100:49679 > 192.168.0.101:49758 PA / DceRpc5 / DceRpc5Response / Raw 0018 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 PA / DceRpc5 / DceRpc5Request / Raw 0019 Ether / IP / TCP 192.168.0.100:epmap > 192.168.0.101:49757 PA / DceRpc5 / DceRpc5Response / Raw 0020 Ether / IP / TCP 192.168.0.100:49679 > 192.168.0.101:49758 A 0021 Ether / IP / TCP 192.168.0.101:49757 > 192.168.0.100:epmap A 0022 Ether / IP / TCP 192.168.0.100:49679 > 192.168.0.101:49758 PA / DceRpc5 / DceRpc5Response / Raw 0023 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 PA / DceRpc5 / DceRpc5Request / Raw 0024 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 A 0025 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 A 0026 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 A 0027 Ether / IP / TCP 192.168.0.101:49758 > 192.168.0.100:49679 A >>> >>> conf.dcerpc_session_enable = False >>> >>> assert pkts[16].load == b'\x00\x00\x02\x00\x0e\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\x001\x009\x002\x00.\x001\x006\x008\x00.\x000\x00.\x001\x000\x000\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x8a\xe3\x13q\x02\xf46q\x02@(\x00\x81\xbbz6D\x98\xf15\xad2\x98\xf08\x00\x10\x03\x02\x00\x00\x00\x04]\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00+\x10H`\x02\x00\x00\x00' >>> assert pkts[22].load == b'0\x00\x00\x00&\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00A\x00D\x00W\x00S\x00\x00\x00\xee`\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\xea\x00\x00\x00' >>> assert pkts[23].load == b'\x00\x00\x00\x00\xad\xb3\xf5\xd1\x8eJ\xdeG\xa9\xa5\x85\xccvb\x8b\x970\x00\x00\x00\x03\x00\x00\x00\x1d\x83\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00' ###(039)=[passed] [PASSIVE] Passive sniffing of DCE/RPC packets encrypted with SPNEGOSSP[KerberosSSP] with AES >>> from scapy.libs.rfc3961 import * >>> >>> bind_bottom_up(TCP, DceRpc5, dport=49701) >>> bind_bottom_up(TCP, DceRpc5, sport=49701) >>> >>> conf.dcerpc_session_enable = True >>> conf.winssps_passive = [ ... SPNEGOSSP( ... [ ... KerberosSSP( ... KEY=Key(EncryptionType.AES256_CTS_HMAC_SHA1_96, key=bytes.fromhex("85abb9b61dc2fa49d4cc04317bbd108f8f79df28239155ed7b144c5d2ebcf016")), ... SPN="ldap/dc1.domain.local", ... ) ... ] ... ) ... ] >>> pkts = sniff(offline=scapy_path('test/pcaps/dcerpc_privacy_krb.pcapng.gz'), session=TCPSession) more Unknown RPC interface e3514235-4b06-11d1-ab04-00c04fc2dcd2. Try loading the IDL >>> pkts.show() 0000 Ether / IP / TCP 192.168.0.101:49700 > 192.168.0.100:epmap S 0001 Ether / IP / TCP 192.168.0.100:epmap > 192.168.0.101:49700 SA 0002 Ether / IP / TCP 192.168.0.101:49700 > 192.168.0.100:epmap A 0003 Ether / IP / TCP 192.168.0.101:49700 > 192.168.0.100:epmap PA / DceRpc5 / DceRpc5Bind 0004 Ether / IP / TCP 192.168.0.100:epmap > 192.168.0.101:49700 PA / DceRpc5 / DceRpc5BindAck 0005 Ether / IP / TCP 192.168.0.101:49700 > 192.168.0.100:epmap PA / DceRpc5 / DceRpc5Request / Raw 0006 Ether / IP / TCP 192.168.0.100:epmap > 192.168.0.101:49700 PA / DceRpc5 / DceRpc5Response / Raw 0007 Ether / IP / TCP 192.168.0.101:49701 > 192.168.0.100:49667 S 0008 Ether / IP / TCP 192.168.0.100:49667 > 192.168.0.101:49701 SA 0009 Ether / IP / TCP 192.168.0.101:49701 > 192.168.0.100:49667 A 0010 Ether / IP / TCP 192.168.0.101:49701 > 192.168.0.100:49667 PA / DceRpc5 / DceRpc5Bind 0011 Ether / IP / TCP 192.168.0.100:49667 > 192.168.0.101:49701 A 0012 Ether / IP / TCP 192.168.0.100:49667 > 192.168.0.101:49701 PA / DceRpc5 / DceRpc5BindAck 0013 Ether / IP / TCP 192.168.0.101:49701 > 192.168.0.100:49667 PA / DceRpc5 / DceRpc5AlterContext 0014 Ether / IP / TCP 192.168.0.100:49667 > 192.168.0.101:49701 PA / DceRpc5 / DceRpc5AlterContextResp 0015 Ether / IP / TCP 192.168.0.101:49701 > 192.168.0.100:49667 PA / DceRpc5 / DceRpc5Request / Raw 0016 Ether / IP / TCP 192.168.0.100:49667 > 192.168.0.101:49701 PA / DceRpc5 / DceRpc5Response / Raw 0017 Ether / IP / TCP 192.168.0.101:49701 > 192.168.0.100:49667 PA / DceRpc5 / DceRpc5Request / Raw 0018 Ether / IP / TCP 192.168.0.100:49667 > 192.168.0.101:49701 PA / DceRpc5 / DceRpc5Response / Raw 0019 Ether / IP / TCP 192.168.0.101:49701 > 192.168.0.100:49667 PA / DceRpc5 / DceRpc5Request / Raw 0020 Ether / IP / TCP 192.168.0.100:49667 > 192.168.0.101:49701 PA / DceRpc5 / DceRpc5Response / Raw 0021 Ether / IP / TCP 192.168.0.101:49700 > 192.168.0.100:epmap PA / DceRpc5 / DceRpc5Request / Raw 0022 Ether / IP / TCP 192.168.0.100:epmap > 192.168.0.101:49700 PA / DceRpc5 / DceRpc5Response / Raw 0023 Ether / IP / TCP 192.168.0.101:49701 > 192.168.0.100:49667 PA / DceRpc5 / DceRpc5Request / Raw 0024 Ether / IP / TCP 192.168.0.100:49667 > 192.168.0.101:49701 PA / DceRpc5 / DceRpc5Response / Raw 0025 Ether / IP / TCP 192.168.0.101:49701 > 192.168.0.100:49667 PA / DceRpc5 / DceRpc5Request / Raw 0026 Ether / IP / TCP 192.168.0.100:49667 > 192.168.0.101:49701 PA / DceRpc5 / DceRpc5Response / Raw 0027 Ether / IP / TCP 192.168.0.101:49701 > 192.168.0.100:49667 PA / DceRpc5 / DceRpc5Request / Raw 0028 Ether / IP / TCP 192.168.0.100:49667 > 192.168.0.101:49701 PA / DceRpc5 / DceRpc5Response / Raw >>> >>> conf.dcerpc_session_enable = False >>> >>> assert pkts[15].load == b'\x00\x00\x02\x00\x00\x00\x00\x00\x1a M\xe2\xd6O\xd1\x11\xa3\xda\x00\x00\xf8u\xae\r\x00\x00\x02\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x004\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\xe3\x13q\x02\xf46q\x02@(\x005BQ\xe3\x06K\xd1\x11\xab\x04\x00\xc0O\xc2\xdc\xd2\x04\x00\x00\x003\x05qq\xba\xbe7I\x83\x19\xb5\xdb\xef\x9c\xcc6\x01\x00\x00\x00' >>> assert pkts[21].load == b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x05\x00\x13\x00\r5BQ\xe3\x06K\xd1\x11\xab\x04\x00\xc0O\xc2\xdc\xd2\x04\x00\x02\x00\x00\x00\x13\x00\r\x04]\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00+\x10H`\x02\x00\x02\x00\x00\x00\x01\x00\x0b\x02\x00\x00\x00\x01\x00\x07\x02\x00\x00\x87\x01\x00\t\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00' >>> assert pkts[22].load == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x00\x00\x00\x00K\x00\x00\x00\x05\x00\x13\x00\r5BQ\xe3\x06K\xd1\x11\xab\x04\x00\xc0O\xc2\xdc\xd2\x04\x00\x02\x00\x00\x00\x13\x00\r\x04]\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00+\x10H`\x02\x00\x02\x00\x00\x00\x01\x00\x0b\x02\x00\x00\x00\x01\x00\x07\x02\x00\xc2\x03\x01\x00\t\x04\x00\xc0\xa8\x00d\x00\x00\x00\x00\x00' ###### ## MS-RPC client and server ###### ###(040)=[passed] Functional: Define a MS-RPC server >>> from scapy.layers.dcerpc import * >>> from scapy.layers.msrpce.all import * Loading MSRPCE layer msrpce.msdcom Loading MSRPCE layer msrpce.msnrpc Loading MSRPCE layer msrpce.mspac Loading MSRPCE layer msrpce.rpcclient Loading MSRPCE layer msrpce.rpcserver Loading MSRPCE layer msrpce.raw.ept Loading MSRPCE layer msrpce.raw.ms_dcom Loading MSRPCE layer msrpce.raw.ms_drsr Loading MSRPCE layer msrpce.raw.ms_nrpc Loading MSRPCE layer msrpce.raw.ms_samr Loading MSRPCE layer msrpce.raw.ms_srvs Loading MSRPCE layer msrpce.raw.ms_wkst >>> from scapy.layers.msrpce.raw.ms_wkst import * >>> >>> class MyRPCServer(DCERPC_Server): ... @DCERPC_Server.answer(NetrWkstaGetInfo_Request) ... def handle_NetrWkstaGetInfo(self, req): ... """ ... NetrWkstaGetInfo [MS-SRVS] ... "returns information about the configuration of a workstation." ... """ ... req = req[NetrWkstaGetInfo_Request] ... req.show() ... if req.Level != 0x00000064: ... return None ... return NetrWkstaGetInfo_Response( ... WkstaInfo=NDRUnion( ... tag=100, ... value=LPWKSTA_INFO_100( ... wki100_platform_id=500, # NT ... wki100_ver_major=5, ... wki100_computername=req.valueof("ServerName") + b"Server" ... ), ... ), ... ndr64=self.ndr64, ... ) ... @DCERPC_Server.answer(NetrEnumerateComputerNames_Request) ... def handle_NetrEnumerateComputerNames(self, req): ... """ ... NetrWkstaGetInfo [MS-SRVS] ... "returns information about the configuration of a workstation." ... """ ... req = req[NetrEnumerateComputerNames_Request] ... req.show() ... return NetrEnumerateComputerNames_Response( ... ComputerNames=PNET_COMPUTER_NAME_ARRAY( ... ComputerNames=[PUNICODE_STRING(Buffer=x) for x in ["Scapy", "Foo", "Bar"]] ... ), ... ndr64=self.ndr64, ... ) ... ###(041)=[passed] Functional: Define wrapper over samba's rpcclient >>> import subprocess >>> >>> TEMP_DIR = pathlib.Path(get_temp_dir()) >>> TEMP_DIR.chmod(0o0755) >>> print(TEMP_DIR) /tmp/scapy_r3hmuex >>> >>> LOGS_DIR = TEMP_DIR / "logs" >>> LOCK_DIR = TEMP_DIR / "lock" >>> PRIVATE_DIR = TEMP_DIR / "private" >>> PID_DIR = TEMP_DIR / "pid" >>> CACHE_DIR = TEMP_DIR / "cache" >>> STATE_DIRECTORY = TEMP_DIR / "state" >>> NCALRPC_DIR = TEMP_DIR / "ncalrpc" >>> >>> for dir in [LOGS_DIR, LOCK_DIR, PRIVATE_DIR, PID_DIR, CACHE_DIR, STATE_DIRECTORY, NCALRPC_DIR]: ... dir.mkdir() ... >>> SMBD_LOG = LOGS_DIR / "log.smbd" >>> SMBD_LOG.touch() >>> >>> CONF_FILE = get_temp_file(autoext=".conf") >>> CONF = """ ... ... [global] ... lock directory = %s ... private directory = %s ... cache directory = %s ... ncalrpc dir = %s ... pid directory = %s ... state directory = %s ... """ % ( ... LOCK_DIR, ... PRIVATE_DIR, ... CACHE_DIR, ... NCALRPC_DIR, ... PID_DIR, ... STATE_DIRECTORY, ... ) >>> >>> print(CONF) [global] lock directory = /tmp/scapy_r3hmuex/lock private directory = /tmp/scapy_r3hmuex/private cache directory = /tmp/scapy_r3hmuex/cache ncalrpc dir = /tmp/scapy_r3hmuex/ncalrpc pid directory = /tmp/scapy_r3hmuex/pid state directory = /tmp/scapy_r3hmuex/state >>> >>> with open(CONF_FILE, "w") as fd: ... fd.write(CONF) ... 283 >>> def run_rpcclient(transport, command, debug=False): ... args = [ ... "rpcclient", ... "-c", ... command, ... "%s:127.0.0.1[12345%s]" % ( ... transport, ... ",seal" ... if transport == "ncacn_ip_tcp" ... else "" ... ), ... "-p", "12345", ... "-U", "User", "--password", "Password", ... "--configfile", CONF_FILE, ... ] ... if debug: ... args += ["-d 5"] ... print(" ".join(args)) ... proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) ... return proc.communicate(timeout=10)[0] ... ###(042)=[passed] Functional: Start the MS-RPC server over NCACN_IP_TCP with NTLMSSP >>> ssp = NTLMSSP( ... UPN="User", ... HASHNT=MD4le("Password"), ... IDENTITIES={ ... "User": MD4le("Password"), ... }, ... ) >>> >>> rpcserver = MyRPCServer.spawn( ... DCERPC_Transport.NCACN_IP_TCP, ... iface=conf.loopback_name, ... ssp=ssp, ... port=12345, ... bg=True, ... ) Server MyRPCServer started. Waiting... ###(043)=[passed] Functional: Connect to it with DCERPC_Client over NCACN_IP_TCP with NTLMSSP >>> client = DCERPC_Client( ... DCERPC_Transport.NCACN_IP_TCP, ... auth_level=DCE_C_AUTHN_LEVEL.PKT_INTEGRITY, ... ssp=ssp, ... ndr64=False, ... ) >>> client.connect(get_if_addr(conf.loopback_name), port=12345) ┃ Connecting to 127.0.0.1 on port 12345 via ... └ Connected from ('127.0.0.1', 54794) >>> client.bind(find_dcerpc_interface("wkssvc")) >> DceRpc5Bind on (with NTLMSSP) ┃ Connection received from ('127.0.0.1', 54794) << DceRpc5Bind (with NTLMSSP) >> DceRpc5BindAck wkssvc is on port '12345' using NDR 2.0 << DceRpc5BindAck port '12345' using NDR32 True >>> >>> req = NetrWkstaGetInfo_Request( ... ServerName="Nice", ... Level=0x00000064, # WKSTA_INFO_100 ... ndr64=False ... ) >>> resp = client.sr1_req(req) >> REQUEST: NetrWkstaGetInfo_Request << DceRpc5Auth3 (with NTLMSSP - PKT_INTEGRITY) << REQUEST: NetrWkstaGetInfo_Request ###[ NetrWkstaGetInfo_Request ]### \ServerName\ |###[ NDRPointer ]### | referent_id= 0x20000 | \value \ | |###[ NDRConformantArray ]### | | max_count = 5 | | \value \ | | |###[ NDRVaryingArray ]### | | | offset = 0 | | | actual_count= 5 | | | value = b'Nice' Level = 100 >> RESPONSE: NetrWkstaGetInfo_Response << RESPONSE: NetrWkstaGetInfo_Response >>> >>> assert isinstance(resp.valueof("WkstaInfo"), LPWKSTA_INFO_100) >>> assert resp.valueof("WkstaInfo").valueof("wki100_computername") == b"NiceServer" ###(047)=[passed] Functional: Close the server >>> client.close() X Connection closed >>> try: ... rpcserver.shutdown(socket.SHUT_RDWR) ... except OSError: ... pass ... >>> rpcserver.close() ###(048)=[passed] Functional: Re-Start the same MS-RPC server over NCACN_IP_TCP with KerberosSSP Server SSP Client SSP X Server closed. >>> load_module("ticketer") >>> SRVKEY = Key(EncryptionType.AES256_CTS_HMAC_SHA1_96, key=bytes.fromhex("85abb9b61dc2fa49d4cc04317bbd108f8f79df28239155ed7b144c5d2ebcf016")) >>> >>> srvssp = KerberosSSP( ... KEY=SRVKEY, ... SPN="ldap/dc1.domain.local", ... ) >>> >>> t = Ticketer() >>> t.import_krb( ... KRB_Ticket(bytes.fromhex("618204ae308204aaa003020105a10e1b0c444f4d41494e2e4c4f43414ca2233021a003020103a11a30181b046c6461701b106463312e646f6d61696e2e6c6f63616ca382046c30820468a003020112a10302010ea282045a04820456280c76dee773a1c5e5bd966094201dc028c76f36bbcb9b04c6bb15e02893834f92c694b26bd627fb3f17c2b7eb3ccc57f926e28a9b578b75d1a179c2ce5cba08c67d6b8529f4988490a86a25ec181615e29a344df498ee5ab11a76ff34d862a09b457f6ed528aeb3ad7e7f075f5a02513830554d17edd00554c8f80bab69b80dec86a55111e7ac476d5f099f2ae374378f814a7b85d60f3ce3cff003ff82dd81a7a91a38ff79e5f51e8576de6aba5c86cc7ae2baf13038a8b4b554ff07b9873f19a0c682e83a57811475688e93b2ff53d232a037a19aab83d741204f088fb711c883ce66f4f989752b2c8b18b5cc3fffecbfd9076c25ee39cb13856c09e2ff4958c26e5ecade8c47a2adfd5ceab9d458617b6d3998dd8ee99d0eb57765d0976031a5eb618b076b1e3f6565b4370f238e8829b13deccf5ec35279946816969d5e307e33820f98efb6f601f79c16344d891a415babc6d4d01f992d15ebbf12fb5948cdbef6ed1ba2e5303ca2b0afd0ef1e5231458571bb2e7f463ce539faef5706ac1f8fb34668b6dff101c2fdb4f231fa75c24bb5aff7ee4349ce1948c42fdb91863772bd6c0dac26f47fe6ab1e617cdc85d9e015898fb5d6a0d8a38423c2ef49ec42e200f983fa45526b8cd205db3015e9d37de9cdd5b5befe519f22b7e65780f251215f3ca618f136f73200dd719c23dd3d4072b185e58628b2408377d688ab4540d1395af818a609d3f4df611483a77cd13511978eacf7acc91dd9740d97a9cbbb1299898219650d5ae0d3c0d0521e32132c889a65819ead424ec4f2be1d930f022f27b88078d301a1ce73070062ddf2259b839211e9f83d4585242328e310656f188f3f4cec5d5a61f08f9f0c2a15992a5aa65c4da838a5fd8df426fc4c7679d6af4a261d943a2501ba7221a0af1bc2db19bdfda44064efd94db45231b89035db904b3361afb0c0da0ab4c17857e86a820027f274e01a60388931520db0d667b5453e985152ebd382872122415ec13a88eaaf8522e18b54f580365742ce5884c5fe1d719b752788ff283725c446739686c9f76c850800016287f7cb85390c045fd250104d44f641d62ce1c7882bad72b574e10e1521d843938f30ab7064b007479f2bdc5e8d0aaf26b89993bf2c7c413aec8b8cad4c8d4714904125b868a807329d54674eff909a690bfd735d2c7134c9e819e48a66385a4d48d13ea710f45df9605d727a3d28e5bd09f7385bcab92bc1903ce888571309ffaf370024c5cc527730d256b20ba19511df8f0aa970b638a4393a45db03969b7415270887ef7ec94abbda98632a8d14b0d73f855e416e6d167269d04ec2489c843f11db04074c60c7ea9a13d2d1aca94379e84529bbd96a73f0cd6d8d9d85b5e06272e8739d0d2607d0b57b6e763118996aa8bf903bbaf4ce2ebc20b071e1dbbd48102634823059d4a37d73c054d0e066a09b6c53fe7319a7fcde0f4624461c8b584743d40dc334b34230d56c338bab40426ce7ade90f05a01cb0c0b8963860e4156831e8aecfb8721bf437ab71af74c426acfe7f9134163364a7ee2e")), ... key=SRVKEY, ... ) >>> clissp = t.ssp(0) >>> >>> rpcserver = MyRPCServer.spawn( ... DCERPC_Transport.NCACN_IP_TCP, ... iface=conf.loopback_name, ... ssp=srvssp, ... port=12345, ... bg=True, ... ) Server MyRPCServer started. Waiting... ###(049)=[passed] Functional: Connect to it with DCERPC_Client over NCACN_IP_TCP with KerberosSSP >>> client = DCERPC_Client( ... DCERPC_Transport.NCACN_IP_TCP, ... auth_level=DCE_C_AUTHN_LEVEL.PKT_INTEGRITY, ... ssp=clissp, ... ndr64=False, ... ) >>> client.connect(get_if_addr(conf.loopback_name), port=12345) ┃ Connecting to 127.0.0.1 on port 12345 via ... └ Connected from ('127.0.0.1', 54796) >>> client.bind(find_dcerpc_interface("wkssvc")) >> DceRpc5Bind on (with KerberosSSP) ┃ Connection received from ('127.0.0.1', 54796) << DceRpc5Bind (with KerberosSSP) >> DceRpc5BindAck wkssvc is on port '12345' using NDR 2.0 << DceRpc5AlterContext (with KerberosSSP - PKT_INTEGRITY) >> DceRpc5AlterContextResp wkssvc is on port '12345' using NDR 2.0 << DceRpc5AlterContextResp port '12345' using NDR32 True >>> >>> req = NetrWkstaGetInfo_Request( ... ServerName="Nice", ... Level=0x00000064, # WKSTA_INFO_100 ... ndr64=False ... ) >>> resp = client.sr1_req(req) >> REQUEST: NetrWkstaGetInfo_Request << REQUEST: NetrWkstaGetInfo_Request ###[ NetrWkstaGetInfo_Request ]### \ServerName\ |###[ NDRPointer ]### | referent_id= 0x20000 | \value \ | |###[ NDRConformantArray ]### | | max_count = 5 | | \value \ | | |###[ NDRVaryingArray ]### | | | offset = 0 | | | actual_count= 5 | | | value = b'Nice' Level = 100 >> RESPONSE: NetrWkstaGetInfo_Response << RESPONSE: NetrWkstaGetInfo_Response >>> >>> assert isinstance(resp.valueof("WkstaInfo"), LPWKSTA_INFO_100) >>> assert resp.valueof("WkstaInfo").valueof("wki100_computername") == b"NiceServer" ###(050)=[passed] Functional: Close the server >>> client.close() X Connection closed >>> try: ... rpcserver.shutdown(socket.SHUT_RDWR) ... except OSError: ... pass ... >>> rpcserver.close() X Server closed. ###(051)=[passed] Functional: Re-Start the same MS-RPC server over NCACN_NP >>> rpcserver = MyRPCServer.spawn( ... DCERPC_Transport.NCACN_NP, ... iface=conf.loopback_name, ... port=12345, ... bg=True, ... ) Server SMB_Server started listening on ('127.0.0.1', 12345) ###(052)=[passed] Functional: Connect to it with DCERPC_Client over NCACN_NP >>> client = DCERPC_Client( ... DCERPC_Transport.NCACN_NP, ... ndr64=False, ... ) >>> client.connect(get_if_addr(conf.loopback_name), port=12345) ┃ Connecting to 127.0.0.1 on port 12345 via ... └ Connected from ('127.0.0.1', 54808) ┃ Connection received from ('127.0.0.1', 54808) > User authenticated as guest! >>> client.open_smbpipe("wkssvc") > Tree Connect on: IPC$ > Opened: wkssvc >>> client.bind(find_dcerpc_interface("wkssvc")) >> DceRpc5Bind on << DceRpc5Bind >> DceRpc5BindAck wkssvc is on port '\\PIPE\\wkssvc' using NDR 2.0 << DceRpc5BindAck port '\\PIPE\\wkssvc' using NDR32 True >>> >>> req = NetrWkstaGetInfo_Request( ... ServerName="Nice", ... Level=0x00000064, # WKSTA_INFO_100 ... ndr64=False ... ) >>> resp = client.sr1_req(req) >> REQUEST: NetrWkstaGetInfo_Request << REQUEST: NetrWkstaGetInfo_Request ###[ NetrWkstaGetInfo_Request ]### \ServerName\ |###[ NDRPointer ]### | referent_id= 0x20000 | \value \ | |###[ NDRConformantArray ]### | | max_count = 5 | | \value \ | | |###[ NDRVaryingArray ]### | | | offset = 0 | | | actual_count= 5 | | | value = b'Nice' Level = 100 >> RESPONSE: NetrWkstaGetInfo_Response << RESPONSE: NetrWkstaGetInfo_Response >>> >>> client.close() X Connection closed >>> try: ... rpcserver.shutdown(socket.SHUT_RDWR) ... except OSError: ... pass ... >>> rpcserver.close() >>> >>> assert isinstance(resp.valueof("WkstaInfo"), LPWKSTA_INFO_100) >>> assert resp.valueof("WkstaInfo").valueof("wki100_computername") == b"NiceServer" X Server closed. ###(053)=[passed] Functional: Re-Start the same MS-RPC server over NCACN_NP with SPNEGOSSP+NTLMSSP >>> from scapy.layers.spnego import SPNEGOSSP >>> >>> ssp = SPNEGOSSP( ... [ ... NTLMSSP( ... UPN="User", ... HASHNT=MD4le("Password"), ... IDENTITIES={ ... "User": MD4le("Password"), ... } ... ) ... ] ... ) >>> >>> rpcserver = MyRPCServer.spawn( ... DCERPC_Transport.NCACN_NP, ... iface=conf.loopback_name, ... ssp=ssp, ... port=12345, ... bg=True, ... ) Server SMB_Server started listening on ('127.0.0.1', 12345) ###(054)=[passed] Functional: Connect to it with DCERPC_Client over NCACN_NP with NTLMSSP >>> client = DCERPC_Client( ... DCERPC_Transport.NCACN_NP, ... ssp=ssp, ... ndr64=False, ... ) >>> client.connect(get_if_addr(conf.loopback_name), port=12345, smb_kwargs={"debug": 5}) ┃ Connecting to 127.0.0.1 on port 12345 via ... └ Connected from ('127.0.0.1', 54816) Starting control thread [tid=140735983710464] ┃ Connection received from ('127.0.0.1', 54816) Received command RUN ## state=[BEGIN] Trying Condition [continue_smb2] Condition [continue_smb2] not taken Trying Condition [send_negotiate] Condition [send_negotiate] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate] SENT : DirectTCP / SMB_Header / SMBNegotiate_Request switching from [BEGIN] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] Select on [, ] Selected [] Looking at RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Trying Receive condition [receive_negotiate_response] Receive condition [receive_negotiate_response] taken to state [SMB2_NEGOTIATE] switching from [SENT_NEGOTIATE] to [SMB2_NEGOTIATE] ## state=[SMB2_NEGOTIATE] Trying Condition [send_negotiate_smb2] Condition [send_negotiate_smb2] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate_smb2] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request switching from [SMB2_NEGOTIATE] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] Select on [, ] Selected [] Looking at RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Trying Receive condition [receive_negotiate_response] Receive condition [receive_negotiate_response] taken to state [NEGOTIATED] switching from [SENT_NEGOTIATE] to [NEGOTIATED] ## state=[NEGOTIATED] Trying Condition [should_send_setup_andx_request] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] Select on [, ] Selected [] Looking at RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Trying Receive condition [receive_setup_andx_response] Receive condition [receive_setup_andx_response] taken to state [NEGOTIATED] switching from [SENT_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] Trying Condition [should_send_setup_andx_request] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] Select on [, ] > User authenticated ! Selected [] Looking at RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Trying Receive condition [receive_setup_andx_response] Receive condition [receive_setup_andx_response] taken to state [AUTHENTICATED] switching from [SENT_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Trying Condition [authenticated_post_actions] Condition [authenticated_post_actions] taken to state [SOCKET_BIND] switching from [AUTHENTICATED] to [SOCKET_BIND] ## state=[SOCKET_BIND] Trying Condition [start_smb_socket] Condition [start_smb_socket] taken to state [SOCKET_MODE_SMB] switching from [SOCKET_BIND] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Select on [, , ] >>> client.open_smbpipe("wkssvc") Selected [] Looking at IOEVENT on smbpipe Trying I/O event [outgoing_data_received_smb] I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / Raw switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Select on [, , ] > Tree Connect on: IPC$ Selected [] Looking at RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response Trying Receive condition [incoming_data_received_smb] Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Select on [, , ] Selected [] Looking at IOEVENT on smbpipe Trying I/O event [outgoing_data_received_smb] I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / Raw switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Select on [, , ] > Opened: wkssvc Selected [] Looking at RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Trying Receive condition [incoming_data_received_smb] Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Select on [, , ] >>> client.bind(find_dcerpc_interface("wkssvc")) >> DceRpc5Bind on (with SPNEGOSSP) Selected [] Looking at IOEVENT on smbpipe Trying I/O event [outgoing_data_received_smb] I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / Raw switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Select on [, , ] << DceRpc5Bind >> DceRpc5BindAck wkssvc is on port '\\PIPE\\wkssvc' using NDR 2.0 Selected [] Looking at RECVD: DirectTCP / SMB2_Header / SMB2_IOCTL_Response Trying Receive condition [incoming_data_received_smb] Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Select on [, , ] << DceRpc5BindAck port '\\PIPE\\wkssvc' using NDR32 True >>> >>> req = NetrWkstaGetInfo_Request( ... ServerName="Nice", ... Level=0x00000064, # WKSTA_INFO_100 ... ndr64=False ... ) >>> resp = client.sr1_req(req) >> REQUEST: NetrWkstaGetInfo_Request Selected [] Looking at IOEVENT on smbpipe Trying I/O event [outgoing_data_received_smb] I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / Raw switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Select on [, , ] << REQUEST: NetrWkstaGetInfo_Request ###[ NetrWkstaGetInfo_Request ]### \ServerName\ |###[ NDRPointer ]### | referent_id= 0x20000 | \value \ | |###[ NDRConformantArray ]### | | max_count = 5 | | \value \ | | |###[ NDRVaryingArray ]### | | | offset = 0 | | | actual_count= 5 | | | value = b'Nice' Level = 100 >> RESPONSE: NetrWkstaGetInfo_Response Selected [] Looking at RECVD: DirectTCP / SMB2_Header / SMB2_IOCTL_Response Trying Receive condition [incoming_data_received_smb] Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Select on [, , ] << RESPONSE: NetrWkstaGetInfo_Response >>> >>> assert isinstance(resp.valueof("WkstaInfo"), LPWKSTA_INFO_100) >>> assert resp.valueof("WkstaInfo").valueof("wki100_computername") == b"NiceServer" ###(055)=[passed] Functional: Connect to the server with samba's rpcclient over NCACN_NP with NTLMSSP >>> result = run_rpcclient("ncacn_np", "wkssvc_enumeratecomputernames") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=11> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback ┃ Connection received from ('127.0.0.1', 54832) > User authenticated ! > Tree Connect on: IPC$ > Opened: wkssvc << DceRpc5Bind >> DceRpc5BindAck wkssvc is on port '\\PIPE\\wkssvc' using NDR 2.0 << REQUEST: NetrEnumerateComputerNames_Request ###[ NetrEnumerateComputerNames_Request ]### \ServerName\ |###[ NDRPointer ]### | referent_id= 0x20000 | \value \ | |###[ NDRConformantArray ]### | | max_count = 10 | | \value \ | | |###[ NDRVaryingArray ]### | | | offset = 0 | | | actual_count= 10 | | | value = b'127.0.0.1' NameType = NetAllComputerNames Reserved = 0 >> RESPONSE: NetrEnumerateComputerNames_Response >>> print(result.decode()) name: 0 Scapy name: 1 Scapy name: 2 Scapy >>> assert b"Scapy" in result ###(056)=[passed] Functional: Close the server >>> client.close() X Connection closed Selected [] Looking at Received command STOP Stopping control thread (tid=140735983710464) >>> try: ... rpcserver.shutdown(socket.SHUT_RDWR) ... except OSError: ... pass ... >>> rpcserver.close() X Server closed. DHCP regression tests for Scapy ━ Run at 01:42:10 from [test/scapy/layers/dhcp.uts] by UTscapy in 0.04041576385498047 └ Passed=7 └ Failed=0 ###### ## DHCP ###### ###(000)=[passed] BOOTP - misc >>> assert BOOTP().answers(BOOTP()) >>> assert BOOTP().hashret() == b"\x00\x00\x00\x00" >>> >>> import random >>> random.seed(0x2809) >>> o = str(RandDHCPOptions(size=1)) >>> assert o in [r"[('NIS_server', '215.226.221.106')]", r"[('tcp_keepalive_interval', 3853054080)]", r"[('tcp_keepalive_interval', 3853054080L)]"] ###(001)=[passed] DHCPOptionsField >>> value = [("hostname", "scapy")] >>> dhcpoptfield = DHCPOptionsField("options", "") >>> assert dhcpoptfield.i2repr("", value) == "[hostname='scapy']" >>> assert dhcpoptfield.i2repr("", ["opt", "opt2"]) == "[opt opt2]" >>> assert dhcpoptfield.i2m("", value) == b'\x0c\x05scapy' >>> assert dhcpoptfield.m2i("", b'\x0cunknown') == [b'\x0cunknown'] >>> assert dhcpoptfield.m2i("", b'\x0c\x05scapy') == [('hostname', b'scapy')] >>> >>> unknown_value_end = b"\xfe" + b"\xff"*257 >>> udof = DHCPOptionsField("options", unknown_value_end) >>> assert udof.m2i("", unknown_value_end) == [(254, b'\xff'*255), 'end'] >>> >>> unknown_value_pad = b"\xfe" + b"\xff"*256 + b"\x00" >>> udof = DHCPOptionsField("options", unknown_value_pad) >>> assert udof.m2i("", unknown_value_pad) == [(254, b'\xff'*255), 'pad'] ###(002)=[passed] DHCP - build >>> s = raw(IP(src="127.0.0.1")/UDP()/BOOTP(chaddr="00:01:02:03:04:05")/DHCP(options=[("message-type","discover"),"end"])) >>> assert s == b'E\x00\x01\x10\x00\x01\x00\x00@\x11{\xda\x7f\x00\x00\x01\x7f\x00\x00\x01\x00C\x00D\x00\xfcf\xea\x01\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0000:01:02:03:04:0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Sc5\x01\x01\xff' >>> >>> s2 = raw(IP(src="127.0.0.1")/UDP()/BOOTP(chaddr="05:04:03:02:01:00")/DHCP(options=[("param_req_list",[12,57,45,254]),("requested_addr", "192.168.0.1"),"end"])) >>> assert s2 == b'E\x00\x01\x19\x00\x01\x00\x00@\x11{\xd1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00C\x00D\x01\x058\xeb\x01\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0005:04:03:02:01:0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Sc7\x04\x0c9-\xfe2\x04\xc0\xa8\x00\x01\xff' >>> >>> s3 = raw(IP(src="127.0.0.1")/UDP()/BOOTP(chaddr="05:04:03:02:01:00")/DHCP(options=[("time_zone",123),("uap-servers","www.example.com"),("netinfo-server-address","10.0.0.1"), ... ("ieee802-3-encapsulation", 2),("max_dgram_reass_size", 120), ("pxelinux_path_prefix","/some/path"), "end"])) >>> assert s3 == b'E\x00\x01=\x00\x01\x00\x00@\x11{\xad\x7f\x00\x00\x01\x7f\x00\x00\x01\x00C\x00D\x01)\x04i\x01\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0005:04:03:02:01:0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Sc\x02\x04\x00\x00\x00{b\x0fwww.example.comp\x04\n\x00\x00\x01$\x01\x02\x16\x02\x00x\xd2\n/some/path\xff' >>> >>> s4 = raw(IP(src="127.0.0.1")/UDP()/BOOTP(chaddr="00:01:02:03:04:05")/DHCP(options=[("mud-url", "https://example.org"), ("captive-portal", "https://example.com"), ("ipv6-only-preferred", 0xffffffff), "end"])) >>> assert s4 == b"E\x00\x01=\x00\x01\x00\x00@\x11{\xad\x7f\x00\x00\x01\x7f\x00\x00\x01\x00C\x00D\x01)L\xd7\x01\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0000:01:02:03:04:0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Sc\xa1\x13https://example.orgr\x13https://example.com\x6c\x04\xff\xff\xff\xff\xff" >>> >>> s5 = raw(IP(src="127.0.0.1")/UDP()/BOOTP(chaddr="00:01:02:03:04:05")/DHCP(options=[("classless_static_routes", "192.168.123.4/32:10.0.0.1", "169.254.254.0/24:10.0.1.2"), ("rapid_commit", b""), "end"])) >>> assert s5 == b'E\x00\x01"\x00\x01\x00\x00@\x11{\xc8\x7f\x00\x00\x01\x7f\x00\x00\x01\x00C\x00D\x01\x0e\xaa\xfd\x01\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0000:01:02:03:04:0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00c\x82Scy\x11 \xc0\xa8{\x04\n\x00\x00\x01\x18\xa9\xfe\xfe\n\x00\x01\x02P\x00\xff' ###(003)=[passed] DHCP - fuzz >>> pkt = fuzz(DHCP()) >>> assert isinstance(pkt.options, RandDHCPOptions) >>> pkt = DHCP(bytes(pkt)) >>> pkt.show() ###[ DHCP options ]### options = [perform-mask-discovery=207 path-mtu-plateau-table=34700 classless_static_routes=['152.83.8.0/18:33.232.19.8', '53.48.56.0/20:172.11.197.68', '242.208.12.0/22:220.96.187.11', '148.10.0.0/15:232.251.146.25'] WWW_server=197.22.36.153 static-routes=149.13.59.50 sip_ua_service_domains=b'\r\x90\xa9>\x06\x93\x15\xf5\xe4B\xce\xbc#\xf2\x890\xb3\xf6\xaf\xf4\xcf\x9bG\x15\x13\xc7WB\xcb6\x9e\xc5/xz\xe2\xd8\x08\xdf#\xf3o\xd5\xbb@\xb0LrSk\',\xd6\x04\xc1\x0e\x82\xf6\x19\xc0\xf4\xebv\x1bT\x14\x9c\xbe\xec\xf9\xc2\x9bwjdpN_@:\xa9\xbd\xd4>\xbf_\xb2\x99\xed\x05\x92\xdd\xdd3\xd4\x87\xcc\xf9\xe5\xf2\xb4\x04\xc7HN"\xdf6M\xbf\xc4\x88\x89\xda\x06`\x97=Mk\x8f\x05\x90\xd1\xe5\x06\xfc6\xe4\xc3\xcc\xddkI4\x07Y\x05\x91&\x11B\x9c:>\xcf\xf0\xe9\x1f\xa4\xcf\xb9\xa2\x12\xb9\xe9\xf7Q\xaf+\x14\x8c\x1buR\x13\x11\x19\xaf\xc1\xb9' IRC_server=96.188.165.185 StreetTalk_server=227.126.228.21 broadcast_address=186.119.81.4 time_server=206.243.199.87 domain=b'\xf95j\x8a\xdf\xbfO\x86\x06R\x92D\xe7\xb3\xbb\t\xabinU\x8b\xeb\x17\xb2\xabcT\xef\x14Tk\t[\xfc\x03\xb2\xd6P\n\x93\x88f\xf4\x81\x07(\x85am\xb5\xe5Z\xea\x887\xda\xef\xdckd)\xb6I\xb9L\xcaZ\xfe\xbf\xcb\xcd\xd0\xfe\x14\xd8\x8d\x1d\r\xe4\xd9Yww\xfd4\xc8\x15g\xd2\xa4\xb5Vce\xc0G/\x8e\xb3\xa0\xebdI\xa9\xf5\xea\xea\x85\xff\x0f\xf1s\xf4`\xf6F\xcf\xc4\xf5/J=b\xfcd\x06~@!"0.\xe5U\x134\x9ag"\x17\xe2\x01UA\x0b\xbf\xa55BVl\x8e\xa9\x19\x00\x9a\xd1\x01\xa8\x00\xf1\x9b\x91\xc9\xa9\x07k\xbf\xfa1\x8c9s_x\x97A\xef>+a\x98\xe9A\xea\x1c}\x1aG\xb3\xed\x8cm\x85^[\x8bE\x04-\xf2]U\x11\xae?\xa5' mobile-ip-home-agent=246.158.85.237 domain=b'_g{[\xf8\xe8\xac%\xa3\x12\xbc8W\xa7\xbe\x15\x08\xd1t\x8a\x8f\x9e\x1a\xb1\xb8W\xe7.s\xb8\xb3\xba\x80x\xe4n\x13\x99|J\x80\xb77' user_class=b'u\xc9(\x84S5\xa5\x9f\xa1\x89J\xa9\x81!\n0\x9f\xafBc\xb0\xf1\x9a \xffr\xc2\xb0q\xfc\x00H\xa3\xe9\xd2\xe8\x90\x9a+\xda\xe1\xfe\xca\xda\x01Y(,0y\xf2\x0c4\x1a\xcbsV\x01-\xfd\xdb\xce\xd6\xf5:\xc6\x8af\x99\t\xc9\xc63\xd1\xb84\xb4\xb1\xf6Ox5\xfb\x13\x1f9\x90\xa4\xf9\xeb\xb8F^\xbe\xd0(M\xfd2\xf9)\xcf\xe4$_\xb0(1b\xef\x8f\xeb\xa5;(\x0bJ>> p = IP(s) >>> assert DHCP in p and p[DHCP].options[0] == ('message-type', 1) >>> >>> p2 = IP(s2) >>> assert DHCP in p2 >>> assert p2[DHCP].options[0] == ("param_req_list",[12,57,45,254]) >>> assert p2[DHCP].options[1] == ("requested_addr", "192.168.0.1") >>> >>> p3 = IP(s3) >>> assert DHCP in p3 >>> assert p3[DHCP].options[0] == ("time_zone",123) >>> assert p3[DHCP].options[1] == ("uap-servers", b'www.example.com') >>> assert p3[DHCP].options[2] == ("netinfo-server-address", "10.0.0.1") >>> assert p3[DHCP].options[3] == ("ieee802-3-encapsulation", 2) >>> assert p3[DHCP].options[4] == ("max_dgram_reass_size", 120) >>> assert p3[DHCP].options[5] == ("pxelinux_path_prefix", b'/some/path') >>> assert p3[DHCP].options[6] == "end" >>> >>> p4 = IP(s4) >>> assert DHCP in p4 >>> assert p4[DHCP].options[0] == ("mud-url", b"https://example.org") >>> assert p4[DHCP].options[1] == ("captive-portal", b"https://example.com") >>> assert p4[DHCP].options[2] == ("ipv6-only-preferred", 0xffffffff) >>> >>> p5 = IP(s5) >>> assert DHCP in p5 >>> assert p5[DHCP].options[0] == ("classless_static_routes", ["192.168.123.4/32:10.0.0.1", "169.254.254.0/24:10.0.1.2"]) >>> assert p5[DHCP].options[1] == ("rapid_commit", b"") >>> >>> repr(DHCP(b"\x01\x00")) '\x1b[0m<\x1b[0m\x1b[31m\x1b[1mDHCP\x1b[0m \x1b[34moptions\x1b[0m\x1b[0m=\x1b[0m\x1b[35m[..]\x1b[0m \x1b[0m|\x1b[0m\x1b[0m>\x1b[0m' >>> assert DHCP(b"\x01\x00").options == [b"\x01\x00"] >>> assert DHCP(b"\x28\x00").options == [("NIS_domain", b"")] >>> assert DHCP(b"\x37\x00").options == [("param_req_list", [])] >>> assert DHCP(b"\x50\x00").options == [("rapid_commit", b"")] >>> assert DHCP(b"\x79\x00").options == [("classless_static_routes", [])] >>> assert DHCP(b"\x01\x0C\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b").options == [("subnet_mask", "0.1.2.3", "4.5.6.7", "8.9.10.11")] >>> >>> b = b"\x79\x01\xff" >>> p = DHCP(b) >>> assert p.options == [b] >>> p.clear_cache() >>> assert raw(p) == b >>> >>> b = b"\x79\x0a\x21\x01\x02\x03\x04\x05\x06\x07\x08\x09" >>> p = DHCP(b) >>> assert p.options == [b] >>> p.clear_cache() >>> assert raw(p) == b >>> >>> b = b"\x79\x09\x20\x01\x02\x03\x04\x05\x06\x07\x08\xff" >>> assert DHCP(b).options == [("classless_static_routes", ["1.2.3.4/32:5.6.7.8"]), "end"] ###(005)=[passed] DHCPOptions >>> assert DHCPOptions[33].name == "static-routes" >>> assert DHCPOptions[46].name == "NetBIOS_node_type" >>> assert DHCPRevOptions['static-routes'][0] == 33 ###(006)=[passed] Check that the dhcpd alias is properly defined and documented >>> assert dhcpd >>> import IPython >>> assert IPython.lib.pretty.pretty(dhcpd) == '' DHCPv6 regression tests for Scapy ━ Run at 01:42:11 from [test/scapy/layers/dhcp6.uts] by UTscapy in 0.3825070858001709 └ Passed=328 └ Failed=0 ###### ## Test DHCP6 DUID_LLT ###### ###(000)=[passed] DUID_LLT basic instantiation >>> a=DUID_LLT() ###(001)=[passed] DUID_LLT basic build >>> raw(DUID_LLT()) == b'\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(002)=[passed] DUID_LLT build with specific values >>> raw(DUID_LLT(lladdr="ff:ff:ff:ff:ff:ff", timeval=0x11111111, hwtype=0x2222)) == b'\x00\x01""\x11\x11\x11\x11\xff\xff\xff\xff\xff\xff' True ###(003)=[passed] DUID_LLT basic dissection >>> a=DUID_LLT(raw(DUID_LLT())) >>> a.type == 1 and a.hwtype == 1 and a.timeval == 0 and a.lladdr == "00:00:00:00:00:00" True ###(004)=[passed] DUID_LLT dissection with specific values >>> a=DUID_LLT(b'\x00\x01""\x11\x11\x11\x11\xff\xff\xff\xff\xff\xff') >>> a.type == 1 and a.hwtype == 0x2222 and a.timeval == 0x11111111 and a.lladdr == "ff:ff:ff:ff:ff:ff" True ###### ## Test DHCP6 DUID_EN ###### ###(005)=[passed] DUID_EN basic instantiation >>> a=DUID_EN() ###(006)=[passed] DUID_EN basic build >>> raw(DUID_EN()) == b'\x00\x02\x00\x00\x017' True ###(007)=[passed] DUID_EN build with specific values >>> raw(DUID_EN(enterprisenum=0x11111111, id="iamastring")) == b'\x00\x02\x11\x11\x11\x11iamastring' True ###(008)=[passed] DUID_EN basic dissection >>> a=DUID_EN(b'\x00\x02\x00\x00\x017') >>> a.type == 2 and a.enterprisenum == 311 True ###(009)=[passed] DUID_EN dissection with specific values >>> a=DUID_EN(b'\x00\x02\x11\x11\x11\x11iamarawing') >>> a.type == 2 and a.enterprisenum == 0x11111111 and a.id == b"iamarawing" True ###### ## Test DHCP6 DUID_LL ###### ###(010)=[passed] DUID_LL basic instantiation >>> a=DUID_LL() ###(011)=[passed] DUID_LL basic build >>> raw(DUID_LL()) == b'\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00' True ###(012)=[passed] DUID_LL build with specific values >>> raw(DUID_LL(hwtype=1, lladdr="ff:ff:ff:ff:ff:ff")) == b'\x00\x03\x00\x01\xff\xff\xff\xff\xff\xff' True ###(013)=[passed] DUID_LL basic dissection >>> a=DUID_LL(raw(DUID_LL())) >>> a.type == 3 and a.hwtype == 1 and a.lladdr == "00:00:00:00:00:00" True ###(014)=[passed] DUID_LL with specific values >>> a=DUID_LL(b'\x00\x03\x00\x01\xff\xff\xff\xff\xff\xff') >>> a.hwtype == 1 and a.lladdr == "ff:ff:ff:ff:ff:ff" True ###### ## Test DHCP6 DUID_UUID ###### ###(015)=[passed] DUID_UUID basic instantiation >>> a=DUID_UUID() ###(016)=[passed] DUID_UUID basic build >>> raw(DUID_UUID()) == b"\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" True ###(017)=[passed] DUID_UUID build with specific values >>> raw(DUID_UUID(uuid="272adcca-138c-4e8d-b3f4-634e953128cf")) == \ ... b"\x00\x04'*\xdc\xca\x13\x8cN\x8d\xb3\xf4cN\x951(\xcf" True ###(018)=[passed] DUID_UUID basic dissection >>> a=DUID_UUID(raw(DUID_UUID())) >>> a.type == 4 and str(a.uuid) == "00000000-0000-0000-0000-000000000000" True ###(019)=[passed] DUID_UUID with specific values >>> a=DUID_UUID(b"\x00\x04'*\xdc\xca\x13\x8cN\x8d\xb3\xf4cN\x951(\xcf") >>> a.type == 4 and str(a.uuid) == "272adcca-138c-4e8d-b3f4-634e953128cf" True ###### ## Test DHCP6 Opt Unknown ###### ###(020)=[passed] DHCP6 Opt Unknown basic instantiation >>> a=DHCP6OptUnknown() ###(021)=[passed] DHCP6 Opt Unknown basic build (default values) >>> raw(DHCP6OptUnknown()) == b'\x00\x00\x00\x00' True ###(022)=[passed] DHCP6 Opt Unknown - len computation test >>> raw(DHCP6OptUnknown(data="shouldbe9")) == b'\x00\x00\x00\tshouldbe9' True ###### ## Test DHCP6 Client Identifier option ###### ###(023)=[passed] DHCP6OptClientId basic instantiation >>> a=DHCP6OptClientId() ###(024)=[passed] DHCP6OptClientId basic build >>> raw(DHCP6OptClientId()) == b'\x00\x01\x00\x00' True ###(025)=[passed] DHCP6OptClientId instantiation with specific values >>> raw(DHCP6OptClientId(duid="toto")) == b'\x00\x01\x00\x04toto' True ###(026)=[passed] DHCP6OptClientId instantiation with DUID_LL >>> raw(DHCP6OptClientId(duid=DUID_LL())) == b'\x00\x01\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00' True ###(027)=[passed] DHCP6OptClientId instantiation with DUID_LLT >>> raw(DHCP6OptClientId(duid=DUID_LLT())) == b'\x00\x01\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(028)=[passed] DHCP6OptClientId instantiation with DUID_EN >>> raw(DHCP6OptClientId(duid=DUID_EN())) == b'\x00\x01\x00\x06\x00\x02\x00\x00\x017' True ###(029)=[passed] DHCP6OptClientId instantiation with specified length >>> raw(DHCP6OptClientId(optlen=80, duid="somestring")) == b'\x00\x01\x00Psomestring' True ###(030)=[passed] DHCP6OptClientId basic dissection >>> a=DHCP6OptClientId(b'\x00\x01\x00\x00') >>> a.optcode == 1 and a.optlen == 0 True ###(031)=[passed] DHCP6OptClientId instantiation with specified length >>> raw(DHCP6OptClientId(optlen=80, duid="somestring")) == b'\x00\x01\x00Psomestring' True ###(032)=[passed] DHCP6OptClientId basic dissection >>> a=DHCP6OptClientId(b'\x00\x01\x00\x00') >>> a.optcode == 1 and a.optlen == 0 True ###(033)=[passed] DHCP6OptClientId dissection with specific duid value >>> a=DHCP6OptClientId(b'\x00\x01\x00\x04somerawing') >>> a.optcode == 1 and a.optlen == 4 and isinstance(a.duid, Raw) and a.duid.load == b'some' and isinstance(a.payload, DHCP6OptUnknown) True ###(034)=[passed] DHCP6OptClientId dissection with specific DUID_LL as duid value >>> a=DHCP6OptClientId(b'\x00\x01\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00') >>> a.optcode == 1 and a.optlen == 10 and isinstance(a.duid, DUID_LL) and a.duid.type == 3 and a.duid.hwtype == 1 and a.duid.lladdr == "00:00:00:00:00:00" True ###(035)=[passed] DHCP6OptClientId dissection with specific DUID_LLT as duid value >>> a=DHCP6OptClientId(b'\x00\x01\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.optcode == 1 and a.optlen == 14 and isinstance(a.duid, DUID_LLT) and a.duid.type == 1 and a.duid.hwtype == 1 and a.duid.timeval == 0 and a.duid.lladdr == "00:00:00:00:00:00" True ###(036)=[passed] DHCP6OptClientId dissection with specific DUID_EN as duid value >>> a=DHCP6OptClientId(b'\x00\x01\x00\x06\x00\x02\x00\x00\x017') >>> a.optcode == 1 and a.optlen == 6 and isinstance(a.duid, DUID_EN) and a.duid.type == 2 and a.duid.enterprisenum == 311 and a.duid.id == b"" True ###### ## Test DHCP6 Server Identifier option ###### ###(037)=[passed] DHCP6OptServerId basic instantiation >>> a=DHCP6OptServerId() ###(038)=[passed] DHCP6OptServerId basic build >>> raw(DHCP6OptServerId()) == b'\x00\x02\x00\x00' True ###(039)=[passed] DHCP6OptServerId basic build with specific values >>> raw(DHCP6OptServerId(duid="toto")) == b'\x00\x02\x00\x04toto' True ###(040)=[passed] DHCP6OptServerId instantiation with DUID_LL >>> raw(DHCP6OptServerId(duid=DUID_LL())) == b'\x00\x02\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00' True ###(041)=[passed] DHCP6OptServerId instantiation with DUID_LLT >>> raw(DHCP6OptServerId(duid=DUID_LLT())) == b'\x00\x02\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(042)=[passed] DHCP6OptServerId instantiation with DUID_EN >>> raw(DHCP6OptServerId(duid=DUID_EN())) == b'\x00\x02\x00\x06\x00\x02\x00\x00\x017' True ###(043)=[passed] DHCP6OptServerId instantiation with specified length >>> raw(DHCP6OptServerId(optlen=80, duid="somestring")) == b'\x00\x02\x00Psomestring' True ###(044)=[passed] DHCP6OptServerId basic dissection >>> a=DHCP6OptServerId(b'\x00\x02\x00\x00') >>> a.optcode == 2 and a.optlen == 0 True ###(045)=[passed] DHCP6OptServerId dissection with specific duid value >>> a=DHCP6OptServerId(b'\x00\x02\x00\x04somerawing') >>> a.optcode == 2 and a.optlen == 4 and isinstance(a.duid, Raw) and a.duid.load == b'some' and isinstance(a.payload, DHCP6OptUnknown) True ###(046)=[passed] DHCP6OptServerId dissection with specific DUID_LL as duid value >>> a=DHCP6OptServerId(b'\x00\x02\x00\n\x00\x03\x00\x01\x00\x00\x00\x00\x00\x00') >>> a.optcode == 2 and a.optlen == 10 and isinstance(a.duid, DUID_LL) and a.duid.type == 3 and a.duid.hwtype == 1 and a.duid.lladdr == "00:00:00:00:00:00" True ###(047)=[passed] DHCP6OptServerId dissection with specific DUID_LLT as duid value >>> a=DHCP6OptServerId(b'\x00\x02\x00\x0e\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.optcode == 2 and a.optlen == 14 and isinstance(a.duid, DUID_LLT) and a.duid.type == 1 and a.duid.hwtype == 1 and a.duid.timeval == 0 and a.duid.lladdr == "00:00:00:00:00:00" True ###(048)=[passed] DHCP6OptServerId dissection with specific DUID_EN as duid value >>> a=DHCP6OptServerId(b'\x00\x02\x00\x06\x00\x02\x00\x00\x017') >>> a.optcode == 2 and a.optlen == 6 and isinstance(a.duid, DUID_EN) and a.duid.type == 2 and a.duid.enterprisenum == 311 and a.duid.id == b"" True ###### ## Test DHCP6 IA Address Option (IA_TA or IA_NA suboption) ###### ###(049)=[passed] DHCP6OptIAAddress - Basic Instantiation >>> raw(DHCP6OptIAAddress()) == b'\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(050)=[passed] DHCP6OptIAAddress - Basic Dissection >>> a = DHCP6OptIAAddress(b'\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.optcode == 5 and a.optlen == 24 and a.addr == "::" and a.preflft == 0 and a. validlft == 0 and a.iaaddropts == [] True ###(051)=[passed] DHCP6OptIAAddress - Instantiation with specific values >>> raw(DHCP6OptIAAddress(optlen=0x1111, addr="2222:3333::5555", preflft=0x66666666, validlft=0x77777777, iaaddropts="somestring")) == b'\x00\x05\x11\x11""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwwwsomestring' True ###(052)=[passed] DHCP6OptIAAddress - Instantiation with specific values (default optlen computation) >>> raw(DHCP6OptIAAddress(addr="2222:3333::5555", preflft=0x66666666, validlft=0x77777777, iaaddropts="somestring")) == b'\x00\x05\x00"""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwwwsomestring' True ###(053)=[passed] DHCP6OptIAAddress - Dissection with specific values >>> a = DHCP6OptIAAddress(b'\x00\x05\x00"""33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00UUffffwwwwsomerawing') >>> a.optcode == 5 and a.optlen == 34 and a.addr == "2222:3333::5555" and a.preflft == 0x66666666 and a. validlft == 0x77777777 and a.iaaddropts[0].load == b"somerawing" True ###### ## Test DHCP6 Identity Association for Non-temporary Addresses Option ###### ###(054)=[passed] DHCP6OptIA_NA - Basic Instantiation >>> raw(DHCP6OptIA_NA()) == b'\x00\x03\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(055)=[passed] DHCP6OptIA_NA - Basic Dissection >>> a = DHCP6OptIA_NA(b'\x00\x03\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.optcode == 3 and a.optlen == 12 and a.iaid == 0 and a.T1 == 0 and a.T2==0 and a.ianaopts == [] True ###(056)=[passed] DHCP6OptIA_NA - Instantiation with specific values (keep automatic length computation) >>> raw(DHCP6OptIA_NA(iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == b'\x00\x03\x00\x0c""""3333DDDD' True ###(057)=[passed] DHCP6OptIA_NA - Instantiation with specific values (forced optlen) >>> raw(DHCP6OptIA_NA(optlen=0x1111, iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == b'\x00\x03\x11\x11""""3333DDDD' True ###(058)=[passed] DHCP6OptIA_NA - Instantiation with a list of IA Addresses (optlen automatic computation) >>> raw(DHCP6OptIA_NA(iaid=0x22222222, T1=0x33333333, T2=0x44444444, ianaopts=[DHCP6OptIAAddress(), DHCP6OptIAAddress()])) == b'\x00\x03\x00D""""3333DDDD\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(059)=[passed] DHCP6OptIA_NA - Dissection with specific values >>> a = DHCP6OptIA_NA(b'\x00\x03\x00L""""3333DDDD\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.optcode == 3 and a.optlen == 76 and a.iaid == 0x22222222 and a.T1 == 0x33333333 and a.T2==0x44444444 and len(a.ianaopts) == 2 and isinstance(a.ianaopts[0], DHCP6OptIAAddress) and isinstance(a.ianaopts[1], DHCP6OptIAAddress) True ###(060)=[passed] DHCP6OptIA_NA - Instantiation with a list of different opts: IA Address and Status Code (optlen automatic computation) >>> raw(DHCP6OptIA_NA(iaid=0x22222222, T1=0x33333333, T2=0x44444444, ianaopts=[DHCP6OptIAAddress(), DHCP6OptStatusCode(statuscode=0xff, statusmsg="Hello")])) == b'\x00\x03\x003""""3333DDDD\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\x00\x07\x00\xffHello' True ###### ## Test DHCP6 Identity Association for Temporary Addresses Option ###### ###(061)=[passed] DHCP6OptIA_TA - Basic Instantiation >>> raw(DHCP6OptIA_TA()) == b'\x00\x04\x00\x04\x00\x00\x00\x00' True ###(062)=[passed] DHCP6OptIA_TA - Basic Dissection >>> a = DHCP6OptIA_TA(b'\x00\x04\x00\x04\x00\x00\x00\x00') >>> a.optcode == 4 and a.optlen == 4 and a.iaid == 0 and a.iataopts == [] True ###(063)=[passed] DHCP6OptIA_TA - Instantiation with specific values >>> raw(DHCP6OptIA_TA(optlen=0x1111, iaid=0x22222222, iataopts=[DHCP6OptIAAddress(), DHCP6OptIAAddress()])) == b'\x00\x04\x11\x11""""\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(064)=[passed] DHCP6OptIA_TA - Dissection with specific values >>> a = DHCP6OptIA_TA(b'\x00\x04\x11\x11""""\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.optcode == 4 and a.optlen == 0x1111 and a.iaid == 0x22222222 and len(a.iataopts) == 2 and isinstance(a.iataopts[0], DHCP6OptIAAddress) and isinstance(a.iataopts[1], DHCP6OptIAAddress) True ###(065)=[passed] DHCP6OptIA_TA - Instantiation with a list of different opts: IA Address and Status Code (optlen automatic computation) >>> raw(DHCP6OptIA_TA(iaid=0x22222222, iataopts=[DHCP6OptIAAddress(), DHCP6OptStatusCode(statuscode=0xff, statusmsg="Hello")])) == b'\x00\x04\x00+""""\x00\x05\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\x00\x07\x00\xffHello' True ###### ## Test DHCP6 Option Request Option ###### ###(066)=[passed] DHCP6OptOptReq - Basic Instantiation >>> raw(DHCP6OptOptReq()) == b'\x00\x06\x00\x04\x00\x17\x00\x18' True ###(067)=[passed] DHCP6OptOptReq - optlen field computation >>> raw(DHCP6OptOptReq(reqopts=[1,2,3,4])) == b'\x00\x06\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04' True ###(068)=[passed] DHCP6OptOptReq - instantiation with empty list >>> raw(DHCP6OptOptReq(reqopts=[])) == b'\x00\x06\x00\x00' True ###(069)=[passed] DHCP6OptOptReq - Basic dissection >>> a=DHCP6OptOptReq(b'\x00\x06\x00\x00') >>> a.optcode == 6 and a.optlen == 0 and a.reqopts == [] True ###(070)=[passed] DHCP6OptOptReq - Dissection with specific value >>> a=DHCP6OptOptReq(b'\x00\x06\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04') >>> a.optcode == 6 and a.optlen == 8 and a.reqopts == [1,2,3,4] True ###(071)=[passed] DHCP6OptOptReq - repr >>> a.show() ###[ DHCP6 Option Request Option ]### optcode = ORO optlen = 8 reqopts = [CLIENTID, SERVERID, IA_NA, IA_TA] ###### ## Test DHCP6 Option - Preference option ###### ###(072)=[passed] DHCP6OptPref - Basic instantiation >>> raw(DHCP6OptPref()) == b'\x00\x07\x00\x01\xff' True ###(073)=[passed] DHCP6OptPref - Instantiation with specific values >>> raw(DHCP6OptPref(optlen=0xffff, prefval= 0x11)) == b'\x00\x07\xff\xff\x11' True ###(074)=[passed] DHCP6OptPref - Basic Dissection >>> a=DHCP6OptPref(b'\x00\x07\x00\x01\xff') >>> a.optcode == 7 and a.optlen == 1 and a.prefval == 255 True ###(075)=[passed] DHCP6OptPref - Dissection with specific values >>> a=DHCP6OptPref(b'\x00\x07\xff\xff\x11') >>> a.optcode == 7 and a.optlen == 0xffff and a.prefval == 0x11 True ###### ## Test DHCP6 Option - Elapsed Time ###### ###(076)=[passed] DHCP6OptElapsedTime - Basic Instantiation >>> raw(DHCP6OptElapsedTime()) == b'\x00\x08\x00\x02\x00\x00' True ###(077)=[passed] DHCP6OptElapsedTime - Instantiation with specific elapsedtime value >>> raw(DHCP6OptElapsedTime(elapsedtime=421)) == b'\x00\x08\x00\x02\x01\xa5' True ###(078)=[passed] DHCP6OptElapsedTime - Basic Dissection >>> a=DHCP6OptElapsedTime(b'\x00\x08\x00\x02\x00\x00') >>> a.optcode == 8 and a.optlen == 2 and a.elapsedtime == 0 True ###(079)=[passed] DHCP6OptElapsedTime - Dissection with specific values >>> a=DHCP6OptElapsedTime(b'\x00\x08\x00\x02\x01\xa5') >>> a.optcode == 8 and a.optlen == 2 and a.elapsedtime == 421 True ###(080)=[passed] DHCP6OptElapsedTime - Repr >>> a.show() ###[ DHCP6 Elapsed Time Option ]### optcode = ELAPSED_TIME optlen = 2 elapsedtime= 4.21 sec ###### ## Test DHCP6 Option - Server Unicast Address ###### ###(081)=[passed] DHCP6OptServerUnicast - Basic Instantiation >>> raw(DHCP6OptServerUnicast()) == b'\x00\x0c\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(082)=[passed] DHCP6OptServerUnicast - Instantiation with specific values (test 1) >>> raw(DHCP6OptServerUnicast(srvaddr="2001::1")) == b'\x00\x0c\x00\x10 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(083)=[passed] DHCP6OptServerUnicast - Instantiation with specific values (test 2) >>> raw(DHCP6OptServerUnicast(srvaddr="2001::1", optlen=42)) == b'\x00\x0c\x00* \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(084)=[passed] DHCP6OptServerUnicast - Dissection with default values >>> a=DHCP6OptServerUnicast(b'\x00\x0c\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.optcode == 12 and a.optlen == 16 and a.srvaddr == "::" True ###(085)=[passed] DHCP6OptServerUnicast - Dissection with specific values (test 1) >>> a=DHCP6OptServerUnicast(b'\x00\x0c\x00\x10 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.optcode == 12 and a.optlen == 16 and a.srvaddr == "2001::1" True ###(086)=[passed] DHCP6OptServerUnicast - Dissection with specific values (test 2) >>> a=DHCP6OptServerUnicast(b'\x00\x0c\x00* \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.optcode == 12 and a.optlen == 42 and a.srvaddr == "2001::1" True ###### ## Test DHCP6 Option - Status Code ###### ###(087)=[passed] DHCP6OptStatusCode - Basic Instantiation >>> raw(DHCP6OptStatusCode()) == b'\x00\r\x00\x02\x00\x00' True ###(088)=[passed] DHCP6OptStatusCode - Instantiation with specific values >>> raw(DHCP6OptStatusCode(optlen=42, statuscode=0xff, statusmsg="Hello")) == b'\x00\r\x00*\x00\xffHello' True ###(089)=[passed] DHCP6OptStatusCode - Automatic Length computation >>> raw(DHCP6OptStatusCode(statuscode=0xff, statusmsg="Hello")) == b'\x00\r\x00\x07\x00\xffHello' True ###### ## Test DHCP6 Option - Rapid Commit ###### ###(090)=[passed] DHCP6OptRapidCommit - Basic Instantiation >>> raw(DHCP6OptRapidCommit()) == b'\x00\x0e\x00\x00' True ###(091)=[passed] DHCP6OptRapidCommit - Basic Dissection >>> a=DHCP6OptRapidCommit(b'\x00\x0e\x00\x00') >>> a.optcode == 14 and a.optlen == 0 True ###### ## Test DHCP6 Option - User class ###### ###(092)=[passed] DHCP6OptUserClass - Basic Instantiation >>> raw(DHCP6OptUserClass()) == b'\x00\x0f\x00\x00' True ###(093)=[passed] DHCP6OptUserClass - Basic Dissection >>> a = DHCP6OptUserClass(b'\x00\x0f\x00\x00') >>> a.optcode == 15 and a.optlen == 0 and a.userclassdata == [] True ###(094)=[passed] DHCP6OptUserClass - Instantiation with one user class data rawucture >>> raw(DHCP6OptUserClass(userclassdata=[USER_CLASS_DATA(data="something")])) == b'\x00\x0f\x00\x0b\x00\tsomething' True ###(095)=[passed] DHCP6OptUserClass - Dissection with one user class data rawucture >>> a = DHCP6OptUserClass(b'\x00\x0f\x00\x0b\x00\tsomething') >>> a.optcode == 15 and a.optlen == 11 and len(a.userclassdata) == 1 and isinstance(a.userclassdata[0], USER_CLASS_DATA) and a.userclassdata[0].len == 9 and a.userclassdata[0].data == b'something' True ###(096)=[passed] DHCP6OptUserClass - Instantiation with two user class data rawuctures >>> raw(DHCP6OptUserClass(userclassdata=[USER_CLASS_DATA(data="something"), USER_CLASS_DATA(data="somethingelse")])) == b'\x00\x0f\x00\x1a\x00\tsomething\x00\rsomethingelse' True ###(097)=[passed] DHCP6OptUserClass - Dissection with two user class data rawuctures >>> a = DHCP6OptUserClass(b'\x00\x0f\x00\x1a\x00\tsomething\x00\rsomethingelse') >>> a.optcode == 15 and a.optlen == 26 and len(a.userclassdata) == 2 and isinstance(a.userclassdata[0], USER_CLASS_DATA) and isinstance(a.userclassdata[1], USER_CLASS_DATA) and a.userclassdata[0].len == 9 and a.userclassdata[0].data == b'something' and a.userclassdata[1].len == 13 and a.userclassdata[1].data == b'somethingelse' True ###### ## Test DHCP6 Option - Vendor class ###### ###(098)=[passed] DHCP6OptVendorClass - Basic Instantiation >>> raw(DHCP6OptVendorClass()) == b'\x00\x10\x00\x04\x00\x00\x00\x00' True ###(099)=[passed] DHCP6OptVendorClass - Basic Dissection >>> a = DHCP6OptVendorClass(b'\x00\x10\x00\x04\x00\x00\x00\x00') >>> a.optcode == 16 and a.optlen == 4 and a.enterprisenum == 0 and a.vcdata == [] True ###(100)=[passed] DHCP6OptVendorClass - Instantiation with one vendor class data rawucture >>> raw(DHCP6OptVendorClass(vcdata=[VENDOR_CLASS_DATA(data="something")])) == b'\x00\x10\x00\x0f\x00\x00\x00\x00\x00\tsomething' True ###(101)=[passed] DHCP6OptVendorClass - Dissection with one vendor class data rawucture >>> a = DHCP6OptVendorClass(b'\x00\x10\x00\x0f\x00\x00\x00\x00\x00\tsomething') >>> a.optcode == 16 and a.optlen == 15 and a.enterprisenum == 0 and len(a.vcdata) == 1 and isinstance(a.vcdata[0], VENDOR_CLASS_DATA) and a.vcdata[0].len == 9 and a.vcdata[0].data == b'something' True ###(102)=[passed] DHCP6OptVendorClass - Instantiation with two vendor class data rawuctures >>> raw(DHCP6OptVendorClass(vcdata=[VENDOR_CLASS_DATA(data="something"), VENDOR_CLASS_DATA(data="somethingelse")])) == b'\x00\x10\x00\x1e\x00\x00\x00\x00\x00\tsomething\x00\rsomethingelse' True ###(103)=[passed] DHCP6OptVendorClass - Dissection with two vendor class data rawuctures >>> a = DHCP6OptVendorClass(b'\x00\x10\x00\x1e\x00\x00\x00\x00\x00\tsomething\x00\rsomethingelse') >>> a.optcode == 16 and a.optlen == 30 and a.enterprisenum == 0 and len(a.vcdata) == 2 and isinstance(a.vcdata[0], VENDOR_CLASS_DATA) and isinstance(a.vcdata[1], VENDOR_CLASS_DATA) and a.vcdata[0].len == 9 and a.vcdata[0].data == b'something' and a.vcdata[1].len == 13 and a.vcdata[1].data == b'somethingelse' True ###### ## Test DHCP6 Option - Vendor-specific information ###### ###(104)=[passed] DHCP6OptVendorSpecificInfo - Basic Instantiation >>> raw(DHCP6OptVendorSpecificInfo()) == b'\x00\x11\x00\x04\x00\x00\x00\x00' True ###(105)=[passed] DHCP6OptVendorSpecificInfo - Basic Dissection >>> a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00\x04\x00\x00\x00\x00') >>> a.optcode == 17 and a.optlen == 4 and a.enterprisenum == 0 True ###(106)=[passed] DHCP6OptVendorSpecificInfo - Instantiation with specific values (one option) >>> raw(DHCP6OptVendorSpecificInfo(enterprisenum=0xeeeeeeee, vso=[VENDOR_SPECIFIC_OPTION(optcode=43, optdata="something")])) == b'\x00\x11\x00\x11\xee\xee\xee\xee\x00+\x00\tsomething' True ###(107)=[passed] DHCP6OptVendorSpecificInfo - Dissection with with specific values (one option) >>> a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00\x11\xee\xee\xee\xee\x00+\x00\tsomething') >>> a.optcode == 17 and a.optlen == 17 and a.enterprisenum == 0xeeeeeeee and len(a.vso) == 1 and isinstance(a.vso[0], VENDOR_SPECIFIC_OPTION) and a.vso[0].optlen == 9 and a.vso[0].optdata == b'something' True ###(108)=[passed] DHCP6OptVendorSpecificInfo - Instantiation with specific values (two options) >>> raw(DHCP6OptVendorSpecificInfo(enterprisenum=0xeeeeeeee, vso=[VENDOR_SPECIFIC_OPTION(optcode=43, optdata="something"), VENDOR_SPECIFIC_OPTION(optcode=42, optdata="somethingelse")])) == b'\x00\x11\x00"\xee\xee\xee\xee\x00+\x00\tsomething\x00*\x00\rsomethingelse' True ###(109)=[passed] DHCP6OptVendorSpecificInfo - Dissection with with specific values (two options) >>> a = DHCP6OptVendorSpecificInfo(b'\x00\x11\x00"\xee\xee\xee\xee\x00+\x00\tsomething\x00*\x00\rsomethingelse') >>> a.optcode == 17 and a.optlen == 34 and a.enterprisenum == 0xeeeeeeee and len(a.vso) == 2 and isinstance(a.vso[0], VENDOR_SPECIFIC_OPTION) and isinstance(a.vso[1], VENDOR_SPECIFIC_OPTION) and a.vso[0].optlen == 9 and a.vso[0].optdata == b'something' and a.vso[1].optlen == 13 and a.vso[1].optdata == b'somethingelse' True ###### ## Test DHCP6 Option - Interface-Id ###### ###(110)=[passed] DHCP6OptIfaceId - Basic Instantiation >>> raw(DHCP6OptIfaceId()) == b'\x00\x12\x00\x00' True ###(111)=[passed] DHCP6OptIfaceId - Basic Dissection >>> a = DHCP6OptIfaceId(b'\x00\x12\x00\x00') >>> a.optcode == 18 and a.optlen == 0 True ###(112)=[passed] DHCP6OptIfaceId - Instantiation with specific value >>> raw(DHCP6OptIfaceId(ifaceid="something")) == b'\x00\x12\x00\x09something' True ###(113)=[passed] DHCP6OptIfaceId - Dissection with specific value >>> a = DHCP6OptIfaceId(b'\x00\x12\x00\x09something') >>> a.optcode == 18 and a.optlen == 9 and a.ifaceid == b"something" True ###### ## Test DHCP6 Option - Reconfigure Message ###### ###(114)=[passed] DHCP6OptReconfMsg - Basic Instantiation >>> raw(DHCP6OptReconfMsg()) == b'\x00\x13\x00\x01\x0b' True ###(115)=[passed] DHCP6OptReconfMsg - Basic Dissection >>> a = DHCP6OptReconfMsg(b'\x00\x13\x00\x01\x0b') >>> a.optcode == 19 and a.optlen == 1 and a.msgtype == 11 True ###(116)=[passed] DHCP6OptReconfMsg - Instantiation with specific values >>> raw(DHCP6OptReconfMsg(optlen=4, msgtype=5)) == b'\x00\x13\x00\x04\x05' True ###(117)=[passed] DHCP6OptReconfMsg - Dissection with specific values >>> a = DHCP6OptReconfMsg(b'\x00\x13\x00\x04\x05') >>> a.optcode == 19 and a.optlen == 4 and a.msgtype == 5 True ###### ## Test DHCP6 Option - Reconfigure Accept ###### ###(118)=[passed] DHCP6OptReconfAccept - Basic Instantiation >>> raw(DHCP6OptReconfAccept()) == b'\x00\x14\x00\x00' True ###(119)=[passed] DHCP6OptReconfAccept - Basic Dissection >>> a = DHCP6OptReconfAccept(b'\x00\x14\x00\x00') >>> a.optcode == 20 and a.optlen == 0 True ###(120)=[passed] DHCP6OptReconfAccept - Instantiation with specific values >>> raw(DHCP6OptReconfAccept(optlen=23)) == b'\x00\x14\x00\x17' True ###(121)=[passed] DHCP6OptReconfAccept - Dssection with specific values >>> a = DHCP6OptReconfAccept(b'\x00\x14\x00\x17') >>> a.optcode == 20 and a.optlen == 23 True ###### ## Test DHCP6 Option - SIP Servers Domain Name List ###### ###(122)=[passed] DHCP6OptSIPDomains - Basic Instantiation >>> raw(DHCP6OptSIPDomains()) == b'\x00\x15\x00\x00' True ###(123)=[passed] DHCP6OptSIPDomains - Basic Dissection >>> a = DHCP6OptSIPDomains(b'\x00\x15\x00\x00') >>> a.optcode == 21 and a.optlen == 0 and a.sipdomains == [] True ###(124)=[passed] DHCP6OptSIPDomains - Instantiation with one domain >>> raw(DHCP6OptSIPDomains(sipdomains=["toto.example.org"])) == b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00' True ###(125)=[passed] DHCP6OptSIPDomains - Dissection with one domain >>> a = DHCP6OptSIPDomains(b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00') >>> a.optcode == 21 and a.optlen == 18 and len(a.sipdomains) == 1 and a.sipdomains[0] == "toto.example.org." True ###(126)=[passed] DHCP6OptSIPDomains - Instantiation with two domains >>> raw(DHCP6OptSIPDomains(sipdomains=["toto.example.org", "titi.example.org"])) == b'\x00\x15\x00$\x04toto\x07example\x03org\x00\x04titi\x07example\x03org\x00' True ###(127)=[passed] DHCP6OptSIPDomains - Dissection with two domains >>> a = DHCP6OptSIPDomains(b'\x00\x15\x00$\x04toto\x07example\x03org\x00\x04TITI\x07example\x03org\x00') >>> a.optcode == 21 and a.optlen == 36 and len(a.sipdomains) == 2 and a.sipdomains[0] == "toto.example.org." and a.sipdomains[1] == "TITI.example.org." True ###(128)=[passed] DHCP6OptSIPDomains - Enforcing only one dot at end of domain >>> raw(DHCP6OptSIPDomains(sipdomains=["toto.example.org."])) == b'\x00\x15\x00\x12\x04toto\x07example\x03org\x00' True ###### ## Test DHCP6 Option - SIP Servers IPv6 Address List ###### ###(129)=[passed] DHCP6OptSIPServers - Basic Instantiation >>> raw(DHCP6OptSIPServers()) == b'\x00\x16\x00\x00' True ###(130)=[passed] DHCP6OptSIPServers - Basic Dissection >>> a = DHCP6OptSIPServers(b'\x00\x16\x00\x00') >>> a.optcode == 22 and a. optlen == 0 and a.sipservers == [] True ###(131)=[passed] DHCP6OptSIPServers - Instantiation with specific values (1 address) >>> raw(DHCP6OptSIPServers(sipservers = ["2001:db8::1"] )) == b'\x00\x16\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(132)=[passed] DHCP6OptSIPServers - Dissection with specific values (1 address) >>> a = DHCP6OptSIPServers(b'\x00\x16\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.optcode == 22 and a.optlen == 16 and len(a.sipservers) == 1 and a.sipservers[0] == "2001:db8::1" True ###(133)=[passed] DHCP6OptSIPServers - Instantiation with specific values (2 addresses) >>> raw(DHCP6OptSIPServers(sipservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00\x16\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' True ###(134)=[passed] DHCP6OptSIPServers - Dissection with specific values (2 addresses) >>> a = DHCP6OptSIPServers(b'\x00\x16\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') >>> a.optcode == 22 and a.optlen == 32 and len(a.sipservers) == 2 and a.sipservers[0] == "2001:db8::1" and a.sipservers[1] == "2001:db8::2" True ###### ## Test DHCP6 Option - DNS Recursive Name Server ###### ###(135)=[passed] DHCP6OptDNSServers - Basic Instantiation >>> raw(DHCP6OptDNSServers()) == b'\x00\x17\x00\x00' True ###(136)=[passed] DHCP6OptDNSServers - Basic Dissection >>> a = DHCP6OptDNSServers(b'\x00\x17\x00\x00') >>> a.optcode == 23 and a. optlen == 0 and a.dnsservers == [] True ###(137)=[passed] DHCP6OptDNSServers - Instantiation with specific values (1 address) >>> raw(DHCP6OptDNSServers(dnsservers = ["2001:db8::1"] )) == b'\x00\x17\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(138)=[passed] DHCP6OptDNSServers - Dissection with specific values (1 address) >>> a = DHCP6OptDNSServers(b'\x00\x17\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.optcode == 23 and a.optlen == 16 and len(a.dnsservers) == 1 and a.dnsservers[0] == "2001:db8::1" True ###(139)=[passed] DHCP6OptDNSServers - Instantiation with specific values (2 addresses) >>> raw(DHCP6OptDNSServers(dnsservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00\x17\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' True ###(140)=[passed] DHCP6OptDNSServers - Dissection with specific values (2 addresses) >>> a = DHCP6OptDNSServers(b'\x00\x17\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') >>> a.optcode == 23 and a.optlen == 32 and len(a.dnsservers) == 2 and a.dnsservers[0] == "2001:db8::1" and a.dnsservers[1] == "2001:db8::2" True ###### ## Test DHCP6 Option - DNS Domain Search List Option ###### ###(141)=[passed] DHCP6OptDNSDomains - Basic Instantiation >>> raw(DHCP6OptDNSDomains()) == b'\x00\x18\x00\x00' True ###(142)=[passed] DHCP6OptDNSDomains - Basic Dissection >>> a = DHCP6OptDNSDomains(b'\x00\x18\x00\x00') >>> a.optcode == 24 and a.optlen == 0 and a.dnsdomains == [] True ###(143)=[passed] DHCP6OptDNSDomains - Instantiation with specific values (1 domain) >>> raw(DHCP6OptDNSDomains(dnsdomains=["toto.example.com."])) == b'\x00\x18\x00\x12\x04toto\x07example\x03com\x00' True ###(144)=[passed] DHCP6OptDNSDomains - Dissection with specific values (1 domain) >>> a = DHCP6OptDNSDomains(b'\x00\x18\x00\x12\x04toto\x07example\x03com\x00') >>> a.optcode == 24 and a.optlen == 18 and len(a.dnsdomains) == 1 and a.dnsdomains[0] == "toto.example.com." True ###(145)=[passed] DHCP6OptDNSDomains - Instantiation with specific values (2 domains) >>> raw(DHCP6OptDNSDomains(dnsdomains=["toto.example.com.", "titi.example.com."])) == b'\x00\x18\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00' True ###(146)=[passed] DHCP6OptDNSDomains - Dissection with specific values (2 domains) >>> a = DHCP6OptDNSDomains(b'\x00\x18\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00') >>> a.optcode == 24 and a.optlen == 36 and len(a.dnsdomains) == 2 and a.dnsdomains[0] == "toto.example.com." and a.dnsdomains[1] == "titi.example.com." True ###### ## Test DHCP6 Option - IA_PD Prefix Option ###### ###(147)=[passed] DHCP6OptIAPrefix - Basic Instantiation >>> raw(DHCP6OptIAPrefix()) == b'\x00\x1a\x00\x19\x00\x00\x00\x00\x00\x00\x00\x000 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(148)=[passed] DHCP6OptIAPrefix - Basic Dissection >>> a = DHCP6OptIAPrefix(b'\x00\x1a\x00\x19\x00\x00\x00\x00\x00\x00\x00\x000 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.optcode == 26 and a.optlen == 25 and a.prefix == "2001:db8::" and a.plen == 48 and a.preflft == 0 and a. validlft == 0 and a.iaprefopts == [] True ###(149)=[passed] DHCP6OptIAPrefix - Instantiation with specific values >>> raw(DHCP6OptIAPrefix(optlen=0x1111, prefix="1111:2222:3333:4444::", plen=64, preflft=0x66666666, validlft=0x77777777, iaprefopts="somestring")) == b'\x00\x1a\x11\x11ffffwwww@\x11\x11""33DD\x00\x00\x00\x00\x00\x00\x00\x00somestring' True ###(150)=[passed] DHCP6OptIAPrefix - Instantiation with specific values (default optlen computation) >>> raw(DHCP6OptIAPrefix(prefix="1111:2222:3333:4444::", plen=64, preflft=0x66666666, validlft=0x77777777, iaprefopts="somestring")) == b'\x00\x1a\x00#ffffwwww@\x11\x11""33DD\x00\x00\x00\x00\x00\x00\x00\x00somestring' True ###(151)=[passed] DHCP6OptIAPrefix - Dissection with specific values >>> a = DHCP6OptIAPrefix(b'\x00\x1a\x00#ffffwwww@\x11\x11""33DD\x00\x00\x00\x00\x00\x00\x00\x00somerawing') >>> a.optcode == 26 and a.optlen == 35 and a.prefix == "1111:2222:3333:4444::" and a.plen == 64 and a.preflft == 0x66666666 and a.validlft == 0x77777777 and a.iaprefopts[0].load == b"somerawing" True ###### ## Test DHCP6 Option - Identity Association for Prefix Delegation ###### ###(152)=[passed] DHCP6OptIA_PD - Basic Instantiation >>> raw(DHCP6OptIA_PD()) == b'\x00\x19\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(153)=[passed] DHCP6OptIA_PD - Basic Dissection >>> a = DHCP6OptIA_PD(b'\x00\x19\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.optcode == 25 and a.optlen == 12 and a.iaid == 0 and a.T1 == 0 and a.T2==0 and a.iapdopt == [] True ###(154)=[passed] DHCP6OptIA_PD - Instantiation with specific values (keep automatic length computation) >>> print(raw(DHCP6OptIA_PD(iaid=0x22222222, T1=0x33333333, T2=0x44444444))) b'\x00\x19\x00\x0c""""3333DDDD' >>> raw(DHCP6OptIA_PD(iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == b'\x00\x19\x00\x0c""""3333DDDD' True ###(155)=[passed] DHCP6OptIA_PD - Instantiation with specific values (forced optlen) >>> raw(DHCP6OptIA_PD(optlen=0x1111, iaid=0x22222222, T1=0x33333333, T2=0x44444444)) == b'\x00\x19\x11\x11""""3333DDDD' True ###(156)=[passed] DHCP6OptIA_PD - Instantiation with a list of IA Prefixes (optlen automatic computation) >>> raw(DHCP6OptIA_PD(iaid=0x22222222, T1=0x33333333, T2=0x44444444, iapdopt=[DHCP6OptIAPrefix(), DHCP6OptIAPrefix()])) == b'\x00\x19\x00F""""3333DDDD\x00\x1a\x00\x19\x00\x00\x00\x00\x00\x00\x00\x000 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x19\x00\x00\x00\x00\x00\x00\x00\x000 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(157)=[passed] DHCP6OptIA_PD - Dissection with specific values >>> a = DHCP6OptIA_PD(b'\x00\x19\x00N""""3333DDDD\x00\x1a\x00\x19\x00\x00\x00\x00\x00\x00\x00\x000 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x19\x00\x00\x00\x00\x00\x00\x00\x000 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.optcode == 25 and a.optlen == 78 and a.iaid == 0x22222222 and a.T1 == 0x33333333 and a.T2==0x44444444 and len(a.iapdopt) == 2 and isinstance(a.iapdopt[0], DHCP6OptIAPrefix) and isinstance(a.iapdopt[1], DHCP6OptIAPrefix) True ###(158)=[passed] DHCP6OptIA_PD - Instantiation with a list of different opts: IA Prefix and Status Code (optlen automatic computation) >>> raw(DHCP6OptIA_PD(iaid=0x22222222, T1=0x33333333, T2=0x44444444, iapdopt=[DHCP6OptIAPrefix(), DHCP6OptStatusCode(statuscode=0xff, statusmsg="Hello")])) == b'\x00\x19\x004""""3333DDDD\x00\x1a\x00\x19\x00\x00\x00\x00\x00\x00\x00\x000 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\x00\x07\x00\xffHello' True ###### ## Test DHCP6 Option - NIS Servers ###### ###(159)=[passed] DHCP6OptNISServers - Basic Instantiation >>> raw(DHCP6OptNISServers()) == b'\x00\x1b\x00\x00' True ###(160)=[passed] DHCP6OptNISServers - Basic Dissection >>> a = DHCP6OptNISServers(b'\x00\x1b\x00\x00') >>> a.optcode == 27 and a. optlen == 0 and a.nisservers == [] True ###(161)=[passed] DHCP6OptNISServers - Instantiation with specific values (1 address) >>> raw(DHCP6OptNISServers(nisservers = ["2001:db8::1"] )) == b'\x00\x1b\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(162)=[passed] DHCP6OptNISServers - Dissection with specific values (1 address) >>> a = DHCP6OptNISServers(b'\x00\x1b\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.optcode == 27 and a.optlen == 16 and len(a.nisservers) == 1 and a.nisservers[0] == "2001:db8::1" True ###(163)=[passed] DHCP6OptNISServers - Instantiation with specific values (2 addresses) >>> raw(DHCP6OptNISServers(nisservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00\x1b\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' True ###(164)=[passed] DHCP6OptNISServers - Dissection with specific values (2 addresses) >>> a = DHCP6OptNISServers(b'\x00\x1b\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') >>> a.optcode == 27 and a.optlen == 32 and len(a.nisservers) == 2 and a.nisservers[0] == "2001:db8::1" and a.nisservers[1] == "2001:db8::2" True ###### ## Test DHCP6 Option - NIS+ Servers ###### ###(165)=[passed] DHCP6OptNISPServers - Basic Instantiation >>> raw(DHCP6OptNISPServers()) == b'\x00\x1c\x00\x00' True ###(166)=[passed] DHCP6OptNISPServers - Basic Dissection >>> a = DHCP6OptNISPServers(b'\x00\x1c\x00\x00') >>> a.optcode == 28 and a. optlen == 0 and a.nispservers == [] True ###(167)=[passed] DHCP6OptNISPServers - Instantiation with specific values (1 address) >>> raw(DHCP6OptNISPServers(nispservers = ["2001:db8::1"] )) == b'\x00\x1c\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(168)=[passed] DHCP6OptNISPServers - Dissection with specific values (1 address) >>> a = DHCP6OptNISPServers(b'\x00\x1c\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.optcode == 28 and a.optlen == 16 and len(a.nispservers) == 1 and a.nispservers[0] == "2001:db8::1" True ###(169)=[passed] DHCP6OptNISPServers - Instantiation with specific values (2 addresses) >>> raw(DHCP6OptNISPServers(nispservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00\x1c\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' True ###(170)=[passed] DHCP6OptNISPServers - Dissection with specific values (2 addresses) >>> a = DHCP6OptNISPServers(b'\x00\x1c\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') >>> a.optcode == 28 and a.optlen == 32 and len(a.nispservers) == 2 and a.nispservers[0] == "2001:db8::1" and a.nispservers[1] == "2001:db8::2" True ###### ## Test DHCP6 Option - NIS Domain Name ###### ###(171)=[passed] DHCP6OptNISDomain - Basic Instantiation >>> raw(DHCP6OptNISDomain()) == b'\x00\x1d\x00\x01\x00' True ###(172)=[passed] DHCP6OptNISDomain - Basic Dissection >>> a = DHCP6OptNISDomain(b'\x00\x1d\x00\x00') DNS RR prematured end (ofs=0, len=0) >>> a.optcode == 29 and a.optlen == 0 and a.nisdomain == b"." True ###(173)=[passed] DHCP6OptNISDomain - Instantiation with one domain name >>> raw(DHCP6OptNISDomain(nisdomain="toto.example.org")) == b'\x00\x1d\x00\x12\x04toto\x07example\x03org\x00' True ###(174)=[passed] DHCP6OptNISDomain - Dissection with one domain name >>> a = DHCP6OptNISDomain(b'\x00\x1d\x00\x11\x04toto\x07example\x03org\x00') DNS RR prematured end (ofs=17, len=17) >>> a.optcode == 29 and a.optlen == 17 and a.nisdomain == b"toto.example.org." True ###(175)=[passed] DHCP6OptNISDomain - Instantiation with one domain with trailing dot >>> raw(DHCP6OptNISDomain(nisdomain="toto.example.org.")) == b'\x00\x1d\x00\x12\x04toto\x07example\x03org\x00' True ###### ## Test DHCP6 Option - NIS+ Domain Name ###### ###(176)=[passed] DHCP6OptNISPDomain - Basic Instantiation >>> raw(DHCP6OptNISPDomain()) == b'\x00\x1e\x00\x01\x00' True ###(177)=[passed] DHCP6OptNISPDomain - Basic Dissection >>> a = DHCP6OptNISPDomain(b'\x00\x1e\x00\x00') DNS RR prematured end (ofs=0, len=0) >>> a.optcode == 30 and a.optlen == 0 and a.nispdomain == b"." True ###(178)=[passed] DHCP6OptNISPDomain - Instantiation with one domain name >>> raw(DHCP6OptNISPDomain(nispdomain="toto.example.org")) == b'\x00\x1e\x00\x12\x04toto\x07example\x03org\x00' True ###(179)=[passed] DHCP6OptNISPDomain - Dissection with one domain name >>> a = DHCP6OptNISPDomain(b'\x00\x1e\x00\x12\x04toto\x07example\x03org\x00') >>> a.optcode == 30 and a.optlen == 18 and a.nispdomain == b"toto.example.org." True ###(180)=[passed] DHCP6OptNISPDomain - Instantiation with one domain with trailing dot >>> raw(DHCP6OptNISPDomain(nispdomain="toto.example.org.")) == b'\x00\x1e\x00\x12\x04toto\x07example\x03org\x00' True ###### ## Test DHCP6 Option - SNTP Servers ###### ###(181)=[passed] DHCP6OptSNTPServers - Basic Instantiation >>> raw(DHCP6OptSNTPServers()) == b'\x00\x1f\x00\x00' True ###(182)=[passed] DHCP6OptSNTPServers - Basic Dissection >>> a = DHCP6OptSNTPServers(b'\x00\x1f\x00\x00') >>> a.optcode == 31 and a. optlen == 0 and a.sntpservers == [] True ###(183)=[passed] DHCP6OptSNTPServers - Instantiation with specific values (1 address) >>> raw(DHCP6OptSNTPServers(sntpservers = ["2001:db8::1"] )) == b'\x00\x1f\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(184)=[passed] DHCP6OptSNTPServers - Dissection with specific values (1 address) >>> a = DHCP6OptSNTPServers(b'\x00\x1f\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.optcode == 31 and a.optlen == 16 and len(a.sntpservers) == 1 and a.sntpservers[0] == "2001:db8::1" True ###(185)=[passed] DHCP6OptSNTPServers - Instantiation with specific values (2 addresses) >>> raw(DHCP6OptSNTPServers(sntpservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00\x1f\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' True ###(186)=[passed] DHCP6OptSNTPServers - Dissection with specific values (2 addresses) >>> a = DHCP6OptSNTPServers(b'\x00\x1f\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') >>> a.optcode == 31 and a.optlen == 32 and len(a.sntpservers) == 2 and a.sntpservers[0] == "2001:db8::1" and a.sntpservers[1] == "2001:db8::2" True ###### ## Test DHCP6 Option - Information Refresh Time ###### ###(187)=[passed] DHCP6OptInfoRefreshTime - Basic Instantiation >>> raw(DHCP6OptInfoRefreshTime()) == b'\x00 \x00\x04\x00\x01Q\x80' True ###(188)=[passed] DHCP6OptInfoRefreshTime - Basic Dissction >>> a = DHCP6OptInfoRefreshTime(b'\x00 \x00\x04\x00\x01Q\x80') >>> a.optcode == 32 and a.optlen == 4 and a.reftime == 86400 True ###(189)=[passed] DHCP6OptInfoRefreshTime - Instantiation with specific values >>> raw(DHCP6OptInfoRefreshTime(optlen=7, reftime=42)) == b'\x00 \x00\x07\x00\x00\x00*' True ###### ## Test DHCP6 Option - BCMCS Servers ###### ###(190)=[passed] DHCP6OptBCMCSServers - Basic Instantiation >>> raw(DHCP6OptBCMCSServers()) == b'\x00"\x00\x00' True ###(191)=[passed] DHCP6OptBCMCSServers - Basic Dissection >>> a = DHCP6OptBCMCSServers(b'\x00"\x00\x00') >>> a.optcode == 34 and a. optlen == 0 and a.bcmcsservers == [] True ###(192)=[passed] DHCP6OptBCMCSServers - Instantiation with specific values (1 address) >>> raw(DHCP6OptBCMCSServers(bcmcsservers = ["2001:db8::1"] )) == b'\x00"\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(193)=[passed] DHCP6OptBCMCSServers - Dissection with specific values (1 address) >>> a = DHCP6OptBCMCSServers(b'\x00"\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.optcode == 34 and a.optlen == 16 and len(a.bcmcsservers) == 1 and a.bcmcsservers[0] == "2001:db8::1" True ###(194)=[passed] DHCP6OptBCMCSServers - Instantiation with specific values (2 addresses) >>> raw(DHCP6OptBCMCSServers(bcmcsservers = ["2001:db8::1", "2001:db8::2"] )) == b'\x00"\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' True ###(195)=[passed] DHCP6OptBCMCSServers - Dissection with specific values (2 addresses) >>> a = DHCP6OptBCMCSServers(b'\x00"\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') >>> a.optcode == 34 and a.optlen == 32 and len(a.bcmcsservers) == 2 and a.bcmcsservers[0] == "2001:db8::1" and a.bcmcsservers[1] == "2001:db8::2" True ###### ## Test DHCP6 Option - BCMCS Domains ###### ###(196)=[passed] DHCP6OptBCMCSDomains - Basic Instantiation >>> raw(DHCP6OptBCMCSDomains()) == b'\x00!\x00\x00' True ###(197)=[passed] DHCP6OptBCMCSDomains - Basic Dissection >>> a = DHCP6OptBCMCSDomains(b'\x00!\x00\x00') >>> a.optcode == 33 and a.optlen == 0 and a.bcmcsdomains == [] True ###(198)=[passed] DHCP6OptBCMCSDomains - Instantiation with specific values (1 domain) >>> raw(DHCP6OptBCMCSDomains(bcmcsdomains=["toto.example.com."])) == b'\x00!\x00\x12\x04toto\x07example\x03com\x00' True ###(199)=[passed] DHCP6OptBCMCSDomains - Dissection with specific values (1 domain) >>> a = DHCP6OptBCMCSDomains(b'\x00!\x00\x12\x04toto\x07example\x03com\x00') >>> a.optcode == 33 and a.optlen == 18 and len(a.bcmcsdomains) == 1 and a.bcmcsdomains[0] == "toto.example.com." True ###(200)=[passed] DHCP6OptBCMCSDomains - Instantiation with specific values (2 domains) >>> raw(DHCP6OptBCMCSDomains(bcmcsdomains=["toto.example.com.", "titi.example.com."])) == b'\x00!\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00' True ###(201)=[passed] DHCP6OptBCMCSDomains - Dissection with specific values (2 domains) >>> a = DHCP6OptBCMCSDomains(b'\x00!\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00') >>> a.optcode == 33 and a.optlen == 36 and len(a.bcmcsdomains) == 2 and a.bcmcsdomains[0] == "toto.example.com." and a.bcmcsdomains[1] == "titi.example.com." True ###### ## Test DHCP6 Option - Relay Agent Remote-ID ###### ###(202)=[passed] DHCP6OptRemoteID - Basic Instantiation >>> raw(DHCP6OptRemoteID()) == b'\x00%\x00\x04\x00\x00\x00\x00' True ###(203)=[passed] DHCP6OptRemoteID - Basic Dissection >>> a = DHCP6OptRemoteID(b'\x00%\x00\x04\x00\x00\x00\x00') >>> a.optcode == 37 and a.optlen == 4 and a.enterprisenum == 0 and a.remoteid == b"" True ###(204)=[passed] DHCP6OptRemoteID - Instantiation with specific values >>> raw(DHCP6OptRemoteID(enterprisenum=0xeeeeeeee, remoteid="someid")) == b'\x00%\x00\n\xee\xee\xee\xeesomeid' True ###(205)=[passed] DHCP6OptRemoteID - Dissection with specific values >>> a = DHCP6OptRemoteID(b'\x00%\x00\n\xee\xee\xee\xeesomeid') >>> a.optcode == 37 and a.optlen == 10 and a.enterprisenum == 0xeeeeeeee and a.remoteid == b"someid" True ###### ## Test DHCP6 Option - Subscriber ID ###### ###(206)=[passed] DHCP6OptSubscriberID - Basic Instantiation >>> raw(DHCP6OptSubscriberID()) == b'\x00&\x00\x00' True ###(207)=[passed] DHCP6OptSubscriberID - Basic Dissection >>> a = DHCP6OptSubscriberID(b'\x00&\x00\x00') >>> a.optcode == 38 and a.optlen == 0 and a.subscriberid == b"" True ###(208)=[passed] DHCP6OptSubscriberID - Instantiation with specific values >>> raw(DHCP6OptSubscriberID(subscriberid="someid")) == b'\x00&\x00\x06someid' True ###(209)=[passed] DHCP6OptSubscriberID - Dissection with specific values >>> a = DHCP6OptSubscriberID(b'\x00&\x00\x06someid') >>> a.optcode == 38 and a.optlen == 6 and a.subscriberid == b"someid" True ###### ## Test DHCP6 Option - Client FQDN ###### ###(210)=[passed] DHCP6OptClientFQDN - Basic Instantiation >>> raw(DHCP6OptClientFQDN()) == b"\x00'\x00\x02\x00\x00" True ###(211)=[passed] DHCP6OptClientFQDN - Basic Dissection >>> a = DHCP6OptClientFQDN(b"\x00'\x00\x01\x00") DNS RR prematured end (ofs=0, len=0) >>> a.optcode == 39 and a.optlen == 1 and a.res == 0 and a.flags == 0 and a.fqdn == b"." True ###(212)=[passed] DHCP6OptClientFQDN - Instantiation with various flags combinations >>> raw(DHCP6OptClientFQDN(flags="S")) == b"\x00'\x00\x02\x01\x00" and raw(DHCP6OptClientFQDN(flags="O")) == b"\x00'\x00\x02\x02\x00" and raw(DHCP6OptClientFQDN(flags="N")) == b"\x00'\x00\x02\x04\x00" and raw(DHCP6OptClientFQDN(flags="SON")) == b"\x00'\x00\x02\x07\x00" and raw(DHCP6OptClientFQDN(flags="ON")) == b"\x00'\x00\x02\x06\x00" True ###(213)=[passed] DHCP6OptClientFQDN - Instantiation with one fqdn >>> raw(DHCP6OptClientFQDN(fqdn="toto.example.org")) == b"\x00'\x00\x13\x00\x04toto\x07example\x03org\x00" True ###(214)=[passed] DHCP6OptClientFQDN - Dissection with one fqdn >>> a = DHCP6OptClientFQDN(b"\x00'\x00\x12\x00\x04toto\x07example\x03org\x00") DNS RR prematured end (ofs=17, len=17) >>> a.optcode == 39 and a.optlen == 18 and a.res == 0 and a.flags == 0 and a.fqdn == b"toto.example.org." True ###### ## Test DHCP6 Option PANA Auth Agent ###### ###(215)=[passed] DHCP6OptPanaAuthAgent - Basic Instantiation >>> raw(DHCP6OptPanaAuthAgent()) == b'\x00(\x00\x00' True ###(216)=[passed] DHCP6OptPanaAuthAgent - Basic Dissection >>> a = DHCP6OptPanaAuthAgent(b"\x00(\x00\x00") >>> a.optcode == 40 and a.optlen == 0 and a.paaaddr == [] True ###(217)=[passed] DHCP6OptPanaAuthAgent - Instantiation with specific values (1 address) >>> raw(DHCP6OptPanaAuthAgent(paaaddr=["2001:db8::1"])) == b'\x00(\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(218)=[passed] DHCP6OptPanaAuthAgent - Dissection with specific values (1 address) >>> a = DHCP6OptPanaAuthAgent(b'\x00(\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.optcode == 40 and a.optlen == 16 and len(a.paaaddr) == 1 and a.paaaddr[0] == "2001:db8::1" True ###(219)=[passed] DHCP6OptPanaAuthAgent - Instantiation with specific values (2 addresses) >>> raw(DHCP6OptPanaAuthAgent(paaaddr=["2001:db8::1", "2001:db8::2"])) == b'\x00(\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' True ###(220)=[passed] DHCP6OptPanaAuthAgent - Dissection with specific values (2 addresses) >>> a = DHCP6OptPanaAuthAgent(b'\x00(\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') >>> a.optcode == 40 and a.optlen == 32 and len(a.paaaddr) == 2 and a.paaaddr[0] == "2001:db8::1" and a.paaaddr[1] == "2001:db8::2" True ###### ## Test DHCP6 Option - New POSIX Time Zone ###### ###(221)=[passed] DHCP6OptNewPOSIXTimeZone - Basic Instantiation >>> raw(DHCP6OptNewPOSIXTimeZone()) == b'\x00)\x00\x00' True ###(222)=[passed] DHCP6OptNewPOSIXTimeZone - Basic Dissection >>> a = DHCP6OptNewPOSIXTimeZone(b'\x00)\x00\x00') >>> a.optcode == 41 and a.optlen == 0 and a.optdata == b"" True ###(223)=[passed] DHCP6OptNewPOSIXTimeZone - Instantiation with specific values >>> raw(DHCP6OptNewPOSIXTimeZone(optdata="EST5EDT4,M3.2.0/02:00,M11.1.0/02:00")) == b'\x00)\x00#EST5EDT4,M3.2.0/02:00,M11.1.0/02:00' True ###(224)=[passed] DHCP6OptNewPOSIXTimeZone - Dissection with specific values >>> a = DHCP6OptNewPOSIXTimeZone(b'\x00)\x00#EST5EDT4,M3.2.0/02:00,M11.1.0/02:00') >>> a.optcode == 41 and a.optlen == 35 and a.optdata == b"EST5EDT4,M3.2.0/02:00,M11.1.0/02:00" True ###### ## Test DHCP6 Option - New TZDB Time Zone ###### ###(225)=[passed] DHCP6OptNewTZDBTimeZone - Basic Instantiation >>> raw(DHCP6OptNewTZDBTimeZone()) == b'\x00*\x00\x00' True ###(226)=[passed] DHCP6OptNewTZDBTimeZone - Basic Dissection >>> a = DHCP6OptNewTZDBTimeZone(b'\x00*\x00\x00') >>> a.optcode == 42 and a.optlen == 0 and a.optdata == b"" True ###(227)=[passed] DHCP6OptNewTZDBTimeZone - Instantiation with specific values >>> raw(DHCP6OptNewTZDBTimeZone(optdata="Europe/Zurich")) == b'\x00*\x00\rEurope/Zurich' True ###(228)=[passed] DHCP6OptNewTZDBTimeZone - Dissection with specific values >>> a = DHCP6OptNewTZDBTimeZone(b'\x00*\x00\rEurope/Zurich') >>> a.optcode == 42 and a.optlen == 13 and a.optdata == b"Europe/Zurich" True ###### ## Test DHCP6 Option Relay Agent Echo Request Option ###### ###(229)=[passed] DHCP6OptRelayAgentERO - Basic Instantiation >>> raw(DHCP6OptRelayAgentERO()) == b'\x00+\x00\x04\x00\x17\x00\x18' True ###(230)=[passed] DHCP6OptRelayAgentERO - optlen field computation >>> raw(DHCP6OptRelayAgentERO(reqopts=[1,2,3,4])) == b'\x00+\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04' True ###(231)=[passed] DHCP6OptRelayAgentERO - instantiation with empty list >>> raw(DHCP6OptRelayAgentERO(reqopts=[])) == b'\x00+\x00\x00' True ###(232)=[passed] DHCP6OptRelayAgentERO - Basic dissection >>> a=DHCP6OptRelayAgentERO(b'\x00+\x00\x00') >>> a.optcode == 43 and a.optlen == 0 and a.reqopts == [] True ###(233)=[passed] DHCP6OptRelayAgentERO - Dissection with specific value >>> a=DHCP6OptRelayAgentERO(b'\x00+\x00\x08\x00\x01\x00\x02\x00\x03\x00\x04') >>> a.optcode == 43 and a.optlen == 8 and a.reqopts == [1,2,3,4] True ###### ## Test DHCP6 Option LQ Client Link ###### ###(234)=[passed] DHCP6OptLQClientLink - Basic Instantiation >>> raw(DHCP6OptLQClientLink()) == b'\x000\x00\x00' True ###(235)=[passed] DHCP6OptLQClientLink - Basic Dissection >>> a = DHCP6OptLQClientLink(b"\x000\x00\x00") >>> a.optcode == 48 and a.optlen == 0 and a.linkaddress == [] True ###(236)=[passed] DHCP6OptLQClientLink - Instantiation with specific values (1 address) >>> raw(DHCP6OptLQClientLink(linkaddress=["2001:db8::1"])) == b'\x000\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(237)=[passed] DHCP6OptLQClientLink - Dissection with specific values (1 address) >>> a = DHCP6OptLQClientLink(b'\x000\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.optcode == 48 and a.optlen == 16 and len(a.linkaddress) == 1 and a.linkaddress[0] == "2001:db8::1" True ###(238)=[passed] DHCP6OptLQClientLink - Instantiation with specific values (2 addresses) >>> raw(DHCP6OptLQClientLink(linkaddress=["2001:db8::1", "2001:db8::2"])) == b'\x000\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' True ###(239)=[passed] DHCP6OptLQClientLink - Dissection with specific values (2 addresses) >>> a = DHCP6OptLQClientLink(b'\x000\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') >>> a.optcode == 48 and a.optlen == 32 and len(a.linkaddress) == 2 and a.linkaddress[0] == "2001:db8::1" and a.linkaddress[1] == "2001:db8::2" True ###### ## Test DHCP6 Option - NTP Server ###### ###(240)=[passed] DHCP6NTPSubOptSrvAddr - Basic dissection/instantiation >>> b = b'\x00\x01' + b'\x00\x10' + b'\x00' * 16 >>> assert raw(DHCP6NTPSubOptSrvAddr()) == b >>> >>> p = DHCP6NTPSubOptSrvAddr(b) >>> assert p.optcode == 1 and p.optlen == 16 and p.addr == '::' ###(241)=[passed] DHCP6NTPSubOptSrvAddr - Dissection/instantiation with specific values >>> b = b'\x00\x01' + b'\x00\x10' + b'\x20\x01\x0d\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> assert raw(DHCP6NTPSubOptSrvAddr(addr='2001:db8::1')) == b >>> >>> p = DHCP6NTPSubOptSrvAddr(b) >>> assert p.optcode == 1 and p.optlen == 16 and p.addr == '2001:db8::1' ###(242)=[passed] DHCP6NTPSubOptMCAddr - Basic dissection/instantiation >>> b = b'\x00\x02' + b'\x00\x10' + b'\x00' * 16 >>> assert raw(DHCP6NTPSubOptMCAddr()) == b >>> >>> p = DHCP6NTPSubOptMCAddr(b) >>> assert p.optcode == 2 and p.optlen == 16 and p.addr == '::' ###(243)=[passed] DHCP6NTPSubOptMCAddr - Dissection/instantiation with specific values >>> b = b'\x00\x02' + b'\x00\x10' + b'\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01' >>> assert raw(DHCP6NTPSubOptMCAddr(addr='ff02::101')) == b >>> >>> p = DHCP6NTPSubOptMCAddr(b) >>> assert p.optcode == 2 and p.optlen == 16 and p.addr == 'ff02::101' ###(244)=[passed] DHCP6NTPSubOptSrvFQDN - Basic dissection/instantiation >>> b = b'\x00\x03' + b'\x00\x01' + b'\x00' >>> assert raw(DHCP6NTPSubOptSrvFQDN()) == b >>> >>> p = DHCP6NTPSubOptSrvFQDN(b) >>> assert p.optcode == 3 and p.optlen == 1 and p.fqdn == b'.' ###(245)=[passed] DHCP6NTPSubOptSrvFQDN - Dissection/instantiation with specific values >>> b = b'\x00\x03' + b'\x00\x0d' + b'\x07example\x03com\x00' >>> assert raw(DHCP6NTPSubOptSrvFQDN(fqdn='example.com')) == b >>> >>> p = DHCP6NTPSubOptSrvFQDN(b) >>> assert p.optcode == 3 and p.optlen == 13 and p.fqdn == b'example.com.' ###(246)=[passed] DHCP6OptNTPServer - Basic dissection/instantiation >>> b = b'\x00\x38' + b'\x00\x00' >>> assert raw(DHCP6OptNTPServer()) == b >>> >>> p = DHCP6OptNTPServer(b) >>> assert p.optcode == 56 and p.optlen == 0 and p.ntpserver == [] ###(247)=[passed] DHCP6OptNTPServer - Dissection/instantiation with specific values >>> srv_addr = b'\x00\x01' + b'\x00\x10' + b'\x20\x01\x0d\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> mc_addr = b'\x00\x02' + b'\x00\x10' + b'\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01' >>> srv_fqdn = b'\x00\x03' + b'\x00\x0d' + b'\x07example\x03com\x00' >>> b = b'\x00\x38' + b'\x00\x39' + srv_addr + mc_addr + srv_fqdn >>> >>> p = DHCP6OptNTPServer( ... ntpserver=[DHCP6NTPSubOptSrvAddr(addr='2001:db8::1'), ... DHCP6NTPSubOptMCAddr(addr='ff02::101'), ... DHCP6NTPSubOptSrvFQDN(fqdn='example.com'), ... ] ... ) >>> assert raw(p) == b >>> >>> p = DHCP6OptNTPServer(b) >>> assert p.optcode == 56 and p.optlen == 57 and len(p.ntpserver) == 3 >>> assert p.ntpserver[0] == DHCP6NTPSubOptSrvAddr(srv_addr) >>> assert p.ntpserver[1] == DHCP6NTPSubOptMCAddr(mc_addr) >>> assert p.ntpserver[2] == DHCP6NTPSubOptSrvFQDN(srv_fqdn) ###### ## Test DHCP6 Option - Boot File URL ###### ###(248)=[passed] DHCP6OptBootFileUrl - Basic Instantiation >>> raw(DHCP6OptBootFileUrl()) == b'\x00;\x00\x00' True ###(249)=[passed] DHCP6OptBootFileUrl - Basic Dissection >>> a = DHCP6OptBootFileUrl(b'\x00;\x00\x00') >>> a.optcode == 59 and a.optlen == 0 and a.optdata == b"" True ###(250)=[passed] DHCP6OptBootFileUrl - Instantiation with specific values >>> raw(DHCP6OptBootFileUrl(optdata="http://wp.pl/file")) == b'\x00;\x00\x11http://wp.pl/file' True ###(251)=[passed] DHCP6OptBootFileUrl - Dissection with specific values >>> a = DHCP6OptBootFileUrl(b'\x00;\x00\x11http://wp.pl/file') >>> a.optcode == 59 and a.optlen == 17 and a.optdata == b"http://wp.pl/file" True ###### ## Test DHCP6 Option - Client Arch Type ###### ###(252)=[passed] DHCP6OptClientArchType - Basic Instantiation >>> raw(DHCP6OptClientArchType()) b'\x00=\x00\x00' >>> raw(DHCP6OptClientArchType()) == b'\x00=\x00\x00' True ###(253)=[passed] DHCP6OptClientArchType - Basic Dissection >>> a = DHCP6OptClientArchType(b'\x00=\x00\x00') >>> a.optcode == 61 and a.optlen == 0 and a.archtypes == [] True ###(254)=[passed] DHCP6OptClientArchType - Instantiation with specific value as just int >>> raw(DHCP6OptClientArchType(archtypes=7)) == b'\x00=\x00\x02\x00\x07' True ###(255)=[passed] DHCP6OptClientArchType - Instantiation with specific value as single item list of int >>> raw(DHCP6OptClientArchType(archtypes=[7])) == b'\x00=\x00\x02\x00\x07' True ###(256)=[passed] DHCP6OptClientArchType - Dissection with specific 1 value list >>> a = DHCP6OptClientArchType(b'\x00=\x00\x02\x00\x07') >>> a.optcode == 61 and a.optlen == 2 and a.archtypes == [7] True ###(257)=[passed] DHCP6OptClientArchType - Instantiation with specific value as 2 item list of int >>> raw(DHCP6OptClientArchType(archtypes=[7, 9])) == b'\x00=\x00\x04\x00\x07\x00\x09' True ###(258)=[passed] DHCP6OptClientArchType - Dissection with specific 2 values list >>> a = DHCP6OptClientArchType(b'\x00=\x00\x04\x00\x07\x00\x09') >>> a.optcode == 61 and a.optlen == 4 and a.archtypes == [7, 9] True ###### ## Test DHCP6 Option - Client Network Inter Id ###### ###(259)=[passed] DHCP6OptClientNetworkInterId - Basic Instantiation >>> raw(DHCP6OptClientNetworkInterId()) b'\x00>\x00\x03\x00\x00\x00' >>> raw(DHCP6OptClientNetworkInterId()) == b'\x00>\x00\x03\x00\x00\x00' True ###(260)=[passed] DHCP6OptClientNetworkInterId - Basic Dissection >>> a = DHCP6OptClientNetworkInterId(b'\x00>\x00\x03\x00\x00\x00') >>> a.optcode == 62 and a.optlen == 3 and a.iitype == 0 and a.iimajor == 0 and a.iiminor == 0 True ###(261)=[passed] DHCP6OptClientNetworkInterId - Instantiation with specific values >>> raw(DHCP6OptClientNetworkInterId(iitype=1, iimajor=2, iiminor=3)) == b'\x00>\x00\x03\x01\x02\x03' True ###(262)=[passed] DHCP6OptClientNetworkInterId - Dissection with specific values >>> a = DHCP6OptClientNetworkInterId(b'\x00>\x00\x03\x01\x02\x03') >>> a.optcode == 62 and a.optlen == 3 and a.iitype == 1 and a.iimajor == 2 and a.iiminor == 3 True ###### ## Test DHCP6 Option - ERP Domain ###### ###(263)=[passed] DHCP6OptERPDomain - Basic Instantiation >>> raw(DHCP6OptERPDomain()) == b'\x00A\x00\x00' True ###(264)=[passed] DHCP6OptERPDomain - Basic Dissection >>> a = DHCP6OptERPDomain(b'\x00A\x00\x00') >>> a.optcode == 65 and a.optlen == 0 and a.erpdomain == [] True ###(265)=[passed] DHCP6OptERPDomain - Instantiation with specific values (1 domain) >>> raw(DHCP6OptERPDomain(erpdomain=["toto.example.com."])) == b'\x00A\x00\x12\x04toto\x07example\x03com\x00' True ###(266)=[passed] DHCP6OptERPDomain - Dissection with specific values (1 domain) >>> a = DHCP6OptERPDomain(b'\x00A\x00\x12\x04toto\x07example\x03com\x00') >>> a.optcode == 65 and a.optlen == 18 and len(a.erpdomain) == 1 and a.erpdomain[0] == "toto.example.com." True ###(267)=[passed] DHCP6OptERPDomain - Instantiation with specific values (2 domains) >>> raw(DHCP6OptERPDomain(erpdomain=["toto.example.com.", "titi.example.com."])) == b'\x00A\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00' True ###(268)=[passed] DHCP6OptERPDomain - Dissection with specific values (2 domains) >>> a = DHCP6OptERPDomain(b'\x00A\x00$\x04toto\x07example\x03com\x00\x04titi\x07example\x03com\x00') >>> a.optcode == 65 and a.optlen == 36 and len(a.erpdomain) == 2 and a.erpdomain[0] == "toto.example.com." and a.erpdomain[1] == "titi.example.com." True ###### ## Test DHCP6 Option - Relay Supplied Option ###### ###(269)=[passed] DHCP6OptRelaySuppliedOpt - Basic Instantiation >>> raw(DHCP6OptRelaySuppliedOpt()) == b'\x00B\x00\x00' True ###(270)=[passed] DHCP6OptRelaySuppliedOpt - Basic Dissection >>> a = DHCP6OptRelaySuppliedOpt(b'\x00B\x00\x00') >>> a.optcode == 66 and a.optlen == 0 and a.relaysupplied == [] True ###(271)=[passed] DHCP6OptRelaySuppliedOpt - Instantiation with specific values >>> raw(DHCP6OptRelaySuppliedOpt(relaysupplied=DHCP6OptERPDomain(erpdomain=["toto.example.com."]))) == b'\x00B\x00\x16\x00A\x00\x12\x04toto\x07example\x03com\x00' True ###(272)=[passed] DHCP6OptRelaySuppliedOpt - Dissection with specific values >>> a = DHCP6OptRelaySuppliedOpt(b'\x00B\x00\x16\x00A\x00\x12\x04toto\x07example\x03com\x00') >>> a.optcode == 66 and a.optlen == 22 and len(a.relaysupplied) == 1 and isinstance(a.relaysupplied[0], DHCP6OptERPDomain) and a.relaysupplied[0].erpdomain[0] == "toto.example.com." True ###(273)=[passed] DHCP6OptRelaySuppliedOpt - deeply nested DHCP6OptRelaySuppliedOpt >>> p = DHCP6(b'\x01\x00\x00\x00' + b'\x00B\x0f\x0f' * 100) >>> assert p.getlayer(DHCP6OptRelaySuppliedOpt, 100) ###### ## Test DHCP6 Option Client Link Layer address ###### ###(274)=[passed] Basic build & dissect >>> s = raw(DHCP6OptClientLinkLayerAddr()) >>> assert s == b"\x00O\x00\x08\x00\x01\x00\x00\x00\x00\x00\x00" >>> >>> p = DHCP6OptClientLinkLayerAddr(s) >>> assert p.clladdr == "00:00:00:00:00:00" >>> >>> r = b"\x00O\x00\x08\x00\x01\x00\x01\x02\x03\x04\x05" >>> p = DHCP6OptClientLinkLayerAddr(r) >>> assert p.clladdr == "00:01:02:03:04:05" ###### ## Test DHCP6 Option Captive-Portal ###### ###(275)=[passed] Basic build & dissect >>> s = raw(DHCP6OptCaptivePortal()) >>> assert s == b"\x00\x67\x00\x00" >>> >>> p = DHCP6OptCaptivePortal(s) >>> assert p.optcode == 103 >>> assert p.optlen == 0 >>> assert p.URI == b"" >>> >>> p = DHCP6OptCaptivePortal(b"\x00\x67\x00\x13https://example.org") >>> assert p.optcode == 103 >>> assert p.optlen == 19 >>> assert p.URI == b"https://example.org" ###### ## Test DHCP6 Option MUD URL ###### ###(276)=[passed] Basic build & dissect >>> s = raw(DHCP6OptMudUrl()) >>> assert s == b"\x00p\x00\x00" >>> >>> p = DHCP6OptMudUrl(s) >>> assert p.mudstring == b"" >>> >>> r = b'\x00p\x00\x13https://example.org' >>> p = DHCP6OptMudUrl(r) >>> assert p.mudstring == b"https://example.org" >>> assert p.optlen == 19 ###### ## Test DHCP6 Option Virtual Subnet Selection ###### ###(277)=[passed] Basic build & dissect >>> s = raw(DHCP6OptVSS()) >>> assert s == b"\x00D\x00\x01\xff" >>> >>> p = DHCP6OptVSS(s) >>> assert p.type == 255 ###### ## Test DHCP6 Messages - DHCP6_Solicit ###### ###(278)=[passed] DHCP6_Solicit - Basic Instantiation >>> raw(DHCP6_Solicit()) == b'\x01\x00\x00\x00' True ###(279)=[passed] DHCP6_Solicit - Basic Dissection >>> a = DHCP6_Solicit(b'\x01\x00\x00\x00') >>> a.msgtype == 1 and a.trid == 0 True ###(280)=[passed] DHCP6_Solicit - Basic test of DHCP6_solicit.hashret() >>> DHCP6_Solicit().hashret() == b'\x00\x00\x00' True ###(281)=[passed] DHCP6_Solicit - Test of DHCP6_solicit.hashret() with specific values >>> DHCP6_Solicit(trid=0xbbccdd).hashret() == b'\xbb\xcc\xdd' True ###(282)=[passed] DHCP6_Solicit - UDP ports overload >>> a=UDP()/DHCP6_Solicit() >>> a.sport == 546 and a.dport == 547 True ###(283)=[passed] DHCP6_Solicit - Dispatch based on UDP port >>> a=UDP(raw(UDP()/DHCP6_Solicit())) No IP underlayer to compute checksum. Leaving null. >>> isinstance(a.payload, DHCP6_Solicit) True ###### ## Test DHCP6 Messages - DHCP6_Advertise ###### ###(284)=[passed] DHCP6_Advertise - Basic Instantiation >>> raw(DHCP6_Advertise()) == b'\x02\x00\x00\x00' True ###(285)=[passed] DHCP6_Advertise - Basic test of DHCP6_solicit.hashret() >>> DHCP6_Advertise().hashret() == b'\x00\x00\x00' True ###(286)=[passed] DHCP6_Advertise - Test of DHCP6_Advertise.hashret() with specific values >>> DHCP6_Advertise(trid=0xbbccdd).hashret() == b'\xbb\xcc\xdd' True ###(287)=[passed] DHCP6_Advertise - Basic test of answers() with solicit message >>> a = DHCP6_Solicit() >>> b = DHCP6_Advertise() >>> a > b True ###(288)=[passed] DHCP6_Advertise - Test of answers() with solicit message >>> a = DHCP6_Solicit(trid=0xbbccdd) >>> b = DHCP6_Advertise(trid=0xbbccdd) >>> a > b True ###(289)=[passed] DHCP6_Advertise - UDP ports overload >>> a=UDP()/DHCP6_Advertise() >>> a.sport == 547 and a.dport == 546 True ###### ## Test DHCP6 Messages - DHCP6_Request ###### ###(290)=[passed] DHCP6_Request - Basic Instantiation >>> raw(DHCP6_Request()) == b'\x03\x00\x00\x00' True ###(291)=[passed] DHCP6_Request - Basic Dissection >>> a=DHCP6_Request(b'\x03\x00\x00\x00') >>> a.msgtype == 3 and a.trid == 0 True ###(292)=[passed] DHCP6_Request - UDP ports overload >>> a=UDP()/DHCP6_Request() >>> a.sport == 546 and a.dport == 547 True ###### ## Test DHCP6 Messages - DHCP6_Confirm ###### ###(293)=[passed] DHCP6_Confirm - Basic Instantiation >>> raw(DHCP6_Confirm()) == b'\x04\x00\x00\x00' True ###(294)=[passed] DHCP6_Confirm - Basic Dissection >>> a=DHCP6_Confirm(b'\x04\x00\x00\x00') >>> a.msgtype == 4 and a.trid == 0 True ###(295)=[passed] DHCP6_Confirm - UDP ports overload >>> a=UDP()/DHCP6_Confirm() >>> a.sport == 546 and a.dport == 547 True ###### ## Test DHCP6 Messages - DHCP6_Renew ###### ###(296)=[passed] DHCP6_Renew - Basic Instantiation >>> raw(DHCP6_Renew()) == b'\x05\x00\x00\x00' True ###(297)=[passed] DHCP6_Renew - Basic Dissection >>> a=DHCP6_Renew(b'\x05\x00\x00\x00') >>> a.msgtype == 5 and a.trid == 0 True ###(298)=[passed] DHCP6_Renew - UDP ports overload >>> a=UDP()/DHCP6_Renew() >>> a.sport == 546 and a.dport == 547 True ###### ## Test DHCP6 Messages - DHCP6_Rebind ###### ###(299)=[passed] DHCP6_Rebind - Basic Instantiation >>> raw(DHCP6_Rebind()) == b'\x06\x00\x00\x00' True ###(300)=[passed] DHCP6_Rebind - Basic Dissection >>> a=DHCP6_Rebind(b'\x06\x00\x00\x00') >>> a.msgtype == 6 and a.trid == 0 True ###(301)=[passed] DHCP6_Rebind - UDP ports overload >>> a=UDP()/DHCP6_Rebind() >>> a.sport == 546 and a.dport == 547 True ###### ## Test DHCP6 Messages - DHCP6_Reply ###### ###(302)=[passed] DHCP6_Reply - Basic Instantiation >>> raw(DHCP6_Reply()) == b'\x07\x00\x00\x00' True ###(303)=[passed] DHCP6_Reply - Basic Dissection >>> a=DHCP6_Reply(b'\x07\x00\x00\x00') >>> a.msgtype == 7 and a.trid == 0 True ###(304)=[passed] DHCP6_Reply - UDP ports overload >>> a=UDP()/DHCP6_Reply() >>> a.sport == 547 and a.dport == 546 True ###(305)=[passed] DHCP6_Reply - Answers >>> assert not DHCP6_Reply(trid=0).answers(DHCP6_Request(trid=1)) >>> assert DHCP6_Reply(trid=1).answers(DHCP6_Request(trid=1)) ###### ## Test DHCP6 Messages - DHCP6_Release ###### ###(306)=[passed] DHCP6_Release - Basic Instantiation >>> raw(DHCP6_Release()) == b'\x08\x00\x00\x00' True ###(307)=[passed] DHCP6_Release - Basic Dissection >>> a=DHCP6_Release(b'\x08\x00\x00\x00') >>> a.msgtype == 8 and a.trid == 0 True ###(308)=[passed] DHCP6_Release - UDP ports overload >>> a=UDP()/DHCP6_Release() >>> a.sport == 546 and a.dport == 547 True ###### ## Test DHCP6 Messages - DHCP6_Decline ###### ###(309)=[passed] DHCP6_Decline - Basic Instantiation >>> raw(DHCP6_Decline()) == b'\x09\x00\x00\x00' True ###(310)=[passed] DHCP6_Confirm - Basic Dissection >>> a=DHCP6_Confirm(b'\x09\x00\x00\x00') >>> a.msgtype == 9 and a.trid == 0 True ###(311)=[passed] DHCP6_Decline - UDP ports overload >>> a=UDP()/DHCP6_Decline() >>> a.sport == 546 and a.dport == 547 True ###### ## Test DHCP6 Messages - DHCP6_Reconf ###### ###(312)=[passed] DHCP6_Reconf - Basic Instantiation >>> raw(DHCP6_Reconf()) == b'\x0A\x00\x00\x00' True ###(313)=[passed] DHCP6_Reconf - Basic Dissection >>> a=DHCP6_Reconf(b'\x0A\x00\x00\x00') >>> a.msgtype == 10 and a.trid == 0 True ###(314)=[passed] DHCP6_Reconf - UDP ports overload >>> a=UDP()/DHCP6_Reconf() >>> a.sport == 547 and a.dport == 546 True ###### ## Test DHCP6 Messages - DHCP6_InfoRequest ###### ###(315)=[passed] DHCP6_InfoRequest - Basic Instantiation >>> raw(DHCP6_InfoRequest()) == b'\x0B\x00\x00\x00' True ###(316)=[passed] DHCP6_InfoRequest - Basic Dissection >>> a=DHCP6_InfoRequest(b'\x0B\x00\x00\x00') >>> a.msgtype == 11 and a.trid == 0 True ###(317)=[passed] DHCP6_InfoRequest - UDP ports overload >>> a=UDP()/DHCP6_InfoRequest() >>> a.sport == 546 and a.dport == 547 True ###### ## Test DHCP6 Messages - DHCP6_RelayForward ###### ###(318)=[passed] DHCP6_RelayForward - Basic Instantiation >>> raw(DHCP6_RelayForward()) == b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(319)=[passed] DHCP6_RelayForward - Basic Dissection >>> a=DHCP6_RelayForward(b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.msgtype == 12 and a.hopcount == 0 and a.linkaddr == "::" and a.peeraddr == "::" True ###(320)=[passed] DHCP6_RelayForward - Dissection with options >>> a = DHCP6_RelayForward(b'\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x04\x03\x01\x00\x00') >>> a.msgtype == 12 and DHCP6OptRelayMsg in a and isinstance(a.message, DHCP6_Request) True ###(321)=[passed] DHCP6_RelayForward - Advanced dissection >>> s = b'`\x00\x00\x00\x002\x11@\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x02#\x02#\x002\xf0\xaf\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x04\x01\x00\x00\x00' >>> p = IPv6(s) >>> assert DHCP6OptRelayMsg in p and isinstance(p.message, DHCP6_Solicit) ###### ## Test DHCP6 Messages - DHCP6OptRelayMsg ###### ###(322)=[passed] DHCP6OptRelayMsg - Basic Instantiation >>> raw(DHCP6OptRelayMsg(optcode=37)) == b'\x00%\x00\x04\x00\x00\x00\x00' True ###(323)=[passed] DHCP6OptRelayMsg - Basic Dissection >>> a = DHCP6OptRelayMsg(b'\x00\r\x00\x00') >>> a.optcode == 13 and a.optlen == 0 and a.message is None True ###(324)=[passed] DHCP6OptRelayMsg - Embedded DHCP6 packet Instantiation >>> raw(DHCP6OptRelayMsg(message=DHCP6_Solicit())) == b'\x00\t\x00\x04\x01\x00\x00\x00' True ###(325)=[passed] DHCP6OptRelayMsg - Embedded DHCP6 packet Dissection >>> p = DHCP6OptRelayMsg(b'\x00\t\x00\x04\x01\x00\x00\x00') >>> isinstance(p.message, DHCP6_Solicit) True ###### ## Test DHCP6 Messages - DHCP6_RelayReply ###### ###(326)=[passed] DHCP6_RelayReply - Basic Instantiation >>> raw(DHCP6_RelayReply()) == b'\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(327)=[passed] DHCP6_RelayReply - Basic Dissection >>> a=DHCP6_RelayReply(b'\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.msgtype == 13 and a.hopcount == 0 and a.linkaddr == "::" and a.peeraddr == "::" True parse a DNS packet specifically crafted for OOM ━ Run at 01:42:11 from [test/scapy/layers/dns.uts] by UTscapy in 0.4378528594970703 └ Passed=30 └ Failed=0 ###### ## DNS ###### ###(001)=[passed] DNS request using dns_resolve this is not using a raw socket so should also work without root >>> val = dns_resolve(qname="google.com", qtype="A") >>> assert val >>> assert inet_pton(socket.AF_INET, val[0].rdata) >>> assert val == conf.netcache.dns_cache[b'google.com.;\x01'] >>> >>> val = dns_resolve(qname="google.com", qtype="AAAA") >>> assert val >>> assert inet_pton(socket.AF_INET6, val[0].rdata) >>> assert val == conf.netcache.dns_cache[b'google.com.;\x1c'] ###(002)=[passed] DNS labels >>> query = DNSQR(qname=b"www.secdev.org") >>> assert query.qname == query.__class__(raw(query)).qname ###(004)=[passed] DNS frame with advanced decompression >>> a = b'\x01\x00^\x00\x00\xfb$\xa2\xe1\x90\xa9]\x08\x00E\x00\x01P\\\xdd\x00\x00\xff\x11\xbb\x93\xc0\xa8\x00\x88\xe0\x00\x00\xfb\x14\xe9\x14\xe9\x01<*\x81\x00\x00\x84\x00\x00\x00\x00\x03\x00\x00\x00\x04\x01B\x019\x015\x019\x013\x014\x017\x013\x016\x017\x010\x012\x010\x01D\x018\x011\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x018\x01E\x01F\x03ip6\x04arpa\x00\x00\x0c\x80\x01\x00\x00\x00x\x00\x0f\x07Zalmoid\x05local\x00\x011\x01A\x019\x014\x017\x01E\x01A\x014\x01B\x01A\x01F\x01B\x012\x011\x014\x010\x010\x016\x01E\x01F\x017\x011\x01F\x012\x015\x013\x01E\x010\x011\x010\x01A\x012\xc0L\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`\x03136\x010\x03168\x03192\x07in-addr\xc0P\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`\xc0\x0c\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\x0c\x00\x02\x00\x08\xc0o\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0o\x00\x02\x00\x08\xc0\xbd\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\xbd\x00\x02\x00\x08\x00\x00)\x05\xa0\x00\x00\x11\x94\x00\x12\x00\x04\x00\x0e\x00\xc1&\xa2\xe1\x90\xa9]$\xa2\xe1\x90\xa9]' >>> pkt = Ether(a) >>> assert pkt.ancount == 3 >>> assert pkt.arcount == 4 >>> assert pkt.an[1].rdata == b'Zalmoid.local.' >>> assert pkt.an[1].rdlen is None >>> assert pkt.an[2].rdata == b'Zalmoid.local.' >>> assert pkt.an[2].rdlen is None >>> assert pkt.ar[1].nextname == b'1.A.9.4.7.E.A.4.B.A.F.B.2.1.4.0.0.6.E.F.7.1.F.2.5.3.E.0.1.0.A.2.ip6.arpa.' >>> assert pkt.ar[2].nextname == b'136.0.168.192.in-addr.arpa.' >>> pkt.show() ###[ Ethernet ]### dst = 01:00:5e:00:00:fb src = 24:a2:e1:90:a9:5d type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 336 id = 23773 flags = frag = 0 ttl = 255 proto = udp chksum = 0xbb93 src = 192.168.0.136 dst = 224.0.0.251 \options \ ###[ UDP ]### sport = mdns dport = mdns len = 316 chksum = 0x2a81 ###[ DNS ]### id = 0 qr = 1 opcode = QUERY aa = 1 tc = 0 rd = 0 ra = 0 z = 0 ad = 0 cd = 0 rcode = ok qdcount = 0 ancount = 3 nscount = 0 arcount = 4 \qd \ \an \ |###[ DNS Resource Record ]### | rrname = b'B.9.5.9.3.4.7.3.6.7.0.2.0.D.8.1.0.0.0.0.0.0.0.0.0.0.0.0.0.8.E.F.ip6.arpa.' | type = PTR | cacheflush= 1 | rclass = IN | ttl = 120 | rdlen = None | rdata = b'Zalmoid.local.' |###[ DNS Resource Record ]### | rrname = b'1.A.9.4.7.E.A.4.B.A.F.B.2.1.4.0.0.6.E.F.7.1.F.2.5.3.E.0.1.0.A.2.ip6.arpa.' | type = PTR | cacheflush= 1 | rclass = IN | ttl = 120 | rdlen = None | rdata = b'Zalmoid.local.' |###[ DNS Resource Record ]### | rrname = b'136.0.168.192.in-addr.arpa.' | type = PTR | cacheflush= 1 | rclass = IN | ttl = 120 | rdlen = None | rdata = b'Zalmoid.local.' \ns \ \ar \ |###[ DNS NSEC Resource Record ]### | rrname = b'B.9.5.9.3.4.7.3.6.7.0.2.0.D.8.1.0.0.0.0.0.0.0.0.0.0.0.0.0.8.E.F.ip6.arpa.' | type = NSEC | cacheflush= 1 | rclass = IN | ttl = 120 | rdlen = None | nextname = b'B.9.5.9.3.4.7.3.6.7.0.2.0.D.8.1.0.0.0.0.0.0.0.0.0.0.0.0.0.8.E.F.ip6.arpa.' | typebitmaps= ['PTR'] |###[ DNS NSEC Resource Record ]### | rrname = b'1.A.9.4.7.E.A.4.B.A.F.B.2.1.4.0.0.6.E.F.7.1.F.2.5.3.E.0.1.0.A.2.ip6.arpa.' | type = NSEC | cacheflush= 1 | rclass = IN | ttl = 120 | rdlen = None | nextname = b'1.A.9.4.7.E.A.4.B.A.F.B.2.1.4.0.0.6.E.F.7.1.F.2.5.3.E.0.1.0.A.2.ip6.arpa.' | typebitmaps= ['PTR'] |###[ DNS NSEC Resource Record ]### | rrname = b'136.0.168.192.in-addr.arpa.' | type = NSEC | cacheflush= 1 | rclass = IN | ttl = 120 | rdlen = None | nextname = b'136.0.168.192.in-addr.arpa.' | typebitmaps= ['PTR'] |###[ DNS OPT Resource Record ]### | rrname = b'.' | type = OPT | rclass = 1440 | extrcode = 0 | version = 0 | z = 4500 | rdlen = None | \rdata \ | |###[ EDNS0 Owner (OWN) ]### | | optcode = Owner | | optlen = 14 | | v = 0 | | s = 193 | | primary_mac= 26:a2:e1:90:a9:5d | |###[ DNS EDNS0 TLV ]### | | optcode = 9378 | | optlen = 57744 | | optdata = b'\xa9]' ###(005)=[passed] DNS frame with DNSRRSRV >>> b = Ether(b'33\x00\x00\x00\xfb$\xe3\x14M\x84\xc0\x86\xdd`\t\xc0f\x02b\x11\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x04*,\x03\xab+/\x14\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfb\x14\xe9\x14\xe9\x02b_\xd8\x00\x00\x84\x00\x00\x00\x00\x0b\x00\x00\x00\x06\x014\x011\x01F\x012\x01B\x012\x01B\x01A\x013\x010\x01C\x012\x01A\x012\x014\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x018\x01E\x01F\x03ip6\x04arpa\x00\x00\x0c\x80\x01\x00\x00\x00x\x00\x14\x0csCapys-fLuff\x05local\x00\x03177\x010\x03168\x03192\x07in-addr\xc0P\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`\x01E\x01F\x017\x01D\x01B\x018\x014\x01C\x014\x01B\x016\x01E\x015\x017\x018\x010\x010\x016\x01E\x01F\x017\x011\x01F\x012\x015\x013\x01E\x010\x011\x010\x01A\x012\xc0L\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc0`+24:e3:14:4d:84:c0@fe80::26e3:14ff:fe4d:84c0\x0e_apple-mobdev2\x04_tcp\xc0m\x00\x10\x80\x01\x00\x00\x11\x94\x00\x01\x00\t_services\x07_dns-sd\x04_udp\xc0m\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x02\xc1\x12\x08521805b3\x04_sub\xc1\x12\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x02\xc0\xe6\xc1\x12\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x02\xc0\xe6\xc0\xe6\x00!\x80\x01\x00\x00\x00x\x00\x08\x00\x00\x00\x00~\xf2\xc0`\xc0`\x00\x1c\x80\x01\x00\x00\x00x\x00\x10\xfe\x80\x00\x00\x00\x00\x00\x00\x04*,\x03\xab+/\x14\xc0`\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8\x00\xb1\xc0`\x00\x1c\x80\x01\x00\x00\x00x\x00\x10*\x01\x0e5/\x17\xfe`\x08u\xe6\xb4\xc4\x8b\xd7\xfe\xc0\x0c\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\x0c\x00\x02\x00\x08\xc0t\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0t\x00\x02\x00\x08\xc0\x98\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\x98\x00\x02\x00\x08\xc0\xe6\x00/\x80\x01\x00\x00\x11\x94\x00\t\xc0\xe6\x00\x05\x00\x00\x80\x00@\xc0`\x00/\x80\x01\x00\x00\x00x\x00\x08\xc0`\x00\x04@\x00\x00\x08\x00\x00)\x05\xa0\x00\x00\x11\x94\x00\x12\x00\x04\x00\x0e\x00\xcf&\xe3\x14M\x84\xc0$\xe3\x14M\x84\xc0') >>> assert isinstance(b.an[7], DNSRRSRV) >>> assert b.an[7].target == b'sCapys-fLuff.local.' >>> assert b.an[6].rrname == b'_apple-mobdev2._tcp.local.' >>> assert b.an[6].rdata == b'24:e3:14:4d:84:c0@fe80::26e3:14ff:fe4d:84c0._apple-mobdev2._tcp.local.' ###(006)=[passed] DNS frame with decompression hidden args >>> c = b'\x01\x00^\x00\x00\xfb\x14\x0cv\x8f\xfe(\x08\x00E\x00\x01C\xe3\x91@\x00\xff\x11\xf4u\xc0\xa8\x00\xfe\xe0\x00\x00\xfb\x14\xe9\x14\xe9\x01/L \x00\x00\x84\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05_raop\x04_tcp\x05local\x00\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x1e\x1b140C768FFE28@Freebox Server\xc0\x0c\xc0(\x00\x10\x80\x01\x00\x00\x11\x94\x00\xa0\ttxtvers=1\x08vs=190.9\x04ch=2\x08sr=44100\x05ss=16\x08pw=false\x06et=0,1\x04ek=1\ntp=TCP,UDP\x13am=FreeboxServer1,2\ncn=0,1,2,3\x06md=0,2\x07sf=0x44\x0bft=0xBF0A00\x08sv=false\x07da=true\x08vn=65537\x04vv=2\xc0(\x00!\x80\x01\x00\x00\x00x\x00\x19\x00\x00\x00\x00\x13\x88\x10Freebox-Server-3\xc0\x17\xc1\x04\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8\x00\xfe' >>> pkt = Ether(c) >>> assert DNS in pkt >>> assert pkt.an[0].rdata == b'140C768FFE28@Freebox Server._raop._tcp.local.' >>> assert pkt.an[1].rdata == [b'txtvers=1', b'vs=190.9', b'ch=2', b'sr=44100', b'ss=16', b'pw=false', b'et=0,1', b'ek=1', b'tp=TCP,UDP', b'am=FreeboxServer1,2', b'cn=0,1,2,3', b'md=0,2', b'sf=0x44', b'ft=0xBF0A00', b'sv=false', b'da=true', b'vn=65537', b'vv=2'] >>> assert pkt.an[2].rrname == b'140C768FFE28@Freebox Server._raop._tcp.local.' >>> assert pkt.an[2].port == 5000 >>> assert pkt.an[2].target == b'Freebox-Server-3.local.' >>> assert pkt.an[3].rrname == b'Freebox-Server-3.local.' >>> assert pkt.an[3].rdata == '192.168.0.254' ###(007)=[passed] Other compressed DNS >>> s = b'\x00\x00\x84\x00\x00\x00\x00\x02\x00\x00\x00\x06\x0bGourmandise\x04_smb\x04_tcp\x05local\x00\x00!\x80\x01\x00\x00\x00x\x00\x14\x00\x00\x00\x00\x01\xbd\x0bGourmandise\xc0"\x0bGourmandise\x0b_afpovertcp\xc0\x1d\x00!\x80\x01\x00\x00\x00x\x00\x08\x00\x00\x00\x00\x02$\xc09\xc09\x00\x1c\x80\x01\x00\x00\x00x\x00\x10\xfe\x80\x00\x00\x00\x00\x00\x00\x00s#\x99\xca\xf7\xea\xdc\xc09\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8\x01x\xc09\x00\x1c\x80\x01\x00\x00\x00x\x00\x10*\x01\xcb\x00\x0bD\x1f\x00\x18k\xb1\x99\x90\xdf\x84.\xc0\x0c\x00/\x80\x01\x00\x00\x00x\x00\t\xc0\x0c\x00\x05\x00\x00\x80\x00@\xc0G\x00/\x80\x01\x00\x00\x00x\x00\t\xc0G\x00\x05\x00\x00\x80\x00@\xc09\x00/\x80\x01\x00\x00\x00x\x00\x08\xc09\x00\x04@\x00\x00\x08' >>> pkt = DNS(s) >>> assert [x.rrname for x in pkt.ar] == [ ... b'Gourmandise.local.', ... b'Gourmandise.local.', ... b'Gourmandise.local.', ... b'Gourmandise._smb._tcp.local.', ... b'Gourmandise._afpovertcp._tcp.local.', ... b'Gourmandise.local.' ... ] ###(008)=[passed] DNS advanced building >>> pkt = DNS(qr=1, qd=[], aa=1, rd=1) >>> pkt.an = [ ... DNSRR(type=12, rrname='_raop._tcp.local.', rdata='140C768FFE28@Freebox Server._raop._tcp.local.'), ... DNSRR(rrname='140C768FFE28@Freebox Server._raop._tcp.local.', type=16, rdata=[b'txtvers=1', b'vs=190.9', b'ch=2', b'sr=44100', b'ss=16', b'pw=false', b'et=0,1', b'ek=1', b'tp=TCP,UDP', b'am=FreeboxServer1,2', b'cn=0,1,2,3', b'md=0,2', b'sf=0x44', b'ft=0xBF0A00', b'sv=false', b'da=true', b'vn=65537', b'vv=2']), ... DNSRRSRV(rrname='140C768FFE28@Freebox Server._raop._tcp.local.', target='Freebox-Server-3.local.', port=5000, type=33, cacheflush=1, rclass=1), ... DNSRR(rrname='Freebox-Server-3.local.', rdata='192.168.0.254', cacheflush=1, rclass=1, type=1, ttl=120), ... ] >>> >>> pkt = DNS(raw(pkt)) >>> >>> assert DNSRRSRV in pkt.an[2] >>> assert pkt.an[2][DNSRRSRV].target == b'Freebox-Server-3.local.' >>> assert pkt.an[2][DNSRRSRV].rrname == b'140C768FFE28@Freebox Server._raop._tcp.local.' >>> >>> assert pkt.an[3].rrname == b'Freebox-Server-3.local.' >>> assert pkt.an[3].rdata == '192.168.0.254' ###(009)=[passed] Basic DNS Compression >>> assert len(pkt) == 426 >>> >>> z = pkt.compress() >>> >>> assert len(z) == 295 >>> assert z.an[0].rrname == b'_raop._tcp.local.' >>> assert z.an[0].rdata == b'\x1b140C768FFE28@Freebox Server\xc0\x0c' >>> assert z.an[1].rrname == z.an[2].rrname == b'\xc0(' >>> assert z.an[2].target == b'\x10Freebox-Server-3\xc0\x17' >>> assert z.an[3].rrname == b'\xc1\x04' >>> >>> raw(z) b'\x00\x00\x85\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05_raop\x04_tcp\x05local\x00\x00\x0c\x00\x01\x00\x00\x00\x00\x00\x1e\x1b140C768FFE28@Freebox Server\xc0\x0c\xc0(\x00\x10\x00\x01\x00\x00\x00\x00\x00\xa0\ttxtvers=1\x08vs=190.9\x04ch=2\x08sr=44100\x05ss=16\x08pw=false\x06et=0,1\x04ek=1\ntp=TCP,UDP\x13am=FreeboxServer1,2\ncn=0,1,2,3\x06md=0,2\x07sf=0x44\x0bft=0xBF0A00\x08sv=false\x07da=true\x08vn=65537\x04vv=2\xc0(\x00!\x80\x01\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x13\x88\x10Freebox-Server-3\xc0\x17\xc1\x04\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8\x00\xfe' >>> >>> assert raw(z) == b'\x00\x00\x85\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05_raop\x04_tcp\x05local\x00\x00\x0c\x00\x01\x00\x00\x00\x00\x00\x1e\x1b140C768FFE28@Freebox Server\xc0\x0c\xc0(\x00\x10\x00\x01\x00\x00\x00\x00\x00\xa0\ttxtvers=1\x08vs=190.9\x04ch=2\x08sr=44100\x05ss=16\x08pw=false\x06et=0,1\x04ek=1\ntp=TCP,UDP\x13am=FreeboxServer1,2\ncn=0,1,2,3\x06md=0,2\x07sf=0x44\x0bft=0xBF0A00\x08sv=false\x07da=true\x08vn=65537\x04vv=2\xc0(\x00!\x80\x01\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x13\x88\x10Freebox-Server-3\xc0\x17\xc1\x04\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8\x00\xfe' >>> >>> recompressed = DNS(raw(z)) >>> recompressed.clear_cache() >>> recompressed.an[0].rdlen = None >>> recompressed.an[1].rdlen = None >>> recompressed.an[2].rdlen = None >>> recompressed.an[3].rdlen = None >>> >>> assert raw(recompressed) == raw(pkt) ###(010)=[passed] DNS cache clearance on sub change >>> p = DNS(b'\x00\x00\x01\x00\x00\x00\x00\x02\x00\x00\x00\x00\x03H-1\x05local\x00\x00\x05\x00\x01\x00\x00\x00\x00\x00\x06\x03H-2\xc0\x10\xc0!\x00\x05\x00\x01\x00\x00\x00\x00\x00\x02\xc0\x0c') >>> p[DNS].an[0].rrname = 'H' >>> assert p.raw_packet_cache is None >>> assert bytes(p) == b'\x00\x00\x01\x00\x00\x00\x00\x02\x00\x00\x00\x00\x01H\x00\x00\x05\x00\x01\x00\x00\x00\x00\x00\x0b\x03H-2\x05local\x00\x03H-2\x05local\x00\x00\x05\x00\x01\x00\x00\x00\x00\x00\x0b\x03H-1\x05local\x00' ###(011)=[passed] DNS frames with MX records >>> frame = b'E\x00\x00\xa4\x93\x1d\x00\x00y\x11\xdc\xfc\x08\x08\x08\x08\xc0\xa8\x00w\x005\xb4\x9b\x00\x90k\x80\x00\x00\x81\x80\x00\x01\x00\x05\x00\x00\x00\x00\x06google\x03com\x00\x00\x0f\x00\x01\xc0\x0c\x00\x0f\x00\x01\x00\x00\x02B\x00\x11\x00\x1e\x04alt2\x05aspmx\x01l\xc0\x0c\xc0\x0c\x00\x0f\x00\x01\x00\x00\x02B\x00\t\x00\x14\x04alt1\xc0/\xc0\x0c\x00\x0f\x00\x01\x00\x00\x02B\x00\t\x002\x04alt4\xc0/\xc0\x0c\x00\x0f\x00\x01\x00\x00\x02B\x00\t\x00(\x04alt3\xc0/\xc0\x0c\x00\x0f\x00\x01\x00\x00\x02B\x00\x04\x00\n\xc0/' >>> pkt = IP(frame) >>> results = [x.exchange for x in pkt.an] >>> assert results == [b'alt2.aspmx.l.google.com.', b'alt1.aspmx.l.google.com.', b'alt4.aspmx.l.google.com.', b'alt3.aspmx.l.google.com.', b'aspmx.l.google.com.'] >>> >>> pkt.clear_cache() >>> assert raw(dns_compress(pkt)) == frame ###(012)=[passed] DNS frame with typebitmaps >>> compressed_pkt = b'\x01\x00^\x00\x00\xfb\xa0\x10\x81\xd9\xd3y\x08\x00E\x00\x01\x14\\\n@\x00\xff\x116n\xc0\xa8F\xbc\xe0\x00\x00\xfb\x14\xe9\x14\xe9\x01\x00Ho\x00\x00\x84\x00\x00\x00\x00\x04\x00\x00\x00\x03\x03188\x0270\x03168\x03192\x07in-addr\x04arpa\x00\x00\x0c\x80\x01\x00\x00\x00x\x00\x0f\x07Android\x05local\x00\x019\x017\x013\x01D\x019\x01D\x01E\x01F\x01F\x01F\x011\x018\x010\x011\x012\x01A\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x010\x018\x01E\x01F\x03ip6\xc0#\x00\x0c\x80\x01\x00\x00\x00x\x00\x02\xc03\xc03\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8F\xbc\xc03\x00\x1c\x80\x01\x00\x00\x00x\x00\x10\xfe\x80\x00\x00\x00\x00\x00\x00\xa2\x10\x81\xff\xfe\xd9\xd3y\xc0\x0c\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0\x0c\x00\x02\x00\x08\xc0B\x00/\x80\x01\x00\x00\x00x\x00\x06\xc0B\x00\x02\x00\x08\xc03\x00/\x80\x01\x00\x00\x00x\x00\x08\xc03\x00\x04@\x00\x00\x08' >>> pkt = Ether(compressed_pkt) >>> assert pkt.ar[2].nextname == b"Android.local." >>> assert pkt.ar[2].sprintf("%typebitmaps%") == "['A', 'AAAA']" ###(013)=[passed] Advanced dns_get_str tests >>> full = b"\x06cheese\x00blobofdata....\x06hamand\xc0\x00" >>> assert dns_get_str(full[22:], full=full)[0] == b'hamand.cheese.' ###(014)=[passed] Decompression loop in dns_get_str >>> full = b"\x04data\xc0\x00" >>> assert dns_get_str(full, full=full)[0] == b"data.data." DNS decompression loop detected ###(015)=[passed] Prematured end in dns_get_str >>> assert dns_get_str(b"\x06da", 0)[0] == b"da." DNS RR prematured end (ofs=7, len=3) >>> >>> full = b"\x04data\xc0\x0f" >>> assert dns_get_str(full, full=full)[0] == b"data." DNS RR prematured end (ofs=15, len=7) ###(016)=[passed] DNS record type 13 (HINFO) >>> b = b'\x00\x00\r\x00\x01\x00\x00\x00\x00\x00\x02\x00\x00' >>> >>> p = DNSRRHINFO() >>> assert raw(p) == b >>> >>> p = DNSRRHINFO(b) >>> assert p.cpu == b'' and p.os == b'' >>> >>> b = b'\x00\x00\r\x00\x01\x00\x00\x00\x00\x00\r\x06X86_64\x05LINUX' >>> >>> p = DNSRRHINFO(cpu='X86_64', os='LINUX') >>> assert raw(p) == b >>> >>> p = DNSRRHINFO(b) >>> assert p.cpu == b'X86_64' and p.os == b'LINUX' >>> >>> d = DNS(raw(DNS(qd=[],an=[p]))) >>> assert raw(d.an[0]) == raw(p) ###(017)=[passed] DNS record type 15 (MX) >>> p = DNS(raw(DNS(qd=[],an=DNSRRMX(exchange='example.com')))) >>> assert p.an[0].exchange == b'example.com.' ###(018)=[passed] DNS record type 16 (TXT) >>> p = DNS(raw(DNS(id=1,ra=1,qd=[],an=DNSRR(rrname='scapy', type='TXT', rdata="niceday", ttl=1)))) >>> assert p[DNS].an[0].rdata == [b"niceday"] >>> >>> p = DNS(raw(DNS(id=1,ra=1,qd=[],an=DNSRR(rrname='secdev', type='TXT', rdata=["sweet", "celestia"], ttl=1)))) >>> assert p[DNS].an[0].rdata == [b"sweet", b"celestia"] >>> assert raw(p) == b'\x00\x01\x01\x80\x00\x00\x00\x01\x00\x00\x00\x00\x06secdev\x00\x00\x10\x00\x01\x00\x00\x00\x01\x00\x0f\x05sweet\x08celestia' >>> >>> b = b'\x05scapy\x00\x00\x10\x00\x01\x00\x00\x00\x00\x00\x01\x00' >>> rr = DNSRR(b) >>> assert rr.rdata == [b""] >>> assert rr.rdlen == 1 >>> rr.clear_cache() >>> assert DNSRR(raw(rr)).rdata == [b""] >>> >>> rr = DNSRR(rrname='scapy', type='TXT', rdata=[""]) >>> assert raw(rr) == b >>> >>> rr = DNSRR(rrname='scapy', type='TXT') >>> assert raw(rr) == b >>> >>> b = b'\x05scapy\x00\x00\x10\x00\x01\x00\x00\x00\x00\x00\x00' >>> rr = DNSRR(b) >>> assert rr.rdata == [] >>> assert rr.rdlen == 0 >>> rr.clear_cache() >>> assert DNSRR(raw(rr)).rdata == [] >>> >>> rr = DNSRR(rrname='scapy', type='TXT', rdata=[]) >>> assert raw(rr) == b ###(019)=[passed] DNS record type 35 (NAPTR) >>> b = b'\x00\x00#\x00\x01\x00\x00\x00\x00\x00+\x00\n\x00d\x01u\x07E2U+sip\x1b!^.*$!sip:info@example.com!\x00' >>> >>> p = DNSRRNAPTR(b) >>> assert p.order == 10 and p.preference == 100 and p.flags == b'u' and p.services == b'E2U+sip' >>> assert p.regexp == b'!^.*$!sip:info@example.com!' and p.replacement == b'.' >>> >>> p = DNSRRNAPTR(order=10, preference=100, flags="u", services="E2U+sip", regexp="!^.*$!sip:info@example.com!") >>> assert raw(p) == b ###(020)=[passed] DNS record type 39 (DNAME) >>> b = b'\x05local\x00\x00\x27\x00\x01\x00\x00\x00\x00\x00\x07\x05local\x00' >>> >>> p = DNSRR(b) >>> assert p.rrname == b'local.' and p.type == 39 and p.rdata == b'local.' >>> >>> p = DNSRR(rrname=b'local', type='DNAME', rdata='local') >>> assert raw(p) == b >>> >>> >>> p = DNS(qd=[], an=[DNSRR(rrname='local', type='DNAME', rdata='local')]) >>> assert raw(p).endswith(b'\x07\x05local\x00') >>> >>> rr = DNS(raw(p)).an[0] >>> assert rr.rrname == b'local.' and rr.type == 39 and rr.rdata == b'local.' >>> >>> cp = dns_compress(p) >>> assert raw(cp).endswith(b'\x02\xc0\x0c') >>> >>> rr = DNS(raw(cp)).an[0] >>> assert rr.rrname == b'local.' and rr.type == 39 and rr.rdata == b'local.' ###(021)=[passed] DNS record type 64, 65 (SVCB, HTTPS) >>> b = b'\x00\x00\x00\x04\x00\x01\x00\x06' >>> p = SvcParam(b) >>> assert p.key == 0 and p.value == [1, 6] >>> assert b == raw(SvcParam(key='mandatory', value=['alpn', 'ipv6hint'])) >>> >>> b = b'\x00\x01\x00\x06\x02h3\x02h2' >>> p = SvcParam(b) >>> assert p.key == 1 and p.value == [b'h3', b'h2'] >>> assert b == raw(SvcParam(key='alpn', value=['h3', 'h2'])) >>> >>> b = b'\x00\x02\x00\x00' >>> p = SvcParam(b) >>> assert p.key == 2 and p.value == [] >>> assert b == raw(SvcParam(key='no-default-alpn')) >>> >>> b = b'\x00\x03\x00\x02\x04\xd2' >>> p = SvcParam(b) >>> assert p.key == 3 and p.value == 1234 >>> assert b == raw(SvcParam(key='port', value=1234)) >>> >>> b = b'\x00\x04\x00\x08\xc0\xa8\x00\x01\xc0\xa8\x00\x02' >>> p = SvcParam(b) >>> assert p.key == 4 and p.value == ['192.168.0.1', '192.168.0.2'] >>> assert b == raw(SvcParam(key='ipv4hint', value=['192.168.0.1', '192.168.0.2'])) >>> >>> b = b'\x00\x06\x00\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> p = SvcParam(b) >>> assert p.key == 6 and p.value == ['2001:db8::1'] >>> assert b == raw(SvcParam(key='ipv6hint', value=['2001:db8::1'])) >>> >>> b = b'\x00\x07\x00\x10/dns-query{?dns}' >>> p = SvcParam(b) >>> assert p.key == 7 and p.value == b'/dns-query{?dns}' >>> assert b == raw(SvcParam(key='dohpath', value=b'/dns-query{?dns}')) >>> >>> p = DNSRRSVCB() >>> assert p.rrname == b'.' and p.type == 64 and p.svc_priority == 0 and p.svc_params == [] >>> >>> p = DNSRRHTTPS() >>> assert p.rrname == b'.' and p.type == 65 and p.svc_priority == 0 and p.svc_params == [] >>> >>> b = b'\x04_dns\x03one\x03one\x03one\x03one\x00\x00@\x00\x01\x00\x00\x01,\x001\x00\x01\x03one\x03one\x03one\x03one\x00\x00\x01\x00\x06\x02h3\x02h2\x00\x07\x00\x10/dns-query{?dns}' >>> p = DNSRRSVCB(b) >>> assert p.type == 64 and p.ttl == 300 and p.svc_priority == 1 and p.target_name == b'one.one.one.one.' >>> >>> alpn = SvcParam(key='alpn', value=['h3', 'h2']) >>> dohpath = SvcParam(key='dohpath', value=b'/dns-query{?dns}') >>> >>> assert raw(p.svc_params[0]) == raw(alpn) >>> assert raw(p.svc_params[1]) == raw(dohpath) >>> >>> assert b == raw(DNSRRSVCB(rrname='_dns.one.one.one.one', ttl=300, svc_priority=1, target_name='one.one.one.one', svc_params=[alpn, dohpath])) >>> >>> b = b'\ncloudflare\x03com\x00\x00A\x00\x01\x00\x00\x00>\x00=\x00\x01\x00\x00\x01\x00\x06\x02h3\x02h2\x00\x04\x00\x08h\x10\x84\xe5h\x10\x85\xe5\x00\x06\x00 &\x06G\x00\x00\x00\x00\x00\x00\x00\x00\x00h\x10\x84\xe5&\x06G\x00\x00\x00\x00\x00\x00\x00\x00\x00h\x10\x85\xe5' >>> >>> p = DNSRRHTTPS(b) >>> assert p.type == 65 and p.ttl == 62 and p.svc_priority == 1 and p.target_name == b'.' >>> >>> alpn = SvcParam(key='alpn', value=['h3', 'h2']) >>> ipv4hint = SvcParam(key='ipv4hint', value=['104.16.132.229', '104.16.133.229']) >>> ipv6hint = SvcParam(key='ipv6hint', value=['2606:4700::6810:84e5', '2606:4700::6810:85e5']) >>> >>> assert raw(p.svc_params[0]) == raw(alpn) >>> assert raw(p.svc_params[1]) == raw(ipv4hint) >>> assert raw(p.svc_params[2]) == raw(ipv6hint) >>> >>> assert b == raw(DNSRRHTTPS(rrname='cloudflare.com', ttl=62, svc_priority=1, target_name='.', svc_params=[alpn, ipv4hint, ipv6hint])) ###(022)=[passed] DNS - Malformed DNS over TCP message >>> _old_dbg = conf.debug_dissector >>> conf.debug_dissector = True >>> >>> try: ... p = IP(raw(IP()/TCP()/DNS(qd=[],length=28))[:-13]) ... assert False ... except Scapy_Exception as e: ... assert str(e) == "Malformed DNS message: too small!" ... Malformed DNS message: too small! DNS dissector failed TCP dissector failed >>> try: ... p = IP(raw(IP()/TCP()/DNS(qd=[],length=28, qdcount=1))) ... assert False ... except Scapy_Exception as e: ... assert str(e) == "Malformed DNS message: invalid length!" ... Malformed DNS message: invalid length! more DNS dissector failed >>> conf.debug_dissector = _old_dbg ###(023)=[passed] DNS - dns_compress on decompressed packet >>> data = b'E\x00\x00n~\x82\x00\x00{\x11\xae\xeb\x08\x08\x08\x08\x01\x01\x01\x01\x005\x005\x00Z!\x17\x00\x00\x81\x80\x00\x01\x00\x00\x00\x01\x00\x00\x03www\x06google\x03com\x00\x00\x0f\x00\x01\xc0\x10\x00\x06\x00\x01\x00\x00\x002\x00&\x03ns1\xc0\x10\tdns-admin\xc0\x10\x14Po\x8f\x00\x00\x03\x84\x00\x00\x03\x84\x00\x00\x07\x08\x00\x00\x00<' >>> >>> p = IP(data) >>> assert p.ns[0].rrname == b"google.com." >>> assert p.ns[0].mname == b"ns1.google.com." >>> assert p.ns[0].rname == b"dns-admin.google.com." >>> cp = dns_compress(p) >>> assert cp.ns[0].rrname == b'\xc0\x10' >>> assert cp.ns[0].mname == b'\x03ns1\xc0\x10' >>> assert cp.ns[0].rname == b'\tdns-admin\xc0\x10' >>> p = IP(raw(cp)) >>> assert p.ns[0].rrname == b"google.com." >>> assert p.ns[0].mname == b"ns1.google.com." >>> assert p.ns[0].rname == b"dns-admin.google.com." ###(024)=[passed] DNS - dns_compress on close indexes >>> p = dns_compress(DNS(qd=DNSQR(qname=b'scapy.'), an=DNSRR(rrname=b'scapy.'), ar=DNSRROPT(rrname=b'.'))) >>> assert raw(p) == b'\x00\x00\x01\x00\x00\x01\x00\x01\x00\x00\x00\x01\x05scapy\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00)\x10\x00\x00\x00\x80\x00\x00\x00' >>> >>> p = DNS(raw(p)) >>> assert p.qd[0].qname == b'scapy.' >>> assert p.an[0].rrname == b'scapy.' >>> assert p.ar[0].rrname == b'.' ###(025)=[passed] DNS - dns_compress with 1-length strings >>> data = b'\xac\x81\x81\x80\x00\x01\x00\x06\x00\r\x00\x00\x04mqtt\x0bweatherflow\x03com\x00\x00\x01\x00\x01\xc0\x0c\x00\x05\x00\x01\x00\x00\x00\xe4\x00>> >>> p = DNS(data) >>> cmp = p.compress() >>> assert len(cmp) == len(data) ###(026)=[passed] DNS - dns_encode edge cases >>> assert dns_encode(b"www.google.com") == b'\x03www\x06google\x03com\x00' >>> assert dns_encode(b"*") == b'\x01*\x00' >>> assert dns_encode(dns_encode(b"*")) == b'\x03\x01*\x00' ###(027)=[passed] DNS - simple request >>> assert raw(DNS()) == b'\x00\x00\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x07example\x03com\x00\x00\x01\x00\x01' ###(028)=[passed] DNS - OOM test >>> import zlib >>> data = zlib.decompress(b'x\x9c\xed\xce!\n\xc2`\x00\x80\xd1\x7f\x0c\xc1\xbal\xf1\x12\x1e\xc0 Vob3\xaf+\xec\x02\xbb\x82x\x83\xb1"\xa2\xc1\xac\x06\x9b\xc9\xb0"\x0b3\xccdV\x93\xa0\x0f^\xfc\xc2w^\x16U\x88\x8a\xd5n\xdf\xb6\xdd0\n\xf5q\xb1\t!M&Y>K\xae\xf9\xacw\t\x83\xe8V\xaf\x0f\xa7m\xdaV\xf78z\xad\x1f\xbf\x95=5\xd9\x071\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x0f\xe94\xdf\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xff\x15\x85\xe18.\xcbrZ\xce\x1f5u\n\xd1') >>> >>> old_max_list_count = conf.max_list_count >>> conf.max_list_count = 10 >>> import time >>> t = time.monotonic() >>> >>> with no_debug_dissector(): ... try: ... dns = Ether(data) ... except MaximumItemsCount: ... pass ... >>> delta = time.monotonic() - t >>> assert delta < 10 >>> >>> conf.max_list_count = old_max_list_count ###(029)=[passed] DNS - Backward compatibility: keep deprecated behavior >>> c = b'\x01\x00^\x00\x00\xfb\x14\x0cv\x8f\xfe(\x08\x00E\x00\x01C\xe3\x91@\x00\xff\x11\xf4u\xc0\xa8\x00\xfe\xe0\x00\x00\xfb\x14\xe9\x14\xe9\x01/L \x00\x00\x84\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05_raop\x04_tcp\x05local\x00\x00\x0c\x00\x01\x00\x00\x11\x94\x00\x1e\x1b140C768FFE28@Freebox Server\xc0\x0c\xc0(\x00\x10\x80\x01\x00\x00\x11\x94\x00\xa0\ttxtvers=1\x08vs=190.9\x04ch=2\x08sr=44100\x05ss=16\x08pw=false\x06et=0,1\x04ek=1\ntp=TCP,UDP\x13am=FreeboxServer1,2\ncn=0,1,2,3\x06md=0,2\x07sf=0x44\x0bft=0xBF0A00\x08sv=false\x07da=true\x08vn=65537\x04vv=2\xc0(\x00!\x80\x01\x00\x00\x00x\x00\x19\x00\x00\x00\x00\x13\x88\x10Freebox-Server-3\xc0\x17\xc1\x04\x00\x01\x80\x01\x00\x00\x00x\x00\x04\xc0\xa8\x00\xfe' >>> pkt = Ether(c) >>> with warnings.catch_warnings(record=True) as w: ... warnings.simplefilter("always") ... assert pkt.an.rdata == b'140C768FFE28@Freebox Server._raop._tcp.local.' ... assert len(w) == 1 and issubclass(w[-1].category, DeprecationWarning) ... >>> with warnings.catch_warnings(record=True) as w: ... warnings.simplefilter("always") ... pkt = DNS(qr=1, qd=None, aa=1, rd=1) ... assert len(w) == 1 and issubclass(w[-1].category, DeprecationWarning) ... >>> pkt = DNS(bytes(pkt)) >>> assert pkt.qd == [] ###(030)=[passed] DNS - command >>> p = DNS() >>> assert p == eval(p.command()) >>> >>> p = DNS(qd=[]) >>> assert p == eval(p.command()) ###(031)=[passed] DNS - iter through DNSStrFields >>> pkt = DNSQR(qname=["domain1.com", "domain2.com"], qtype="A") >>> for i in pkt: ... assert i.qname in [b"domain1.com.", b"domain2.com."] ... Test campaign ━ Run at 01:42:11 from [test/scapy/layers/dns_dnssec.uts] by UTscapy in 0.054884910583496094 └ Passed=30 └ Failed=0 ###### ## bitmap2RRlist() ###### ###(000)=[passed] example from RFC 4034 >>> RRlist2bitmap([1, 15, 46, 47, 1234]) == b'\x00\x06@\x01\x00\x00\x00\x03\x04\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20' True ###(001)=[passed] [0] >>> RRlist2bitmap([0]) == b'\x00\x01\x80' True ###(002)=[passed] [0,1,2,3,4,5,6,7] >>> RRlist2bitmap([0,1,2,3,4,5,6,7]) == b'\x00\x01\xff' True ###(003)=[passed] [256,512,4096,36864] >>> RRlist2bitmap([256,512,4096,36864]) == b'\x01\x01\x80\x02\x01\x80\x10\x01\x80\x90\x01\x80' True ###(004)=[passed] [65535] >>> RRlist2bitmap([65535]) == b'\xff\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###### ## From RRlist2bitmap() to bitmap2RRlist() ###### ###(005)=[passed] example from RFC 4034 >>> b = b'\x00\x06@\x01\x00\x00\x00\x03\x04\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20' >>> RRlist2bitmap(bitmap2RRlist(b)) == b True ###(006)=[passed] [0] >>> b= b'\x00\x01\x80' >>> RRlist2bitmap(bitmap2RRlist(b)) == b True ###(007)=[passed] [0,1,2,3,4,5,6,7] >>> b = b'\x00\x01\xff' >>> RRlist2bitmap(bitmap2RRlist(b)) == b True ###(008)=[passed] [256,512,4096,36864] >>> b = b'\x01\x01\x80\x02\x01\x80\x10\x01\x80\x90\x01\x80' >>> RRlist2bitmap(bitmap2RRlist(b)) == b True ###(009)=[passed] [65535] >>> b = b'\xff\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> RRlist2bitmap(bitmap2RRlist(b)) == b True ###### ## Test NSEC RR ###### ###(010)=[passed] DNSRRNSEC(), basic instantiation >>> t = DNSRRNSEC() >>> raw(t) == b'\x00\x00/\x00\x01\x00\x00\x00\x00\x00\x01\x00' True ###(011)=[passed] DNSRRRNSEC(), check parameters >>> t = DNSRRNSEC(rrname="scapy.secdev.org.", rclass=42, ttl=28, nextname="www.secdev.org.", typebitmaps=RRlist2bitmap([1,2,3,4,1234])) >>> raw(t) == b'\x05scapy\x06secdev\x03org\x00\x00/\x00*\x00\x00\x00\x1c\x000\x03www\x06secdev\x03org\x00\x00\x01x\x04\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 ' True ###### ## Test NSEC3 RR ###### ###(012)=[passed] DNSRRNSEC3(), basic instantiation >>> t = DNSRRNSEC3() >>> raw(t) == b'\x00\x002\x00\x01\x00\x00\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00' True ###(013)=[passed] DNSRRRNSEC3(), check parameters >>> t = DNSRRNSEC3(rrname="scapy.secdev.org.", rclass=42, ttl=28, hashalg=7, iterations=80, saltlength=28, salt=b"\x28\x07", hashlength=31, nexthashedownername="XXX.scapy.secdev.org", typebitmaps=RRlist2bitmap([1,2,3,4,1234])) >>> raw(t) == b'\x05scapy\x06secdev\x03org\x00\x002\x00*\x00\x00\x00\x1c\x00<\x07\x00\x00P\x1c(\x07\x1fXXX.scapy.secdev.org\x00\x01x\x04\x1b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 ' True ###### ## Test NSEC3PARAM RR ###### ###(014)=[passed] DNSRRNSEC3PARAM(), basic instantiation >>> t = DNSRRNSEC3PARAM() >>> raw(t) == b'\x00\x003\x00\x01\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00' True ###(015)=[passed] DNSRRRNSEC3PARAM(), check parameters >>> t = DNSRRNSEC3(rrname="scapy.secdev.org.", rclass=42, ttl=28, hashalg=7, flags=80, iterations=80, saltlength=28, salt=b"\x28\x07") >>> raw(t) == b'\x05scapy\x06secdev\x03org\x00\x002\x00*\x00\x00\x00\x1c\x00\x08\x07P\x00P\x1c(\x07\x00' True ###### ## Test RRSIG RR ###### ###(016)=[passed] DNSRRRSIG(), basic instantiation >>> t = DNSRRRSIG() >>> raw(t) == b'\x00\x00.\x00\x01\x00\x00\x00\x00\x00\x13\x00\x01\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(017)=[passed] DNSRRRSIG(), check parameters >>> t = DNSRRRSIG(rrname="test.example.com.", type=46, rclass=12, ttl=64, originalttl=2807, keytag=42, signersname="test.rsig", signature="test RSIG") >>> raw(t) == b'\x04test\x07example\x03com\x00\x00.\x00\x0c\x00\x00\x00@\x00&\x00\x01\x05\x00\x00\x00\n\xf7\x00\x00\x00\x00\x00\x00\x00\x00\x00*\x04test\x04rsig\x00test RSIG' True ###(018)=[passed] DNSRRRSIG(), dissection >>> rrsig = b'\x03isc\x03org\x00\x00.\x00\x01\x00\x00\x96O\x00\x9b\x00\x02\x05\x02\x00\x00\xa8\xc0K-3\xd9K\x05\xa6\xd9\xed6\x03isc\x03org\x00\xac\xb2_I\x9e\xdcU\xca/3\x1c\xdf{\xba\xd5\x80\xb0 \xa4~\x98\x95\xab~\x84\xb2\x1f9\x17#\x7f\xfeP\xb9\xfb\x8d\x13\x19\xd7\x7f\x9e/\x1c\xd7rv<\xc6\xd3\xf1\xae8\rh\xba\x1e\xaa\xe6\xf1\x1e\x1d\xdaS\xd4\\\xfd\xa3`P\xa1\xe0\xa2\x860\xd4?\xb4}j\x81O\x03\xdc&v\x13\xd4(k\xa07\x8f-\x08e\x06\xff\xb8h\x8f\x16j\xe4\xd92\xd2\x99\xc2\xb4' >>> t = DNSRRRSIG(rrsig) >>> t.rrname == b'isc.org.' and t.labels == 2 and t.keytag == 60726 and t.signature[-4:] == b'\xd2\x99\xc2\xb4' True ###### ## Test DNSKEY RR ###### ###(019)=[passed] DNSRRDNSKEY(), basic instantiation >>> t = DNSRRDNSKEY() >>> raw(t) == b'\x00\x000\x00\x01\x00\x00\x00\x00\x00\x04\x01\x00\x03\x05' and t.sprintf("%flags%") == 'Z' True ###(020)=[passed] DNSRRDNSKEY(), check parameters >>> t = DNSRRDNSKEY(rrname="www.secdev.org.", type=42, rclass=12, ttl=1234, rdlen=567, flags=2807, protocol=195, algorithm=66, publickey="strong public key") >>> raw(t) == b'\x03www\x06secdev\x03org\x00\x00*\x00\x0c\x00\x00\x04\xd2\x027\n\xf7\xc3Bstrong public key' True ###(021)=[passed] DNSRRDNSKEY(), dissection >>> t = DNSRRDNSKEY(b'\x03dlv\x03isc\x03org\x00\x000\x00\x01\x00\x00\x1bq\x01\t\x01\x01\x03\x05\x04@\x00\x00\x03\xc72\xef\xf9\xa2|\xeb\x10N\xf3\xd5\xe8&\x86\x0f\xd6<\xed>\x8e\xea\x19\xadm\xde\xb9a\'\xe0\xccC\x08M~\x94\xbc\xb6n\xb8P\xbf\x9a\xcd\xdfdJ\xb4\xcc\xd7\xe8\xc8\xfb\xd27sx\xd0\xf8^I\xd6\xe7\xc7g$\xd3\xc2\xc6\x7f>\x8c\x01\xa5\xd8VK+\xcb~\xd6\xea\xb8[\xe9\xe7\x03z\x8e\xdb\xe0\xcb\xfaN\x81\x0f\x89\x9e\xc0\xc2\xdb!\x81p{C\xc6\xeft\xde\xf5\xf6v\x90\x96\xf9\xe9\xd8`1\xd7\xb9\xcae\xf8\x04\x8f\xe8C\xe7\x00+\x9d?\xc6\xf2o\xd3Ak\x7f\xc90\xea\xe7\x0cO\x01e\x80\xf7\xbe\x8eq\xb1<\xf1&\x1c\x0b^\xfdDdc\xad\x99~B\xe8\x04\x00\x03,t="\xb4\xb6\xb6\xbc\x80{\xb9\x9b\x05\x95\\;\x02\x1eS\xf4p\xfedq\xfe\xfc00$\xe05\xba\x0c@\xabTv\xf3W\x0e\xb6\t\r!\xd9\xc2\xcd\xf1\x89\x15\xc5\xd5\x17\xfej_T\x99\x97\xd2j\xff\xf85b\xca\x8c|\xe9O\x9fd\xfdT\xadL3taK\x96\xac\x13a') >>> t.rrname == b"dlv.isc.org." and t.rdlen == 265 and t.sprintf("%flags%") == 'SZ' and t.publickey == b'\x04@\x00\x00\x03\xc72\xef\xf9\xa2|\xeb\x10N\xf3\xd5\xe8&\x86\x0f\xd6<\xed>\x8e\xea\x19\xadm\xde\xb9a\'\xe0\xccC\x08M~\x94\xbc\xb6n\xb8P\xbf\x9a\xcd\xdfdJ\xb4\xcc\xd7\xe8\xc8\xfb\xd27sx\xd0\xf8^I\xd6\xe7\xc7g$\xd3\xc2\xc6\x7f>\x8c\x01\xa5\xd8VK+\xcb~\xd6\xea\xb8[\xe9\xe7\x03z\x8e\xdb\xe0\xcb\xfaN\x81\x0f\x89\x9e\xc0\xc2\xdb!\x81p{C\xc6\xeft\xde\xf5\xf6v\x90\x96\xf9\xe9\xd8`1\xd7\xb9\xcae\xf8\x04\x8f\xe8C\xe7\x00+\x9d?\xc6\xf2o\xd3Ak\x7f\xc90\xea\xe7\x0cO\x01e\x80\xf7\xbe\x8eq\xb1<\xf1&\x1c\x0b^\xfdDdc\xad\x99~B\xe8\x04\x00\x03,t="\xb4\xb6\xb6\xbc\x80{\xb9\x9b\x05\x95\\;\x02\x1eS\xf4p\xfedq\xfe\xfc00$\xe05\xba\x0c@\xabTv\xf3W\x0e\xb6\t\r!\xd9\xc2\xcd\xf1\x89\x15\xc5\xd5\x17\xfej_T\x99\x97\xd2j\xff\xf85b\xca\x8c|\xe9O\x9fd\xfdT\xadL3taK\x96\xac\x13a' True ###### ## Test DS and DLV RR ###### ###(022)=[passed] DNSRRDS() and DNSRRDLV(), basic instancaition >>> ds = DNSRRDS() >>> dlv = DNSRRDLV(type=43) >>> raw(ds) == raw(dlv) True ###(023)=[passed] DNSRRDS(), check parameters >>> t = DNSRRDS(b'\x03isc\x03org\x00\x00+\x00\x01\x00\x01Q(\x00\x182\\\x05\x01\x98!\x13\xd0\x8bLj\x1d\x9fj\xee\x1e"7\xae\xf6\x9f?\x97Y') >>> t.rrname == b'isc.org.' and t.keytag == 12892 and t.algorithm == 5 and t.digesttype == 1 and t.digest == b'\x98!\x13\xd0\x8bLj\x1d\x9fj\xee\x1e"7\xae\xf6\x9f?\x97Y' True ###### ## Test TXT RR ###### ###(024)=[passed] DNSRR(type="TXT") instantiation >>> t = DNSRR(type="TXT", rdata=b"test") >>> assert t.rdata == [b"test"] >>> assert raw(DNSRR(type="TXT", rdata=["hello", "DNS", "!"])) == b'\x00\x00\x10\x00\x01\x00\x00\x00\x00\x00\x0c\x05hello\x03DNS\x01!' ###(025)=[passed] Build DNSRR >>> an = DNSRR(type='AAAA', rdata='2001::1') >>> an = DNSRR(raw(an)) >>> assert an.rdata == '2001::1' ###(026)=[passed] DNSRRR(), check parameters >>> t = DNSRR(b'\x04test\x00\x00\x10\x00\x01\x00\x00\x00\x00\x018\xffScapy is an interactive packet manipulation program that enables you to sniff, mangle, send network packets ; test equipment ; probe and discover networks ; quickly develop new protocols. It can easily handle most classical tasks like scanning, tracerout7ing, probing, unit tests, attacks or network discovery.') DNS RR TXT prematured end of character-string (size=106, remaining bytes=55) >>> t.type == 16 and t.rdlen == 312 and t.rdata[0][:5] == b"Scapy" and t.rdata[1][-10:] == b"discovery." True ###### ## Test DNSRRTSIG RR ###### ###(027)=[passed] DNSRRTSIG basic instantiation >>> t = DNSRRTSIG() >>> raw(t) == b"\x00\x00\xfa\x00\x01\x00\x00\x00\x00\x00\x1b\thmac-sha1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00" True ###(028)=[passed] DNSRRTSIG(), check parameters >>> t = DNSRRTSIG(rrname="SAMPLE-ALG.EXAMPLE.", time_signed=853804800, fudge=300) >>> raw(t) == b"\nSAMPLE-ALG\x07EXAMPLE\x00\x00\xfa\x00\x01\x00\x00\x00\x00\x00\x1b\thmac-sha1\x00\x00\x002\xe4\x07\x00\x01,\x00\x14\x00\x00\x00\x00\x00\x00" True ###(029)=[passed] TimeField methods >>> packed_data = b"\x00\x002\xe4\x07\x00" >>> assert TimeSignedField("", 0).i2m("", 853804800) == packed_data >>> assert TimeSignedField("", 0).m2i("", packed_data) == 853804800 >>> assert TimeSignedField("", 0).i2repr("", 853804800) == "Tue Jan 21 00:00:00 1997" Test campaign ━ Run at 01:42:11 from [test/scapy/layers/dns_edns0.uts] by UTscapy in 0.06334733963012695 └ Passed=17 └ Failed=0 ###### ## Test EDNS0 rdata ###### ###(000)=[passed] EDNS0TLV(), basic instantiation >>> tlv = EDNS0TLV() >>> raw(tlv) == b'\x00\x00\x00\x00' True ###(001)=[passed] EDNS0TLV(), check parameters >>> tlv = EDNS0TLV(optcode=42, optlen=12, optdata="edns0tlv") >>> raw(tlv) == b'\x00*\x00\x0cedns0tlv' True ###(002)=[passed] EDNS0TLV(), check computed optlen >>> tlv = EDNS0TLV(optdata="edns0tlv") >>> raw(tlv) == b'\x00\x00\x00\x08edns0tlv' True ###(003)=[passed] EDNS0TLV(), dissection >>> tlv = EDNS0TLV(b'\x00*\x00\x08edns0tlv') >>> tlv.optcode == 42 and tlv.optlen == 8 and tlv.optdata == b"edns0tlv" True ###### ## Test OPT RR ###### ###(004)=[passed] DNSRROPT(), basic instantiation >>> opt = DNSRROPT() >>> raw(opt) == b'\x00\x00)\x10\x00\x00\x00\x80\x00\x00\x00' True ###(005)=[passed] DNSRROPT(), check parameters >>> opt = DNSRROPT(rrname="rropt", type=42, rclass=123, extrcode=1, version=2, z=3, rdlen=4, rdata=[EDNS0TLV()]) >>> raw(opt) == b'\x05rropt\x00\x00*\x00{\x01\x02\x00\x03\x00\x04\x00\x00\x00\x00' True ###(006)=[passed] DNSRROPT() & EDN0TLV(), check parameters >>> opt = DNSRROPT(rrname="rropt", type=42, rclass=123, extrcode=1, version=2, z=3, rdlen=4, rdata=[EDNS0TLV(optcode=42, optlen=12, optdata="edns0tlv")]) >>> raw(opt) == b'\x05rropt\x00\x00*\x00{\x01\x02\x00\x03\x00\x04\x00*\x00\x0cedns0tlv' True ###(007)=[passed] DNSRROP(), dissection >>> opt = DNSRROPT(b'\x05rropt\x00\x00*\x00{\x01\x02\x00\x03\x00\x0c\x00*\x00\x0cedns0tlv') >>> opt.rrname == b"rropt." and opt.rdlen == 12 and opt.rdata[0].optcode == 42 and opt.rdata[0].optdata == b"edns0tlv" True ###### ## Test EDNS-PING ###### ###(008)=[passed] EDNS-PING - basic instantiation >>> tlv = EDNS0TLV(optcode=5, optdata=b"\x00\x11\x22\x33") >>> raw(tlv) == b'\x00\x05\x00\x04\x00\x11"3' True ###### ## Test EDNS-COOKIE ###### ###(009)=[passed] EDNS-COOKIE - basic instantiation >>> tlv = EDNS0TLV(optcode="COOKIE", optdata=b"\x01" * 8) >>> assert tlv.optcode == 10 >>> assert raw(tlv) == b"\x00\x0A\x00\x08\x01\x01\x01\x01\x01\x01\x01\x01" ###### ## Test DNS Name Server Identifier (NSID) Option ###### ###(010)=[passed] NSID- basic instantiation >>> tlv = EDNS0TLV(optcode=2, optdata="") >>> raw(tlv) == b'\x00\x02\x00\x00' True ###### ## EDNS0 - DAU ###### ###(012)=[passed] Basic instantiation & dissection >>> b = b'\x00\x05\x00\x00' >>> >>> p = EDNS0DAU() >>> assert raw(p) == b >>> >>> p = EDNS0DAU(b) >>> assert p.optcode == 5 and p.optlen == 0 and p.alg_code == [] >>> >>> b = raw(EDNS0DAU(alg_code=['RSA/SHA-256', 'RSA/SHA-512'])) >>> >>> p = EDNS0DAU(b) >>> repr(p) '\x1b[0m<\x1b[0m\x1b[31m\x1b[1mEDNS0DAU\x1b[0m \x1b[34moptcode\x1b[0m\x1b[0m=\x1b[0m\x1b[35mDAU\x1b[0m \x1b[34moptlen\x1b[0m\x1b[0m=\x1b[0m\x1b[35m2\x1b[0m \x1b[34malg_code\x1b[0m\x1b[0m=\x1b[0m\x1b[35m[RSA/SHA-256, RSA/SHA-512]\x1b[0m \x1b[0m|\x1b[0m\x1b[0m>\x1b[0m' >>> assert p.optcode == 5 and p.optlen == 2 and p.alg_code == [8, 10] ###### ## EDNS0 - DHU ###### ###(013)=[passed] Basic instantiation & dissection >>> b = b'\x00\x06\x00\x00' >>> >>> p = EDNS0DHU() >>> assert raw(p) == b >>> >>> p = EDNS0DHU(b) >>> assert p.optcode == 6 and p.optlen == 0 and p.alg_code == [] >>> >>> b = raw(EDNS0DHU(alg_code=['SHA-1', 'SHA-256', 'SHA-384'])) >>> >>> p = EDNS0DHU(b) >>> repr(p) '\x1b[0m<\x1b[0m\x1b[31m\x1b[1mEDNS0DHU\x1b[0m \x1b[34moptcode\x1b[0m\x1b[0m=\x1b[0m\x1b[35mDHU\x1b[0m \x1b[34moptlen\x1b[0m\x1b[0m=\x1b[0m\x1b[35m3\x1b[0m \x1b[34malg_code\x1b[0m\x1b[0m=\x1b[0m\x1b[35m[SHA-1, SHA-256, SHA-384]\x1b[0m \x1b[0m|\x1b[0m\x1b[0m>\x1b[0m' >>> assert p.optcode == 6 and p.optlen == 3 and p.alg_code == [1, 2, 4] ###### ## EDNS0 - N3U ###### ###(014)=[passed] Basic instantiation & dissection >>> b = b'\x00\x07\x00\x00' >>> >>> p = EDNS0N3U() >>> assert raw(p) == b >>> >>> p = EDNS0N3U(b) >>> assert p.optcode == 7 and p.optlen == 0 and p.alg_code == [] >>> >>> b = raw(EDNS0N3U(alg_code=['SHA-1'])) >>> >>> p = EDNS0N3U(b) >>> repr(p) '\x1b[0m<\x1b[0m\x1b[31m\x1b[1mEDNS0N3U\x1b[0m \x1b[34moptcode\x1b[0m\x1b[0m=\x1b[0m\x1b[35mN3U\x1b[0m \x1b[34moptlen\x1b[0m\x1b[0m=\x1b[0m\x1b[35m1\x1b[0m \x1b[34malg_code\x1b[0m\x1b[0m=\x1b[0m\x1b[35m[SHA-1]\x1b[0m \x1b[0m|\x1b[0m\x1b[0m>\x1b[0m' >>> assert p.optcode == 7 and p.optlen == 1 and p.alg_code == [1] ###### ## EDNS0 - Client Subnet ###### ###(015)=[passed] Basic instantiation & dissection >>> raw_d = b'\x00\x00)\x10\x00\x00\x00\x00\x00\x00\n\x00\x08\x00\x06\x00\x01\x10\x00\xc0\xa8' >>> >>> d = DNSRROPT(z=0, rdata=[EDNS0ClientSubnet()]) >>> assert raw(d) == raw_d >>> >>> d = DNSRROPT(raw_d) >>> assert EDNS0ClientSubnet in d.rdata[0] and d.rdata[0].family == 1 and d.rdata[0].address == "192.168.0.0" >>> >>> raw_d = b'\x00\x00)\x10\x00\x00\x00\x00\x00\x00\x0c\x00\x08\x00\x08\x00\x02 \x00 \x01\r\xb8' >>> d = DNSRROPT(z=0, rdata=[EDNS0ClientSubnet(address="2001:db8::")]) >>> assert raw(d) == raw_d >>> >>> d = DNSRROPT(raw_d) >>> assert EDNS0ClientSubnet in d.rdata[0] and d.rdata[0].family == 2 and d.rdata[0].address == "2001:db8::" ###### ## EDNS0 - Cookie ###### ###(016)=[passed] Basic instantiation & dissection >>> b = b'\x00\n\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> p = EDNS0COOKIE() >>> assert raw(p) == b >>> >>> p = EDNS0COOKIE(b) >>> assert p.optcode == 10 >>> assert p.optlen == 8 >>> assert p.client_cookie == b'\x00' * 8 >>> assert p.server_cookie == b'' >>> >>> b = b'\x00\n\x00\x18\x01\x01\x01\x01\x01\x01\x01\x01\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02' >>> >>> p = EDNS0COOKIE(client_cookie=b'\x01' * 8, server_cookie=b'\x02' * 16) >>> assert raw(p) == b >>> >>> p = EDNS0COOKIE(b) >>> assert p.optcode == 10 >>> assert p.optlen == 24 >>> assert p.client_cookie == b'\x01' * 8 >>> assert p.server_cookie == b'\x02' * 16 ###### ## EDNS0 - Extended DNS Error ###### ###(017)=[passed] Basic instantiation & dissection >>> b = b'\x00\x0f\x00\x02\x00\x00' >>> >>> p = EDNS0ExtendedDNSError() >>> assert raw(p) == b >>> >>> p = EDNS0ExtendedDNSError(b) >>> assert p.optcode == 15 and p.optlen == 2 and p.info_code == 0 and p.extra_text == b'' >>> >>> b = raw(EDNS0ExtendedDNSError(info_code="DNSSEC Bogus", extra_text="proof of non-existence of example.com. NSEC")) >>> >>> p = EDNS0ExtendedDNSError(b) >>> assert p.info_code == 6 and p.optlen == 45 and p.extra_text == b'proof of non-existence of example.com. NSEC' >>> >>> rropt = DNSRROPT(b'\x00\x00)\x04\xd0\x00\x00\x00\x00\x001\x00\x0f\x00-\x00\x06proof of non-existence of example.com. NSEC') >>> assert len(rropt.rdata) == 1 >>> p = rropt.rdata[0] >>> assert p.info_code == 6 and p.optlen == 45 and p.extra_text == b'proof of non-existence of example.com. NSEC' >>> >>> p = DNSRROPT(raw(DNSRROPT(rdata=[EDNS0ExtendedDNSError(), EDNS0ClientSubnet(), EDNS0TLV()]))) >>> assert len(p.rdata) == 3 >>> assert all(Raw not in opt for opt in p.rdata) >>> >>> for opt_class in EDNS0OPT_DISPATCHER.values(): ... p = DNSRROPT(raw(DNSRROPT(rdata=[EDNS0TLV(), opt_class(), opt_class()]))) ... assert len(p.rdata) == 3 ... assert all(Raw not in opt for opt in p.rdata) ... Dot11 regression tests for Scapy ━ Run at 01:42:12 from [test/scapy/layers/dot11.uts] by UTscapy in 0.32883715629577637 └ Passed=59 └ Failed=0 ###### ## 802.11 ###### ###(000)=[passed] 802.11 - misc >>> PrismHeader().answers(PrismHeader()) == True True >>> >>> dpl = Dot11PacketList([Dot11()/LLC()/SNAP()/IP()/UDP()]) >>> len(dpl) == 1 True >>> >>> dpl_ether = dpl.toEthernet() No WEP to remove >>> len(dpl_ether) == 1 and Ether in dpl_ether[0] True ###(001)=[passed] Dot11 - build >>> s = raw(Dot11()) >>> s == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(002)=[passed] Dot11 - dissection >>> p = Dot11(s) >>> Dot11 in p and p.addr3 == "00:00:00:00:00:00" True >>> assert p.mysummary() == '802.11 Management Association Request 00:00:00:00:00:00 (TA=SA) > 00:00:00:00:00:00 (RA=DA)' >>> assert "DA" in p.address_meaning(1) >>> assert "SA" in p.address_meaning(2) >>> assert "BSSID" in p.address_meaning(3) ###(003)=[passed] Dot11QoS - build >>> s = raw(Dot11()/Dot11QoS(Ack_Policy=1)) >>> assert s == b'\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00' >>> >>> s = raw(Dot11(type=2, subtype=8)/Dot11QoS(TID=4)) >>> assert s == b'\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' ###(004)=[passed] Dot11 - binary in SSID >>> pkt = Dot11() / Dot11Beacon() / Dot11Elt(ID=0, info=b"".join(chb(i) for i in range(32))) >>> pkt.show() ###[ 802.11 ]### subtype = Beacon type = Management proto = 0 FCfield = ID = 0 addr1 = 00:00:00:00:00:00 (RA=DA) addr2 = 00:00:00:00:00:00 (TA=SA) addr3 = 00:00:00:00:00:00 (BSSID/STA) SC = 0 ###[ 802.11 Beacon ]### timestamp = 0 beacon_interval= 100 cap = ###[ 802.11 Information Element ]### ID = SSID len = None info = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f' >>> pkt.summary() "802.11 Management Beacon 00:00:00:00:00:00 (TA=SA) > 00:00:00:00:00:00 (RA=DA) / Dot11Beacon / SSID='\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'" >>> assert pkt[Dot11Elt::{"ID": 0}].summary() == "SSID='%s'" % "".join(chr(d) for d in range(32)) >>> >>> pkt = Dot11(raw(pkt)) >>> pkt.show() ###[ 802.11 ]### subtype = Beacon type = Management proto = 0 FCfield = ID = 0 addr1 = 00:00:00:00:00:00 (RA=DA) addr2 = 00:00:00:00:00:00 (TA=SA) addr3 = 00:00:00:00:00:00 (BSSID/STA) SC = 0 ###[ 802.11 Beacon ]### timestamp = 0 beacon_interval= 100 cap = ###[ 802.11 Information Element ]### ID = SSID len = 32 info = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f' >>> pkt.summary() "802.11 Management Beacon 00:00:00:00:00:00 (TA=SA) > 00:00:00:00:00:00 (RA=DA) / Dot11Beacon / SSID='\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f'" >>> assert pkt[Dot11Elt::{"ID": 0}].summary() == "SSID='%s'" % "".join(chr(d) for d in range(32)) ###(005)=[passed] Dot11QoS - dissection >>> p = Dot11(s) >>> assert Dot11QoS in p >>> assert p.TID == 4 >>> assert "DA" in p.address_meaning(1) >>> assert "SA" in p.address_meaning(2) >>> assert "BSSID" in p.address_meaning(3) ###(006)=[passed] Dot11 - answers >>> query = Dot11(type=0, subtype=0) >>> Dot11(type=0, subtype=1).answers(query) == True True ###(007)=[passed] Dot11 - misc >>> assert Dot11Elt(info="scapy").summary() == "SSID='scapy'" >>> assert Dot11Elt(ID=1).mysummary() == "" >>> assert Dot11(b'\x84\x00\x00\x00\x00\x11\x22\x33\x44\x55\x00\x11\x22\x33\x44\x55').addr2 == '00:11:22:33:44:55' ###(008)=[passed] Dot11 - type 1 subtype 4, 5, 6 >>> assert raw(Dot11(type=1, subtype=4, addr2="ff:ff:ff:ff:ff:ff")) == b'D\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff' >>> assert raw(Dot11(type=1, subtype=5, addr2="ff:ff:ff:ff:ff:ff")) == b'T\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff' >>> assert raw(Dot11(type=1, subtype=6, addr2="ff:ff:ff:ff:ff:ff", cfe=3)) == b'd0\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff' >>> assert raw(Dot11(type=1, subtype=6, addr2="ff:ff:ff:ff:ff:ff", cfe=6, addr3="aa:aa:aa:aa:aa:aa")) == b'd`\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa' >>> >>> assert Dot11(type=1, subtype=5).address_meaning(1) == 'RA' >>> assert Dot11(type=1, subtype=6, cfe=5).address_meaning(2) == 'TA' >>> assert Dot11(type=1, subtype=6, cfe=6).address_meaning(2) == 'NAV-SA' >>> assert Dot11(type=1, subtype=6, cfe=6).address_meaning(3) == 'NAV-DA' ###(009)=[passed] Multiple Dot11Elt layers >>> pkt = Dot11() / Dot11Beacon() / Dot11Elt(ID="Supported Rates") / Dot11Elt(ID="SSID", info="Scapy") >>> assert pkt[Dot11Elt::{"ID": 0}].info == b"Scapy" >>> assert pkt.getlayer(Dot11Elt, ID=0).info == b"Scapy" ###(010)=[passed] Dot11WEP - build >>> conf.wepkey = "" >>> assert raw(PPI()/Dot11(FCfield=0x40)/Dot11WEP()) == b'\x00\x00\x08\x00i\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' No WEP key set (conf.wepkey).. strange results expected.. >>> conf.wepkey = "test123" >>> assert raw(PPI()/Dot11(type=2, subtype=8, FCfield=0x40)/Dot11QoS()/Dot11WEP()) == b'\x00\x00\x08\x00i\x00\x00\x00\x88@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008(^a' ###(011)=[passed] Dot11WEP - dissect >>> conf.wepkey = "test123" >>> a = PPI(b'\x00\x00\x08\x00i\x00\x00\x00\x88@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008(^a') >>> assert a[Dot11QoS][Dot11WEP].icv == 942169697 ###(012)=[passed] Dot11TKIP - dissection >>> pkt = RadioTap(b'\x00\x00\x0f\x00*\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x08B\x00\x00\xff\xff\xff\xff\xff\xff\xfe\xec\xda\x1d\xa3M\x00\x04t\x14\x02BP+\x01!\x00\xa0\x01!\x00\xa0\x01!\x00\xa0\x00\x00\x00\x00\xb0\xb6sN\xbdl9S\xc3x\x9d\xa6TEp\xcd(\xebht{\xff9\x9a[\x0f~\x00\xf8&m$\x1e\xd2[dXn\x16\x8526G\x8c\x88\xc3B\xc9\xda^\xc5w\xa5 \x9a\xa0 \x08') >>> assert Dot11TKIP in pkt >>> >>> assert pkt[Dot11TKIP].TSC1 == 1 >>> assert pkt[Dot11TKIP].WEPSeed == 33 >>> assert pkt[Dot11TKIP].TSC0 == 0 >>> assert pkt[Dot11TKIP].key_id == 2 >>> assert pkt[Dot11TKIP].ext_iv == 1 >>> assert pkt[Dot11TKIP].res == 0 >>> assert pkt[Dot11TKIP].TSC2 == 1 >>> assert pkt[Dot11TKIP].TSC3 == 33 >>> assert pkt[Dot11TKIP].TSC4 == 0 >>> assert pkt[Dot11TKIP].TSC5 == 160 >>> >>> assert "DA" in pkt[Dot11].address_meaning(1) >>> assert "TA=BSSID" in pkt[Dot11].address_meaning(2) >>> assert "SA" in pkt[Dot11].address_meaning(3) ###(013)=[passed] Dot11CCMP - dissection >>> pkt = RadioTap(b'\x00\x00\x0f\x00*\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x08b\x00\x00\x01\x00^\x7f\xff\xfa\x0e\xec\xda\x1d\xa3M\x00\x0eX7\xbe\xbe\x00\x8aD#\x00\xa0D#\x00\xa0\x00\x00\x00\x00c\xb7\rv/s\x88N;>\x07\x0e\xe5\xd9\xf5\xfa\xcdD\xc2he\xfc\xc5^m\xae\xf2\xfe\xf9\xb06\xce\rt\xbe\x9d(\xb5\x98\x848NU\x0f\x93\x0f]m\xa2\x96\x80{\x95\x00\xb5\x98Y!\xa3^\xfc\xda\xca.R\xf3\xd3\xf8^\xeda\x88\x82p\xc6\xb8L\x0b\x815-\x85(\xb1F\xd5K\x166dJ\xc7\x04B\xdb\xec\x8d\xb7:{\x0f\'g<\x06\xd07>\xde\xad\x08\xcb\xffr\xfa\xf4}o\xe9\xa9b\xa5)\x87\x90\xa5{\xe1\xea\x0f\x0fGf`x1\xbd\xc1\xe8\xa0\xb6(\x05gq\xf3\x99\x9e\x93\xde\'\x8e\nQ\xf7\xad\xf7\x89"\xee\xcf\xe8$\x8a\x9c\xb4\xe6\x03\xab\x9ec\xd0\xd5\x08\xca\xd2\xbb\xae\xcc\x9c$R\xbc\xcdFO?\xc3Ah\x9ch\xd4\x9b)m\xea\xbab+\'\x06I2\xb5!\xdb\x03\xbe\xb8\xb2\x86\x0f\x80\n\xbc\x85\x02\xb4T\x00\x00\xc7|\xac\xc0B\xb2\x89\xbb\xc5\xc0\x93\x858\xe3Q\xf9\t\xff4\xdb\x9a>\xe5O-e\x16\x81w!9m\xb9dZ\xaa\xaa0\x9cW\xaa\xa3\xf1\xdd\xecW\xdd\xc41D\xe6\xba\xf3SQ\x81S\xf6\xbd\xe3\xc0e\xba\xa0*\x15%\x9cz0\xa8\xa6l\x8e\x0c(\xd3\xe4\xa2\xf9\xc2:Yae#T\x8d\xef\x01\xfad\x05/\xdb\xf2!D\xde~\x0f\x99\xf6U\xf5\xbf\xd0\xaf\xbe0\xf7\xf03\xa8s`\x8d>4\x98\xb5Y\x06dXFz\x88\x82\'B\x84\xe6\xca\x05\x02\xd5G\xb6\x11\xed <\xb1\xd4\xc9\xa9\xaa\xae\xc9\xb3g\xbc\xfd+\xe7\x1aG\x92\x17\xdb\xce\xf7\x843\xce4\xc4w\x8f\x8a\x83\xf0\'\xfe\x87\x14\x95\xd3\x0bM\xbaL$\xc8\x8d\' 8\x87c 3yt\xc5\xeeN\xc9\xe1\x95\x1d\xe9\xddh\x87E\x07\xe5\x86\xc7\x82\x8a\x88\x05\xa4\x06\xb1\x0c\xddV\xd0\xf0d\xc8\xcet`\xc5C\xcb\x8f\x06]A\x92\x1a\xae5wc\x8dN\xa2\xf0}aJ\x9c\x8e\xd1\xb2[*\xffK\x0f\xf8u\xd5\x84#\xc3"\xffX\x9f\xffC\x0fb\x02n\x1b\xbaAr\x93\xe1\xb7\x1f\x8e\x1c\xfev]w\xaa\xcch\x8c{lm\xb9\x9aE\x08\x1d\xc28u\x82\xa8\xbe\xf2\xb3\x11\xdc\x90 \x83\xa7\x9c*:\x01R\xcf\xd6\xc6~\x989\x9a5\xc97\xfa\x10\xe4!uEP\x968\x00*\xd0\xefE\xf8{\x1d(\xcb\xe3IR\\r\xee\x9fU\x14\ty\xe3\xdc\x96@\xf4\x8d\x17\xab\xcc\x98I\x8e\xe16\x9e\xa5+\xe0\xa8{S\x051##\x90:A') >>> assert Dot11CCMP in pkt >>> >>> assert pkt[Dot11CCMP].PN0 == 68 >>> assert pkt[Dot11CCMP].PN1 == 35 >>> assert pkt[Dot11CCMP].res0 == 0 >>> assert pkt[Dot11CCMP].key_id == 2 >>> assert pkt[Dot11CCMP].ext_iv == 1 >>> assert pkt[Dot11CCMP].res1 == 0 >>> assert pkt[Dot11CCMP].PN2 == 68 >>> assert pkt[Dot11CCMP].PN3 == 35 >>> assert pkt[Dot11CCMP].PN4 == 0 >>> assert pkt[Dot11CCMP].PN5 == 160 ###(014)=[passed] Dot11 - answers >>> a = Dot11()/Dot11Auth(seqnum=1) >>> b = Dot11()/Dot11Auth(seqnum=2) >>> assert b.answers(a) >>> assert not a.answers(b) >>> >>> assert not (Dot11()/Dot11Ack()).answers(Dot11()) >>> assert (Dot11()/LLC(dsap=2, ctrl=4)).answers(Dot11()/LLC(dsap=1, ctrl=5)) >>> >>> a = Dot11()/Dot11Auth(algo=3, seqnum=1) # non-AP STA --> AP STA COMMIT >>> b = Dot11()/Dot11Auth(algo=3, seqnum=1) # AP STA --> non-AP STA COMMIT >>> c = Dot11()/Dot11Auth(algo=3, seqnum=2) # non-AP STA --> AP STA CONFIRM >>> d = Dot11()/Dot11Auth(algo=3, seqnum=2) # AP STA --> non-AP STA CONFIRM >>> e = Dot11()/Dot11Auth(algo=0, seqnum=1) >>> >>> assert b.answers(a) >>> assert c.answers(b) >>> assert d.answers(c) >>> >>> assert not a.answers(e) >>> assert not c.answers(e) >>> assert not e.answers(a) >>> assert not e.answers(c) ###(015)=[passed] Dot11Beacon network_stats() >>> data = b'\x00\x00\x12\x00.H\x00\x00\x00\x02\x8f\t\xa0\x00\x01\x01\x00\x00\x80\x00\x00\x00\xff\xff\xff\xff\xff\xffDH\xc1\xb7\xf0uDH\xc1\xb7\xf0u\x10\xb7\x00\x00\x00\x00\x00\x00\x00\x00\x90\x01\x11\x00\x00\x06SSID76\x01\n\x82\x84\x0c\x12\x18$0H`l\x03\x01\x080\x18\x01\x00\x00\x0f\xac\x04\x02\x00\x00\x0f\xac\x04\x00\x0f\xac\x02\x01\x00\x00\x0f\xac\x02\x0c\x00\x07\tUSI\x01\x18\x00\n\x05\xe7' >>> pkt = RadioTap(data) >>> nstats = pkt[Dot11Beacon].network_stats() >>> nstats {'ssid': 'SSID76', 'rates': [1.0, 2.0, 6.0, 9.0, 12.0, 18.0, 24.0, 36.0, 48.0, 54.0], 'channel': 8, 'country': 'US', 'country_desc_type': 'Indoor', 'crypto': {'WPA2/PSK'}} >>> assert nstats == { ... 'channel': 8, ... 'crypto': {'WPA2/PSK'}, ... 'rates': [1.0, 2.0, 6.0, 9.0, 12.0, 18.0, 24.0, 36.0, 48.0, 54.0], ... 'ssid': 'SSID76', ... 'country': 'US', ... 'country_desc_type': 'Indoor' ... } >>> >>> data = b'\x00\x00\x16\x00\x0f\x00\x00\x00|P\xb1\x82\xae\x86\x05\x00\x00\x02l\t\xa0\x00\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x02\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00:Q\xb1\x82\xae\x86\x05\x00d\x00\x11\x04\x00\x0cWPA3-Network\x01\x08\x82\x84\x8b\x96\x0c\x12\x18$\x03\x01\x01\x05\x04\x00\x02\x00\x00*\x01\x042\x040H`l0\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x08\xc0\x00;\x02Q\x00\x7f\x08\x04\x00\x00\x00\x00\x00\x00@' >>> pkt = RadioTap(data) >>> nstats = pkt[Dot11Beacon].network_stats() >>> nstats {'ssid': 'WPA3-Network', 'rates': [1.0, 2.0, 5.5, 11.0, 6.0, 9.0, 12.0, 18.0, 24.0, 36.0, 48.0, 54.0], 'channel': 1, 'crypto': {'WPA3/SAE'}} >>> assert nstats == { ... 'ssid': 'WPA3-Network', ... 'rates': [1.0, 2.0, 5.5, 11.0, 6.0, 9.0, 12.0, 18.0, 24.0, 36.0, 48.0, 54.0], ... 'channel': 1, ... 'crypto': {'WPA3/SAE'} ... } ###(016)=[passed] Dot11EltCountry dissection Country element: padding check Country element: Secondary padding check >>> data = b"\x00\x00&\x00/@\x00\xa0 \x08\x00\xa0 \x08\x00\x00R\xa9[#\x00\x00\x00\x00\x10\x18\x85\t\xc0\x00\xc8\x00\x00\x00\xc3\x00\xc7\x01P\x080\x00V\x9cm\xf4\xb1\xe9\xa0\xcf[\xfb%0\xa0\xcf[\xfb%0\xa0R&\x1a@\xc2\x06\x03\x00\x00f\x00!\x14\x00\x1eDisney Convention Center Guest\x01\x07\x12\x98$0H`l\x03\x01\x06\x07\x06US \x01\x0b\x1e\x0b\x05\n\x00\x8a\x8d[ \x01\x03*\x01\x00-\x1a,\x18\x1b\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\x03*L\x01=\x16\x06\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F\x05s\xc0\x00\x00\x00\x7f\x06\x00\x10\x00\x04\x01@\x85\x1e\x10\x00\x8f\x00\x0f\x00\xff\x03Y\x001617-AP33-SorcA\x00\n\x00\x00:\x96\x06\x00@\x96\x00\x0b\x00\xdd\x18\x00P\xf2\x02\x01\x01\x80\x00\x03\xa4\x00\x00'\xa4\x00\x00BC^\x00b2/\x00\xdd\x06\x00@\x96\x01\x01\x04\xdd\x05\x00@\x96\x03\x05\xdd\x05\x00@\x96\x0bI\xdd\x05\x00@\x96\x14\x00dZ\x97\xbf" >>> pkt = RadioTap(data) >>> assert pkt[Dot11EltCountry].info == b'US \x01\x0b\x1e' >>> assert len(pkt[Dot11EltCountry].descriptors) == 1 >>> assert pkt[Dot11EltCountry].descriptors[0].mtp == 30 >>> >>> data = hex_bytes('00001a002f48000017cd9f3100000000000c3c144001e000000080000000ffffffffffff461b860bef06461b860bef06909403e0f75b0000000064001105000c4c697665626f782d3232353001088c1218243048606c0301240504020300000728504c202401172801172c01173001173401173801173c011740011764011e68011e6c011e70011e000b05000002ffff46050000000000200100c30502171717002a01002d1aef0117fffffffffeffffffff1f000001000000000018e6e719003d1624050000000000000000000000000000000000000000dd180050f2020101840003a4000027a4000042435e0062322f0030140100000fac040100000fac040100000fac020000bf0cb279c33faaff0000aaff0000c005012a00fcffdd1e002686010300dd00000025040592000601d15b5816830000000000000000dd06002686170000dd0e00268618010101024c1b860bef067f080100080200000040dd3b0050f204104a0001101044000102105700010110470010344331423836f042f546303634433142103c000103103c0001031049000600372a000120') >>> pkt = RadioTap(data) >>> assert pkt[Dot11EltCountry].pad == 0 >>> assert pkt.getlayer(Dot11Elt, ID=11) >>> >>> erp_payload = b'\x2a\x01\x62' >>> country_payload = b'\x07\x06\x55\x53\x20\x01\x0b\x1e' >>> >>> bare_country = Dot11EltCountry(country_payload) >>> country_nested = Dot11EltCountry(country_payload + erp_payload) >>> >>> assert not bare_country.payload >>> assert country_nested.payload >>> assert country_nested.payload.ID == 42 ###(017)=[passed] RSNCipherSuite >>> assert bytes(RSNCipherSuite()) == b'\x00\x0f\xac\x04' >>> rsn = RSNCipherSuite(b'\x00\x0f\xac\x04') >>> assert rsn.oui == 0x0fac >>> assert rsn.cipher == 0x04 ###(018)=[passed] AKMSuite >>> assert bytes(AKMSuite()) == b'\x00\x0f\xac\x01' >>> akm = AKMSuite(b'\x00\x0f\xac\x01') >>> assert akm.oui == 0x0fac >>> assert akm.suite == 0x01 ###(019)=[passed] PMKIDListPacket >>> assert bytes(PMKIDListPacket()) == b'\x00\x00' >>> pmkids = PMKIDListPacket(b'\x01\x00LD\xfe\xf2l\xdcV\xce\x0b7\xab\xc62\x02O\x11') >>> assert pmkids.nb_pmkids == 1 >>> assert len(pmkids.pmkid_list) == 1 >>> assert pmkids.pmkid_list[0] == b'LD\xfe\xf2l\xdcV\xce\x0b7\xab\xc62\x02O\x11' ###(020)=[passed] Dot11EltRSN >>> assert bytes( ... Dot11EltRSN(group_cipher_suite=RSNCipherSuite(), ... pairwise_cipher_suites=[RSNCipherSuite()], ... akm_suites=[AKMSuite()], ... pmkids=PMKIDListPacket(), ... group_management_cipher_suite=RSNCipherSuite(cipher=6)) ... ) == b'0\x1a\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\xc0\x00\x00\x00\x00\x0f\xac\x06' >>> >>> rsn_ie = Dot11EltRSN(b'0\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x01\x00') >>> assert rsn_ie.group_cipher_suite.cipher == 0x04 >>> assert rsn_ie.nb_pairwise_cipher_suites == 0x01 >>> assert rsn_ie.pairwise_cipher_suites[0].cipher == 0x04 >>> assert rsn_ie.nb_akm_suites == 0x01 >>> assert rsn_ie.akm_suites[0].suite == 0x01 >>> assert rsn_ie.pre_auth >>> assert Dot11Elt in rsn_ie >>> >>> pkt = RadioTap(b"\x00\x000\x00/@\x00\xa0 \x08\x00\xa0 \x08\x00\xa0 \x08\x00\x00\x00\x00\x00\x00\x0bpin;%\xedN\x10\x0cl\t\xc0\x00\xce\x00\x00\x00\xb2\x00\xbd\x01\xce\x02\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\xec\x17/\x82\x1e)\xec\x17/\x82\x1e)\x10p\x81a\xa1\x08\x00\x00\x00\x00d\x001\x04\x00\rROUTE-821E295\x01\x01\x8c\x03\x01\x01\x05\x04\x00\x02\x00\x00\x07$IL \x01\x01\x14\x02\x01\x14\x03\x01\x14\x04\x01\x14\x05\x01\x14\x06\x01\x14\x07\x01\x14\x08\x01\x14\t\x01\x14\n\x01\x14\x0b\x01\x14;\x12QQRSTstuvwxyz{}~\x7f\x80*\x01\x000\x1a\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x02\x8c\x00\x00\x00\x00\x0f\xac\x06-\x1a\x8d\x01\x1f\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x16\x01\x00\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x18\x00P\xf2\x02\x01\x01\x81\x00\x03\xa4\x00\x00'\xa4\x00\x00BT^\x00a2/\x00\x7f\x01\x04\xdd\x07\x00\xa0\xc6\x02\x02\x03\x00\xdd\x17\xec\x17/RRRRRRRRRRRRRRRRRRRRR\x9e[\xf2") >>> assert Dot11EltRSN in pkt >>> pkt[Dot11Beacon].network_stats() {'ssid': 'ROUTE-821E295', 'rates': [6.0], 'channel': 1, 'country': 'IL', 'country_desc_type': None, 'crypto': {'WPA2/PSK'}} >>> assert pkt[Dot11Beacon].network_stats() == { ... 'ssid': 'ROUTE-821E295', ... 'rates': [6.0], ... 'channel': 1, ... 'country': 'IL', ... 'country_desc_type': None, ... 'crypto': {'WPA2/PSK'} ... } >>> assert [x.ID for x in pkt[Dot11Elt].iterpayloads()] == [0, 1, 3, 5, 7, 59, 42, 48, 45, 61, 221, 127, 221, 221] >>> assert pkt.pmkids.nb_pmkids == 0 >>> assert pkt.group_management_cipher_suite.oui == 0xfac >>> assert pkt.group_management_cipher_suite.cipher == 0x6 ###(021)=[passed] Dot11EltMicrosoftWPA >>> assert bytes(Dot11EltMicrosoftWPA()) == b'\xdd\x16\x00P\xf2\x01\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01' >>> ms_wpa_ie = Dot11EltMicrosoftWPA(b'\xdd\x1a\x00P\xf2\x01\x01\x00\x00P\xf2\x02\x02\x00\x00P\xf2\x04\x00P\xf2\x02\x01\x00\x00P\xf2\x01') >>> assert ms_wpa_ie[Dot11EltMicrosoftWPA].type == 0x01 >>> assert ms_wpa_ie[Dot11EltMicrosoftWPA].version == 0x01 >>> assert ms_wpa_ie[Dot11EltMicrosoftWPA].group_cipher_suite.cipher == 0x02 >>> assert ms_wpa_ie[Dot11EltMicrosoftWPA].nb_pairwise_cipher_suites == 0x02 >>> assert ms_wpa_ie[Dot11EltMicrosoftWPA].pairwise_cipher_suites[0].cipher == 0x04 >>> assert ms_wpa_ie[Dot11EltMicrosoftWPA].pairwise_cipher_suites[1].cipher == 0x02 >>> assert ms_wpa_ie[Dot11EltMicrosoftWPA].nb_akm_suites == 0x01 >>> assert ms_wpa_ie[Dot11EltMicrosoftWPA].akm_suites[0].suite == 0x01 >>> assert Dot11Elt in ms_wpa_ie ###(022)=[passed] Dot11EltVendorSpecific >>> assert bytes(Dot11EltVendorSpecific()) == b'\xdd\x03\x00\x00\x00' >>> vendor_specific_ie = Dot11EltVendorSpecific(b'\xdd\t\x00\x03\x7f\x01\x01\x00\x00\xff\x7f') >>> assert vendor_specific_ie.oui == 0x00037f >>> assert Dot11Elt in vendor_specific_ie ###(023)=[passed] Beacon with RSN IE >>> f = Dot11(b"\x80\x00\x00\x00\xff\xff\xff\xff\xff\xffLN5V\xee\x03LN5V\xee\x03\xf0\x8f\x80\x01\xdc7\x00\x00\x00\x00\x90\x011\x04\x00\x0cciscosb-wpa2\x01\x08\x82\x84\x8b\x96\x0c\x12\x18$\x03\x01\x06\x05\x04\x00\x01\x00\x00*\x01\x000\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x01\x002\x040H`l\xdd\x18\x00P\xf2\x02\x01\x01\x84\x00\x03\xa4\x00\x00'\xa4\x00\x00BC^\x00b2/\x00\xdd\x1e\x00\x90L3L\x10\x1b\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-\x1aL\x10\x1b\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x1a\x00\x90L4\x06\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x16\x06\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00J\x0e\x14\x00\n\x00,\x01\xc8\x00\x14\x00\x05\x00\x19\x00\x7f\x01\x01\xdd\t\x00\x03\x7f\x01\x01\x00\x00\xff\x7f\xdd\n\x00\x03\x7f\x04\x01\x00\x06\x00@\x00") >>> assert Dot11EltRSN in f >>> assert f[Dot11EltRSN].len == 20 >>> assert f[Dot11EltRSN].group_cipher_suite[0].cipher == 0x04 >>> assert f[Dot11EltRSN].pairwise_cipher_suites[0].cipher == 0x04 >>> assert f[Dot11EltRSN].akm_suites[0].suite == 0x01 ###(024)=[passed] Other Beacon with RSN IE >>> f = Dot11(b'\x00\x00<\x00h}\xb4_\x1a\x0eJe}\xf2@\xb2h}\xb4_\x1a\x0e\xb0\xe8\x11\x11\x14\x00\x00\x08wpa3-sae\x01\x07\x12\x98$\xb0H`l!\x02\xf9\x15$\n$\x044\x04d\x0b\x95\x04\xa5\x010&\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\t\xcc\x00\x01\x00\xed!\xd6\xf6\xc2\x12C\xce\xbd\x94\xb6\xc3\xb1\xea%^F\x051\x08\x01\x00\x006\x03\xac4\x00-\x1ao\x00\x1b\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x08\x00\x00\x08\x00\x00\x00\x00@\xbf\x0c2p\x81\x0f\xfa\xff\x00\x00\xfa\xff\x00\x00\xc7\x01\x11\xff\x1c#\x01\x08\x08\x00\x00\x80D0\x02\x00\x1d\x00\x9f\x08\x00\x0c\x00\xfa\xff\xfa\xff9\x1c\xc7q\x1c\x07\xdd\x0b\x00\x17\xf2\n\x00\x01\x04\x00\x00\x00\x00\xdd\x05\x00\x90L\x04\x07\xdd\n\x00\x10\x18\x02\x00\x00\x10\x00\x00\x02\xdd\x07\x00P\xf2\x02\x00\x01\x00\x90\xe7\xf5\x12') >>> assert Dot11EltRSN in f >>> assert f.group_management_cipher_suite is None >>> assert len(list(f.iterpayloads())) == 19 >>> assert Dot11EltHTCapabilities in f >>> assert f.mfp_capable and f.mfp_required >>> assert f.pmkids.nb_pmkids == 1 >>> assert f.pmkids.pmkid_list == [b'\xed!\xd6\xf6\xc2\x12C\xce\xbd\x94\xb6\xc3\xb1\xea%^'] ###(025)=[passed] Beacon with Microsoft WPA IE >>> f = Dot11(b"\x80\x00\x00\x00\xff\xff\xff\xff\xff\xffNN5V\xee\x03NN5V\xee\x030\x8f\x80\x01\xdc7\x00\x00\x00\x00\x90\x011\x04\x00\x0bciscosb-wpa\x01\x08\x82\x84\x8b\x96\x0c\x12\x18$\x03\x01\x06\x05\x04\x00\x01\x00\x00*\x01\x00\xdd\x16\x00P\xf2\x01\x01\x00\x00P\xf2\x04\x01\x00\x00P\xf2\x04\x01\x00\x00P\xf2\x012\x040H`l\xdd\x18\x00P\xf2\x02\x01\x01\x85\x00\x03\xa4\x00\x00'\xa4\x00\x00BC^\x00b2/\x00\xdd\x1e\x00\x90L3L\x10\x1b\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-\x1aL\x10\x1b\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdd\x1a\x00\x90L4\x06\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x16\x06\x08\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00J\x0e\x14\x00\n\x00,\x01\xc8\x00\x14\x00\x05\x00\x19\x00\x7f\x01\x01\xdd\t\x00\x03\x7f\x01\x01\x00\x00\xff\x7f\xdd\n\x00\x03\x7f\x04\x01\x00\x06\x00@\x00") >>> assert Dot11EltMicrosoftWPA in f >>> assert f[Dot11EltMicrosoftWPA].type == 0x01 >>> assert f[Dot11EltMicrosoftWPA].version == 0x01 >>> assert f[Dot11EltMicrosoftWPA].group_cipher_suite.cipher == 0x04 >>> assert f[Dot11EltMicrosoftWPA].nb_pairwise_cipher_suites == 0x01 >>> assert f[Dot11EltMicrosoftWPA].pairwise_cipher_suites[0].cipher == 0x04 >>> assert f[Dot11EltMicrosoftWPA].nb_akm_suites == 0x01 >>> assert f[Dot11EltMicrosoftWPA].akm_suites[0].suite == 0x01 ###(026)=[passed] HT Capabilities >>> f = RadioTap(b"\x00\x00&\x00/@\x00\xa0 \x08\x00\xa0 \x08\x00\x00\x9dt\xc3\xf1\x18\x00\x00\x00\x10\x02l\t\xa0\x00\xd9\x00\x00\x00\xd3\x00\xd7\x01@\x00\x00\x00\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xff\xff\xff\xff\xff\xffP'\x00\x00\x01\x04\x02\x04\x0b\x162\x08\x0c\x12\x18$0H`l\x03\x01\x01-\x1a-@\x17\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x08\x00\x00\x08\x04\x00\x00\x00@Y\xb7T\x13") >>> assert Dot11EltHTCapabilities in f >>> assert f.L_SIG_TXOP_Protection == 0 >>> assert f.Forty_Mhz_Intolerant == 1 >>> assert f.PSMP == 0 >>> assert f.DSSS_CCK == 0 >>> assert f.Max_A_MSDU == 0 >>> assert f.Delayed_BlockAck == 0 >>> assert f.Rx_STBC == 0 >>> assert f.Tx_STBC == 0 >>> assert f.Short_GI_40Mhz == 0 >>> assert f.Short_GI_20Mhz == 1 >>> assert f.Green_Field == 0 >>> assert f.SM_Power_Save == 3 >>> assert f.Supported_Channel_Width == 0 >>> assert f.LDPC_Coding_Capability == 1 >>> assert f.res1 == 0 >>> assert f.Min_MPDCU_Start_Spacing == 5 >>> assert f.Max_A_MPDU_Length_Exponent == 3 >>> assert f.TX_Unequal_Modulation == 0 >>> assert f.TX_Max_Spatial_Streams == 0 >>> assert f.TX_RX_MCS_Set_Not_Equal == 0 >>> assert f.TX_MCS_Set_Defined == 0 >>> assert f.RX_Highest_Supported_Data_Rate == 0 >>> assert f.RX_MSC_Bitmask == 255 >>> assert f.RD_Responder == 0 >>> assert f.HTC_HT_Support == 0 >>> assert f.MCS_Feedback == 0 >>> assert f.PCO_Transition_Time == 0 >>> assert f.PCO == 0 >>> assert f.Channel_Estimation_Capability == 0 >>> assert f.CSI_max_n_Rows_Beamformer_Supported == 0 >>> assert f.Compressed_Steering_n_Beamformer_Antennas_Supported == 0 >>> assert f.Noncompressed_Steering_n_Beamformer_Antennas_Supported == 0 >>> assert f.CSI_n_Beamformer_Antennas_Supported == 0 >>> assert f.Minimal_Grouping == 0 >>> assert f.Explicit_Compressed_Beamforming_Feedback == 0 >>> assert f.Explicit_Noncompressed_Beamforming_Feedback == 0 >>> assert f.Explicit_Transmit_Beamforming_CSI_Feedback == 0 >>> assert f.Explicit_Compressed_Steering == 0 >>> assert f.Explicit_Noncompressed_Steering == 0 >>> assert f.Explicit_CSI_Transmit_Beamforming == 0 >>> assert f.Calibration == 0 >>> assert f.Implicit_Trasmit_Beamforming == 0 >>> assert f.Transmit_NDP == 0 >>> assert f.Receive_NDP == 0 >>> assert f.Transmit_Staggered_Sounding == 0 >>> assert f.Receive_Staggered_Sounding == 0 >>> assert f.Implicit_Transmit_Beamforming_Receiving == 0 >>> assert f.ASEL == 0 ###(027)=[passed] HT Capabilities with fuzzed values >>> f = RadioTap(b'\x00\x00\t\x00\x02\x00\x00\x00\x10@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-\x1a\xecH\xbf\x85!\x02\xd0m\x91\xa8\xd9\xf0\xa9\xb8\x15\xae\x00\x00\x00,Y\x86\xb3H\xa7?Z\xd2\xa8\xc2') >>> assert Dot11EltHTCapabilities in f >>> assert f.L_SIG_TXOP_Protection == 0 >>> assert f.Forty_Mhz_Intolerant == 1 >>> assert f.PSMP == 0 >>> assert f.DSSS_CCK == 0 >>> assert f.Max_A_MSDU == 1 >>> assert f.Delayed_BlockAck == 0 >>> assert f.Rx_STBC == 0 >>> assert f.Tx_STBC == 1 >>> assert f.Short_GI_40Mhz == 1 >>> assert f.Short_GI_20Mhz == 1 >>> assert f.Green_Field == 0 >>> assert f.SM_Power_Save == 3 >>> assert f.Supported_Channel_Width == 0 >>> assert f.LDPC_Coding_Capability == 0 >>> assert f.res1 == 5 >>> assert f.Min_MPDCU_Start_Spacing == 7 >>> assert f.Max_A_MPDU_Length_Exponent == 3 >>> assert f.TX_Unequal_Modulation == 0 >>> assert f.TX_Max_Spatial_Streams == 3 >>> assert f.TX_RX_MCS_Set_Not_Equal == 1 >>> assert f.TX_MCS_Set_Defined == 0 >>> assert f.RX_Highest_Supported_Data_Rate == 440 >>> assert f.RX_MSC_Bitmask == 46944200869120244326789 >>> assert f.RD_Responder == 1 >>> assert f.HTC_HT_Support == 0 >>> assert f.MCS_Feedback == 1 >>> assert f.PCO_Transition_Time == 2 >>> assert f.PCO == 0 >>> assert f.Channel_Estimation_Capability == 0 >>> assert f.CSI_max_n_Rows_Beamformer_Supported == 3 >>> assert f.Compressed_Steering_n_Beamformer_Antennas_Supported == 2 >>> assert f.Noncompressed_Steering_n_Beamformer_Antennas_Supported == 2 >>> assert f.CSI_n_Beamformer_Antennas_Supported == 1 >>> assert f.Minimal_Grouping == 0 >>> assert f.Explicit_Compressed_Beamforming_Feedback == 1 >>> assert f.Explicit_Noncompressed_Beamforming_Feedback == 1 >>> assert f.Explicit_Transmit_Beamforming_CSI_Feedback == 2 >>> assert f.Explicit_Compressed_Steering == 0 >>> assert f.Explicit_Noncompressed_Steering == 1 >>> assert f.Explicit_CSI_Transmit_Beamforming == 1 >>> assert f.Calibration == 2 >>> assert f.Implicit_Trasmit_Beamforming == 0 >>> assert f.Transmit_NDP == 0 >>> assert f.Receive_NDP == 0 >>> assert f.Transmit_Staggered_Sounding == 1 >>> assert f.Receive_Staggered_Sounding == 1 >>> assert f.Implicit_Transmit_Beamforming_Receiving == 0 >>> assert f.ASEL.res >>> assert f.ASEL.Transmit_Sounding_PPDUs >>> assert f.ASEL.Receive_ASEL >>> assert f.ASEL.Antenna_Indices_Feedback >>> assert f.ASEL.Explicit_CSI_Feedback >>> assert f.ASEL.Explicit_CSI_Feedback_Based_Transmit_ASEL >>> assert not f.ASEL.Antenna_Selection >>> assert f.ASEL == 63 ###(028)=[passed] RadioTap - MCS weird padding >>> f = RadioTap(b'\x00\x00,\x00K\x08\x1c\x00"b\x96\x03\x00\x00\x00\x00\x10\x00l\t\x80\x04\xb0\x00\x80\x04\x01\x00l\t\x01\x00\x1f\x08\x0c\x00\x94\x05\x00\x00\x04\x00\x00\x00\x88\x020\x00.\xdf\xc4J\xb0\xdc\xa0c\x91sf\xech\x05\xca?\xf4h@Y\x00\x00\xaa\xaa\x03\x00\x00\x00\x08\x00E\x00\x05\xdc \xcf@\x00\x80\x06P\xf0\xc0\xa8\x01\n\xc0\xa8\x01\x02\xdb\x8f\x13\x89\xfbv\xa3\xde\xf6\xd8L\xe8P\x10\xff\xfft\xdd\x00\x0023456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901O\xdc\x01x') >>> assert f.knownMCS == 31 >>> assert f.Ness_LSB == 0 >>> assert f.STBC_streams == 0 >>> assert f.FEC_type == 0 >>> assert f.HT_format == 1 >>> assert f.guard_interval == 0 >>> assert f.MCS_bandwidth == 0 >>> assert f.MCS_index == 0xc >>> assert f.A_MPDU_ref == 1428 ###(029)=[passed] RadioTap MCS >>> f = RadioTap(b"\x00\x00)\x00+@\x08\xa0 \x08\x00\xa0 \x08\x00\x00\xff\xc3$N\x00\x00\x00\x00\x10\x00d\x14@\x01\xc8\x00\x00\x00'\x00\n\xc8\x00\xbd\x01\x88\x02\x00\x00\x01\x00^\x02\x00\n\x04\xf0!K}\xb7\x00\r\xb9L\xfd\xd4 4$\x00\xaa\xaa\x03\x00\x00\x00\x08\x00E\x00\x05\x94\x80\xc7@\x00\x05\x11\x0c\xb4\xac\x10T\xc1\xe2\x02\x00\n\xdeU\x13\x89\x05\x80,m\x00\x00\x07?`G\xc7 \x00\x07\x02u\x00\x00\x00\x00H\x01\x00\x98\x00\x00\x00\x01\x00\x00\x13\x89\x00\x00\x05x\x00\x00\x00\x00\xff") >>> assert f.knownMCS == 0x27 >>> assert f.MCS_index == 10 ###(030)=[passed] RadioTap ts, HE, HE-MU, LSIG >>> f = RadioTap(b'\x00\x00^\x00*@\xd0\xa9 \x08\x00\xa0 \x08\x00\xc0\x01\x00\x00\x00\x10\x00|\x15@\x01\xd4\x00\x00\x00\x00\x00x\x10\x01\x00\x00\x00\x00\x00\xa7\x14\xd0\xf9\x00\x00\x00\x00\x16\x00\x11\x03\xf6\xc7\x7f@"+\x00\x00\x98Q\x01\x00\xd0\xd3W\x04\xc8\xc8\xc8\xc8rrrr\x02\x00`\x0b\xd4\x00\xd3\x01\xf6T%\x01\x02\x00\x14\x00\x00\x00\x88B\x82\x00\xd8\xf8\x835\xd3\x06\xf0/t|\xa3\xb4\xf0/t|\xa3\xb4\x00\n\xc0\x00\xac\x10\x00 \x01\x00\x00\x00\xe8^\x98\xc3\x08<\xce\x85\xf4\xc0\xe0/\xb0[\xaf\xb11\x90\x11\xb5\xa8\xa3\x02\x99-\xa0\xcf\x7fE%\x8a\xa8~[\xbe\xe8\xfc\xe5:\xbdBJ\xf3\x8a5\xb3\xed\x88\xde\xdcF\x02\xed\xddc\x0bLN\x02\xcdR\x06\x9b\x9d)\xc2\xdc\xf1\xcd\xe3Pv\xcauP\x1a\xaf_\x0c\x12<\x8f\x999*\x1c\xf7x\xe4>G"\x8d\x91\xd6\xeb\xe5\xf9\xc3Y\xedf\xffg\xf8*\xda\xe9aYb\x92\x8b\x93\xde\'\xe7_N$\xd2;\xe3\xadj\xd6\xeb\xf1p|[\xfe\xc9m\xc2\xe1\xde\xd2\xff\x9e\xdb_\x8d9\x80\xec\xd2\x113\x0fWB\x86\xfec\xd5\xb9\x9b\x07\xb0\xa6\x06\xa5\x07iQ\x80\xa5\x8f\x13I\x98\xcb\xb2\x13\x92\xb3\x00\xac<\xdf\x95|\x0b\x8b{\x1d\x0f4@\x12\xb1r\xbez\x81\xc2dQ\x13,nN\xa5\xf1\xcd$\xba\x97\xb6^\x0c\x141\xad\xde`\x0e\x04u\xb6b1\xd2\xb6\xb3\xcf\x01\xf4jn\x07A\x84\xab\xc1!p\xef\xdf\xe9IP\x9dm\xc6[\x01\xb84X\xe6F%\xf7wW+\x80\xb1\xc3\x99b\x15\x03\x86p\x94m\xd8D\xf5\xef\x176\xd0\xbdb\x12\x93\x02)\xac\xed\xfe\x8d\xbd\xcbyI\xaa\xa1\xae\x95H\x0eh\xcd\xfd\xe0\xe6\xf2U\x03\xf6E\x1d\xce\x82\xf6\x8e4\x12\x8e+\xc8\xadJ8\r\x10/\xca3\xd2\x88|\xd2\xce\x7f\x15k\x81R\x88U\xc4\xdeT\x1d\xcf\'\xf0\'\xb2\xb6\xb3\x84\x02\xc9L\xee\xf6E\x04\xaeF\xb1#\xeb\x17\xd0\n\x00\x1aH2<\xe0\xb3[\x8d\t\xd6\x89[0&P\x17/\x191\x050\xe4\xc0\n_?\xde\x92\xbdC\xa6\xb1\xc2n\x12\x9f\xb5b\x10\xcc\xc3\xfa\xce\xd7\xe0\xf2\xaa\x84\xa2\xe9\xa8\x81S&\xf9\r;\xcc\x81\xa3\x84v\xff\n\xb9?\xbe!]\xb4E]\xac\xbfQ\x1d)2\xee9\x84\xddjq\xb1q\x87ef\xca\x87\xfe\xf6\xcd\xbck#\xad\x03\xe9>\x91]\xf3@\x02\xb4\x8b\xfe\x84z\x88\x83\xf3\xb18N\xf7x\xde\xd6|\xb2p\n\xe4$h\xd5\x10\x15&\xd6O\xdf\xb3y\'\x80[a\xf6f2\x84\xe4\xa9\xe3a\xd0h\x93%\xa5\xd1\x9fX\x94P\x8b\xbc\xf9J"k\xd0\xaf-\xa2\xbf\x1a\xf65\xa8[y\xba\x0b\xaa\x05J9\x93VVM+\x13+;y\xbdJ!@\xab\r\x93\x93\x8c\xd6\xbb\xc2\'\xa0_N\'6\x05\x96"\xef\xd7\xbd4S\x99\xfaf\x05\xf2\xb7\xb9\xe4\x02\xd4\x1f?\x0e\xe7') >>> >>> assert f.timestamp == 4191163559 >>> assert f.ts_accuracy == 22 >>> assert f.ts_unit == 1 >>> assert f.ts_position == 1 >>> assert f.ts_flags.Accuracy and "32-bit_counter" in f.ts_flags >>> assert f.he_data1 == 51190 >>> assert f.he_data2 == 16511 >>> assert f.he_data3 == 11042 >>> assert f.he_data4 == 0 >>> assert f.he_data5 == 20888 >>> assert f.he_data6 == 1 >>> assert f.hemu_flags1 == 54224 >>> assert f.hemu_flags2 == 1111 >>> assert f.RU_channel1 == [200, 200, 200, 200] >>> assert f.RU_channel2 == [114, 114, 114, 114] >>> assert f.lsig_data1.length >>> assert f.lsig_length == 182 >>> assert f.lsig_rate == 0 >>> assert f == eval(f.command()) ###(031)=[passed] Reassociation request >>> f = Dot11(b' \x00:\x01@\xe3\xd6\x7f*\x00\x00\x10\x18\xa9l.@\xe3\xd6\x7f*\x00 \t1\x04\n\x00@\xe3\xd6\x7f*\x00\x00\x064.2.12\x01\x08\x82\x84\x0b\x16$0Hl!\x02\x08\x1a$\x02\x01\x0b0&\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x01\x00\x00\x01\x00LD\xfe\xf2l\xdcV\xce\x0b7\xab\xc62\x02O\x112\x04\x0c\x12\x18`\x7f\x08\x01\x00\x00\x00\x00\x00\x00@\xdd\t\x00\x10\x18\x02\x00\x00\x10\x00\x00') >>> assert Dot11EltRSN in f >>> assert f[Dot11EltRSN].pmkids.nb_pmkids == 1 >>> assert len(f[Dot11EltRSN].pmkids.pmkid_list) == 1 >>> assert f[Dot11EltRSN].pmkids.pmkid_list[0] == b'LD\xfe\xf2l\xdcV\xce\x0b7\xab\xc62\x02O\x11' ###(032)=[passed] Backward compatibility of Dot11Elt >>> assert Dot11Elt(ID="DSset").sprintf("%ID%") == 'DSSS Set' >>> assert Dot11Elt(ID="RSNinfo").sprintf("%ID%") == 'RSN' ###(033)=[passed] Dot11FCS parent matching >>> pkt = Ether()/IP()/Dot11FCS() >>> assert pkt[Dot11] ###(034)=[passed] Dot11FCS - test FCS with FCSField >>> data = b'\x00\x00 \x00\xae@\x00\xa0 \x08\x00\xa0 \x08\x00\x00\x10\x02\x85\t\xa0\x00\xe2\x00d\x00\x00\x00\x00\x00\x00\x01\xa0@:\x01\x00\xc0\xca\xa4}PLfA\xac\xe4\xb3\x00\xc0\xca\xa4}P\x00\x03\x00 \x08 \x00\x00\x00\x00\x0f)\x1d\xd4\xd49\x1f>4\xeb' >>> pkt = RadioTap(data) >>> w_payload = hex_bytes('00002000ae4000a0200800a02008000010028509a000e2006400000000000001a0403a0100c0caa47d504c6641ace4b300c0caa47d50000300200820000000000f291dd4d4391f3e34eb') >>> assert raw(pkt) == w_payload ###(035)=[passed] Dot11FCS computation >>> pkt = RadioTap() / Dot11FCS() / Dot11Beacon() >>> assert raw(pkt) == b'\x00\x00\t\x00\x02\x00\x00\x00\x10\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00e\xd9=\xb9' ###(036)=[passed] WEP tests >>> conf.wepkey = "" >>> bck_conf_crypto_valid = conf.crypto_valid >>> p = Dot11WEP(b'\x00\x00\x00\x00\xe3OjYLw\xc3x_%\xd0\xcf\xdeu-\xc3pH#\x1eK\xae\xf5\xde\xe7\xb8\x1d,\xa1\xfe\xe83\xca\xe1\xfe\xbd\xfe\xec\x00)T`\xde.\x93Td\x95C\x0f\x07\xdd') >>> assert isinstance(p, Dot11WEP) >>> conf.crypto_valid = bck_conf_crypto_valid >>> >>> conf.wepkey = "Fobar" >>> r = raw(Dot11WEP()/LLC()/SNAP()/IP(src="127.0.0.1", dst="127.0.0.1")/TCP(seq=12345678)) >>> r b'\x00\x00\x00\x00\xe3OjYLw\xc3x_%\xd0\xcf\xdeu-\xc3pH#\x1eK\xae\xf5\xde\xe7\xb8\x1d,\xa1\xfe\xe83\xca\xe1\xfe\xbd\xfe\xec\x00)T`\xde.\x93Td\x95C\x0f\x07\xdd' >>> assert r == b'\x00\x00\x00\x00\xe3OjYLw\xc3x_%\xd0\xcf\xdeu-\xc3pH#\x1eK\xae\xf5\xde\xe7\xb8\x1d,\xa1\xfe\xe83\xca\xe1\xfe\xbd\xfe\xec\x00)T`\xde.\x93Td\x95C\x0f\x07\xdd' >>> p = Dot11WEP(r) >>> p >>>> >>> assert TCP in p and p[TCP].seq == 12345678 ###(037)=[passed] RadioTap - dissection & build >>> data = b'\x00\x008\x00k\x084\x00oo\x0f\x98\x00\x00\x00\x00\x10\x00\x99\x16@\x01\xc5\xa1\x01\x00\x00\x00@\x01\x02\x00\x99\x16\x9d"\x05\x0b\x00\x00\x00\x00\x00\x00\xff\x01\x16\x01\x82\x00\x00\x00\x01\x00\x00\x00\x88\x020\x00\xb8\xe8VB_\xb2\x82*\xa8Uq\x15\xf0\x9f\xc2\x11\x16dP\xb0\x00\x00\xaa\xaa\x03\x00\x00\x00\x08\x00E\x00\x00GC\xad@\x007\x11\x97;\xd0C\xde{\xac\x10\r\xee\x005\xed\xec\x003\xd5/\xfc\\\x81\x80\x00\x01\x00\x01\x00\x00\x00\x00\tlocalhost\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\x01\x00\t:\x80\x00\x04\x7f\x00\x00\x01\xcdj\x88]' >>> r = RadioTap(data) >>> r = RadioTap(raw(r)) >>> assert r.dBm_AntSignal == -59 >>> assert r.ChannelFrequency == 5785 >>> assert r.ChannelPlusFrequency == 5785 >>> assert r.present == 3410027 >>> assert r.A_MPDU_ref == 2821 >>> assert r.KnownVHT == 511 >>> assert r.PresentVHT == 22 >>> assert r.notdecoded == b'' ###(038)=[passed] RadioTap Big-Small endian dissection >>> data = b'\x00\x00\x1a\x00/H\x00\x00\xe1\xd3\xcb\x05\x00\x00\x00\x00@0x\x14@\x01\xac\x00\x00\x00' >>> r = RadioTap(data) >>> r.show() ###[ RadioTap ]### version = 0 pad = 0 len = 26 present = TSFT+Flags+Rate+Channel+dBm_AntSignal+Antenna+RXFlags mac_timestamp= 97244129 Flags = badFCS Rate = 24.0 Mbps ChannelFrequency= 5240 ChannelFlags= OFDM+5GHz dBm_AntSignal= -84 dBm Antenna = 0 RXFlags = notdecoded= b'' >>> assert r.present == 18479 ###(039)=[passed] RadioTap MCS dissection >>> data = b"\x00\x00\x0b\x00\x00\x00\x08\x00?,\x05" >>> r = RadioTap(data) >>> r.show() ###[ RadioTap ]### version = 0 pad = 0 len = 11 present = MCS knownMCS = MCS_bandwidth+MCS_index+guard_interval+HT_format+FEC_type+STBC_streams Ness_LSB = 0 STBC_streams= 1 FEC_type = BCC HT_format = greenfield guard_interval= Short_GI MCS_bandwidth= 20MHz MCS_index = 5 notdecoded= b'' >>> assert r.present.MCS >>> assert r.knownMCS.MCS_bandwidth >>> assert r.knownMCS.MCS_index >>> assert r.knownMCS.guard_interval >>> assert r.knownMCS.HT_format >>> assert r.knownMCS.FEC_type >>> assert r.knownMCS.STBC_streams >>> assert not r.knownMCS.Ness >>> assert not r.knownMCS.Ness_MSB >>> assert r.MCS_bandwidth == 0 >>> assert r.guard_interval == 1 >>> assert r.HT_format == 1 >>> assert r.FEC_type == 0 >>> assert r.STBC_streams == 1 >>> assert r.MCS_index == 5 >>> assert r.Ness_LSB == 0 ###(040)=[passed] RadioTap RX/TX Flags dissection >>> data = b'\x00\x00\x0c\x00\x00\xc0\x00\x00\x02\x00\x3f\x00' >>> r = RadioTap(data) >>> r.show() ###[ RadioTap ]### version = 0 pad = 0 len = 12 present = RXFlags+TXFlags RXFlags = BAD_PLCP TXFlags = TX_FAIL+CTS+RTS+NOACK+NOSEQ+ORDER notdecoded= b'' >>> assert r.present.TXFlags >>> assert r.TXFlags.TX_FAIL >>> assert r.TXFlags.CTS >>> assert r.TXFlags.RTS >>> assert r.TXFlags.NOACK >>> assert r.TXFlags.NOSEQ >>> assert r.TXFlags.ORDER >>> assert r.present.RXFlags >>> assert r.RXFlags.BAD_PLCP ###(041)=[passed] RadioTap, other fields >>> data = b'\x00\x00 \x00\xae@\x00\xa0 \x08\x00\xa0 \x08\x00\x00\x10\x02\x85\t\xa0\x00\xe2\x00d\x00\x00\x00\x00\x00\x00\x01\xa0@:\x01\x00\xc0\xca\xa4}PLfA\xac\xe4\xb3\x00\xc04\xeb\xca\xa4}P\x00 \x08 \x00\x00\x00\x00\x0f)\x1d\xd4\xd49\x00\x03\x1f>' >>> r = RadioTap(data) >>> assert Dot11TKIP in r >>> assert r[Dot11] >>> assert r.dBm_AntSignal == -30 >>> assert r.Lock_Quality == 100 >>> assert r.RXFlags == 0 >>> >>> data = b'\x00\x00\x0f\x00\x00\x00\x00\x02\xff\x7f?\x00\x00\x04\x00' >>> r = RadioTap(data) >>> repr(r) "\x1b[0m<\x1b[0m\x1b[31m\x1b[1mRadioTap\x1b[0m \x1b[34mversion\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mpad\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mlen\x1b[0m\x1b[0m=\x1b[0m\x1b[35m15\x1b[0m \x1b[34mpresent\x1b[0m\x1b[0m=\x1b[0m\x1b[35mHE_MU_other_user\x1b[0m \x1b[34mhemuou_per_user_1\x1b[0m\x1b[0m=\x1b[0m\x1b[35m32767\x1b[0m \x1b[34mhemuou_per_user_2\x1b[0m\x1b[0m=\x1b[0m\x1b[35m63\x1b[0m \x1b[34mhemuou_per_user_position\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mhemuou_per_user_known\x1b[0m\x1b[0m=\x1b[0m\x1b[35mNSTS\x1b[0m \x1b[34mnotdecoded\x1b[0m\x1b[0m=\x1b[0m\x1b[35mb''\x1b[0m \x1b[0m|\x1b[0m\x1b[0m>\x1b[0m" >>> assert list(r.hemuou_per_user_known) == ['NSTS'] ###(042)=[passed] RadioTap - Dissection - guess_payload_class() test >>> data = b'\x00\x00\r\x00\x04\x80\x02\x00\x02\x00\x00\x00\x00@\x00\x00\x00\xff\xff\xff\xff\xff\xff\xe8\x94\xf6\x1c\xdf\x8b\xff\xff\xff\xff\xff\xff\xa0\x01\x00\x10ciscosb-wpa2-eap\x01\x08\x02\x04\x0b\x16\x0c\x12\x18$2\x040H`l\x03\x01\x01-\x1an\x11\x1b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> radiotap = RadioTap(data) >>> assert radiotap.present.Rate >>> assert radiotap.present.TXFlags >>> assert radiotap.present.b18 >>> assert radiotap.present == 163844 >>> assert radiotap.guess_payload_class("") == Dot11 ###(043)=[passed] RadioTap - Dissection with Extended presence mask >>> data = b"\x00\x00 \x00\xae@\x00\xa0 \x08\x00\xa0 \x08\x00\x00\x10\x02\x9e\t\xa0\x00\xa2\x00d\x00\x00\x00\x00\x00\x00\x01\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x94S0\xe8\x93\xb2\x94S0\xe8\x93\xb2\xf0u\x85\xe1H\x9c\x08\x00\x00\x00d\x00\x11\x14\x00\x08Why Fye?\x01\x08\x82\x84\x8b\x96$0Hl\x03\x01\x0b\x05\x04\x00\x01\x00\x00*\x01\x04/\x01\x040\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x02\x0c\x002\x04\x0c\x12\x18`\x0b\x05\x07\x00;\x00\x00-\x1a\xad\x19\x17\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x16\x0b\x08\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x08\x04\x00\x08\x00\x00\x00\x00@\xdd1\x00P\xf2\x04\x10J\x00\x01\x10\x10D\x00\x01\x02\x10G\x00\x10\xef\xda]\xd2#\xe8\xa7\xf0\xb2/\xa4\x98\xbf\x0cv\xe7\x10<\x00\x01\x03\x10I\x00\x06\x007*\x00\x01 \xdd\t\x00\x10\x18\x02\x07\x00\x1c\x00\x00\xdd\x18\x00P\xf2\x02\x01\x01\x80\x00\x03\xa4\x00\x00'\xa4\x00\x00BC^\x00b2/\x00F\x05r\x08\x01\x00\x00\xdd\x1e\x00\x90L\x04\x08\xbf\x0c\xb2Y\x82\x0f\xea\xff\x00\x00\xea\xff\x00\x00\xc0\x05\x00\x0b\x00\x00\x00\xc3\x02\x00\x02\x08I\xc0\xdb" >>> radiotap = RadioTap(data) >>> >>> assert radiotap.present.Ext >>> assert len(radiotap.Ext) == 2 >>> assert radiotap.Ext[0].present.b5 >>> assert radiotap.Ext[0].present.b11 >>> assert radiotap.Ext[0].present.b29 >>> assert radiotap.Ext[0].present.Ext >>> assert radiotap.Ext[1].present.b37 >>> assert radiotap.Ext[1].present.b43 >>> assert not radiotap.Ext[1].present.Ext >>> >>> assert radiotap.present.Flags >>> assert radiotap.Flags.FCS >>> assert Dot11FCS in radiotap >>> assert radiotap.fcs == 0xdbc04908 >>> >>> assert Dot11EltRates in radiotap >>> assert radiotap[Dot11EltRates].rates == [130, 132, 139, 150, 36, 48, 72, 108] ###(044)=[passed] RadioTap - Build with Extended presence mask >>> a = RadioTapExtendedPresenceMask(present="b0+b12+b29+Ext") >>> b = RadioTapExtendedPresenceMask(index=1, present="b32+b45+b59+b62") >>> pkt = RadioTap(present="Ext", Ext=[a, b]) >>> assert raw(pkt) == b'\x00\x00\x10\x00\x00\x00\x00\x80\x01\x10\x00\xa0\x01 \x00H' ###(045)=[passed] RadioTap - dissect & build TLVs >>> pkt = RadioTap( ... present="TLV+dBm_TX_Power+TXFlags+Channel+Rate+Flags", ... tlvs=[ ... RadioTapTLV(type=30, data=b"tes1t"), ... RadioTapTLV(type=1, data=b"a") ... ] ... ) >>> >>> assert raw(pkt) == b'\x00\x00,\x00\x0e\x84\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00tes1t\x00\x00\x00\x01\x00\x01\x00a\x00\x00\x00' >>> >>> pkt = RadioTap(raw(pkt)) >>> assert pkt.present.TLV >>> assert pkt.tlvs[0].type == 30 >>> assert pkt.tlvs[0].data == b"tes1t" >>> assert pkt.tlvs[0].pad == b"\0\0\0" >>> assert pkt.tlvs[1].type == 1 >>> assert pkt.tlvs[1].data == b"a" >>> assert pkt.notdecoded == b"" ###(046)=[passed] fuzz() calls for Dot11Elt() >>> for i in range(10): ... assert isinstance(raw(fuzz(Dot11Elt())), bytes) ... ###(047)=[passed] PMKIDListPacket - Check computation of nb_pmkids >>> assert PMKIDListPacket(raw(PMKIDListPacket())).nb_pmkids == 0 >>> assert PMKIDListPacket(raw(PMKIDListPacket(pmkid_list=["AZEDFREZSDERFGTY"]))).nb_pmkids == 1 >>> assert PMKIDListPacket(raw(PMKIDListPacket(pmkid_list=["0123456789ABDEFX", "AZEDFREZSDERFGTY"]))).nb_pmkids == 2 ###(048)=[passed] Dot11EltRSN - Check computation of nb_pairwise_cipher_suites and nb_akm_suites >>> assert Dot11EltRSN(raw(Dot11EltRSN())).nb_pairwise_cipher_suites == 1 >>> assert Dot11EltRSN(raw(Dot11EltRSN(pairwise_cipher_suites=[RSNCipherSuite(cipher="TKIP")]))).nb_pairwise_cipher_suites == 1 >>> assert Dot11EltRSN(raw(Dot11EltRSN(pairwise_cipher_suites=[RSNCipherSuite(cipher="TKIP"), RSNCipherSuite(cipher="CCMP-128")]))).nb_pairwise_cipher_suites == 2 >>> assert Dot11EltRSN(raw(Dot11EltRSN())).nb_akm_suites == 1 >>> assert Dot11EltRSN(raw(Dot11EltRSN(akm_suites=[AKMSuite(suite="PSK")]))).nb_akm_suites == 1 >>> assert Dot11EltRSN(raw(Dot11EltRSN(akm_suites=[AKMSuite(suite="PSK"), AKMSuite(suite="802.1X")]))).nb_akm_suites == 2 ###(049)=[passed] Dot11EltMicrosoftWPA - Check computation of nb_pairwise_cipher_suites and nb_akm_suites >>> assert Dot11EltMicrosoftWPA(raw(Dot11EltMicrosoftWPA())).nb_pairwise_cipher_suites == 1 >>> assert Dot11EltMicrosoftWPA(raw(Dot11EltMicrosoftWPA(pairwise_cipher_suites=[RSNCipherSuite(cipher="TKIP")]))).nb_pairwise_cipher_suites == 1 >>> assert Dot11EltMicrosoftWPA(raw(Dot11EltMicrosoftWPA(pairwise_cipher_suites=[RSNCipherSuite(cipher="TKIP"), RSNCipherSuite(cipher="CCMP-128")]))).nb_pairwise_cipher_suites == 2 >>> assert Dot11EltMicrosoftWPA(raw(Dot11EltMicrosoftWPA())).nb_akm_suites == 1 >>> assert Dot11EltMicrosoftWPA(raw(Dot11EltMicrosoftWPA(akm_suites=[AKMSuite(suite="PSK")]))).nb_akm_suites == 1 >>> assert Dot11EltMicrosoftWPA(raw(Dot11EltMicrosoftWPA(akm_suites=[AKMSuite(suite="PSK"), AKMSuite(suite="802.1X")]))).nb_akm_suites == 2 ###(050)=[passed] Dot11BSSTMRequest - dissection >>> pkt = RadioTap(b"\x00\x008\x00/@@\xa0 \x08\x00\xa0 \x08\x00\x00\x7f\x89&\x88\x00\x00\x00\x00\x10\x0c\xcc\x15@\x01\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8f\xe7&\x88\x00\x00\x00\x00\x16\x00\x11\x03\xe4\x00\xde\x01\xd0\x00<\x00\x92U\x1f\xe9g9J\xf2\x1c\x03)\x89J\xf2\x1c\x03)\x89\xc0\xce\n\x07\x01\x05\x05\x00\xff4\x10F\xf2\x1c\x03)\x89\x00\x00\x00\x00Q\x0b\x00\x03\x01\xff\xaaV\xdaY") >>> assert Dot11BSSTMRequest in pkt >>> >>> assert pkt[Dot11Action].category == 10 >>> assert pkt[Dot11Action][Dot11WNM].action == 7 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].token == 1 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].mode.Preferred_Candidate_List_Included >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].mode.Disassociation_Imminent >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].disassociation_timer == 5 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].validity_interval == 255 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].type == 52 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].len == 16 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].BSSID == "46:f2:1c:03:29:89" >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].AP_reach == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].security == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].key_scope == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].capabilities == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].mobility == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].HT == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].VHT == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].FTM == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].reserved == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].op_class == 81 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].channel == 11 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMRequest].neighbor_report[0].phy_type == 0 ###(051)=[passed] Dot11BSSTMResponse - dissection >>> pkt = RadioTap(b"\x00\x00,\x00\xae@\x00\xa0 \x08\x00\xa0 \x08\x00\xa0 \x08\x00\xa0 \x08\x00\x00\x10\x0c<\x14@\x01\xce\x00d\x00\x00\x00\xd0\x00\xca\x01\xca\x02\xcc\x03\xd0\x00<\x00df$J\xe1\xc4\xa0\xcc+\xbe\xc9Odf$J\xe1\xc4p\x0c\n\x08\x01\x06\x004\rdf$J\xe1\xc3\x00\x00\x00\x00\x04\x0c\x00<\xdd\xdf=") >>> assert Dot11BSSTMResponse in pkt >>> >>> assert pkt[Dot11Action].category == 10 >>> assert pkt[Dot11Action][Dot11WNM].action == 8 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].token == 1 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].status == 6 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].termination_delay == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].type == 52 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].len == 13 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].BSSID == "64:66:24:4a:e1:c3" >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].AP_reach == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].security == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].key_scope == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].capabilities == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].mobility == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].HT == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].VHT == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].FTM == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].reserved == 0 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].op_class == 4 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].channel == 12 >>> assert pkt[Dot11Action][Dot11WNM][Dot11BSSTMResponse].neighbor_report[0].phy_type == 0 ###(052)=[passed] Dot11Ack >>> pkt = Dot11(bytes(Dot11()/Dot11Ack())) >>> assert pkt.subtype == 13 >>> assert pkt.type == 1 ###(053)=[passed] Dot11CSA >>> pkt = RadioTap(b"\x00\x008\x00/@@\xa0 \x08\x00\xa0 \x08\x00\x00\xfe\x83\x06\x10\x00\x00\x00\x00\x10\x02\x8a\t\xa0\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x006\x07\x10\x00\x00\x00\x00\x16\x00\x11\x03\xf8\x00\xfe\x01\xd0\x00\x00\x00\xff\xff\xff\xff\xff\xff\x0cs)d\xa5\r\x0cs)d\xa5\r\xb0!\x00\x04%\x03\x01\x0b\x05\x0b\xb9<\x8c") >>> assert Dot11SpectrumManagement in pkt >>> assert Dot11CSA in pkt >>> assert Dot11EltCSA in pkt >>> >>> assert pkt[Dot11Action].category == 0 >>> assert pkt[Dot11Action][Dot11SpectrumManagement].action == 4 >>> assert pkt[Dot11Action][Dot11SpectrumManagement][Dot11CSA][Dot11EltCSA].ID == 37 >>> assert pkt[Dot11Action][Dot11SpectrumManagement][Dot11CSA][Dot11EltCSA].len == 3 >>> assert pkt[Dot11Action][Dot11SpectrumManagement][Dot11CSA][Dot11EltCSA].mode == 1 >>> assert pkt[Dot11Action][Dot11SpectrumManagement][Dot11CSA][Dot11EltCSA].new_channel == 11 >>> assert pkt[Dot11Action][Dot11SpectrumManagement][Dot11CSA][Dot11EltCSA].channel_switch_count == 5 ###(054)=[passed] Dot11OBSS >>> data = b'\x00\x008\x00/@@\xa0 \x08\x00\xa0 \x08\x00\x00\x7fB\xe9\n\x00\x00\x00\x00\x10\x16l\t\xa0\x00\xc3\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x9b\xe9\n\x00\x00\x00\x00\x16\x00\x11\x03\xc3\x00\xbf\x01\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff`\x8d&\xa6\xd6\x04`\x8d&\xa6\xd6\x04@S\xe2\xb0\x04\x00\x00\x00\x00\x00d\x00\x11\x14\x00\rArc-QA-Lab-2G\x01\x08\x82\x84\x8b\x96$0Hl\x03\x01\x01\x05\x04\x02\x03\x00\x00\x07\x06AE \x01\r\x14#\x02\x19\x00*\x01\x042\x04\x0c\x12\x18`0\x18\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x02\x00\x00\x0f\xac\x02\x00\x0f\xac\x04\x0c\x00\x0b\x05\x00\x00\xc1\x00\x00F\x053\x00\x00\x00\x006\x03d\x00\x00-\x1a\xef\x19\x17\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x16\x01\x08\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00J\x0e\x14\x00\n\x00,\x01\xc8\x00\x14\x00\x05\x00\x19\x00\x7f\n\x05\x00\x08\x80\x00\x00\x00@\x00@\xff #\x05\x00\x08\x12\x00\x10" \x02\xc0\x0fB\x85\x10\x00\x0c\x00\xea\xff\xea\xffz\x1c\xc7q\x1c\xc7q\x1c\xc7q\xff\x07$\xf4?\x00\x02\xfc\xff\xff\x0e&\x00\x00\xa4\x08 \xa4\x08@C\x08`2\x08\xdd\x1d\x00P\xf2\x04\x10J\x00\x01\x10\x10D\x00\x01\x02\x10<\x00\x01\x03\x10I\x00\x06\x007*\x00\x01 \xdd\x1e\x00\x90L\x04\x18\xbf\x0c\xb1i\x8a\x0f\xea\xff\x00\x00\xea\xff\x00\x00\xc0\x05\x00\x01\x00\x00\x00\xc3\x02\x005\xdd\n\x00\x10\x18\x02\x00\x00\x1c\x00\x00\x01\xdd\x18\x00P\xf2\x02\x01\x01\x80\x00\x03\xa4\x00\x00\'\xa4\x00\x00BC^\x00b2/\x00l\x02\x7f\x00 \x8d\xf4\xe1' >>> pkt = RadioTap(data) >>> >>> assert Dot11EltOBSS in pkt >>> >>> assert pkt[Dot11EltOBSS].ID == 74 >>> assert pkt[Dot11EltOBSS].len == 14 >>> assert pkt[Dot11EltOBSS].Passive_Dwell == 20 >>> assert pkt[Dot11EltOBSS].Active_Dwell == 10 >>> assert pkt[Dot11EltOBSS].Scan_Interval == 300 >>> assert pkt[Dot11EltOBSS].Passive_Total_Per_Channel == 200 >>> assert pkt[Dot11EltOBSS].Active_Total_Per_Channel == 20 >>> assert pkt[Dot11EltOBSS].Delay == 5 >>> assert pkt[Dot11EltOBSS].Activity_Threshold == 25 ###(055)=[passed] Dot11VHTOperation >>> pkt = RadioTap(b"\x00\x008\x00/@@\xa0 \x08\x00\xa0 \x08\x00\x00K\x1178\x00\x00\x00\x00\x10\x0c<\x14@\x01\xba\x00\x00\x00\x00\x00\x00\x00\x00\x00\xffj78\x00\x00\x00\x00\x16\x00\x11\x03\xb6\x00\xba\x01\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff`\x8d&\xa6\xd6\x05`\x8d&\xa6\xd6\x05\xb0i~\x96\x9e\x03\x00\x00\x00\x00d\x00\x11\x11\x00\rArc-QA-Lab-5G\x01\x08\x8c\x12\x98$\xb0H`l\x05\x04\x00\x03\x00\x00\x07>> assert Dot11EltVHTOperation in pkt >>> assert Dot11VHTOperationInfo in pkt >>> >>> assert pkt[Dot11EltVHTOperation].ID == 192 >>> assert pkt[Dot11EltVHTOperation].VHT_Operation_Info >>> assert pkt[Dot11EltVHTOperation].VHT_Operation_Info.channel_width == 1 >>> assert pkt[Dot11EltVHTOperation].VHT_Operation_Info.channel_center0 == 42 >>> assert pkt[Dot11EltVHTOperation].VHT_Operation_Info.channel_center1 == 50 ###(056)=[passed] Dot11EltVHTOperation in isolation >>> pkt = Dot11EltVHTOperation(b'\xc0\x05\x01*2\x00\x00') >>> assert pkt[Dot11Elt::{"ID": 192}].len == 5 ###(057)=[passed] Dot11EltOBSS in isolation >>> pkt = Dot11EltOBSS(b'J\x0e\x14\x00\n\x00,\x01\xc8\x00\x14\x00\x05\x00\x19\x00') >>> assert pkt[Dot11Elt::{"ID": 74}].len == 14 ###(058)=[passed] Dot11EltCSA in isolation >>> pkt = Dot11EltCSA(b'%\x03\x01\x0b\x05') >>> assert pkt[Dot11Elt::{"ID": 37}].len == 3 Regression tests for the Dot15D4, SixLoWPAN and Zigbee layers ━ Run at 01:42:12 from [test/scapy/layers/dot15d4.uts] by UTscapy in 0.4032931327819824 └ Passed=59 └ Failed=0 ###### ## Dot15D4 tests ###### ###(000)=[passed] Dot15D4 layers >>> pkt = Dot15d4()/Dot15d4Ack()/Dot15d4AuxSecurityHeader()/Dot15d4Beacon()/Dot15d4Cmd()/Dot15d4CmdAssocReq()/Dot15d4CmdAssocResp()/Dot15d4CmdCoordRealign()/Dot15d4CmdCoordRealignPage()/Dot15d4CmdDisassociation()/Dot15d4CmdGTSReq()/Dot15d4Data()/Dot15d4FCS() >>> assert Dot15d4 in pkt.layers() >>> assert Dot15d4Ack in pkt.layers() >>> assert Dot15d4AuxSecurityHeader in pkt.layers() >>> assert Dot15d4Beacon in pkt.layers() >>> assert Dot15d4Cmd in pkt.layers() >>> assert Dot15d4CmdAssocReq in pkt.layers() >>> assert Dot15d4CmdAssocResp in pkt.layers() >>> assert Dot15d4CmdCoordRealign in pkt.layers() >>> assert Dot15d4CmdCoordRealignPage in pkt.layers() >>> assert Dot15d4CmdDisassociation in pkt.layers() >>> assert Dot15d4CmdGTSReq in pkt.layers() >>> assert Dot15d4Data in pkt.layers() >>> assert Dot15d4FCS in pkt.layers() ###(001)=[passed] Dot15d4FCS parent matching >>> pkt = Ether()/IP()/Dot15d4FCS() >>> assert pkt[Dot15d4] ###(002)=[passed] Dot15d4FCS - Beacon (without pending addresses) >>> pkt = Dot15d4FCS(b'\x00\x80\x89\xaa\x99\x00\x00\xff\xcf\x00\x00\x00"\x84\xfe\xca\xef\xbe\xed\xfe\xce\xfa\xff\xff\xff\x00X\xa4') >>> assert Dot15d4FCS in pkt.layers() >>> assert pkt[Dot15d4FCS].fcf_frametype == 0 >>> assert pkt[Dot15d4FCS].fcf_security == False >>> assert pkt[Dot15d4FCS].fcf_pending == False >>> assert pkt[Dot15d4FCS].fcf_ackreq == False >>> assert pkt[Dot15d4FCS].fcf_panidcompress == False >>> assert pkt[Dot15d4FCS].fcf_destaddrmode == 0 >>> assert pkt[Dot15d4FCS].fcf_framever == 0 >>> assert pkt[Dot15d4FCS].fcf_srcaddrmode == 2 >>> assert pkt[Dot15d4FCS].seqnum == 137 >>> assert Dot15d4Beacon in pkt.layers() >>> assert pkt[Dot15d4Beacon].src_panid == 0x99aa >>> assert pkt[Dot15d4Beacon].src_addr == 0x0000 >>> assert pkt[Dot15d4Beacon].sf_beaconorder == 15 >>> assert pkt[Dot15d4Beacon].sf_sforder == 15 >>> assert pkt[Dot15d4Beacon].sf_finalcapslot == 15 >>> assert pkt[Dot15d4Beacon].sf_battlifeextend == False >>> assert pkt[Dot15d4Beacon].sf_pancoord == True >>> assert pkt[Dot15d4Beacon].sf_assocpermit == True >>> assert pkt[Dot15d4Beacon].gts_spec_permit == False >>> assert pkt[Dot15d4Beacon].gts_spec_reserved == 0 >>> assert pkt[Dot15d4Beacon].gts_spec_desccount == 0 >>> assert pkt[Dot15d4Beacon].pa_num_short == 0 >>> assert pkt[Dot15d4Beacon].pa_num_long == 0 >>> assert pkt[Dot15d4Beacon].pa_short_addresses == [] >>> assert pkt[Dot15d4Beacon].pa_long_addresses == [] >>> assert raw(pkt[Dot15d4Beacon].payload) == b'\x00"\x84\xfe\xca\xef\xbe\xed\xfe\xce\xfa\xff\xff\xff\x00' >>> assert pkt[Dot15d4FCS].fcs == 0xa458 ###(003)=[passed] Dot15d4FCS - Beacon (with pending addresses) >>> pkt = Dot15d4FCS(b'\x00\x80\x89\xaa\x99\x00\x00\xff\xcf\x00\x124\x12xV\x88wfUD3"\x11\x00"\x84\xfe\xca\xef\xbe\xed\xfe\xce\xfa\xff\xff\xff\x00\x96\xd3') >>> assert Dot15d4FCS in pkt.layers() >>> assert pkt[Dot15d4FCS].fcf_frametype == 0 >>> assert pkt[Dot15d4FCS].fcf_security == False >>> assert pkt[Dot15d4FCS].fcf_pending == False >>> assert pkt[Dot15d4FCS].fcf_ackreq == False >>> assert pkt[Dot15d4FCS].fcf_panidcompress == False >>> assert pkt[Dot15d4FCS].fcf_destaddrmode == 0 >>> assert pkt[Dot15d4FCS].fcf_framever == 0 >>> assert pkt[Dot15d4FCS].fcf_srcaddrmode == 2 >>> assert pkt[Dot15d4FCS].seqnum == 137 >>> assert Dot15d4Beacon in pkt.layers() >>> assert pkt[Dot15d4Beacon].src_panid == 0x99aa >>> assert pkt[Dot15d4Beacon].src_addr == 0x0000 >>> assert pkt[Dot15d4Beacon].sf_beaconorder == 15 >>> assert pkt[Dot15d4Beacon].sf_sforder == 15 >>> assert pkt[Dot15d4Beacon].sf_finalcapslot == 15 >>> assert pkt[Dot15d4Beacon].sf_battlifeextend == False >>> assert pkt[Dot15d4Beacon].sf_pancoord == True >>> assert pkt[Dot15d4Beacon].sf_assocpermit == True >>> assert pkt[Dot15d4Beacon].gts_spec_permit == False >>> assert pkt[Dot15d4Beacon].gts_spec_reserved == 0 >>> assert pkt[Dot15d4Beacon].gts_spec_desccount == 0 >>> assert pkt[Dot15d4Beacon].pa_num_short == 2 >>> assert pkt[Dot15d4Beacon].pa_num_long == 1 >>> assert pkt[Dot15d4Beacon].pa_short_addresses == [0x1234, 0x5678] >>> assert pkt[Dot15d4Beacon].pa_long_addresses == [0x1122334455667788] >>> assert raw(pkt[Dot15d4Beacon].payload) == b'\x00"\x84\xfe\xca\xef\xbe\xed\xfe\xce\xfa\xff\xff\xff\x00' >>> assert pkt[Dot15d4FCS].fcs == 0xd396 ###(004)=[passed] Dot15d4FCS - Coordinator Realignment (without the channel page) >>> pkt = Dot15d4FCS(b'#\xcc\x89\xff\xff\x88wfUD3"\x11\xaa\x99\xff\xee\xdd\xcc\xbb\xaa\x99\x88\x08\xaa\x99\xde\xc0\x14\xad\xde\\!') >>> assert Dot15d4FCS in pkt.layers() >>> assert pkt[Dot15d4FCS].fcf_frametype == 3 >>> assert pkt[Dot15d4FCS].fcf_security == False >>> assert pkt[Dot15d4FCS].fcf_pending == False >>> assert pkt[Dot15d4FCS].fcf_ackreq == True >>> assert pkt[Dot15d4FCS].fcf_panidcompress == False >>> assert pkt[Dot15d4FCS].fcf_destaddrmode == 3 >>> assert pkt[Dot15d4FCS].fcf_framever == 0 >>> assert pkt[Dot15d4FCS].fcf_srcaddrmode == 3 >>> assert pkt[Dot15d4FCS].seqnum == 137 >>> assert Dot15d4Cmd in pkt.layers() >>> assert pkt[Dot15d4Cmd].dest_panid == 0xffff >>> assert pkt[Dot15d4Cmd].dest_addr == 0x1122334455667788 >>> assert pkt[Dot15d4Cmd].src_panid == 0x99aa >>> assert pkt[Dot15d4Cmd].src_addr == 0x8899aabbccddeeff >>> assert pkt[Dot15d4Cmd].cmd_id == 0x08 >>> assert Dot15d4CmdCoordRealign in pkt.layers() >>> assert pkt[Dot15d4CmdCoordRealign].panid == 0x99aa >>> assert pkt[Dot15d4CmdCoordRealign].coord_address == 0xc0de >>> assert pkt[Dot15d4CmdCoordRealign].channel == 20 >>> assert pkt[Dot15d4CmdCoordRealign].dev_address == 0xdead >>> assert raw(pkt[Dot15d4CmdCoordRealign].payload) == b'' >>> assert pkt[Dot15d4FCS].fcs == 0x215c ###(005)=[passed] Dot15d4FCS - Coordinator Realignment (with the channel page) >>> pkt = Dot15d4FCS(b'#\xcc\x89\xff\xff\x88wfUD3"\x11\xaa\x99\xff\xee\xdd\xcc\xbb\xaa\x99\x88\x08\xaa\x99\xde\xc0\x14\xad\xde\x00\xc8\x98') >>> assert Dot15d4FCS in pkt.layers() >>> assert pkt[Dot15d4FCS].fcf_frametype == 3 >>> assert pkt[Dot15d4FCS].fcf_security == False >>> assert pkt[Dot15d4FCS].fcf_pending == False >>> assert pkt[Dot15d4FCS].fcf_ackreq == True >>> assert pkt[Dot15d4FCS].fcf_panidcompress == False >>> assert pkt[Dot15d4FCS].fcf_destaddrmode == 3 >>> assert pkt[Dot15d4FCS].fcf_framever == 0 >>> assert pkt[Dot15d4FCS].fcf_srcaddrmode == 3 >>> assert pkt[Dot15d4FCS].seqnum == 137 >>> assert Dot15d4Cmd in pkt.layers() >>> assert pkt[Dot15d4Cmd].dest_panid == 0xffff >>> assert pkt[Dot15d4Cmd].dest_addr == 0x1122334455667788 >>> assert pkt[Dot15d4Cmd].src_panid == 0x99aa >>> assert pkt[Dot15d4Cmd].src_addr == 0x8899aabbccddeeff >>> assert pkt[Dot15d4Cmd].cmd_id == 0x08 >>> assert Dot15d4CmdCoordRealign in pkt.layers() >>> assert pkt[Dot15d4CmdCoordRealign].panid == 0x99aa >>> assert pkt[Dot15d4CmdCoordRealign].coord_address == 0xc0de >>> assert pkt[Dot15d4CmdCoordRealign].channel == 20 >>> assert pkt[Dot15d4CmdCoordRealign].dev_address == 0xdead >>> assert Dot15d4CmdCoordRealignPage in pkt.layers() >>> assert pkt[Dot15d4CmdCoordRealignPage].channel_page == 0 >>> assert raw(pkt[Dot15d4CmdCoordRealignPage].payload) == b'' >>> assert pkt[Dot15d4FCS].fcs == 0x98c8 ###### ## SixLoWPAN tests ###### ###(006)=[passed] Set SixLoWPAN >>> conf.dot15d4_protocol = "sixlowpan" ###(007)=[passed] SixLoWPAN layers >>> pkt = SixLoWPAN()/LoWPANFragmentationFirst()/LoWPANFragmentationSubsequent()/LoWPANMesh()/LoWPANUncompressedIPv6() >>> assert SixLoWPAN in pkt.layers() >>> assert LoWPANFragmentationFirst in pkt.layers() >>> assert LoWPANFragmentationSubsequent in pkt.layers() >>> assert LoWPANMesh in pkt.layers() >>> assert LoWPANUncompressedIPv6 in pkt.layers() ###(008)=[passed] Default dissection >>> lowpan_frag_first = b'\xc29\x00\x17`\x00\x00\x00\x00\x00\x00\x00 \x02\r\xb8\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x01 \x02\r\xb8\x00\x00\x00\x00\x00\x11"\xff\xfe3DU\xc4\xf9\x00Pw\x9b\x18\x9d\x00\x00\x01\xa2P\x18\x13X\x08\x10\x00\x00GET / HTTP/1.1\r\nHost: [aaaa::11:22ff' >>> lowpan_frag_first_packet = SixLoWPAN(lowpan_frag_first) >>> >>> assert lowpan_frag_first_packet.load == b'\xc4\xf9\x00Pw\x9b\x18\x9d\x00\x00\x01\xa2P\x18\x13X\x08\x10\x00\x00GET / HTTP/1.1\r\nHost: [aaaa::11:22ff' ###(009)=[passed] Frag second dissection >>> lowpan_frag_second = b'\xe29\x00\x17\x0c`\x00\x00\x00\x00\x00\x00\x00 \x02\r\xb8\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x01 \x02\r\xb8\x00\x00\x00\x00\x00\x11"\xff\xfe3DUerer: http://[aaaa::11:22ff:fe33:4455]/sensor.shtml\r\nUse' >>> lowpan_frag_sec_packet = SixLoWPAN(lowpan_frag_second) >>> >>> assert LoWPANFragmentationSubsequent in lowpan_frag_sec_packet >>> assert lowpan_frag_sec_packet.datagramSize == 569 >>> assert lowpan_frag_sec_packet.datagramTag == 0x17 ###(010)=[passed] LoWPAN_IPHC dissections >>> lowpan_iphc = b"\x78\xf6\x00\x06\x80\x00\x01\x00\x50\xc4\xf9\x00\x00\x02\x12\x77\x9b\x1a\x9a\x50\x18\x04\xc4\x12\xd5\x00\x00\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x48\x54\x4d\x4c\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x48\x54\x4d\x4c\x20\x34\x2e\x30\x31\x20\x54\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x61\x6c\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70" >>> lowpan_frag_iphc = LoWPAN_IPHC(lowpan_iphc) >>> >>> assert IPv6 in lowpan_frag_iphc >>> assert lowpan_frag_iphc.load == b'>> >>> p = LoWPAN_IPHC(tf=0x0, flowlabel=0x8, nhField=0x3a, hopLimit=64)/IPv6(dst="aaaa::11:22ff:fe33:4455", src="aaaa::1")/ICMPv6EchoRequest() >>> p = LoWPAN_IPHC(raw(p)) >>> assert ICMPv6EchoRequest in p >>> assert p.dst == "aaaa::11:22ff:fe33:4455" >>> >>> q = LoWPAN_IPHC(tf=0x0) >>> assert raw(q) == b'`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' ###(011)=[passed] LoWPAN_IPHC - M=1, DAC=1, DAM=0 >>> p = Dot15d4(b'a\x88\x10"\x00\x13\x00\x16Pw\x9cB\xe6\x87`\x12\xe1\x08~\x04\x08\x00\x00\x00\xf0Q\xc7\x1bX\x9e\xf3\x00\x00\x00\x1c\xfa\xfa\xfa\xfa\xe7k') >>> >>> assert p.m == 1 >>> assert p.dac == 1 >>> assert p.dam == 0 >>> assert p.dst == "ff00::f0:51c7" >>> >>> p = Dot15d4(raw(p)) >>> assert p.dst == "ff00::f0:51c7" >>> >>> assert raw(p) == b'a\x88\x10"\x00\x13\x00\x16Pw\x9cB\xe6\x87`\x12\xe1\x08~\x04\x08\x00\x00\x00\xf0Q\xc7\x1bX\x9e\xf3\x00\x00\x00\x1c\xfa\xfa\xfa\xfa\xe7k' ###(012)=[passed] LoWPAN_NHC - NHC_UDP >>> p = Dot15d4(b'A\x88\x00"\x00\xff\xff\x13\x00};\x01\xf0\xda\xc9\xda\xc9\x85\x80\xc8\x00\x00\x00\x00\x00\x00\x00\xf2\xeb') >>> >>> assert LoWPAN_NHC in p >>> assert p[LoWPAN_NHC].exts[0].udpSourcePort == 56009 >>> assert p[LoWPAN_NHC].exts[0].udpDestPort == 56009 >>> assert p[LoWPAN_NHC].exts[0].udpChecksum == 0x8580 >>> assert p[UDP].sport == 56009 >>> assert p[UDP].dport == 56009 >>> >>> p.clear_cache() >>> >>> assert raw(p) == b'A\x88\x00"\x00\xff\xff\x13\x00};\x01\xf0\xda\xc9\xda\xc9\x85\x80\xc8\x00\x00\x00\x00\x00\x00\x00\xf2\xeb' ###(013)=[passed] LoWPAN_NHC - compute UDP NHC_UDP >>> p = Dot15d4()/Dot15d4Data()/LoWPAN_IPHC()/LoWPAN_NHC()/IPv6()/UDP(sport=61618, dport=61621) >>> assert raw(p) == b'\x01\x08\x01\xff\xff\xff\xffd\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xf3%\x1et' >>> >>> assert p.exts[0].udpSourcePort == 2 >>> assert p.exts[0].udpDestPort == 5 >>> assert p.exts[0].udpChecksum == 0x1e74 ###(014)=[passed] LoWPAN_NHC - NHC_IPv6Ext >>> p = Dot15d4(b'a\x88\x07"\x00\x16\x00\x13\x00|f\x10\x00\x13\x00\x12\xe1\x08~\x04\n\x00\x00\x00\xf0Q\xc7\x1bX\x9f\t\x00\x00\x00\t\xfa\xfa\xfa\xfa\xf0\xeb') >>> >>> assert LoWPAN_NHC in p >>> assert p[LoWPAN_NHC].exts[0].eid == 0 >>> assert p[LoWPAN_NHC].exts[0].len == 8 >>> assert p[LoWPAN_NHC].exts[0].data == b'~\x04\n\x00\x00\x00\xf0Q' ###(015)=[passed] LoWPAN_HC1 dissection & build >>> dat = b'\x00"\x19\x100\xe5\x00\x1c\xda\x00\x00\x01\x08\x00E\x00\x00m\xc7\xf3\x00\x00@\x11W\x0f\xac\x10\x02)\xac\x10\x014EZEZ\x00Y\x8f\xaaEX\x02\x01\x00\x00\x01\x01\xff\x00\x0c\xd14\x7f\xc1H4\x00\x05\xc68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001A\xcc\xa5\xff\xff\x8a\x18\x00\xff\xff\xda\x1c\x00\x88\x18\x00\xff\xff\xda\x1c\x00B\xfb`@\x04\x01\x1f\x88\xc0Hello 005 0x626B\n\xa5\x0b' >>> p = Ether(dat) >>> p.clear_cache() >>> >>> assert p[LoWPAN_HC1].src == p[IPv6].src == 'fe80::21c:daff:ff00:1888' >>> assert p[LoWPAN_HC1].dst == p[IPv6].dst == 'fe80::21c:daff:ff00:188a' >>> assert p[LoWPAN_HC1].hopLimit == p[IPv6].hlim == 64 >>> assert p[LoWPAN_HC1].hc2Field.sc == 0 >>> assert p[LoWPAN_HC1].hc2Field.dc == 1 >>> assert p[LoWPAN_HC1].hc2Field.lc == 1 >>> assert p[IPv6].nh == socket.IPPROTO_UDP >>> assert p[LoWPAN_HC1].udpSourcePort == p.getlayer(UDP, 2).sport == 1025 >>> assert p[LoWPAN_HC1].udpDestPort == p.getlayer(UDP, 2).dport == 61617 >>> assert p[LoWPAN_HC1].udpChecksum == p.getlayer(UDP, 2).chksum == 0xf88c >>> assert p.getlayer(UDP, 2).len == 27 >>> >>> assert raw(p) == dat ###(016)=[passed] LoWPAN_HC1 build from scratch >>> a = Dot15d4()/Dot15d4Data()/LoWPAN_HC1()/IPv6()/UDP() >>> assert raw(a) == b'\x01\x08\x01\xff\xff\xff\xffB\x03\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x03P\x03P\x00\x8f\xf7 ' >>> >>> a = Dot15d4(raw(a)) >>> assert a[LoWPAN_HC1].nh == 1 >>> assert a[LoWPAN_HC1].hc2 == 1 >>> assert a[LoWPAN_HC1].udpDestPort >>> assert a[LoWPAN_HC1].udpSourcePort ###(017)=[passed] Advanced packets - dissection & FCS computation >>> ieee802_firstfrag = b"\x41\xcc\xa3\xcd\xab\x16\x15\x14\xfe\xff\x13\x12\x02\x55\x44\x33\xfe\xff\x22\x11\x02\xc3\x42\x00\x23\x78\xf6\x00\x06\x80\x00\x01\x00\x50\xc4\xf9\x00\x00\x02\x12\x77\x9b\x1a\x9a\x50\x18\x04\xc4\x12\xd5\x00\x00\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x48\x54\x4d\x4c\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\x2f\x2f\x44\x54\x44\x20\x48\x54\x4d\x4c\x20\x34\x2e\x30\x31\x20\x54\x72\x61\x6e\x73\x69\x74\x69\x6f\x6e\x61\x6c\x2f\x2f\x45\x4e\x22\x20\x22\x68\x74\x74\x70\x39\xb5" >>> ieee = Dot15d4FCS(ieee802_firstfrag) >>> ieee.show() ###[ 802.15.4 - FCS ]### fcf_reserved_1= 0 fcf_panidcompress= True fcf_ackreq= False fcf_pending= False fcf_security= False fcf_frametype= Data fcf_srcaddrmode= Long fcf_framever= 0 fcf_destaddrmode= Long fcf_reserved_2= 0 seqnum = 163 fcs = 0xb539 ###[ 802.15.4 Data ]### dest_panid= 0xabcd dest_addr = 02:12:13:ff:fe:14:15:16 src_addr = 02:11:22:ff:fe:33:44:55 ###[ 6LoWPAN First Fragmentation Packet ]### reserved = 24 datagramSize= 834 datagramTag= 0x23 ###[ LoWPAN IP Header Compression Packet ]### _reserved = 3 tf = 3 nh = Inline hlim = Inline cid = Present (1) sac = Stateful (1) sam = Compressed (3) m = 0 dac = Stateful (1) dam = 16-bits inline (3) sci = 0 dci = 0 nhField = TCP hopLimit = 128 src = fe80:: dst = ::1 ###[ Raw ]### load = b'\x00P\xc4\xf9\x00\x00\x02\x12w\x9b\x1a\x9aP\x18\x04\xc4\x12\xd5\x00\x00>> assert ieee.fcs == 0xb539 >>> >>> del ieee.fcs >>> ieee = Dot15d4FCS(raw(ieee)) >>> assert ieee.fcs == 0xb539 >>> >>> >>> ieee802_secfrag = b"\x41\xcc\x4d\xcd\xab\x55\x44\x33\xfe\xff\x22\x11\x02\x16\x15\x14\xfe\xff\x13\x12\x02\xe2\x39\x00\x17\x10\x69\x76\x65\x0d\x0a\x52\x65\x66\x65\x72\x65\x72\x3a\x20\x68\x74\x74\x70\x3a\x2f\x2f\x5b\x61\x61\x61\x61\x3a\x3a\x31\x31\x3a\x32\x32\x66\x66\x3a\x66\x65\x33\x33\x3a\x34\x34\x35\x35\x5d\x2f\x73\x65\x6e\x73\x6f\x72\x2e\x73\x68\x74\x6d\x6c\x0d\x0a\x55\x73\x65\x72\x2d\x41\x67\x65\x6e\x74\x3a\x20\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x58\x31\x31\x3b\x20\x55\x3b\x20\x4c\x69\x66\xac" >>> ieee = Dot15d4FCS(ieee802_secfrag) >>> ieee.show() ###[ 802.15.4 - FCS ]### fcf_reserved_1= 0 fcf_panidcompress= True fcf_ackreq= False fcf_pending= False fcf_security= False fcf_frametype= Data fcf_srcaddrmode= Long fcf_framever= 0 fcf_destaddrmode= Long fcf_reserved_2= 0 seqnum = 77 fcs = 0xac66 ###[ 802.15.4 Data ]### dest_panid= 0xabcd dest_addr = 02:11:22:ff:fe:33:44:55 src_addr = 02:12:13:ff:fe:14:15:16 ###[ 6LoWPAN Subsequent Fragmentation Packet ]### reserved = 28 datagramSize= 569 datagramTag= 0x17 datagramOffset= 16 ###[ Raw ]### load = b'ive\r\nReferer: http://[aaaa::11:22ff:fe33:4455]/sensor.shtml\r\nUser-Agent: Mozilla/5.0 (X11; U; Li' >>> assert ieee.fcs == 0xac66 >>> >>> del ieee.fcs >>> ieee = Dot15d4FCS(raw(ieee)) >>> assert ieee.fcs == 0xac66 >>> >>> ieee802_iphc = b"\x41\xcc\xb5\xcd\xab\x16\x15\x14\xfe\xff\x13\x12\x02\x55\x44\x33\xfe\xff\x22\x11\x02\x78\xf6\x00\x06\x80\x00\x01\x00\x50\xc4\xfa\x00\x00\x01\xf7\x89\xf3\x02\x5f\x50\x18\x04\xc4\x48\x28\x00\x00\x43\x6f\x6e\x74\x65\x6e\x74\x2d\x74\x79\x70\x65\x3a\x20\x74\x65\x78\x74\x2f\x63\x73\x73\x0d\x0a\x0d\x0a\xc1\x16" >>> ieee = Dot15d4FCS(ieee802_iphc) >>> ieee.show() ###[ 802.15.4 - FCS ]### fcf_reserved_1= 0 fcf_panidcompress= True fcf_ackreq= False fcf_pending= False fcf_security= False fcf_frametype= Data fcf_srcaddrmode= Long fcf_framever= 0 fcf_destaddrmode= Long fcf_reserved_2= 0 seqnum = 181 fcs = 0x16c1 ###[ 802.15.4 Data ]### dest_panid= 0xabcd dest_addr = 02:12:13:ff:fe:14:15:16 src_addr = 02:11:22:ff:fe:33:44:55 ###[ LoWPAN IP Header Compression Packet ]### _reserved = 3 tf = 3 nh = Inline hlim = Inline cid = Present (1) sac = Stateful (1) sam = Compressed (3) m = 0 dac = Stateful (1) dam = 16-bits inline (3) sci = 0 dci = 0 nhField = TCP hopLimit = 128 src = fe80:: dst = ::1 ###[ IPv6 ]### version = 6 tc = 0 fl = 0 plen = 46 nh = TCP hlim = 128 src = fe80:: dst = ::1 ###[ TCP ]### sport = http dport = 50426 seq = 503 ack = 2314404447 dataofs = 5 reserved = 0 flags = PA window = 1220 chksum = 0x4828 urgptr = 0 options = [] ###[ HTTP 1 ]### ###[ Raw ]### load = b'Content-type: text/css\r\n\r\n' >>> assert ieee.fcs == 0x16c1 >>> >>> assert ieee[LoWPAN_IPHC].dst == '::1' >>> >>> del ieee.fcs >>> ieee = Dot15d4FCS(raw(ieee)) >>> assert ieee.fcs == 0x16c1 ###(018)=[passed] Dot15d4AuxSecurityHeader - build & dissect >>> p = Dot15d4AuxSecurityHeader(b"\x04\x05\x00\x00\x00") >>> assert p.sec_sc_keyidmode == 0 >>> assert p.sec_sc_seclevel == 4 >>> >>> p = Dot15d4AuxSecurityHeader(b"\x18\x05\x00\x00\x00\xff\xee\xdd\xcc\xbb\xaa\x00\x99\x88\x77") >>> assert p.sec_sc_keyidmode == 3 >>> assert p.sec_keyid_keysource == 11024999611375677183 ###(019)=[passed] Fragmentate packet & defragmentate >>> ipv6p = b"\x60\x00\x00\x00\x02\x11\x06\x80\x20\x02\x0d\xb8\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x01\x20\x02\x0d\xb8\x00\x00\x00\x00\x00\x11\x22\xff\xfe\x33\x44\x55" >>> tcpp = b"\xc4\xf9\x00\x50\x77\x9b\x18\x9d\x00\x00\x01\xa2\x50\x18\x13\x58\x08\x10\x00\x00" >>> httpp = b"\x47\x45\x54\x20\x2f\x20\x48\x54\x54\x50\x2f\x31\x2e\x31\x0d\x0a\x48\x6f\x73\x74\x3a\x20\x5b\x61\x61\x61\x61\x3a\x3a\x31\x31\x3a\x32\x32\x66\x66\x3a\x66\x65\x33\x33\x3a\x34\x34\x35\x35\x5d\x0d\x0a\x43\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x3a\x20\x6b\x65\x65\x70\x2d\x61\x6c\x69\x76\x65\x0d\x0a\x52\x65\x66\x65\x72\x65\x72\x3a\x20\x68\x74\x74\x70\x3a\x2f\x2f\x5b\x61\x61\x61\x61\x3a\x3a\x31\x31\x3a\x32\x32\x66\x66\x3a\x66\x65\x33\x33\x3a\x34\x34\x35\x35\x5d\x2f\x73\x65\x6e\x73\x6f\x72\x2e\x73\x68\x74\x6d\x6c\x0d\x0a\x55\x73\x65\x72\x2d\x41\x67\x65\x6e\x74\x3a\x20\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x58\x31\x31\x3b\x20\x55\x3b\x20\x4c\x69\x6e\x75\x78\x20\x69\x36\x38\x36\x3b\x20\x65\x6e\x2d\x55\x53\x29\x20\x41\x70\x70\x6c\x65\x57\x65\x62\x4b\x69\x74\x2f\x35\x33\x34\x2e\x31\x36\x20\x28\x4b\x48\x54\x4d\x4c\x2c\x20\x6c\x69\x6b\x65\x20\x47\x65\x63\x6b\x6f\x29\x20\x55\x62\x75\x6e\x74\x75\x2f\x31\x30\x2e\x31\x30\x20\x43\x68\x72\x6f\x6d\x69\x75\x6d\x2f\x31\x30\x2e\x30\x2e\x36\x34\x38\x2e\x31\x33\x33\x20\x43\x68\x72\x6f\x6d\x65\x2f\x31\x30\x2e\x30\x2e\x36\x34\x38\x2e\x31\x33\x33\x20\x53\x61\x66\x61\x72\x69\x2f\x35\x33\x34\x2e\x31\x36\x0d\x0a\x41\x63\x63\x65\x70\x74\x3a\x20\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x78\x6d\x6c\x2c\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x78\x68\x74\x6d\x6c\x2b\x78\x6d\x6c\x2c\x74\x65\x78\x74\x2f\x68\x74\x6d\x6c\x3b\x71\x3d\x30\x2e\x39\x2c\x74\x65\x78\x74\x2f\x70\x6c\x61\x69\x6e\x3b\x71\x3d\x30\x2e\x38\x2c\x69\x6d\x61\x67\x65\x2f\x70\x6e\x67\x2c\x2a\x2f\x2a\x3b\x71\x3d\x30\x2e\x35\x0d\x0a\x41\x63\x63\x65\x70\x74\x2d\x45\x6e\x63\x6f\x64\x69\x6e\x67\x3a\x20\x67\x7a\x69\x70\x2c\x64\x65\x66\x6c\x61\x74\x65\x2c\x73\x64\x63\x68\x0d\x0a\x41\x63\x63\x65\x70\x74\x2d\x4c\x61\x6e\x67\x75\x61\x67\x65\x3a\x20\x65\x6e\x2d\x55\x53\x2c\x65\x6e\x3b\x71\x3d\x30\x2e\x38\x0d\x0a\x41\x63\x63\x65\x70\x74\x2d\x43\x68\x61\x72\x73\x65\x74\x3a\x20\x49\x53\x4f\x2d\x38\x38\x35\x39\x2d\x31\x2c\x75\x74\x66\x2d\x38\x3b\x71\x3d\x30\x2e\x37\x2c\x2a\x3b\x71\x3d\x30\x2e\x33\x0d\x0a\x0d\x0a" >>> ipv6_tcp_http = IPv6(ipv6p + tcpp + httpp) >>> pkt = sixlowpan_fragment(ipv6_tcp_http, 0x17) >>> >>> assert len(pkt) == 6 >>> assert isinstance(pkt[0], LoWPANFragmentationFirst) >>> assert all(isinstance(x, LoWPANFragmentationSubsequent) for x in pkt[1:]) >>> >>> ipv6 = sixlowpan_defragment(pkt)[0x17] >>> assert TCP in ipv6 >>> assert raw(ipv6_tcp_http) == raw(ipv6) ###(020)=[passed] Mesh Header. >>> ###(021)=[passed] SixLoWPAN - Advanced 1 >>> packet = LoWPAN_IPHC(b"\x7b\x49\x3a\x02\x01\xff\x02\x02\x02\x87\x00\x02\x0b\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x12\x74\x02\x00\x02\x02\x02") >>> assert packet.nhField == 0x3a >>> assert packet.src == "::" >>> assert packet.dst == "ff02::1:ff02:202" ###(022)=[passed] SixLoWPAN - Advanced 2 >>> packet = SixLoWPAN(b"\x7b\x49\x3a\x02\x01\xff\x01\x01\x01\x87\x00\x57\xe6\x00\x00\x00\x00\xaa\xaa\x00\x00\x00\x00\x00\x00\x02\x12\x74\x01\x00\x01\x01\x01") >>> assert packet.nhField == 0x3a >>> assert packet.src == "::" >>> assert packet.dst == "ff02::1:ff01:101" ###(023)=[passed] SixLoWPAN - Advanced 3 >>> packet = Ether()/IP()/UDP()/ZEP2()/Dot15d4(fcf_srcaddrmode=2)/Dot15d4Data(src_addr=0x0)/b"\x7b\x33\x3a\x88\x00\x3c\xb9\x60\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x12\x74\x02\x00\x02\x02\x02\x02\x02\x00\x12\x74\x02\x00\x02\x02\x02\x00\x00\x00\x00\x00\x00" >>> packet = Ether(raw(packet)) >>> packet.show2() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 114 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7c78 src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = zep dport = zep len = 94 chksum = 0xe776 ###[ Zigbee Encapsulation Protocol (V2) ]### preamble = b'EX' ver = 0 type = 0 channel = 0 device = 0 lqi_mode = 1 lqi_val = 0 timestamp = 0 seq = 0 res = 0 length = 0 ###[ 802.15.4 ]### fcf_reserved_1= 0 fcf_panidcompress= False fcf_ackreq= False fcf_pending= False fcf_security= False fcf_frametype= Data fcf_srcaddrmode= Short fcf_framever= 0 fcf_destaddrmode= Short fcf_reserved_2= 0 seqnum = 1 ###[ 802.15.4 Data ]### dest_panid= 0xffff dest_addr = 0xffff src_panid = 0x0 src_addr = 0x0 ###[ LoWPAN IP Header Compression Packet ]### _reserved = 3 tf = 3 nh = Inline hlim = Compressed/HL255 cid = 0 sac = Stateless (0) sam = Compressed (3) m = 0 dac = Stateless (0) dam = Compressed (3) nhField = ICMPv6 src = fe80::ff:fe00:0 dst = fe80::ff:fe00:ffff ###[ IPv6 ]### version = 6 tc = 0 fl = 0 plen = 40 nh = ICMPv6 hlim = 255 src = fe80::ff:fe00:0 dst = fe80::ff:fe00:ffff ###[ ICMPv6 Neighbor Discovery - Neighbor Advertisement ]### type = Neighbor Advertisement code = 0 cksum = 0x3cb9 R = 0 S = 1 O = 1 res = 0x0 tgt = fe80::212:7402:2:202 ###[ ICMPv6 Neighbor Discovery Option - Destination Link-Layer Address ]### type = 2 len = 2 lladdr = 00:12:74:02:00:02 ###[ ICMPv6 Neighbor Discovery Option - Destination Link-Layer Address ]### type = 2 len = 2 lladdr = 00:00:00:00:00:00 >>> assert packet[LoWPAN_IPHC].src == 'fe80::ff:fe00:0' >>> assert packet[LoWPAN_IPHC].dst == 'fe80::ff:fe00:ffff' ###(024)=[passed] SixLoWPAN - Using ICMP >>> icmp = b"\x7b\xf6\x00\x3a\x00\x01\x87\x00\xaa\x66\x00\x00\x00\x00\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x02\x02\x11\x22\xff\xfe\x33\x44\x55\x00\x00\x00\x00\x00\x00" >>> packet = SixLoWPAN(icmp) >>> assert packet.tf == 0x3 >>> assert packet.nh == 0 >>> assert packet.hlim == 0x3 >>> assert packet.cid == True >>> assert packet.sac == True >>> assert packet.sam == 0x3 >>> assert packet.m == False >>> assert packet.dac == True >>> assert packet.dam == 0x2 >>> assert packet.nhField == 0x3a ###(025)=[passed] LoWPAN_IPHC - Extracted packet >>> icmp = Ether()/IP()/UDP()/ZEP2()/Dot15d4(fcf_srcaddrmode=2)/Dot15d4Data(src_addr=0xFFFF)/b"\x7b\x3b\x3a\x01\x86\x00\xd3\xfd\x80\x00\x00\xc8\x00\x05\x7e\x40\x00\x00\x00\x00\x03\x04\x40\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x05\x00\x01\x02\x02\x12\x13\xff\xfe\x14\x15\x16\x7b\x66\x6f\x6e\x74\x2d" >>> packet = Ether(raw(icmp)) >>> assert packet[LoWPAN_IPHC][IPv6].dst == 'ff02::1' >>> >>> eth = Ether()/IP()/UDP()/ZEP2()/Dot15d4()/Dot15d4Data()/b"\x41\xc8\x49\xcd\xab\xff\xff\x16\x15\x14\xfe\xff\x13\x12\x02\x7b\x3b\x3a\x01\x86\x00\xd3\xfd\x80\x00\x00\xc8\x00\x05\x7e\x40\x00\x00\x00\x00\x03\x04\x40\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x01\x00\x00\x00\x00\x05\x00\x01\x02\x02\x12\x13\xff\xfe\x14\x15\x16\x7b\x66\x6f\x6e\x74\x2d\xa0\x90" >>> packet = Ether(raw(eth)) >>> assert LoWPANUncompressedIPv6 in packet ###(026)=[passed] LoWPAN_IPHC - Extracted packet 2 >>> udp = Ether()/IP()/UDP()/ZEP2()/Dot15d4()/Dot15d4Data()/b"\x7e\xf7\x00\xf0\x22\x3d\x16\x2e\x8e\x60\x10\x03\x00\x00\xaa\xaa\x00\x00\x00\x00\x00\x00\x48\x65\x6c\x6c\x6f\x20\x31\x20\x66\x72\x6f\x6d\x20\x74\x68\x65\x20\x63\x6c\x69\x65\x6e\x74\x2e\x2d\x2e\x2d\x2e\x2d\x20\x30\x20\x33\x34\x35\x36\x37\x38\x39\x20\x31\x20\x33\x34\x35\x36\x37\x38\x39\x20\x32\x20\x33\x34\x35\x36\x37\x38\x39\x20\x33\x20\x33\x34\x35\x36\x37\x38\x39\x20\x34\x20\x33\x34\x35\x36" >>> packet = Ether(raw(udp)) >>> assert packet.exts[0].udpSourcePort == 8765 >>> assert packet.exts[0].udpDestPort == 5678 >>> assert packet.exts[0].udpChecksum == 0x8e60 >>> assert packet[IPv6].nh == 0x11 # the ipv6 header >>> assert packet[IPv6][UDP].sport == 8765 #udp decompressed header >>> assert packet[IPv6][UDP].dport == 5678 #udp decompressed header >>> assert packet[IPv6][UDP].chksum == 0x8e60 #udp decompressed header >>> packet.show2() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 165 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7c45 src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = zep dport = zep len = 145 chksum = 0x54b ###[ Zigbee Encapsulation Protocol (V2) ]### preamble = b'EX' ver = 0 type = 0 channel = 0 device = 0 lqi_mode = 1 lqi_val = 0 timestamp = 0 seq = 0 res = 0 length = 0 ###[ 802.15.4 ]### fcf_reserved_1= 0 fcf_panidcompress= False fcf_ackreq= False fcf_pending= False fcf_security= False fcf_frametype= Data fcf_srcaddrmode= None fcf_framever= 0 fcf_destaddrmode= Short fcf_reserved_2= 0 seqnum = 1 ###[ 802.15.4 Data ]### dest_panid= 0xffff dest_addr = 0xffff ###[ LoWPAN IP Header Compression Packet ]### _reserved = 3 tf = 3 nh = Compressed hlim = Compressed/HL64 cid = Present (1) sac = Stateful (1) sam = Compressed (3) m = 0 dac = Stateful (1) dam = Compressed (3) sci = 0 dci = 0 src = fe80:: dst = fe80::ff:fe00:ffff ###[ LOWPAN_NHC ]### \exts \ |###[ LoWPAN_NHC_UDP ]### | res = 30 | C = 0 | P = 0 | udpSourcePort= 8765 | udpDestPort= 5678 | udpChecksum= 0x8e60 ###[ IPv6 ]### version = 6 tc = 0 fl = 0 plen = 96 nh = UDP hlim = 64 src = fe80:: dst = fe80::ff:fe00:ffff ###[ UDP ]### sport = ultraseek_http dport = rrac len = 96 chksum = 0x8e60 ###[ Raw ]### load = b'\x10\x03\x00\x00\xaa\xaa\x00\x00\x00\x00\x00\x00Hello 1 from the client.-.-.- 0 3456789 1 3456789 2 3456789 3 3456789 4 3456' ###(027)=[passed] SixLoWPAN - Check Traffic Class and Flow Label when TF=0 >>> packet = SixLoWPAN()/LoWPAN_IPHC(tf=0)/IPv6(tc = 12, fl=467) >>> packet = SixLoWPAN(raw(packet)) >>> assert (packet.tc_ecn << 6) + packet.tc_dscp == 12 >>> assert packet.flowlabel == 467 ###(028)=[passed] SixLoWPAN - Check Traffic Class and Flow Label when TF=1 >>> packet = SixLoWPAN()/LoWPAN_IPHC(tf=1)/IPv6(tc = 12, fl=467) >>> packet = SixLoWPAN(raw(packet)) >>> assert packet.tc_ecn == 0 and packet.flowlabel == 467 ###(029)=[passed] SixLoWPAN - Check Traffic Class and Flow Label when TF=2 >>> packet = SixLoWPAN()/LoWPAN_IPHC(tf=2)/IPv6(tc = 12, fl=467) >>> packet = SixLoWPAN(raw(packet)) >>> assert (packet.tc_ecn << 6) + packet.tc_dscp == 12 and packet.flowlabel is None >>> packet = SixLoWPAN()/LoWPAN_IPHC(tf=3)/IPv6(tc = 12, fl=467) >>> packet = SixLoWPAN(raw(packet)) >>> assert packet.tc_ecn is None and packet.tc_dscp is None and packet.flowlabel is None ###(030)=[passed] SixLoWPAN - Checking the Hop Limit value in the IPv6 packet decompressed >>> packet = SixLoWPAN()/LoWPAN_IPHC()/IPv6(tc = 12, fl=467, hlim=65)/ICMPv6EchoRequest() >>> packet = SixLoWPAN(raw(packet)) >>> assert packet[IPv6].hlim == 65 >>> packet = SixLoWPAN()/LoWPAN_IPHC(hlim=1)/IPv6(tc = 12, fl=467, hlim=65)/ICMPv6EchoRequest() >>> packet = SixLoWPAN(raw(packet)) >>> assert packet[IPv6].hlim == 1 >>> packet = SixLoWPAN()/LoWPAN_IPHC(hlim=2)/IPv6(tc = 12, fl=467, hlim=65)/ICMPv6EchoRequest() >>> packet = SixLoWPAN(raw(packet)) >>> assert packet[IPv6].hlim == 64 >>> packet = SixLoWPAN()/LoWPAN_IPHC(hlim=3)/IPv6(tc = 12, fl=467, hlim=65)/ICMPv6EchoRequest() >>> packet = SixLoWPAN(raw(packet)) >>> assert packet[IPv6].hlim == 255 ###(031)=[passed] SixLoWPAN - Check Source Address >>> packet = SixLoWPAN()/LoWPAN_IPHC(sam = 0, sac = 0, dst='ff02::1a')/IPv6(hlim=65, src="aaaa::1", dst="ff02::1a")/ICMPv6EchoRequest() >>> packet = SixLoWPAN(raw(packet)) >>> assert packet.src == "aaaa::1" >>> assert packet.dst == "ff02::1a" ###(032)=[passed] SixLoWPAN over Ethernet >>> packet = Ether(b'\xff\xff\xff\xff\xff\xffPQRg\x15i\xa0\xed~;\x02\xf0\x1f\x90\x1f\x90\x03Qtesttext2') >>> assert LoWPAN_IPHC in packet >>> assert packet[LoWPAN_IPHC].src == "fe80::5051:52ff:fe67:1569" >>> assert packet[LoWPAN_IPHC].dst == "ff02::2" >>> assert packet[UDP].dport == packet[UDP].sport == 8080 ###### ## Dot15d4 with SixLoWPAN - Advanced dissection ###### ###(033)=[passed] Compressed SixLoWPAN - real packets with ZEP2 >>> basic_ipv6 = b'\x00"\x19\x100\xe5\x00\x1c\xda\x00\x10\x04\x08\x00E\x00\x00g>\x0c\x00\x00@\x11\xe1\x95\xac\x10\x01\x90\xac\x10\x014EZEZ\x00S\xda\x93EX\x02\x01\x03\x00Y\x01\xff\x00\x02\xab\xa2\x81\xba\xc2\xdf\x00\x00<\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00+A\x88U\xaa\x1b\xff\xfffU{;:\x1a\x9b\x01uE\x00\xf1\x03Z\x8b\xf0\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x11"lF' >>> ack_frame = b'\x00"\x19\x100\xe5\x00\x1c\xda\x00\x10\x04\x08\x00E\x00\x00A>\x0e\x00\x00@\x11\xe1\xb9\xac\x10\x01\x90\xac\x10\x014EZEZ\x00-d7EX\x02\x01\x03\x00Y\x01\xff\x00\x02\xab\xa8\x84\xcb\x07\xd0\x00\x00<\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x02\x00[\xeeY' >>> router_adv = b'\x00"\x19\x100\xe5\x00\x1c\xda\x00\x10\x04\x08\x00E\x00\x00\xab>F\x00\x00@\x11\xe1\x17\xac\x10\x01\x90\xac\x10\x014EZEZ\x00\x97\x81\xb0EX\x02\x01\x03\x00Y\x01\xff\x00\x02\xab\xe8E\xce\xbf\xec\x00\x00>> >>> pkt_1 = Ether(basic_ipv6) >>> pkt_2 = Ether(ack_frame) >>> pkt_3 = Ether(router_adv) >>> >>> assert ZEP2 in pkt_1 >>> assert pkt_1[LoWPAN_IPHC].src == "fe80::ff:fe00:5566" >>> >>> assert ZEP2 in pkt_2 >>> assert Dot15d4Ack in pkt_2 >>> >>> assert ZEP2 in pkt_3 >>> assert ICMPv6NDOptSrcLLAddr in pkt_3 >>> assert pkt_3[Dot15d4Data].dest_panid == 0x1baa ###(034)=[passed] SixLoWPAN - Using ETH >>> lowpan_iphc_header = Ether()/IP()/UDP()/ZEP2()/Dot15d4()/Dot15d4Data()/b"\x78\xe7\x00\x06\x80\x00\x01" >>> packet = Ether(raw(lowpan_iphc_header)) >>> assert packet.tf == 0x3 >>> assert packet.nh == 0 >>> assert packet.hlim == 0x0 >>> assert packet.cid == True >>> assert packet.sac == True >>> assert packet.sam == 0x2 >>> assert packet.m == 0x0 >>> assert packet.dac == 0x1 >>> assert packet.dam == 0x03 >>> assert packet.nhField == 0x06 >>> assert packet.hopLimit == 128 ###(035)=[passed] SixLoWPAN - Using ETH 2 >>> lowpan_iphc_header = Ether()/IP()/UDP()/ZEP2()/Dot15d4()/Dot15d4Data()/b"\x78\xf6\x00\x06\x80\x00\x01" >>> packet = Ether(raw(lowpan_iphc_header)) >>> assert packet.tf == 0x3 >>> assert packet.nh == 0 >>> assert packet.hlim == 0x0 >>> assert packet.cid == True >>> assert packet.sac == True >>> assert packet.sam == 0x3 >>> assert packet.m == 0x0 >>> assert packet.dac == 0x1 >>> assert packet.dam == 0x02 >>> assert packet.nhField == 0x06 >>> assert packet.hopLimit == 128 ###(036)=[passed] SixLoWPAN - Using ETH 3 >>> lowpan_iphc_header = Ether()/IP()/UDP()/ZEP2()/Dot15d4()/Dot15d4Data()/b"\x78\xe7\x00\x06\x80\x00\x01" >>> packet = Ether(raw(lowpan_iphc_header)) >>> assert packet.tf == 0x3 >>> assert packet.nh == 0 >>> assert packet.hlim == 0x0 >>> assert packet.cid == True >>> assert packet.sac == True >>> assert packet.sam == 0x2 >>> assert packet.m == 0x0 >>> assert packet.dac == 0x1 >>> assert packet.dam == 0x03 >>> assert packet.nhField == 0x06 >>> assert packet.hopLimit == 128 >>> packet.show2() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 74 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7ca0 src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = zep dport = zep len = 54 chksum = 0x4170 ###[ Zigbee Encapsulation Protocol (V2) ]### preamble = b'EX' ver = 0 type = 0 channel = 0 device = 0 lqi_mode = 1 lqi_val = 0 timestamp = 0 seq = 0 res = 0 length = 0 ###[ 802.15.4 ]### fcf_reserved_1= 0 fcf_panidcompress= False fcf_ackreq= False fcf_pending= False fcf_security= False fcf_frametype= Data fcf_srcaddrmode= None fcf_framever= 0 fcf_destaddrmode= Short fcf_reserved_2= 0 seqnum = 1 ###[ 802.15.4 Data ]### dest_panid= 0xffff dest_addr = 0xffff ###[ LoWPAN IP Header Compression Packet ]### _reserved = 3 tf = 3 nh = Inline hlim = Inline cid = Present (1) sac = Stateful (1) sam = 16-bits inline (3) m = 0 dac = Stateful (1) dam = Compressed (3) sci = 0 dci = 0 nhField = TCP hopLimit = 128 src = fe80::ff:fe00:1 dst = fe80::ff:fe00:ffff ###[ IPv6 ]### version = 6 tc = 0 fl = 0 plen = 0 nh = TCP hlim = 128 src = fe80::ff:fe00:1 dst = fe80::ff:fe00:ffff ###### ## Zigbee tests ###### ###(037)=[passed] Set zigbee >>> conf.dot15d4_protocol = "zigbee" ###(038)=[passed] ZigbeeNWKStub - ZigbeeNWK dispatch_hook >>> pkt = Dot15d4()/Dot15d4Data()/ZigbeeNWKStub() >>> pkt = Dot15d4(raw(pkt)) >>> assert ZigbeeNWKStub in pkt ###(039)=[passed] Zigbee - ZCLGeneralReadAttributesResponse >>> pkt = ZigbeeClusterLibrary()/ZCLGeneralReadAttributesResponse(read_attribute_status_record=[ZCLReadAttributeStatusRecord(attribute_data_type=0x08, attribute_value=b"\xee")]) >>> pkt = ZigbeeClusterLibrary(raw(pkt)) >>> assert ZCLGeneralReadAttributesResponse in pkt >>> assert pkt.read_attribute_status_record[0].attribute_data_type == 0x08 >>> assert pkt.read_attribute_status_record[0].attribute_value == b'\xee' >>> assert raw(pkt) == b'\x00\x00\x01\x00\x00\x00\x08\xee' ###(040)=[passed] Zigbee - ZigbeeAppDataPayload >>> pkt = ZigbeeAppDataPayload(b'@\x01\x00\x00\x04\x01\x01\r\x18 \x01\x00\x00\x00 \x01\x04\x00\x00B\x07sengled') >>> >>> assert ZigbeeClusterLibrary in pkt >>> assert ZCLGeneralReadAttributesResponse in pkt >>> assert pkt.command_identifier == 1 >>> assert len(pkt.read_attribute_status_record) == 2 >>> >>> assert pkt.read_attribute_status_record[0].status == 0 >>> assert pkt.read_attribute_status_record[0].attribute_data_type == 0x20 >>> assert pkt.read_attribute_status_record[0].attribute_value == b'\x01' >>> >>> assert pkt.read_attribute_status_record[1].status == 0 >>> assert pkt.read_attribute_status_record[1].attribute_data_type == 0x42 >>> assert pkt.read_attribute_status_record[1].attribute_value == b'\x07sengled' ###(041)=[passed] Zigbee - advanced dissection >>> import os >>> filename = scapy_path("/test/pcaps/zigbee-join-authenticate.pcap") >>> a = rdpcap(filename) >>> >>> pkt1 = a[0] # Data >>> pkt2 = a[1] # Command >>> pkt3 = a[2] # Beacon >>> pkt4 = a[38] # ack >>> >>> assert Dot15d4 in pkt1 >>> assert ZigbeeNWK in pkt1 >>> assert ZigbeeSecurityHeader in pkt1 >>> assert pkt1[ZigbeeNWK].flags == 18 >>> assert pkt1[ZigbeeNWK].ext_src == 3781220488824152 >>> f,v = pkt1[ZigbeeNWK].getfield_and_val("ext_src") >>> assert f.i2repr(None, v) == "00:0d:6f:00:00:0d:c5:58" >>> assert pkt1[ZigbeeSecurityHeader].source == 3781220488824152 >>> assert pkt1[ZigbeeSecurityHeader].key_type == 1 >>> assert pkt1[ZigbeeSecurityHeader].extended_nonce == 1 >>> >>> assert Dot15d4 in pkt2 >>> assert Dot15d4Cmd in pkt2 >>> assert pkt2[Dot15d4Cmd].dest_addr == 0xffff >>> assert pkt2[Dot15d4Cmd].dest_panid == 0xffff >>> assert pkt2[Dot15d4Cmd].cmd_id == 7 >>> >>> assert Dot15d4 in pkt3 >>> assert Dot15d4Beacon in pkt3 >>> assert ZigBeeBeacon in pkt3 >>> assert pkt3[Dot15d4Beacon].src_panid == 0x1ff >>> assert pkt3[ZigBeeBeacon].nwkc_protocol_version== 2 >>> assert pkt3[ZigBeeBeacon].extended_pan_id == 125823003551091 >>> f,v = pkt3[ZigBeeBeacon].getfield_and_val("extended_pan_id") >>> assert f.i2repr(None, v) == "00:00:72:6f:73:6e:65:73" >>> assert pkt3[ZigBeeBeacon].tx_offset == 16777215 ###(042)=[passed] Zigbee - skke_1 transport key >>> filename = scapy_path("/test/pcaps/zigbee-transport-key-skke_1.pcap") >>> a = rdpcap(filename) >>> >>> pkt1 = a[0] # AppCommandPayload with transport key >>> >>> assert Dot15d4FCS in pkt1 >>> assert ZigbeeNWK in pkt1 >>> assert ZigbeeAppDataPayload in pkt1 >>> assert ZigbeeAppCommandPayload in pkt1 >>> assert pkt1[ZigbeeAppCommandPayload].cmd_identifier == 5 >>> f,v = pkt1[ZigbeeAppCommandPayload].getfield_and_val("cmd_identifier") >>> assert f.i2repr(None, v) == "APS_CMD_TRANSPORT_KEY" >>> assert pkt1[ZigbeeAppCommandPayload].key == b"&Tkr;9jr{]RqQ}9/" >>> assert pkt1[ZigbeeAppCommandPayload].key_seqnum == 0 >>> assert pkt1[ZigbeeAppCommandPayload].dest_addr == 4502500120025882 >>> f,v = pkt1[ZigbeeAppCommandPayload].getfield_and_val("dest_addr") >>> assert f.i2repr(None, v) == "00:0f:ff:00:00:41:5b:1a" >>> assert pkt1[ZigbeeAppCommandPayload].src_addr == 18446744073709551615 >>> f,v = pkt1[ZigbeeAppCommandPayload].getfield_and_val("src_addr") >>> assert f.i2repr(None, v) == "ff:ff:ff:ff:ff:ff:ff:ff" ###(043)=[passed] Zigbee - Link Status >>> pkt = ZigbeeNWKCommandPayload(b'\x08c\x00\x00\x11\xad\xde\x11\xde\xc0\x11') >>> assert ZigbeeNWKCommandPayload in pkt.layers() >>> assert pkt[ZigbeeNWKCommandPayload].cmd_identifier == 0x08 >>> assert pkt[ZigbeeNWKCommandPayload].entry_count == 3 >>> assert pkt[ZigbeeNWKCommandPayload].first_frame == 1 >>> assert pkt[ZigbeeNWKCommandPayload].last_frame == 1 >>> assert len(pkt[ZigbeeNWKCommandPayload].link_status_list) == 3 >>> assert pkt[ZigbeeNWKCommandPayload].link_status_list[0].neighbor_network_address == 0x0000 >>> assert pkt[ZigbeeNWKCommandPayload].link_status_list[0].incoming_cost == 1 >>> assert pkt[ZigbeeNWKCommandPayload].link_status_list[0].outgoing_cost == 1 >>> assert raw(pkt[ZigbeeNWKCommandPayload].link_status_list[0].payload) == b'' >>> assert pkt[ZigbeeNWKCommandPayload].link_status_list[1].neighbor_network_address == 0xdead >>> assert pkt[ZigbeeNWKCommandPayload].link_status_list[1].incoming_cost == 1 >>> assert pkt[ZigbeeNWKCommandPayload].link_status_list[1].outgoing_cost == 1 >>> assert raw(pkt[ZigbeeNWKCommandPayload].link_status_list[1].payload) == b'' >>> assert pkt[ZigbeeNWKCommandPayload].link_status_list[2].neighbor_network_address == 0xc0de >>> assert pkt[ZigbeeNWKCommandPayload].link_status_list[2].incoming_cost == 1 >>> assert pkt[ZigbeeNWKCommandPayload].link_status_list[2].outgoing_cost == 1 >>> assert raw(pkt[ZigbeeNWKCommandPayload].link_status_list[2].payload) == b'' >>> assert raw(pkt[ZigbeeNWKCommandPayload].payload) == b'' ###(044)=[passed] Zigbee - Network Report >>> pkt = ZigbeeNWKCommandPayload(b'\t\x01\x88wfUD3"\x11\xaa\x99') >>> assert ZigbeeNWKCommandPayload in pkt.layers() >>> assert pkt[ZigbeeNWKCommandPayload].cmd_identifier == 0x09 >>> assert pkt[ZigbeeNWKCommandPayload].report_information_count == 0b00001 >>> assert pkt[ZigbeeNWKCommandPayload].report_command_identifier == 0b000 >>> assert pkt[ZigbeeNWKCommandPayload].epid == 0x1122334455667788 >>> assert pkt[ZigbeeNWKCommandPayload].PAN_ID_conflict_report == [0x99aa] >>> assert raw(pkt[ZigbeeNWKCommandPayload].payload) == b'' ###(045)=[passed] Zigbee - End Device Timeout Request >>> pkt = ZigbeeNWKCommandPayload(b'\x0b\x03\x00') >>> assert ZigbeeNWKCommandPayload in pkt.layers() >>> assert pkt[ZigbeeNWKCommandPayload].cmd_identifier == 0x0b >>> assert pkt[ZigbeeNWKCommandPayload].req_timeout == 3 >>> assert pkt[ZigbeeNWKCommandPayload].ed_conf == 0 >>> assert raw(pkt[ZigbeeNWKCommandPayload].payload) == b'' ###(046)=[passed] Zigbee - End Device Timeout Response >>> pkt = ZigbeeNWKCommandPayload(b'\x0c\x00\x03') >>> assert ZigbeeNWKCommandPayload in pkt.layers() >>> assert pkt[ZigbeeNWKCommandPayload].cmd_identifier == 0x0c >>> assert pkt[ZigbeeNWKCommandPayload].status == 0 >>> assert pkt[ZigbeeNWKCommandPayload].mac_data_poll_keepalive == 1 >>> assert pkt[ZigbeeNWKCommandPayload].ed_timeout_req_keepalive == 1 >>> assert raw(pkt[ZigbeeNWKCommandPayload].payload) == b'' ###(047)=[passed] Zigbee - Transport Key >>> pkt = ZigbeeAppCommandPayload(b'\x05\x01\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x00\x88wfUD3"\x11\xff\xee\xdd\xcc\xbb\xaa\x99\x88') >>> assert ZigbeeAppCommandPayload in pkt.layers() >>> assert pkt[ZigbeeAppCommandPayload].cmd_identifier == 0x05 >>> assert pkt[ZigbeeAppCommandPayload].key_type == 1 >>> assert pkt[ZigbeeAppCommandPayload].key == b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f' >>> assert pkt[ZigbeeAppCommandPayload].key_seqnum == 0 >>> assert pkt[ZigbeeAppCommandPayload].dest_addr == 0x1122334455667788 >>> assert pkt[ZigbeeAppCommandPayload].src_addr == 0x8899aabbccddeeff >>> assert raw(pkt[ZigbeeAppCommandPayload].payload) == b'' ###(048)=[passed] Zigbee - Request Key >>> pkt = ZigbeeAppCommandPayload(b'\x08\x04') >>> assert ZigbeeAppCommandPayload in pkt.layers() >>> assert pkt[ZigbeeAppCommandPayload].cmd_identifier == 0x08 >>> assert pkt[ZigbeeAppCommandPayload].key_type == 0x04 >>> assert raw(pkt[ZigbeeAppCommandPayload].payload) == b'' ###(049)=[passed] Zigbee - Tunnel >>> pkt = ZigbeeAppCommandPayload(b'\x0e\x88wfUD3"\x11!\xe20\x0bP\x00\x00\xff\xee\xdd\xcc\xbb\xaa\x99\x88\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc') >>> assert ZigbeeAppCommandPayload in pkt.layers() >>> assert pkt[ZigbeeAppCommandPayload].cmd_identifier == 0x0e >>> assert pkt[ZigbeeAppCommandPayload].dest_addr == 0x1122334455667788 >>> assert pkt[ZigbeeAppCommandPayload].aps_frametype == 1 >>> assert pkt[ZigbeeAppCommandPayload].delivery_mode == 0 >>> assert pkt[ZigbeeAppCommandPayload].frame_control == 0b0010 >>> assert ZigbeeSecurityHeader in pkt.layers() >>> assert raw(pkt[ZigbeeSecurityHeader]) == b'0\x0bP\x00\x00\xff\xee\xdd\xcc\xbb\xaa\x99\x88\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc' ###(050)=[passed] Zigbee - Verify Key >>> pkt = ZigbeeAppCommandPayload(b'\x0f\x04\x88wfUD3"\x11\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f') >>> assert ZigbeeAppCommandPayload in pkt.layers() >>> assert pkt[ZigbeeAppCommandPayload].cmd_identifier == 0x0f >>> assert pkt[ZigbeeAppCommandPayload].key_type == 0x04 >>> assert pkt[ZigbeeAppCommandPayload].address == 0x1122334455667788 >>> assert pkt[ZigbeeAppCommandPayload].key_hash == b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f' >>> assert raw(pkt[ZigbeeAppCommandPayload].payload) == b'' ###(051)=[passed] Zigbee - Confirm Key >>> pkt = ZigbeeAppCommandPayload(b'\x10\x00\x04\x88wfUD3"\x11') >>> assert ZigbeeAppCommandPayload in pkt.layers() >>> assert pkt[ZigbeeAppCommandPayload].cmd_identifier == 0x10 >>> assert pkt[ZigbeeAppCommandPayload].status == 0 >>> assert pkt[ZigbeeAppCommandPayload].key_type == 0x04 >>> assert pkt[ZigbeeAppCommandPayload].address == 0x1122334455667788 >>> assert raw(pkt[ZigbeeAppCommandPayload].payload) == b'' ###(052)=[passed] Zigbee - APS acknowledgment (with the Acknowledgment Format enabled) >>> pkt = ZigbeeAppDataPayload(b'\x12\xa8') >>> assert ZigbeeAppDataPayload in pkt.layers() >>> assert pkt[ZigbeeAppDataPayload].aps_frametype == 2 >>> assert pkt[ZigbeeAppDataPayload].delivery_mode == 0 >>> assert pkt[ZigbeeAppDataPayload].frame_control == 0b0001 >>> assert pkt[ZigbeeAppDataPayload].counter == 168 >>> assert raw(pkt[ZigbeeAppDataPayload].payload) == b'' ###(053)=[passed] Zigbee - APS acknowledgment (with the Acknowledgment Format disabled) >>> pkt = ZigbeeAppDataPayload(b'\x02\x00\x02\x00\x00\x00\x00\xa6') >>> assert ZigbeeAppDataPayload in pkt.layers() >>> pkt.show() ###[ Zigbee Application Layer Data Payload (General APS Frame Format) ]### frame_control= delivery_mode= unicast aps_frametype= ack dst_endpoint= 0 cluster = 0x2 profile = Zigbee_Device_Profile src_endpoint= 0 counter = 166 >>> assert pkt[ZigbeeAppDataPayload].aps_frametype == 2 >>> assert pkt[ZigbeeAppDataPayload].delivery_mode == 0 >>> assert pkt[ZigbeeAppDataPayload].frame_control == 0b0000 >>> assert pkt[ZigbeeAppDataPayload].dst_endpoint == 0 >>> assert pkt[ZigbeeAppDataPayload].cluster == 0x0002 >>> assert pkt[ZigbeeAppDataPayload].profile == 0x0000 >>> assert pkt[ZigbeeAppDataPayload].src_endpoint == 0 >>> assert pkt[ZigbeeAppDataPayload].counter == 166 >>> assert raw(pkt[ZigbeeAppDataPayload].payload) == b'' ###(054)=[passed] Zigbee - ZDP command >>> pkt = ZigbeeAppDataPayload(b'\x08\x006\x00\x00\x00\x00\xb5\x01\x14\x01') >>> assert ZigbeeAppDataPayload in pkt.layers() >>> assert pkt[ZigbeeAppDataPayload].aps_frametype == 0 >>> assert pkt[ZigbeeAppDataPayload].delivery_mode == 2 >>> assert pkt[ZigbeeAppDataPayload].frame_control == 0b0000 >>> assert pkt[ZigbeeAppDataPayload].dst_endpoint == 0 >>> assert pkt[ZigbeeAppDataPayload].cluster == 0x0036 >>> assert pkt[ZigbeeAppDataPayload].profile == 0x0000 >>> assert pkt[ZigbeeAppDataPayload].src_endpoint == 0 >>> assert pkt[ZigbeeAppDataPayload].counter == 181 >>> assert ZigbeeDeviceProfile in pkt.layers() >>> assert raw(pkt[ZigbeeDeviceProfile]) == b'\x01\x14\x01' ###(055)=[passed] Zigbee - ZDP command: Device_annce >>> pkt = ZigbeeAppDataPayload(b'\x08\x00\x13\x00\x00\x00\x00\x0c\x81\xad\xde\x88wfUD3"\x11\x8e') >>> assert ZigbeeAppDataPayload in pkt.layers() >>> assert pkt[ZigbeeAppDataPayload].aps_frametype == 0 >>> assert pkt[ZigbeeAppDataPayload].delivery_mode == 2 >>> assert pkt[ZigbeeAppDataPayload].frame_control == 0b0000 >>> assert pkt[ZigbeeAppDataPayload].dst_endpoint == 0 >>> assert pkt[ZigbeeAppDataPayload].cluster == 0x0013 >>> assert pkt[ZigbeeAppDataPayload].profile == 0x0000 >>> assert pkt[ZigbeeAppDataPayload].src_endpoint == 0 >>> assert pkt[ZigbeeAppDataPayload].counter == 12 >>> assert ZigbeeDeviceProfile in pkt.layers() >>> assert pkt[ZigbeeDeviceProfile].trans_seqnum == 129 >>> assert ZDPDeviceAnnce in pkt.layers() >>> assert pkt[ZDPDeviceAnnce].nwk_addr == 0xdead >>> assert pkt[ZDPDeviceAnnce].ieee_addr == 0x1122334455667788 >>> assert pkt[ZDPDeviceAnnce].alternate_pan_coordinator == 0b0 >>> assert pkt[ZDPDeviceAnnce].device_type == 0b1 >>> assert pkt[ZDPDeviceAnnce].power_source == 0b1 >>> assert pkt[ZDPDeviceAnnce].receiver_on_when_idle == 0b1 >>> assert pkt[ZDPDeviceAnnce].reserved1 == 0b0 >>> assert pkt[ZDPDeviceAnnce].reserved2 == 0b0 >>> assert pkt[ZDPDeviceAnnce].security_capability == 0b0 >>> assert pkt[ZDPDeviceAnnce].allocate_address == 0b1 >>> assert raw(pkt[ZDPDeviceAnnce].payload) == b'' ###(056)=[passed] Zigbee - ZCL General command: Read Attributes >>> pkt = ZigbeeAppDataPayload(b'@\x01\n\x00\x04\x01\x01\x9d\x00\x00\x00\x00\x00') >>> assert ZigbeeAppDataPayload in pkt.layers() >>> assert pkt[ZigbeeAppDataPayload].aps_frametype == 0 >>> assert pkt[ZigbeeAppDataPayload].delivery_mode == 0 >>> assert pkt[ZigbeeAppDataPayload].frame_control == 0b0100 >>> assert pkt[ZigbeeAppDataPayload].dst_endpoint == 1 >>> assert pkt[ZigbeeAppDataPayload].cluster == 0x000a >>> assert pkt[ZigbeeAppDataPayload].profile == 0x0104 >>> assert pkt[ZigbeeAppDataPayload].src_endpoint == 1 >>> assert pkt[ZigbeeAppDataPayload].counter == 157 >>> assert ZigbeeClusterLibrary in pkt.layers() >>> assert pkt[ZigbeeClusterLibrary].zcl_frametype == 0b00 >>> assert pkt[ZigbeeClusterLibrary].manufacturer_specific == 0b0 >>> assert pkt[ZigbeeClusterLibrary].command_direction == 0b0 >>> assert pkt[ZigbeeClusterLibrary].disable_default_response == 0b0 >>> assert pkt[ZigbeeClusterLibrary].transaction_sequence == 0 >>> assert pkt[ZigbeeClusterLibrary].command_identifier == 0x00 >>> assert ZCLGeneralReadAttributes in pkt.layers() >>> assert len(pkt[ZCLGeneralReadAttributes].attribute_identifiers) == 1 >>> assert pkt[ZCLGeneralReadAttributes].attribute_identifiers[0] == 0x0000 >>> assert raw(pkt[ZCLGeneralReadAttributes].payload) == b'' ###(057)=[passed] Zigbee - ZCL General command: Read Attributes Response >>> pkt = ZCLGeneralReadAttributesResponse(b'!\x00\x00 \xc4') >>> assert ZCLGeneralReadAttributesResponse in pkt.layers() >>> assert len(pkt[ZCLGeneralReadAttributesResponse].read_attribute_status_record) == 1 >>> assert pkt[ZCLGeneralReadAttributesResponse].read_attribute_status_record[0].attribute_identifier == 0x0021 >>> assert pkt[ZCLGeneralReadAttributesResponse].read_attribute_status_record[0].status == 0x00 >>> assert pkt[ZCLGeneralReadAttributesResponse].read_attribute_status_record[0].attribute_data_type == 0x20 >>> assert pkt[ZCLGeneralReadAttributesResponse].read_attribute_status_record[0].attribute_value == b'\xc4' >>> assert raw(pkt[ZCLGeneralReadAttributesResponse].payload) == b'' ###(058)=[passed] Zigbee - ZCL IAS Zone command: Zone Enroll Response >>> pkt = ZCLIASZoneZoneEnrollResponse(b'\x00:') >>> assert ZCLIASZoneZoneEnrollResponse in pkt.layers() >>> assert pkt[ZCLIASZoneZoneEnrollResponse].rsp_code == 0x00 >>> assert pkt[ZCLIASZoneZoneEnrollResponse].zone_id == 0x3a >>> assert raw(pkt[ZCLIASZoneZoneEnrollResponse].payload) == b'' EAP regression tests for Scapy ━ Run at 01:42:12 from [test/scapy/layers/eap.uts] by UTscapy in 0.09413623809814453 └ Passed=45 └ Failed=0 ###### ## EAPOL class tests ###### ###(000)=[passed] EAPOL - Basic Instantiation >>> raw(EAPOL()) == b'\x01\x00\x00\x00' True ###(001)=[passed] EAPOL - Instantiation with specific values >>> raw(EAPOL(version = 3, type = 5)) == b'\x03\x05\x00\x00' True ###(002)=[passed] EAPOL - Dissection (1) >>> s = b'\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> eapol = EAPOL(s) >>> assert eapol.version == 3 >>> assert eapol.type == 1 >>> assert eapol.len == 0 ###(003)=[passed] EAPOL - Dissection (2) >>> s = b'\x03\x00\x00\x05\x01\x01\x00\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> eapol = EAPOL(s) >>> assert eapol.version == 3 >>> assert eapol.type == 0 >>> assert eapol.len == 5 ###(004)=[passed] EAPOL - Dissection (3) >>> s = b'\x03\x00\x00\x0e\x02\x01\x00\x0e\x01anonymous\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> eapol = EAPOL(s) >>> assert eapol.version == 3 >>> assert eapol.type == 0 >>> assert eapol.len == 14 ###(005)=[passed] EAPOL - Dissection (4) >>> req = EAPOL(b'\x03\x00\x00\x05\x01\x01\x00\x05\x01') >>> ans = EAPOL(b'\x03\x00\x00\x0e\x02\x01\x00\x0e\x01anonymous') >>> ans.answers(req) 1 ###(006)=[passed] EAPOL - Dissection (5) >>> s = b'\x02\x00\x00\x06\x01\x01\x00\x06\r ' >>> eapol = EAPOL(s) >>> assert eapol.version == 2 >>> assert eapol.type == 0 >>> assert eapol.len == 6 >>> assert eapol.haslayer(EAP_TLS) ###(007)=[passed] EAPOL - Dissection (6) >>> s = b'\x03\x00\x00<\x02\x9e\x00<+\x01\x16\x03\x01\x001\x01\x00\x00-\x03\x01dr1\x93ZS\x0en\xad\x1f\xbaH\xbb\xfe6\xe6\xd0\xcb\xec\xd7\xc0\xd7\xb9\xa5\xc9\x0c\xfd\x98o\xa7T \x00\x00\x04\x004\x00\x00\x01\x00\x00\x00' >>> eapol = EAPOL(s) >>> assert eapol.version == 3 >>> assert eapol.type == 0 >>> assert eapol.len == 60 >>> assert eapol.haslayer(EAP_FAST) ###### ## EAPOL-Key class tests ###### ###(008)=[passed] EAPOK-Key - over 802.11 - Dissection >>> s = b'\x08\x02:\x01\x00\xc0\xcab\xa4\xf6\x00"k\xfbI+\x00"k\xfbI+\xa0[\xaa\xaa\x03\x00\x00\x00\x88\x8e\x02\x03\x00u\x02\x00\x8a\x00\x10\x00\x00\x00\x00\x00\x00\x00\x04\x95X{I5\':3\x8f\x90\xb1I\xae\x1f\xd7-"\x82\x1e\\$\xefC=\x83\x97?M\xd6\xdf>\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\xdd\x14\x00\x0f\xac\x04\x03\xca?d\xca\xed\xdd\xef\xf69;\xefX\xd4\x97w' >>> wifi = Dot11(s) >>> assert wifi[EAPOL].key_descriptor_type == 2 >>> assert wifi[EAPOL].encrypted_key_data == 0 >>> assert wifi[EAPOL].key_ack == 1 >>> assert wifi[EAPOL].key_type == 1 >>> assert wifi[EAPOL].key_descriptor_type_version == 2 >>> assert wifi[EAPOL].key_replay_counter == 4 >>> assert wifi[EAPOL].has_key_mic == 0 >>> assert wifi[EAPOL].key_data_length == 22 >>> assert len(wifi[EAPOL].key_data) == 22 ###(009)=[passed] EAPOL-Key - Key 1 - Dissection (1) >>> s = b'\x02\x03\x00\x75\x02\x00\x8a\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x12\x6a\xce\x64\xc1\xa6\x44\xd2\x7b\x84\xe0\x39\x26\x3b\x63\x3b\xc3\x74\xe3\x29\x9d\x7d\x45\xe1\xc4\x25\x44\x05\x48\x05\xbf\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\xdd\x14\x00\x0f\xac\x04\x05\xb1\xb6\x8b\x5a\x91\xfc\x04\x06\x83\x84\x06\xe8\xd1\x5f\xdb' >>> eapol = EAPOL(s) >>> assert(eapol.version == 2) >>> assert(eapol.type == 3) >>> assert(eapol.len == 117) >>> assert(eapol.haslayer(EAPOL_KEY)) >>> eapol_key = eapol[EAPOL_KEY] >>> assert(eapol_key.key_descriptor_type == 2) >>> assert(eapol_key.key_descriptor_type_version == 2) >>> assert(eapol_key.key_type == 1) >>> assert(eapol_key.key_length == 16) >>> assert(eapol_key.install == 0) >>> assert(eapol_key.key_ack == 1) >>> assert(eapol_key.key_mic == b"\x00" * 16) >>> assert(eapol_key.secure == 0) >>> assert(eapol_key.key_data_length == 22) >>> assert(eapol_key.guess_key_number() == 0) ###(010)=[passed] EAPOL_KEY - Key 2 - Dissection (2) >>> s = b'\x02\x03\x00\x75\x02\x01\x0a\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x60\x5e\x85\xa7\x9c\xfa\xfd\xb0\xea\xa0\x50\x68\x3f\x97\xbe\x1b\x66\xde\xf7\xbc\x65\x20\x57\x31\x68\x71\xc2\x73\xc5\xae\x47\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x91\x89\xcd\xf1\x88\x54\x8e\x73\xcd\x37\xd5\x78\x52\x66\x05\x88\x00\x16\x30\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x02\x28\x00' >>> eapol = EAPOL(s) >>> assert(eapol.version == 2) >>> assert(eapol.type == 3) >>> assert(eapol.len == 117) >>> assert(eapol.haslayer(EAPOL_KEY)) >>> eapol_key = eapol[EAPOL_KEY] >>> assert(eapol_key.key_descriptor_type == 2) >>> assert(eapol_key.key_descriptor_type_version == 2) >>> assert(eapol_key.key_type == 1) >>> assert(eapol_key.key_length == 16) >>> assert(eapol_key.install == 0) >>> assert(eapol_key.key_ack == 0) >>> assert(eapol_key.has_key_mic == 1) >>> assert(eapol_key.secure == 0) >>> assert(eapol_key.key_data_length == 22) >>> assert(eapol_key.guess_key_number() == 2) ###(011)=[passed] EAPOL_KEY - Key 3 - Dissection (3) >>> s = b'\x02\x03\x00\x97\x02\x13\xca\x00\x10\x00\x00\x00\x00\x00\x00\x00\x01\x12\x6a\xce\x64\xc1\xa6\x44\xd2\x7b\x84\xe0\x39\x26\x3b\x63\x3b\xc3\x74\xe3\x29\x9d\x7d\x45\xe1\xc4\x25\x44\x05\x48\x05\xbf\xe5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x1f\x1e\x80\xe7\x6c\xbf\x4a\x5c\xe9\xce\x84\x6d\x20\x7f\x7d\x00\x38\x10\xcc\x53\x66\x65\x5f\x7f\xf5\xd5\x5a\xf8\xc3\x87\x69\x85\xde\x7d\x96\xaa\xfd\x2b\x93\x48\x9f\x6c\xdf\x5f\x9c\x26\x2b\xe1\xad\x21\xeb\xce\x62\xc9\x4d\x88\x97\x1f\xd7\x5e\x23\xf6\x96\xf6\xc0\xe0\x1e\xf3\x52\x85\xe2\xf2\xcc' >>> eapol = EAPOL(s) >>> assert(eapol.version == 2) >>> assert(eapol.type == 3) >>> assert(eapol.len == 151) >>> assert(eapol.haslayer(EAPOL_KEY)) >>> eapol_key = eapol[EAPOL_KEY] >>> assert(eapol_key.key_descriptor_type == 2) >>> assert(eapol_key.key_descriptor_type_version == 2) >>> assert(eapol_key.key_type == 1) >>> assert(eapol_key.key_length == 16) >>> assert(eapol_key.install == 1) >>> assert(eapol_key.key_ack == 1) >>> assert(eapol_key.has_key_mic == 1) >>> assert(eapol_key.secure == 1) >>> assert(eapol_key.key_data_length == 56) >>> assert(eapol_key.guess_key_number() == 3) ###(012)=[passed] EAPOL_KEY - Key 4 - Dissection (4) >>> s = b'\x02\x03\x00\x5f\x02\x03\x0a\x00\x10\x00\x00\x00\x00\x00\x00\x00\x01\x60\x5e\x85\xa7\x9c\xfa\xfd\xb0\xea\xa0\x50\x68\x3f\x97\xbe\x1b\x66\xde\xf7\xbc\x65\x20\x57\x31\x68\x71\xc2\x73\xc5\xae\x47\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x27\x95\xe1\x76\xeb\x6b\xba\xc1\x6e\x06\x16\xb4\x14\x94\xd6\x0a\x00\x00' >>> eapol = EAPOL(s) >>> assert(eapol.version == 2) >>> assert(eapol.type == 3) >>> assert(eapol.len == 95) >>> assert(eapol.haslayer(EAPOL_KEY)) >>> eapol_key = eapol[EAPOL_KEY] >>> assert(eapol_key.key_descriptor_type == 2) >>> assert(eapol_key.key_descriptor_type_version == 2) >>> assert(eapol_key.key_type == 1) >>> assert(eapol_key.key_length == 16) >>> assert(eapol_key.install == 0) >>> assert(eapol_key.key_ack == 0) >>> assert(eapol_key.has_key_mic == 1) >>> assert(eapol_key.secure == 1) >>> assert(eapol_key.key_data_length == 0) >>> assert(eapol_key.key_data == b'') >>> assert(eapol_key.guess_key_number() == 4) ###### ## EAPOL-MKA class tests ###### ###(013)=[passed] EAPOL-MKA - With Basic parameter set - Dissection >>> eapol = None >>> s = b'\x03\x05\x00T\x01\xff\xf0<\x00Bh\xa8\x1e\x03\x00\n\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x01\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\xff\x00\x00\x10\xe5\xf5j\x86V\\\xb1\xcc\xa9\xb95\x04m*Cj' >>> eapol = EAPOL(s) >>> assert eapol.version == 3 >>> assert eapol.type == 5 >>> assert eapol.len == 84 >>> assert eapol.haslayer(MKAPDU) >>> assert eapol[MKAPDU].basic_param_set.actor_member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7" >>> assert eapol[MKAPDU].haslayer(MKAICVSet) >>> assert eapol[MKAPDU][MKAICVSet].icv == b"\xe5\xf5j\x86V\\\xb1\xcc\xa9\xb95\x04m*Cj" ###(014)=[passed] EAPOL-MKA - With Potential Peer List parameter set - Dissection >>> eapol = None >>> s = b'\x03\x05\x00h\x01\x10\xe0<\xccN$\xc4\xf7\x7f\x00\x80q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00}\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x02\x00\x00\x10\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x01\xff\x00\x00\x105\x01\xdc)\xfd\xd1\xff\xd55\x9c_o\xc9\x9c\xca\xc0' >>> eapol = EAPOL(s) >>> assert eapol.version == 3 >>> assert eapol.type == 5 >>> assert eapol.len == 104 >>> assert eapol.haslayer(MKAPDU) >>> assert eapol[MKAPDU].basic_param_set.actor_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6" >>> assert eapol.haslayer(MKAPotentialPeerListParamSet) >>> assert eapol[MKAPDU][MKAPotentialPeerListParamSet].member_id_message_num[0].member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7" >>> assert eapol[MKAPDU].haslayer(MKAICVSet) >>> assert eapol[MKAPDU][MKAICVSet].icv == b"5\x01\xdc)\xfd\xd1\xff\xd55\x9c_o\xc9\x9c\xca\xc0" ###(015)=[passed] EAPOL-MKA - With Live Peer List parameter set - Dissection >>> eapol = None >>> s = b"\x03\x05\x00h\x01\xffp<\x00Bh\xa8\x1e\x03\x00\n\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x02\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x01\x00\x00\x10q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x80\xff\x00\x00\x10\xf4\xa1d\x18\tD\xa2}\x8e'\x0c/\xda,\xea\xb7" >>> eapol = EAPOL(s) >>> assert eapol.version == 3 >>> assert eapol.type == 5 >>> assert eapol.len == 104 >>> assert eapol.haslayer(MKAPDU) >>> assert eapol[MKAPDU].basic_param_set.actor_member_id == b'\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7' >>> assert eapol.haslayer(MKALivePeerListParamSet) >>> assert eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6" >>> assert eapol[MKAPDU].haslayer(MKAICVSet) >>> assert eapol[MKAPDU][MKAICVSet].icv == b"\xf4\xa1d\x18\tD\xa2}\x8e'\x0c/\xda,\xea\xb7" ###(016)=[passed] EAPOL-MKA - With SAK Use parameter set - Dissection >>> eapol = None >>> s = b'\x03\x05\x00\x94\x01\xffp<\x00Bh\xa8\x1e\x03\x00\n\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x03\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x03\x10\x00(q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x01\x00\x00\x00\x00q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x01\x00\x00\x00\x00\x01\x00\x00\x10q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x83\xff\x00\x00\x10OF\x84\xf1@%\x95\xe6Fw9\x1a\xfa\x03(\xae' >>> eapol = EAPOL(s) >>> assert eapol.version == 3 >>> assert eapol.type == 5 >>> assert eapol.len == 148 >>> assert eapol.haslayer(MKAPDU) >>> assert eapol[MKAPDU].basic_param_set.actor_member_id == b'\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7' >>> assert eapol.haslayer(MKASAKUseParamSet) >>> assert eapol[MKAPDU][MKASAKUseParamSet].latest_key_key_server_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6" >>> assert eapol.haslayer(MKALivePeerListParamSet) >>> assert eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6" >>> assert eapol[MKAPDU].haslayer(MKAICVSet) >>> assert eapol[MKAPDU][MKAICVSet].icv == b"OF\x84\xf1@%\x95\xe6Fw9\x1a\xfa\x03(\xae" ###(017)=[passed] EAPOL-MKA - With Distributed SAK parameter set - Dissection >>> eapol = None >>> s = b"\x03\x05\x00\xb4\x01\x10\xe0<\xccN$\xc4\xf7\x7f\x00\x80q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x81\x00\x80\xc2\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x01\x00\x00\x10\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7\x00\x00\x00\x02\x03\x10\x00(q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x10\x00\x1c\x00\x00\x00\x01Cz\x05\x88\x9f\xe8-\x94W+?\x13~\xfb\x016yVB?\xbd\xa1\x9fu\xff\x00\x00\x10\xb0H\xcf\xe0:\xa1\x94RD'\x03\xe67\xe1Ur" >>> eapol = EAPOL(s) >>> assert eapol.version == 3 >>> assert eapol.type == 5 >>> assert eapol.len == 180 >>> assert eapol.haslayer(MKAPDU) >>> assert eapol[MKAPDU].basic_param_set.actor_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6" >>> assert eapol.haslayer(MKASAKUseParamSet) >>> assert eapol[MKAPDU][MKASAKUseParamSet].latest_key_key_server_member_id == b"q\x8b\x8a9\x86k/X\x14\xc9\xdc\xf6" >>> assert eapol.haslayer(MKALivePeerListParamSet) >>> assert eapol[MKAPDU][MKALivePeerListParamSet].member_id_message_num[0].member_id == b"\xbcj\x00\x96Ywz\x82:\x90\xd9\xe7" >>> assert eapol.haslayer(MKADistributedSAKParamSet) >>> assert eapol[MKADistributedSAKParamSet].sak_aes_key_wrap == b"Cz\x05\x88\x9f\xe8-\x94W+?\x13~\xfb\x016yVB?\xbd\xa1\x9fu" >>> assert eapol[MKAPDU].haslayer(MKAICVSet) >>> assert eapol[MKAPDU][MKAICVSet].icv == b"\xb0H\xcf\xe0:\xa1\x94RD'\x03\xe67\xe1Ur" ###### ## EAP class tests ###### ###(018)=[passed] EAP - Basic Instantiation >>> raw(EAP()) == b'\x04\x00\x00\x04' True ###(019)=[passed] EAP - Instantiation with specific values >>> raw(EAP(code = 1, id = 1, len = 5, type = 1)) == b'\x01\x01\x00\x05\x01' True ###(020)=[passed] EAP - Instantiation - Multiple desired authentication types >>> raw(EAP(code=2, type=3, desired_auth_types=[13,21,25,43])) == b'\x02\x00\x00\t\x03\r\x15\x19+' True ###(021)=[passed] EAP - Dissection (1) >>> s = b'\x01\x01\x00\x05\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> eap = EAP(s) >>> assert eap.code == 1 >>> assert eap.id == 1 >>> assert eap.len == 5 >>> assert hasattr(eap, "type") >>> assert eap.type == 1 ###(022)=[passed] EAP - Dissection (2) >>> s = b'\x02\x01\x00\x0e\x01anonymous\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> eap = EAP(s) >>> assert eap.code == 2 >>> assert eap.id == 1 >>> assert eap.len == 14 >>> assert eap.type == 1 >>> assert hasattr(eap, 'identity') >>> assert eap.identity == b'anonymous' ###(023)=[passed] EAP - Dissection (3) >>> s = b'\x01\x01\x00\x06\r ' >>> eap = EAP(s) >>> assert eap.code == 1 >>> assert eap.id == 1 >>> assert eap.len == 6 >>> assert eap.type == 13 >>> assert eap.haslayer(EAP_TLS) >>> assert eap[EAP_TLS].L == 0 >>> assert eap[EAP_TLS].M == 0 >>> assert eap[EAP_TLS].S == 1 ###(024)=[passed] EAP - Dissection (4) >>> s = b'\x02\x01\x00\xd1\r\x00\x16\x03\x01\x00\xc6\x01\x00\x00\xc2\x03\x01UK\x02\xdf\x1e\xde5\xab\xfa[\x15\xef\xbe\xa2\xe4`\xc6g\xb9\xa8\xaa%vAs\xb2\x1cXt\x1c0\xb7\x00\x00P\xc0\x14\xc0\n\x009\x008\x00\x88\x00\x87\xc0\x0f\xc0\x05\x005\x00\x84\xc0\x12\xc0\x08\x00\x16\x00\x13\xc0\r\xc0\x03\x00\n\xc0\x13\xc0\t\x003\x002\x00\x9a\x00\x99\x00E\x00D\xc0\x0e\xc0\x04\x00/\x00\x96\x00A\xc0\x11\xc0\x07\xc0\x0c\xc0\x02\x00\x05\x00\x04\x00\x15\x00\x12\x00\t\x00\xff\x01\x00\x00I\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x004\x002\x00\x0e\x00\r\x00\x19\x00\x0b\x00\x0c\x00\x18\x00\t\x00\n\x00\x16\x00\x17\x00\x08\x00\x06\x00\x07\x00\x14\x00\x15\x00\x04\x00\x05\x00\x12\x00\x13\x00\x01\x00\x02\x00\x03\x00\x0f\x00\x10\x00\x11\x00#\x00\x00\x00\x0f\x00\x01\x01' >>> eap = EAP(s) >>> assert eap.code == 2 >>> assert eap.id == 1 >>> assert eap.len == 209 >>> assert eap.type == 13 >>> assert eap.haslayer(EAP_TLS) >>> assert eap[EAP_TLS].L == 0 >>> assert eap[EAP_TLS].M == 0 >>> assert eap[EAP_TLS].S == 0 ###(025)=[passed] EAP - Dissection (5) >>> s = b'\x02\x9e\x00<+\x01\x16\x03\x01\x001\x01\x00\x00-\x03\x01dr1\x93ZS\x0en\xad\x1f\xbaH\xbb\xfe6\xe6\xd0\xcb\xec\xd7\xc0\xd7\xb9\xa5\xc9\x0c\xfd\x98o\xa7T \x00\x00\x04\x004\x00\x00\x01\x00\x00\x00' >>> eap = EAP(s) >>> assert eap.code == 2 >>> assert eap.id == 158 >>> assert eap.len == 60 >>> assert eap.type == 43 >>> assert eap.haslayer(EAP_FAST) >>> assert eap[EAP_FAST].L == 0 >>> assert eap[EAP_FAST].M == 0 >>> assert eap[EAP_FAST].S == 0 >>> assert eap[EAP_FAST].version == 1 ###(026)=[passed] EAP - Dissection (6) >>> s = b'\x02\x9f\x01L+\x01\x16\x03\x01\x01\x06\x10\x00\x01\x02\x01\x00Y\xc9\x8a\tcw\t\xdcbU\xfd\x035\xcd\x1a\t\x10f&[(9\xf6\x88W`\xc6\x0f\xb3\x84\x15\x19\xf5\tk\xbd\x8fp&0\xb0\xa4B\x85\x0c<:s\xf2zT\xc3\xbd\x8a\xe4D{m\xe7\x97\xfe>\xda\x14\xb8T1{\xd7H\x9c\xa6\xcb\xe3,u\xdf\xe0\x82\xe5R\x1e<\xe5\x03}\xeb\x98\xe2\xf7\x8d3\xc6\x83\xac"\x8f\xd7\x12\xe5{:"\x84A\xd9\x14\xc2cZF\xd4\t\xab\xdar\xc7\xe0\x0e\x00o\xce\x05g\xdc?\xcc\xf7\xe83\x83E\xb3>\xe8<3-QB\xfd$C/\x1be\xcf\x03\xd6Q4\xbe\\h\xba)<\x99N\x89\xd9\xb1\xfa!\xd7a\xef\xa3\xd3o\xed8Uz\xb5k\xb0`\xfeC\xbc\xb3aS,d\xe6\xdc\x13\xa4A\x1e\x9b\r{\xd6s \xd0cQ\x95y\xc8\x1d\xc3\xd9\x87\xf2=\x81\x96q~\x99E\xc3\x97\xa8px\xe2\xc7\x92\xeb\xff/v\x84\x1e\xfb\x00\x95#\xba\xfb\xd88h\x90K\xa7\xbd9d\xb4\xf2\xf2\x14\x02vtW\xaa\xadY\x14\x03\x01\x00\x01\x01\x16\x03\x01\x000\x97\xc5l\xd6\xef\xffcM\x81\x90Q\x96\xf6\xfeX1\xf7\xfc\x84\xc6\xa0\xf6Z\xcd\xb6\xe1\xd4\xdb\x88\xf9t%Q!\xe7,~#2G-\xdf\x83\xbf\x86Q\xa2$' >>> eap = EAP(s) >>> assert eap.code == 2 >>> assert eap.id == 159 >>> assert eap.len == 332 >>> assert eap.type == 43 >>> assert eap.haslayer(EAP_FAST) >>> assert eap[EAP_FAST].L == 0 >>> assert eap[EAP_FAST].M == 0 >>> assert eap[EAP_FAST].S == 0 >>> assert eap[EAP_FAST].version == 1 ###(027)=[passed] EAP - Dissection (7) >>> s = b'\x02\xf1\x00\t\x03\r\x15\x19+' >>> eap = EAP(s) >>> assert eap.code == 2 >>> assert eap.id == 241 >>> assert eap.len == 9 >>> assert eap.type == 3 >>> assert hasattr(eap, 'desired_auth_types') >>> assert eap.desired_auth_types == [13,21,25,43] ###(028)=[passed] EAP - Dissection (8) >>> s = b"\x02\x03\x01\x15\x15\x00\x16\x03\x01\x01\n\x01\x00\x01\x06\x03\x03\xd5\xd9\xd5rT\x9e\xb8\xbe,>\xcf!\xcf\xc7\x02\x8c\xb1\x1e^F\xf7\xc84\x8c\x01t4\x91[\x02\xc8/\x00\x00\x8c\xc00\xc0,\xc0(\xc0$\xc0\x14\xc0\n\x00\xa5\x00\xa3\x00\xa1\x00\x9f\x00k\x00j\x00i\x00h\x009\x008\x007\x006\x00\x88\x00\x87\x00\x86\x00\x85\xc02\xc0.\xc0*\xc0&\xc0\x0f\xc0\x05\x00\x9d\x00=\x005\x00\x84\xc0/\xc0+\xc0'\xc0#\xc0\x13\xc0\t\x00\xa4\x00\xa2\x00\xa0\x00\x9e\x00g\x00@\x00?\x00>\x003\x002\x001\x000\x00\x9a\x00\x99\x00\x98\x00\x97\x00E\x00D\x00C\x00B\xc01\xc0-\xc0)\xc0%\xc0\x0e\xc0\x04\x00\x9c\x00<\x00/\x00\x96\x00A\x00\xff\x01\x00\x00Q\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x00\x1c\x00\x1a\x00\x17\x00\x19\x00\x1c\x00\x1b\x00\x18\x00\x1a\x00\x16\x00\x0e\x00\r\x00\x0b\x00\x0c\x00\t\x00\n\x00\r\x00 \x00\x1e\x06\x01\x06\x02\x06\x03\x05\x01\x05\x02\x05\x03\x04\x01\x04\x02\x04\x03\x03\x01\x03\x02\x03\x03\x02\x01\x02\x02\x02\x03\x00\x0f\x00\x01\x01" >>> eap = EAP(s) >>> assert eap.code == 2 >>> assert eap.id == 3 >>> assert eap.len == 277 >>> assert eap.type == 21 >>> assert eap.haslayer(EAP_TTLS) >>> assert eap[EAP_TTLS].L == 0 >>> assert eap[EAP_TTLS].M == 0 >>> assert eap[EAP_TTLS].S == 0 >>> assert eap[EAP_TTLS].version == 0 ###(029)=[passed] EAP - EAP_TLS - Basic Instantiation >>> raw(EAP_TLS()) == b'\x01\x00\x00\x06\r\x00' True ###(030)=[passed] EAP - EAP_FAST - Basic Instantiation >>> raw(EAP_FAST()) == b'\x01\x00\x00\x06+\x00' True ###(031)=[passed] EAP - EAP_TTLS - Basic Instantiation >>> raw(EAP_TTLS()) == b'\x01\x00\x00\x06\x15\x00' True ###(032)=[passed] EAP - EAP_PEAP - Basic Instantiation >>> raw(EAP_PEAP()) == b'\x01\x00\x00\x06\x19\x01' True ###(033)=[passed] EAP - EAP_MD5 - Basic Instantiation >>> raw(EAP_MD5()) == b'\x01\x00\x00\x06\x04\x00' True ###(034)=[passed] EAP - EAP_MD5 - Request - Dissection (8) >>> s = b'\x01\x02\x00\x16\x04\x10\x86\xf9\x89\x94\x81\x01\xb3 nHh\x1b\x8d\xe7^\xdb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> eap = EAP(s) >>> assert eap.code == 1 >>> assert eap.id == 2 >>> assert eap.len == 22 >>> assert eap.type == 4 >>> assert eap.haslayer(EAP_MD5) >>> assert eap[EAP_MD5].value_size == 16 >>> assert eap[EAP_MD5].value == b'\x86\xf9\x89\x94\x81\x01\xb3 nHh\x1b\x8d\xe7^\xdb' >>> assert eap[EAP_MD5].optional_name == b'' ###(035)=[passed] EAP - EAP_MD5 - Response - Dissection (9) >>> s = b'\x02\x02\x00\x16\x04\x10\xfd\x1e\xffe\xf5\x80y\xa8\xe3\xc8\xf1\xbd\xc2\x85\xae\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> eap = EAP(s) >>> assert eap.code == 2 >>> assert eap.id == 2 >>> assert eap.len == 22 >>> assert eap.type == 4 >>> assert eap.haslayer(EAP_MD5) >>> assert eap[EAP_MD5].value_size == 16 >>> assert eap[EAP_MD5].value == b'\xfd\x1e\xffe\xf5\x80y\xa8\xe3\xc8\xf1\xbd\xc2\x85\xae\xcf' >>> assert eap[EAP_MD5].optional_name == b'' ###(036)=[passed] EAP - LEAP - Basic Instantiation >>> raw(LEAP()) == b'\x01\x00\x00\x08\x11\x01\x00\x00' True ###(037)=[passed] EAP - LEAP - Request - Dissection (10) >>> s = b'\x01D\x00\x1c\x11\x01\x00\x088\xb6\xd7\xa1E>> eap = LEAP(s) >>> assert eap.code == 1 >>> assert eap.id == 68 >>> assert eap.len == 28 >>> assert eap.type == 17 >>> assert eap.haslayer(LEAP) >>> assert eap[LEAP].version == 1 >>> assert eap[LEAP].count == 8 >>> assert eap[LEAP].challenge_response == b'8\xb6\xd7\xa1E>> assert eap[LEAP].username == b"supplicant-1" ###(038)=[passed] EAP - LEAP - Response - Dissection (11) >>> s = b'\x02D\x00,\x11\x01\x00\x18\xb3\x82[\x82\x8a\xc8M*\xf3\xe7\xb3\xad,7\x8b\xbfG\x81\xda\xbf\xe6\xc1\x9b\x95supplicant-1' >>> eap = LEAP(s) >>> assert eap.code == 2 >>> assert eap.id == 68 >>> assert eap.len == 44 >>> assert eap.type == 17 >>> assert eap.haslayer(LEAP) >>> assert eap[LEAP].version == 1 >>> assert eap[LEAP].count == 24 >>> assert eap[LEAP].challenge_response == b'\xb3\x82[\x82\x8a\xc8M*\xf3\xe7\xb3\xad,7\x8b\xbfG\x81\xda\xbf\xe6\xc1\x9b\x95' >>> assert eap[LEAP].username == b"supplicant-1" ###(039)=[passed] EAP - PEAP - Request - Dissection >>> s = b'\x01\x03\x00\x06\x19 ' >>> eap = EAP_PEAP(s) >>> assert eap.code == 1 >>> assert eap.id == 3 >>> assert eap.len == 6 >>> assert eap.type == 25 >>> assert eap.haslayer(EAP_PEAP) >>> assert eap[EAP_PEAP].S == 1 >>> assert eap[EAP_PEAP].version == 0 ###(040)=[passed] EAP - PEAP - Response - Dissection >>> s = b'\x02\x03\x008\x19\x01\x16\x03\x03\x00-\x01\x00\x00)\x03\x03Zt9\xb6\xdem\xb9\xd4\x00\xed\xa5Bp>\x9a9\x8a[\x91\xe1U\xfa\xb6H\xd1\xbd\x9b\xd5\xadl\rV\x00\x00\x02\x00/\x01\x00' >>> eap = EAP_PEAP(s) >>> assert eap.code == 2 >>> assert eap.id == 3 >>> assert eap.len == 56 >>> assert eap.type == 25 >>> assert eap.haslayer(EAP_PEAP) >>> assert eap[EAP_PEAP].S == 0 >>> assert eap[EAP_PEAP].version == 1 >>> assert hasattr(eap[EAP_PEAP], "tls_data") ###(041)=[passed] EAP - Layers (1) >>> eap = EAP_MD5() >>> assert EAP_MD5 in eap >>> assert not EAP_TLS in eap >>> assert not EAP_FAST in eap >>> assert not LEAP in eap >>> assert EAP in eap >>> eap = EAP_TLS() >>> assert EAP_TLS in eap >>> assert not EAP_MD5 in eap >>> assert not EAP_FAST in eap >>> assert not LEAP in eap >>> assert EAP in eap >>> eap = EAP_FAST() >>> assert EAP_FAST in eap >>> assert not EAP_MD5 in eap >>> assert not EAP_TLS in eap >>> assert not LEAP in eap >>> assert EAP in eap >>> eap = EAP_TTLS() >>> assert EAP_TTLS in eap >>> assert not EAP_MD5 in eap >>> assert not EAP_TLS in eap >>> assert not EAP_FAST in eap >>> assert not LEAP in eap >>> assert EAP in eap >>> eap = EAP_PEAP() >>> assert EAP_PEAP in eap >>> assert EAP in eap >>> eap = LEAP() >>> assert not EAP_MD5 in eap >>> assert not EAP_TLS in eap >>> assert not EAP_FAST in eap >>> assert LEAP in eap >>> assert EAP in eap ###(042)=[passed] EAP - Layers (2) >>> eap = EAP_MD5() >>> assert type(eap[EAP]) == EAP_MD5 >>> eap = EAP_TLS() >>> assert type(eap[EAP]) == EAP_TLS >>> eap = EAP_FAST() >>> assert type(eap[EAP]) == EAP_FAST >>> eap = EAP_TTLS() >>> assert type(eap[EAP]) == EAP_TTLS >>> eap = EAP_PEAP() >>> assert type(eap[EAP]) == EAP_PEAP >>> eap = LEAP() >>> assert type(eap[EAP]) == LEAP ###(043)=[passed] EAP - sessions (1) >>> p = IP()/TCP()/EAP() >>> l = PacketList(p) >>> s = l.sessions() # Crashed on commit: e42ecdc54556c4852ca06b1a6da6c1ccbf3f522e >>> assert len(s) == 1 ###(044)=[passed] EAP - sessions (2) >>> p = IP()/UDP()/EAP() >>> l = PacketList(p) >>> s = l.sessions() # Crashed on commit: e42ecdc54556c4852ca06b1a6da6c1ccbf3f522e >>> assert len(s) == 1 HSRP regression tests for Scapy ━ Run at 01:42:12 from [test/scapy/layers/hsrp.uts] by UTscapy in 0.0037620067596435547 └ Passed=1 └ Failed=0 ###### ## HSRP tests ###### ###(000)=[passed] HSRP - build & dissection >>> defaddr = conf.route.route('0.0.0.0')[1] >>> pkt = IP(raw(IP()/UDP(dport=1985, sport=1985)/HSRP()/HSRPmd5())) >>> assert pkt[IP].dst == "224.0.0.2" and pkt[UDP].sport == pkt[UDP].dport == 1985 >>> assert pkt[HSRP].opcode == 0 and pkt[HSRP].state == 16 >>> assert pkt[HSRPmd5].type == 4 and pkt[HSRPmd5].sourceip == defaddr HTTP regression tests for Scapy ━ Run at 01:42:12 from [test/scapy/layers/http.uts] by UTscapy in 0.3901712894439697 └ Passed=17 └ Failed=0 ###### ## HTTP ###### ###(000)=[passed] TCPSession - dissect HTTP 1.0 chunked image >>> load_layer("http") >>> >>> import os >>> >>> filename = scapy_path("/test/pcaps/http_chunk.pcap.gz") >>> >>> a = sniff(offline=filename, session=TCPSession) >>> >>> a[2].show() ###[ Ethernet ]### dst = 90:e2:ba:2f:3a:01 src = 98:5f:d3:3c:ef:ab type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = None id = 19962 flags = DF frag = 0 ttl = 128 proto = tcp chksum = None src = 192.168.62.91 dst = 191.236.16.125 \options \ ###[ TCP ]### sport = 53226 dport = http seq = 4110649981 ack = 1205747592 dataofs = 5 reserved = 0 flags = PA window = 255 chksum = 0xcb2c urgptr = 0 options = [] ###[ HTTP 1 ]### ###[ HTTP Request ]### Method = GET Path = /httpgallery/chunked/chunkedimage.aspx?0.2911017199439567 Http_Version= HTTP/1.1 A_IM = None Accept = image/webp,image/apng,image/*,*/*;q=0.8 Accept_Charset= None Accept_Datetime= None Accept_Encoding= gzip, deflate Accept_Language= fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7 Access_Control_Request_Headers= None Access_Control_Request_Method= None Authorization= None Cache_Control= None Connection= keep-alive Content_Length= None Content_MD5= None Content_Type= None Cookie = _ga=GA1.2.535792095.1551908432; _gid=GA1.2.1942743104.1551908432; ARRAffinity=7a12659f1b02b1cc5637d9e9039ba653ae8c8d5b929ff97a475517a868a08cac DNT = None Date = None Expect = None Forwarded = None From = None Front_End_Https= None HTTP2_Settings= None Host = www.httpwatch.com If_Match = None If_Modified_Since= None If_None_Match= None If_Range = None If_Unmodified_Since= None Keep_Alive= None Max_Forwards= None Origin = None Permanent = None Pragma = None Proxy_Authorization= None Proxy_Connection= None Range = None Referer = http://www.httpwatch.com/httpgallery/chunked/ Save_Data = None TE = None Upgrade = None Upgrade_Insecure_Requests= None User_Agent= Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36 Via = None Warning = None X_ATT_DeviceId= None X_Correlation_ID= None X_Csrf_Token= None X_Forwarded_For= None X_Forwarded_Host= None X_Forwarded_Proto= None X_Http_Method_Override= None X_Request_ID= None X_Requested_With= None X_UIDH = None X_Wap_Profile= None Unknown_Headers= None >>> assert HTTPRequest in a[2] >>> assert a[2].Path == b'/httpgallery/chunked/chunkedimage.aspx?0.2911017199439567' >>> assert a[2].Accept_Encoding == b'gzip, deflate' >>> assert a[2].Accept == b'image/webp,image/apng,image/*,*/*;q=0.8' >>> assert a[2].Http_Version == b'HTTP/1.1' >>> assert a[2].Referer == b'http://www.httpwatch.com/httpgallery/chunked/' >>> >>> a[29].show() ###[ Ethernet ]### dst = 98:5f:d3:3c:ef:ab src = 90:e2:ba:2f:3a:01 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = None id = 22897 flags = DF frag = 0 ttl = 103 proto = tcp chksum = None src = 191.236.16.125 dst = 192.168.62.91 \options \ ###[ TCP ]### sport = http dport = 53226 seq = 1205747592 ack = 4110650576 dataofs = 5 reserved = 0 flags = PA window = 1023 chksum = 0x393c urgptr = 0 options = [] ###[ HTTP 1 ]### ###[ HTTP Response ]### Http_Version= HTTP/1.1 Status_Code= 200 Reason_Phrase= OK Accept_Patch= None Accept_Ranges= None Access_Control_Allow_Credentials= None Access_Control_Allow_Headers= None Access_Control_Allow_Methods= None Access_Control_Allow_Origin= None Access_Control_Expose_Headers= None Access_Control_Max_Age= None Age = None Allow = None Alt_Svc = None Cache_Control= no-cache, no-store Connection= None Content_Disposition= None Content_Encoding= None Content_Language= None Content_Length= None Content_Location= None Content_MD5= None Content_Range= None Content_Security_Policy= None Content_Type= image/jpeg; charset=utf-8 Date = Wed, 06 Mar 2019 23:50:52 GMT Delta_Base= None ETag = None Expires = -1 IM = None Keep_Alive= None Last_Modified= None Link = None Location = None P3P = None Permanent = None Pragma = no-cache Proxy_Authenticate= None Public_Key_Pins= None Refresh = None Retry_After= None Server = Microsoft-IIS/10.0 Set_Cookie= None Status = None Strict_Transport_Security= None Timing_Allow_Origin= None Tk = None Trailer = None Transfer_Encoding= chunked Upgrade = None Vary = None Via = None WWW_Authenticate= None Warning = None X_Content_Duration= None X_Content_Security_Policy= None X_Content_Type_Options= None X_Correlation_ID= None X_Frame_Options= None X_Powered_By= ASP.NET X_Request_ID= None X_UA_Compatible= None X_WebKit_CSP= None X_XSS_Protection= None Unknown_Headers= {b'X-AspNet-Version': b'4.0.30319', b'Arr-Disable-Session-Affinity': b'True'} ###[ Raw ]### load = b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00II*\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xec\x00\x11Ducky\x00\x01\x00\x04\x00\x00\x00<\x00\x00\xff\xed\x00,Photoshop 3.0\x008BIM\x04%\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xee\x00\x0eAdobe\x00d\xc0\x00\x00\x00\x01\xff\xdb\x00\x84\x00\x06\x04\x04\x04\x05\x04\x06\x05\x05\x06\t\x06\x05\x06\t\x0b\x08\x06\x06\x08\x0b\x0c\n\n\x0b\n\n\x0c\x10\x0c\x0c\x0c\x0c\x0c\x0c\x10\x0c\x0e\x0f\x10\x0f\x0e\x0c\x13\x13\x14\x14\x13\x13\x1c\x1b\x1b\x1b\x1c\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x01\x07\x07\x07\r\x0c\r\x18\x10\x10\x18\x1a\x15\x11\x15\x1a\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\x1f\xff\xc0\x00\x11\x08\x02\xb7\x02\x9d\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x01\xa2\x00\x00\x00\x07\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x04\x05\x03\x02\x06\x01\x00\x07\x08\t\n\x0b\x01\x00\x02\x02\x03\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x10\x00\x02\x01\x03\x03\x02\x04\x02\x06\x07\x03\x04\x02\x06\x02s\x01\x02\x03\x11\x04\x00\x05!\x121AQ\x06\x13a"q\x81\x142\x91\xa1\x07\x15\xb1B#\xc1R\xd1\xe13\x16b\xf0$r\x82\xf1%C4S\x92\xa2\xb2cs\xc25D\'\x93\xa3\xb36\x17Tdt\xc3\xd2\xe2\x08&\x83\t\n\x18\x19\x84\x94EF\xa4\xb4V\xd3U(\x1a\xf2\xe3\xf3\xc4\xd4\xe4\xf4eu\x85\x95\xa5\xb5\xc5\xd5\xe5\xf5fv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf67GWgw\x87\x97\xa7\xb7\xc7\xd7\xe7\xf78HXhx\x88\x98\xa8\xb8\xc8\xd8\xe8\xf8)9IYiy\x89\x99\xa9\xb9\xc9\xd9\xe9\xf9*:JZjz\x8a\x9a\xaa\xba\xca\xda\xea\xfa\x11\x00\x02\x02\x01\x02\x03\x05\x05\x04\x05\x06\x04\x08\x03\x03m\x01\x00\x02\x11\x03\x04!\x121A\x05Q\x13a"\x06q\x81\x912\xa1\xb1\xf0\x14\xc1\xd1\xe1#B\x15Rbr\xf13$4C\x82\x16\x92S%\xa2c\xb2\xc2\x07s\xd25\xe2D\x83\x17T\x93\x08\t\n\x18\x19&6E\x1a\'dtU7\xf2\xa3\xb3\xc3()\xd3\xe3\xf3\x84\x94\xa4\xb4\xc4\xd4\xe4\xf4eu\x85\x95\xa5\xb5\xc5\xd5\xe5\xf5FVfv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf6GWgw\x87\x97\xa7\xb7\xc7\xd7\xe7\xf78HXhx\x88\x98\xa8\xb8\xc8\xd8\xe8\xf89IYiy\x89\x99\xa9\xb9\xc9\xd9\xe9\xf9*:JZjz\x8a\x9a\xaa\xba\xca\xda\xea\xfa\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf5N*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbc\xe3\xf3\x9f\xcegI\xd1\xc6\x8bg\'\x1dCRS\xea\xb2\x9a\x18\xed\xebF?\xf3\xd3\xec\x8fj\xe6\xd3\xb34\xdcr\xe3<\xa3\xf7\xbc\xff\x00ok\xfc,~\x1c~\xa9\xfd\x83\xf6\xf2\xf9\xa4^S\xf3>\xa3>\x91oq\x05\xd3\xa3\xa8\xe12\x06\xaa\xf3M\x8dW\xec\xef\xd7\xe9\xceW\xb5qOK\xa9\x94bH\x89\xdc{\x8f\xea\xe4\xf6}\x83\xa9\x86\xb7G\t\xcc\x031\xe9\x97\xbc~\xb1G\xe2\xca\xad\xbc\xef\xaaEA:Gp;\x9287\xde\xbb~\x19\x8f\x0e\xd3\xc89\xd1s\xb2vV3\xc8\x90\x9b\xda\xf9\xe7L\x92\x82\xe29-\xdb\xb9\xfbk\xf7\x8d\xff\x00\x0c\xcc\x87i\xe3<\xc1\x0e\x16N\xca\xc8>\x92\nqi\xab\xe9\x97t\x16\xf71\xbb\x1e\x89Z7\xfc\t\xa1\xcc\xccz\x8cs\xe4C\x83\x93M\x92\x1fTJ/.iv*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xa8M_U\xb3\xd2t\xcb\x9dJ\xf5\xf8[Z\xa1\x92C\xdfn\x80{\xb1\xd8{\xe4\xf1\xe33\x90\x88\xe6Z\xb3\xe6\x8e(\x19\xcb\x90|\xaf\xe6=z\xf3^\xd6\xae\xb5[\xb3\xfb\xdb\x87\xaa\xa5j\x11\x06\xc8\x8b\xec\xab\xb6u\xd8q\x0cp\x11\x1d\x1f5\xd5je\x9b!\x9c\xb9\x94\xef\xc8\x1a\x97\xa5y-\x83\xb7\xc1p9\xc4\x0f\xf3\xa0\xdc\x0f\x9a\xfe\xac\xe7=\xa8\xd1\xf1\xe1\x19G8s\xf7\x1f\xda\xf5\xde\xc4v\x87\x87\xa8\x96\x02v\xc86\xfe\xb0\xfdb\xfeA\x9d\x9c\xe0\x9fUk\x02Z\xc5Q\xb6\xba\xd6\xabiOB\xeaD\x03\xa2\x93\xc9\x7f\xe0Z\xa3.\x86\xa7$9\x12\xd1\x93K\x8e\x7fTBok\xe7\xcdJ:\x0b\x88c\x9dGqTc\xf4\x8a\x8f\xc33!\xda\x93\x1fP\x05\xc2\xc9\xd98\xcf\xd2H\xfbS\x9b_<\xe9\x12\xd0N\xb2[\xb7r\xc3\x92\xfd\xebS\xf8fl;O\x19\xe7a\xc1\xc9\xd9YG*\x92sk\xa9\xe9\xd7`}Z\xe69I\xfd\x95a\xcb\xfe\x07\xaefC4\'\xf4\x90\\\x1c\x98\'\x0f\xa8\x10\x89\xcbZ\x9d\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbc?\xf3\xbb\xce\x9f[\xbe_-\xd9\xbdm\xad\x18=\xf3)\xfbS\xd3\xe1M\xbb ;\xff\x00\x95\xf2\xcd\xff\x00e\xe9\xb8G\x88y\x9e^\xe7\x8d\xf6\x87_\xc5/\x06<\xa3\xcf\xdf\xdd\xf0\xfb\xfd\xcf*\xcd\xbb\xcd+\xd9\xddKiw\x15\xccF\x92B\xe1\xd7\xde\x87\xa1\xa7c\x95\xe6\xc5\x1c\x900\x97)\nm\xd3\xe7\x96\x1c\x91\xc9\x1f\xaa$\x11\xf0z\xed\xbd\xc4w6\xd1\\Dk\x1c\xa8\x1d\x0f\xb3\n\x8c\xf2MF\tb\xc9(K\x9cM>\xfd\xa4\xd4\xc7>(\xe4\x8f\xd30\n\xfc\xa1\xc9k\x15q\xc0\x96\xb1V\x8e)[\xdf\x02\xa6\x16\x9e`\xd6m(!\xbb\x90(\xe8\x8cy\xaf\xdc\xd5\xcc\x8cz\xbc\x90\xe5"\xe3d\xd1\xe2\x9f8\x84\xe2\xd3\xf3\x02\xfd(.\xad\xe3\x99\x7f\x99\t\x8d\xbf\xe3a\xf8fn>\xd5\x98\xfa\x80?c\x85\x93\xb1\xe0~\x92G\xda\x9dZy\xe7D\x9a\x82S%\xb3\x7f\x96\xb5_\xbdyff>\xd3\xc5.v\x1c\x0c\x9d\x95\x96<\xaaI\xd5\xae\xa1ct+mq\x1c\xde\xc8\xc0\x9f\xa4\r\xf36\x19a?\xa4\x82\xe0\xe4\xc38}@\x85|\xb1\xad\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5X\xdf\xe6\x07\x9bb\xf2\xc7\x97f\xbd\x04\x1b\xd9\x7fsc\x19\xde\xb2\xb0\xfbT\xf0A\xf1\x1f\xbb\xbeeh\xf4\xfe,\xeb\xa7W_\xdaz\xd1\xa7\xc4e\xfcGa\xef\xfd\x8f\x98%\x9aY\xa5y\xa5s$\xb21y\x1d\x8dY\x99\x8dI$\xf7\':\xb0(P|\xe6R$\xd9\xe6\xb7\n\x1b\xc5\x0c\xfb\xc8Z\x97\xad\xa7\xc9b\xe7\xe3\xb6nQ\xff\x00\xc675\xfc\x1a\xbf~p\xbe\xd4\xe8\xf8rG(\xe5-\x8f\xbc~\xb1\xf7>\xa3\xec7h\xf1\xe1\x96\x9eGxn?\xaay\xfc\x8f\xfb\xa6Q\x9c\x9b\xde5\x8a\xb8\xe0KX\xabG\x14\xad\xc0\xad\x1cU\xa3\x8aZ8\x12\xe0H \x83B:\x11\x8a\xa6V\x9ef\xd7mh#\xbbvQ\xfb2~\xf0\x7f\xc3W2q\xebr\xc7\x94\xbfK\x8b\x93C\x86|\xe2>\xe4\xea\xd3\xf3\x0e\xedh.\xedRA\xdd\xa3%\x0f\xdcyfn>\xd6\x90\xfa\x85\xb8\x19;\x1a\'\xe9\x95{\xd3\xbb?\xf1\x99\xb1\x9cd,\x1bp\'\tD\xd4\x85*d\x98\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xe6\x9f\x9d~s\xfd\x17\xa4\r\n\xceJ_jJ}r:\xa5\xb5h\x7f\xe4a\x1c~U\xcd\xaffi\xb8\xe5\xc6yG\xefy\xfe\xdf\xd7\xf8x\xfc8\xfdS\xe7\xee\xfd\xbf\xad\xe0\x99\xd0\xbcK\x86(o\x15o\x147\x8a\xbdC\xcb\x1a\x97\xd7\xf4xdf\xac\xd1\x0fJm\xeay\'s\xf3\x149\xe6]\xbd\xa3\xf052\xaf\xa6^\xa1\xf1\xe7\xf6\xbe\xd7\xec\xbfh~gG\x12O\xae\x1e\x93\xf0\xe5\xf3\x15\xf1M3L\xf4N8\x12\xd6*\xd1\xc5+p+G\x15h\xe2\x96\x8e\x04\xbb\x02\xad8\xa5\xa3\x8a\xbb\x02Z8\xabX\x12\xd6*\xd1\xc0\xad\xc7,\xb18x\x9d\xa3q\xd1\x94\x90~\xf1\x84H\x83aLA\x14wN,\xfc\xe5\xe6\x1bZ\x01rfA\xfb3\x00\xff\x00\xf0\xc7\xe2\xfcs3\x1fh\xe6\x8f[\xf7\xb8Y;7\x04\xff\x00\x86\xbd\xdb~\xc4\xf2\xcf\xf3$\xec/l\xfeo\x0b\x7f\xc6\xad\xff\x005fv>\xd8\xfet~N\xbf/b\x7f2_?\xc7\xe8O,\xbc\xe9\xe5\xeb\xaa\x0f\xac\xfa\x0e\x7ff`S\xfe\x1b\xec\xfe9\x9d\x8f\xb4p\xcb\xad{\xdc\x0c\xbd\x99\x9e\x1d/\xdd\xf8\xb4\xe6)\xa1\x99\x03\xc3"\xc8\x87\xa3!\x0c>\xf1\x99\x91\x90"\xc1\xb7\x06Q14E/\xc91v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5PZ\xce\xafe\xa3\xe9w:\x9d\xebp\xb6\xb5C#\x9e\xe6\x9d\x15}\xd8\xec=\xf2x\xb1\x99\xc8Ds-9\xf3G\x14\x0c\xe5\xc8>V\xf3\x0e\xb9y\xae\xeb7Z\xad\xe1\xfd\xf5\xcb\xf2\xe3Z\x84Q\xb2 \xf6U\x00g_\x87\x10\xc7\x11\x11\xd1\xf3mV\xa2Y\xb2\x19\xcb\x99K\xf2\xc6\x87\x0cP\xde*\xde(o\x15d\xdeD\xd4\xbd\rI\xec\xdc\xfe\xee\xe9~\x1fg@H\xfb\xc5\x7f\x0c\xe7=\xa6\xd1\xf8\x988\xc7\xd5\x8f\xee<\xff\x00A{\x1fb\xfbG\xc1\xd5\x1cG\xe9\xca+\xfc\xe1\xb8\xfd#\xe2\x19\xf6y\xe3\xeb\x8e8\x12\xd6*\xd1\xc5+p+G\x15h\xe2\x96\x8e\x04\xbb\x02\xad8\xa5\xa3\x8a\xbb\x02Z8\xabX\x12\xd6*\xd1\xc0\xad\x1cR\xd1\xc5-`V\xb0%|7\x17\x16\xef\xce\t^\'\xfedb\xa7\xef\x19(\xcc\xc7pi\x8c\xa1\x19\n"\xd3\xab?Q\x8f\xf8o\x96t\x1d\x97\xa6\xe1\x8f\x19\xe6y{\x9e7\xda\r\x7f\x1c\xfc(\xfd1\xe7\xef\xfd\x9f{\xcb3l\xf3m\xe2\xae\x18\xa1\xbcU\xbcP\xde*\xa9\x04\xd2A4sDx\xc9\x13\x07C\xd6\x85MFG$\x04\xe2by\x1d\x99\xe2\xcb,s\x13\x89\xa9D\xd8\xf7\x87\xadX\xdd\xc7yg\r\xd4\x7fbd\x0e\x07\x85z\x83N\xe3\xa6y&\xb3Lpe\x963\xfc\'\xfb>\xc7\xdf\xbb?Y\x1dN\x08e\x8f)\x8b\xfdc\xe0vV9\x8a\xe6\xb5\x8a\xb4qJ\xdc\n\xd1\xc5Z8\xa5\xa3\x81.\xc0\xabN)h\xe2\xae\xc0\x96\x8e*\xd6\x04\xb5\x8a\xb4p+G\x14\xb4qKX\x15\xac\th\xe2\x96\xb1V\xb0%\xacUZ\xda\xf6\xf2\xd5\xf9\xdbO$\r\xe3\x1b\x15\xfdG%\x0c\x92\x89\xb8\x92\x18O\x14f*@\x14\xee\xcf\xcf\xdeb\xb6\xa0yR\xe5\x07\xec\xcc\xa2\xbf\xf0K\xc4\xfd\xf9\x9d\x8f\xb5sG\x99\xe2\xf7\xb8\x19{#\x04\xb9\x0e\x1fr}e\xf9\x9dh\xd4\x17\xb6o\x1f\x8b\xc4\xc1\xc7\xce\x8d\xc6\x9f~g\xe3\xed\xa8\x9f\xaa5\xeeu\xd9{\x0eC\xe8\x90>\xf4\xfe\xcb\xcd\xbe]\xbc\xa0\x8e\xf5\x11\x8f\xecKX\xcd|>:\x0f\xbb3\xf1\xeb\xf0\xcf\x94\x87\xc7g]\x97\xb3\xb3\xc3\x9cO\xc3\x7f\xb96VVP\xcaC)\xdc\x11\xb89\x96\r\xb8dSxP\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5X\xc7\xe6\'\x9b\xe3\xf2\xc7\x97&\xbbR\r\xfc\xf5\x86\xc23\xbdea\xf6\x88\xf0A\xf1\x1f\xbb\xbee\xe8\xf4\xfe,\xeb\xa7W]\xdaz\xd1\xa7\xc4e\xfcGa\xef\xfd\x8f\x98$\x92Ididb\xf2;\x16wcRX\x9a\x92I\xees\xab\x02\x9f<\x91$\xd9k\x16-\xe2\xae\x18\xa1\xbcU\xbcP\xde*\xecP\xce<\x85\xa9z\x96\xd3i\xee~(O\xa9\x10\xff\x00!\x8f\xc4\x07\xc9\xbf^q>\xd5\xe8\xeaQ\xcc:\xfaO\xe8\xfcy>\x99\xec\'h\xdcg\xa7\x97\xf0\xfa\xa3\xee\xeb\xf6\xd7\xcc\xb2\xc3\x9cs\xe8mb\xad\x1cR\xb7\x02\xb4qV\x8e)h\xe0K\xb0*\xd3\x8aZ8\xab\xb0%\xa3\x8a\xb5\x81-b\xad\x1c\n\xd1\xc5-\x1cR\xd6\x05k\x02Z8\xa5\xacU\xac\tk\x15v\x05ZqKG\x02\xbb\x14\xab\xdajZ\x85\x9bV\xd6\xe6H\x0f\xfcV\xe5A\xf9\x80rx\xf3N\x1fI!\xab&\x18O\xea\x00\xa7\xd6_\x98\x9ea\xb7\xa0\x99\xa3\xbaQ\xfe\xfcZ5>i\xc7\xf1\xcc\xfc}\xaf\x9a<\xea^\xf7_\x97\xb1\xb0\xcb\x95\xc7\xdd\xfbS\xfb\x1f\xcc\xfd=\xe8\xb7\xb6\xb2@\x7f\x9a2$_\xa6\xbc\x0f\xeb\xcd\x86.\xda\x81\xfa\xa2G\xda\xeb\xb2\xf6\x14\xc7\xd1 }\xfb\'\xf6>i\xf2\xfd\xed\x04\x17\xd1\xf2=\x11\xcf\xa6\xdfs\xf1\xaf\xd1\x99\xf8\xb5\xd8g\xcaC\xee\xfb\xddv]\x06l|\xe2~\xff\x00\xb95\x04\x11Q\xb8=\x0ee\xb8n\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5ZwDFw`\xa8\xa0\x96bh\x00\x1b\x92I\xc4\x04\x13O\x98\xff\x002\xbc\xe4\xfeg\xf3\x14\x93D\xc7\xf4m\xa5a\xb0O\x14\x07\xe2\x93\xe7!\xdf\xe5A\xdb:\xad\x16\x9b\xc2\x85\x7f\x11\xe6\xf9\xf7j\xeb\xbf1\x96\xc7\xd06\x1f\xaf\xe2\xc5\x06f:\xc6\xf1Cx\xab\x86(o\x15o\x147\x8a\xbb\x14&\x1a\x16\xa2t\xfdR\x0b\x9a\xd20\xdce\xeb\xf6\x1bf\xe9\xe1\xd70\xbbGH5\x18%\x8f\xa9\x1b{\xfa;.\xc7\xd7\x9d&\xaa\x19z\x03\xbf\xf5N\xc7\xec\xfb^\xa9Z\x8a\x8e\x99\xe4\xc4\x10h\xbe\xf7\x19\x02,rk\x03&\x8e)[\x81Z8\xabG\x14\xb4p%\xd8\x15i\xc5-\x1cU\xd8\x12\xd1\xc5Z\xc0\x96\xb1V\x8e\x05h\xe2\x96\x8e)k\x02\xb5\x81-\x1cR\xd6*\xd6\x04\xb5\x8a\xbb\x02\xad8\xa5\xa3\x81]\x8aZ\xc0\xabqK\xb0+G\x14\xa2\xac\xb5}R\xc4\x83iu, ~\xca9\x0b\xf4\xafC\x96\xe3\xd4d\x87\xd3"\x1ar\xe9\xf1\xe4\xfa\xa2\x0b \xb2\xfc\xc9\xd7\xe0\xa0\xb8\x11]/r\xeb\xc1\xbe\xf4\xa0\xfc3?\x17lf\x8f:\x93\xae\xcb\xd8\x98e\xf4\xdc\x7f\x1el\x82\xcb\xf3?I\x96\x82\xf2\xde[f=Yi"\x0f\xa7\xe1o\xc368\xbbk\x19\xfa\x81\x1fk\xad\xcb\xd8Y\x07\xd2D\xbe\xc6Ac\xe6M\x06\xfa\x9fV\xbe\x89\x98\xf4Fn\x0f\xff\x00\x02\xfc[\xf0\xcd\x86-f)\xfd2\x0e\xb7.\x8b6?\xaa%2\xcc\x97\x15\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbc\xc7\xf3\xb7\xce\x9f\xa3t\xa5\xd0,\xe4\xa5\xee\xa2\xb5\xba*wKn\x84\x7f\xcfC\xb7\xca\xb9\xb5\xec\xbd7\x14\xb8\xcf(\xfd\xff\x00\xb1\xe7\xbb{]\xe1\xc3\xc2\x8f\xd5.~\xef\xda\xf0L\xe8^-\xb1\x8a\xb7\x8a\x1b\xc5\\1Cx\xabx\xa1\xbcU\xd8\xa1\xbcU\xe9>R\xd4~\xb9\xa3D\x1b\xfb\xdbo\xdc\xbf\xc9G\xc2\x7f\xe0i\x9em\xed\x16\x8f\xc1\xd4\x99\x0f\xa6~\xaf\x8f_\xb7\x7f\x8b\xec\xde\xc8v\x87\xe64b\'\xea\xc5\xe9>\xef\xe1\xfb6\xf8\'9\xa1z\x96\x8e)[\x81Z8\xabG\x14\xb4p%\xd8\x15i\xc5-\x1cU\xd8\x12\xd1\xc5Z\xc0\x96\xb1V\x8e\x05h\xe2\x96\x8e)k\x02\xb5\x81-\x1cR\xd6*\xd6\x04\xb5\x8a\xbb\x02\xad8\xa5\xa3\x81]\x8aZ\xc0\xabqK\xb0+G\x14\xb5\x81-b\xad\x1c\n\xd1\xc5(\xeb\x1d{Y\xb0\xa0\xb4\xbc\x96%\x1d\x101)\xff\x00\x00j\xbf\x86_\x8bU\x93\x1f\xd3"\x1c|\xbaLY>\xa8\x82\xc8,\x7f3\xb5\xc8h.\xa2\x8a\xed{\x9azo\xf7\xaf\xc3\xff\x00\x0b\x9b\x0c]\xb5\x96?P\x12\xfb?\x1f\'[\x97\xb0\xb1K\xe9&?o\xe3\xe6\xc8l\x7f3\xf49\xa8\xb7QKj\xc7\xabPH\x83\xe9_\x8b\xfe\x1768\xbbk\x11\xfa\x81\x8f\xdb\xf8\xf9:\xdc\xbd\x85\x96?I\x12\xfb?\x1f6Ec\xaf\xe8\xb7\xf4\x16\x97\xb0\xca\xc7\xa2\x06\x01\xff\x00\xe0\r\x1b\xf0\xcd\x86-V)\xfd2\x05\xd6e\xd2e\xc7\xf5D\x84~d8\xee\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xa8\x1dsY\xb2\xd1t\x9b\xadR\xf5\xb8\xdb\xda\xa1v\xf1c\xd1U}\xd9\xa8\x06Y\x8b\x19\x9c\x84G2\xd3\xa8\xcf\x1cP3\x97 \xf9S_\xd6\xefu\xcdb\xebU\xbc5\x9e\xe9\xcb\x15\xea\x15z*/\xb2\xad\x00\xce\xbb\x0e!\x8e"#\xa3\xe6\xfa\x9dD\xb3d3\x972\x97\xe5\x8d\r\x8cU\xbcP\xde*\xe1\x8a\x1b\xc5[\xc5\r\xe2\xae\xc5\r\xe2\xac\x87\xc9Z\x88\xb5\xd5}\x074\x8a\xecp\xde\x80s]\xd3\xf8\x8f\xa74\x1e\xd1\xe8\xfcm1\x90\xfa\xb1\xef\xf0\xeb\xfa\xfe\x0fW\xecwh\xfe_X O\xa3/\xa7\xe3\xfc?n\xdf\x17\xa0\xe7\x9b\xbe\xc8\xd1\xc5+p+G\x15h\xe2\x96\x8e\x04\xbb\x02\xad8\xa5\xa3\x8a\xbb\x02Z8\xabX\x12\xd6*\xd1\xc0\xad\x1cR\xd1\xc5-`V\xb0%\xa3\x8aZ\xc5Z\xc0\x96\xb1W`U\xa7\x14\xb4p+\xb1KX\x15n)v\x05h\xe2\x96\xb0%\xacU\xa3\x81Z8\xa5\xac\n\xd1\xc5Z\xc5-\x1c\tL\xac|\xcb\xafXPZ\xdfJ\x8a\xbd#-\xcd\x07\xfb\x07\xe4\xbf\x86d\xe2\xd6e\xc7\xf4\xc8\xb8\xb9t8r}Q\x0c\x93L\xfc\xce\xd6\x83\xacWV\xd1]\x7f\x94\xb5\x89\xbe\x929/\xfc.l\xb0v\xd6[\xa9\x01/\xb1\xd2\xeb\xbb\'\x06(\x1c\x9cF |\x7f\x1f7\xa5Z\xdc\xc5sm\x15\xc4F\xb1\xcc\x81\xd0\xfb0\xaet\xb0\x98\x94D\x87"\xf3\x92\x8f\t\xa5L\x93\x17b\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xf0\x7f\xce\xff\x00:~\x90\xd5\x17\xcb\xd6rV\xcfOnWez=\xc5)\xc7\xe5\x184\xff\x00Z\xbe\x19\xd0v^\x9b\x86yc\xee;{\xba}\x8f\xbe\xf6N\xbcj\xf4\xd0\xcc?\x88o\xef\xe4~\xd4I\xcc7d\xb7\x02\xb4qV\x8e)h\xe0K\xb0*\xd3\x8aZ8\xab\xb0%\xa3\x8a\xb5\x81-b\xad\x1c\n\xd1\xc5-\x1cR\xd6\x05k\x02Z8\xa5\xacU\xac\tk\x15v\x05ZqKG\x02\xbb\x14\xb5\x81V\xe2\x97`V\x8e)k\x02Z\xc5Z8\x15\xa3\x8aZ\xc0\xad\x1cU\xacR\xd1\xc0\x97b\xa9\x8d\x84\x1c\x13\xd4a\xf1?Oa\x99x!B\xde\x17\xda.\xd0\xf12xQ\xfaa\xcf\xce_\xb3\xf5\xbd\'\xc8\x1a\x97\xada%\x8b\x9f\x8e\xd9\xb9G\xff\x00\x18\xdc\xd7\xf0j\xfd\xe3:>\xcc\xcdq0=>\xe3\xfb]~9qc\x07\xbbc\xf0\xe5\xf6}\xcc\xab6\x89v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1V-\xf9\x8f\xe7\x08\xfc\xaf\xe5\xc9nca\xfaB\xe6\xb0\xd8!\xff\x00~\x11\xbb\xd3\xc1\x06\xff\x00p\xef\x99z-7\x8b:\xe89\xba\xee\xd4\xd6\x8d>"G\xd4v\x1f\x8f\'\xcc\x0f#\xc9#I#\x17w%\x9d\x89\xa9$\xeeI9\xd5\x81O\x9e\x93{\x95\xb8\xa1\xbcP\xd8\xc5[\xc5\r\xe2\xae\x18\xa1\xbcU\xbcP\xde*\xecP\xde*\xecU\x99\xf9\x0fQ\xaa\xcf\xa7\xb9\xdd\x7f{\x085\xe8vq\xf7\xd0\xfd\xf9\xc7{W\xa3\xb1\x1c\xc3\xfa\xa7\xf4~\x97\xd1}\x83\xed\x1a3\xd3H\xff\x00J?t\xbfA\xf9\xb2\xe3\x9cK\xe9kp+G\x15h\xe2\x96\x8e\x04\xbb\x02\xad8\xa5\xa3\x8a\xbb\x02Z8\xabX\x12\xd6*\xd1\xc0\xad\x1cR\xd1\xc5-`V\xb0%\xa3\x8aZ\xc5Z\xc0\x96\xb1W`U\xa7\x14\xb4p+\xb1KX\x15n)v\x05h\xe2\x96\xb0%\xacU\xa3\x81Z8\xa5\xac\n\xd1\xc5Z\xc5-\x1c\tV\xb4\x83\xd5\x97\x7f\xb0\xbb\xb7\xf4\xcb1C\x88\xba\x9e\xd8\xed\x0f\xcba$}r\xd8~\xbf\x82j3=\xf3\x8bM|\xb7\xa9~\x8e\xd6 \x9d\x9b\x8c,})\xcfA\xc1\xf6$\xfb)\xa3}\x19\x91\xa5\xcb\xe1\xe4\x12\xe9\xd7\xdd\xf8\xdd\xcb\xd1\xcb\xd4c\xfc\xef\xbf\xa7\xea\xf8\xbdS:w%\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xadI"F\x8d$\x8c\x11\x10\x16v&\x80\x01\xb9$\xe2\x05\xa0\x9a\x16_/\xfedy\xc6O4y\x8e[\x98\xd8\xfe\x8e\xb6\xac6\x08kOL\x1d\xde\x9e2\x1d\xfeT\x1d\xb3\xab\xd1i\xbc(W\xf1\x1eo\x9fv\xa6\xb4\xea2\x92>\x91\xb0\xfcy\xb1l\xcbu\xae\xc5[\xc5\r\x8cU\xbcP\xde*\xe1\x8a\x1b\xc5[\xc5\r\xe2\xae\xc5\r\xe2\xae\xc5Q\x9aM\xf3Xj0]\r\xc4m\xf1\x8f\x15;0\xff\x00\x819\x8d\xad\xd3\x0c\xf8e\x8c\xff\x00\x10\xfe\xcf\xb5\xcd\xec\xddi\xd2\xea!\x98\x7f\x01\xfb:\x8f\x88z\xa2\xb2\xba\x06R\n\xb0\xaa\x91\xb8 \xe7\x91\xce\x0621<\xc3\xf4\x06,\x91\x9cD\xa2n2\x16=\xc5\xac\x836\x8e*\xd1\xc5-\x1c\tv\x05ZqKG\x15v\x04\xb4qV\xb0%\xacU\xa3\x81Z8\xa5\xa3\x8aZ\xc0\xad`KG\x14\xb5\x8a\xb5\x81-b\xae\xc0\xabN)h\xe0Wb\x96\xb0*\xdcR\xec\n\xd1\xc5-`KX\xabG\x02\xb4qKX\x15\xa3\x8a\xb5\x8a]BM\x06\xe4\xf4\x18\xa2R\x00Y\xe4\x9a\xdb\xc2"\x88/~\xac}\xf3;\x1c8C\xe6\xbd\xa9\xae:\x9c\xc6_\xc26\x8f\xbb\xf6\xaa\x8c\xb1\xd6\xae\xc5 \xd6\xefP\xf2\xae\xa5\xf5\xfd\x16\x17cY\xa1\xfd\xcc\xc7\xa9\xe4\x80P\x9f\xf5\x96\x87:M\x16n\x8c\x9e\x93\xf1\xe5\xf6\xfd\x96\xf4,\xf3\x17\xdb\x1a8\xabG\x14\xb4p%\xd8\x15i\xc5-\x1cU\xd8\x12\xd1\xc5Z\xc0\x96\xb1V\x8e\x05h\xe2\x96\x8e)k\x02\xb5\x81-\x1cR\xd6*\xd6\x04\xb5\x8a\xbb\x02\xad8\xa5\xa3\x81]\x8aZ\xc0\xabqK\xb0+G\x14\xb5\x81-b\xad\x1c\n\xd1\xc5-`V\x8e*\xdcq\x99\x1c(\xef\xdf\x0cE\x9ah\xd5\xeac\x83\x19\xc9.C\xf1I\xaa(U\n6\x03a\x99\xf1\x14)\xf2\xfc\xf9\xe5\x96fr\xe7%\xd8Z\x9b\x18Uv)T\x82i \x9a9\xa2\xecP\xde*\xecU\xbcP\xd8\xc5[\xc5\r\xe2\xae\x18\xa1\xbcU\xbcP\xde*\xecP\xde*\xecU\xbc(\\\x8cU\x83)!\x81\xa8#\xa88\n\xdd=CH\xbe\x17\xdat\x17_\xb4\xeb\xf1\x8e\x94q\xb3~#<\xa3\xb5t\x7f\x97\xd4J\x1d9\x8fq\xe5\xfa\x9f{\xec.\xd0\xfc\xde\x92\x19\x7f\x8a\xaa_\xd6\x1b\x1f\xd7\xf1E\x9c\xd7;f\x8e)h\xe0K\xb0*\xd3\x8aZ8\xab\xb0%\xa3\x8a\xb5\x81-b\xad\x1c\n\xd1\xc5-\x1cR\xd6\x05k\x02Z8\xa5\xacU\xac\tk\x15v\x05ZqKG\x02\xbb\x14\xb5\x81V\xe2\x97`V\x8e)k\x02Z\xc5Z8\x15\xa3\x8aZ\xc0\xad\x1cU\x1dg\x0f\x04\xe6~\xd3~\x032\xb0\xc2\x85\xbc/\xb4\x1d\xa1\xe2\xe4\xf0\xe3\xf4C\xed?\xb3\x97\xcd\x122\xf7\x9do\x15laU\xd8\xa5\xb1\x85Y\xc7\xe5\xfe\xa5\xce\xde}9\xcf\xc5\x11\xf5a\x1f\xe41\xa3\x01\xf2m\xfe\x9c\xdcvf]\x8c\x0fM\xc7\xe9\xfcy\xbb\xd0\xd9\x87\x8e\xe2\x9fvr^\xd5\xe8\xf8\xb1\xc70\xe7\x1d\x8f\xb8\xf2\xfb~\xf7\xbf\xf6\x0f\xb4x2\xcbO#\xb4\xfdQ\xf7\x8e\x7f1\xfe\xe5\x98\x1c\xe1\x1fRh\xe2\x96\x8e\x04\xbb\x02\xad8\xa5\xa3\x8a\xbb\x02Z8\xabX\x12\xd6*\xd1\xc0\xad\x1cR\xd1\xc5-`V\xb0%\xa3\x8aZ\xc5Z\xc0\x96\xb1W`U\xa7\x14\xb4p+\xb1KX\x15n)v\x05h\xe2\x96\xb0%\xacU\xa3\x81Z8\xa5\xac\n\xabm\x17\xa9&\xff\x00ew9-\x9c\xad\xb9\xa3\x81.\xc0\xabN)h\xe2\xae\xc0\x96\x8e*\xd6\x04\xb5\x8a\xb4p+G\x14\xb4qKX\x15\xac\th\xe2\x96\xb1V\xb0%\xacU\xd8\x15i\xc5-\x1c\n\xecR\xd6\x05[\x8a]\x81Z8\xa5\xac\tk\x15h\xe0V\x8e)h\x02M\x07S\xd3\x162\x90\x88$\xf2\t\x8c1\x88\xe3\x0b\xdf\xb9\xf7\xcc\xbcq\xa0\xf9\xafjk\x8e\xa71\x97\xf0\xf2\x1e\xe5L\xb1\xd760\xa5\xbcU\xb1\x85Wb\x96\xc6\x15o\n\xbd+\xc9\xda\x97\xd74X\xd1\x8df\xb5\xfd\xcb\xfc\x94|\x07\xfe\x06\x9fNt\x1a\x0c\xbcx\xc0\xeb\x1d\xbfS\xb6\x94\xb8\xc0\x9f\xf3\xbe\xfe\xbf\xaf\xe2\x9d\xe6k\x17b\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xf2\xaf\xcf/:\xfdGN_.Y\xc9K\xbb\xe5\xe7z\xcawKz\xec\x9f9\x08\xff\x00\x81\xf9\xe6\xdb\xb2\xf4\xdcR\xe3<\x87/{\xce\xf6\xf6\xbb\x82\x1e\x14y\xcb\x9f\xbb\xf6\xbc#:\x07\x8ep\xc5[\xc5]\x8a\x1b\xc5]\x8a\xb7\x8a\x1b\x18\xabx\xa1\xbcU\xc3\x147\x8a\xb7\x8a\x1b\xc5]\x8a\x1b\xc5]\x8a\xb7\x85\r\x8c\n\xd8\xc2\x86y\xe4\xdd@\xdci\xa6\xdd\xcdd\xb5n#\xaf\xd8m\xd7\xaf\xd23\xcf\xbd\xa9\xd1\xf0f\x19G)\xfd\xe3\xf6W\xda\xfa\xdf\xb0\xdd\xa3\xe2\xe9\x8e\x19\x1fV#\xb7\xf5O\xea7\xf6\'\xc79w\xb8h\xe0K\xb0*\xd3\x8aZ8\xab\xb0%\xa3\x8a\xb5\x81-b\xad\x1c\n\xd1\xc5-\x1cR\xd6\x05k\x02Z8\xa5\xacU\xac\tk\x15v\x05ZqKG\x02\xbb\x14\xb5\x81V\xe2\x97`V\x8e)k\x02Z\xc5Z8\x15\xa3\x8aQ\x16\x91o\xea\x1f\x92\xe5\xd8\xa3\xd5\xe5\xbd\xa3\xed\x0e\x18\xf81\xe6~\xafww\xc7\xf1\xcd\x163!\xe2\xdb\xc2\xad\x8c)o\x15laU\xd8\xa5\xb1\x85[\xc2\xac\x83\xc9:\x97\xd55q\x03\x9aEx=3\xfe\xb8\xdd\x0f\xeb_\xa73t\x19x2WIm\xfa\xbf\x1env\x92V\x0c>#\xf4\xfd\x9b\xfc\x1e\x8b\x9d\x03s\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xa5\xdeb\xd7l\xb4\x1d\x16\xebU\xbc?\xb9\xb6N\\kB\xecvD\x1e\xec\xc4\x0c\xb7\x0e#\x92B#\xabF\xa7Q\x1c8\xcc\xe5\xc8>P\xd6\xf5\x8b\xddgU\xb9\xd4\xef_\x9d\xcd\xd3\x97s\xd8v\n\xb5\xfd\x95\x14\x03\xdb:\xdcX\xc4""9\x07\xces\xe6\x96Y\x99\xcb\x99A\xe5\x8d.\x18\xabx\xab\xb1Cx\xab\xb1V\xf1Cc\x15o\x147\x8a\xb8b\x86\xf1V\xf1Cx\xab\xb1Cx\xab\xb1V\xf0\xa1\xb1\x81[\x18P\x9b\xf9b\xff\x00\xeaz\xbcE\x8d#\x9b\xf72\x7f\xb2;\x1f\xf8*f\xa7\xb6\xb4\x7f\x98\xd3J#\xea\x1e\xa1\xef\x1f\xacl\xef\xbd\x99\xed\x1f\xcaka#\xf4K\xd3/q\xfdF\x8b\xd0\xceyc\xee\xad\x1c\tv\x05ZqKG\x15v\x04\xb4qV\xb0%\xacU\xa3\x81Z8\xa5\xa3\x8aZ\xc0\xad`KG\x14\xb5\x8a\xb5\x81-b\xae\xc0\xabN)h\xe0Wb\x96\xb0*\xdcR\xec\n\xd1\xc5-`KX\xabG\x02\xb6\x88]\x82\x8e\xfdN\x10,\xd3\x8f\xac\xd5G\x06#\x92]>\xdf$z\xa8P\x00\xe8:f`\x14\xf9\x86|\xd2\xcb39s\x92\xe1\x85\xa9\xbc*\xd8\xc2\x96\xf1V\xc6\x15]\x8a[\x18U\xbc*\xba7tutb\xae\x8420\xea\x085\x07\xe88\xfb\x9b1d0\x90\x90\xe8\xf5\x9d*\xfd5\r:\x0b\xb5\xa0\xf5P\x16Q\xd9\xc6\xcc\xbfC\x023\xa8\xc1\x97\xc4\x80\x97{\xb3\x9c@;r\xe9\xee\xe8\x8a\xcbX;\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xf3\xff\x00\xe7w\x9d\x7fJk\x03A\xb3\x92\xb6\x1ak\x1f\xac\x10v\x92\xe6\x94?D`\xf1\xf9\xd7:\x1e\xcc\xd3pG\x8c\xf3\x97\xdc\xf1\x9d\xbb\xae\xf1\'\xe1\xc7\xe9\x8f?\x7f\xec\xfdo2\xcd\xab\xa0o\x148b\xad\xe2\xae\xc5\r\xe2\xae\xc5[\xc5\r\x8cU\xbcP\xde*\xe1\x8a\x1b\xc5[\xc5\r\xe2\xae\xc5\r\xe2\xae\xc5[\xc2\x86\xc6\x05laCx\xa1\xe9Z\x1e\xa1\xf5\xfd2\x19\xc9\xac\xb4\xe37J\xf3]\x894\xf1\xeb\x9eW\xdbZ?\xcb\xeae\x11\xf4\x9d\xc7\xb8\xfe\xaeO\xbb\xfb7\xda?\x9b\xd1\xc2d\xfa\xe3\xe9\x97\xbc~\xb1G\xe2\x8e9\xa9w\xce\xc0\xabN)h\xe2\xae\xc0\x96\x8e*\xd6\x04\xb5\x8a\xb4p+G\x14\xb4qKX\x15\xac\th\xe2\x96\xb1V\xb0%\xacU\xd8\x15i\xc5-\x1c\n\xecR\xd6\x05[\x8a]\x81Z8\xa5\xac\tk\x15h\xe0T]\xbc|W\x91\xfbM\xfa\xb3#\x14kw\x83\xf6\x83\xb4<\\\x9e\x1cO\xa2\x1fi\xfd\x9c\x95\xb2\xe7\x9flb\xad\xe1V\xc6\x14\xb7\x8a\xb60\xaa\xecR\xd8\xc2\xad\xe1V\xc6*\xcc\xbc\x81\xa9oq\xa79\xff\x00\x8b\xe1\xfc\x15\xc7\xea?~m\xbb3.\xe6\x07\xde?K\xb2\xc3.,~q\xdb\xe0y~\x9f\xb1\x99f\xdd\x93\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xacC\xf3?\xce\x8b\xe5\x7f.I$\x0c?I\xdeV\x1b\x05\xee\x18\x8f\x8aZxF\r~t\xcc\xcd\x0e\x9b\xc5\x9e\xff\x00H\xe6\xeb;W]\xf9|V>\xb9l?_\xc1\xf3\x0b33\x16bY\x98\xd5\x98\xeeI=\xceu/\x02K\xb0\xa1\xbcP\xe1\x8a\xb7\x8a\xbb\x147\x8a\xbb\x15o\x1461V\xf1Cx\xab\x86(o\x15o\x147\x8a\xbb\x147\x8a\xbb\x15o\n\x1b\x18\x15\xb1\x85\r\xe2\x86M\xe4\x9dC\xd3\xba\x96\xc5\xcf\xc30\xe7\x10\xae\xdc\xd4n\x00\xf7_\xd5\x9c\xb7\xb5:><#(\xe7\x0e~\xe3\xfb\x7fK\xdd{\x0b\xda>\x16\xa2X$}9F\xdf\xd6\x1f\xac_\xc83#\x9e|\xfa\xdb\xb0*\xd3\x8aZ8\xab\xb0%\xa3\x8a\xb5\x81-b\xad\x1c\n\xd1\xc5-\x1cR\xd6\x05k\x02Z8\xa5\xacU\xac\tk\x15v\x05ZqKG\x02\xbb\x14\xb5\x81V\xe2\x97`V\x8e)k\x02Z\xc5W\xc3\x1f7\xa9\xe8:\xe4\xa1\x1b.\xa3\xb6{C\xf2\xf8v\xfa\xe5\xb0\xfd\'\xe1\xf7\xa3\x06e>t\xde\x15lb\xad\xe1V\xc6\x14\xb7\x8a\xb60\xaa\xecR\xd8\xc2\xad\xe1V\xc6*\x8b\xd2\xef\x9e\xc3P\x82\xedk\xfb\xa7\x05\xc0\xee\x87f\x1fJ\x93\x96b\xc8a!.\xe7\'K1\x19\xd1\xe5-\xbf\x1e\xe3E\xeb\x08\xe8\xe8\xae\x8420\x05Xt \xee\x0eu\x00\xd8\xb0\xe6\x10A\xa2\xde\x14;\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xad\x9ah\xa1\x85\xe6\x99\xc4qD\xa5\xe4\x91\x8d\x15UEI$\xf6\x03\x08\x16h"D\x01g\x93\xe5\x9f\xcc?8K\xe6\x9f2Oz\t\x161~\xe6\xc23\xb5"S\xf6\xa9\xfc\xce~#\xf7v\xce\xafI\xa7\xf0\xa1]z\xbe}\xdaZ\xc3\xa8\xcae\xfc#a\xeec9\x94\xeb\xdb\xc5[\xc5\x0e\x18\xabx\xab\xb1Cx\xab\xb1V\xf1Cc\x15o\x147\x8a\xb8b\x86\xf1V\xf1Cx\xab\xb1Cx\xab\xb1V\xf0\xa1\xb1\x81[\x18P\xde(U\xb4\xb9\x92\xda\xe6;\x88\xcf\xc7\x13\x06^\xb44\xeci\xd8\xe5Y\xb1G$\x0c%\xcaB\x9b\xf4\xda\x89a\xc9\x1c\x90\xfa\xa2A\x1f\x07\xa8A4s\xc3\x1c\xd1\x9a\xc7*\x87C\xec\xc2\xa3<\x83S\x82XrJ\x12\xe7\x13O\xd0\xba=Tu\x18c\x96?L\xc0+\xf2\x87%i\xc5-\x1cU\xd8\x12\xd1\xc5Z\xc0\x96\xb1V\x8e\x05h\xe2\x96\x8e)k\x02\xb5\x81-\x1cR\xd6*\xd6\x04\xb5\x8a\xbb\x02\xad8\xa5\xa3\x81]\x8aZ\xc0\xabqK\xb0+G\x14\xb5\x81.\x00\x93A\xd4\xe2\xc6s\x11\x04\x9d\x80E\xc6\x81\x16\x9f~d\xc24\x1f4\xed-q\xd4\xe63\xfe\x1eC\xdc\xbcd\xdc\x06\xf0\xabc\x15o\n\xb60\xa5\xbcU\xb1\x85Wb\x96\xc6\x15o\n\xb61V\xf0\xab\xd0\xfc\x95\xa8\xfdkH\x16\xeek-\x99\xf4\xce\xfb\xfagt?*|?Fo{;/\x16>\x1e\xb1\xfb\xba~\xaf\x83\xb6\xe2\xe3\x88\x9f\x7f?x\xe7\xfa\xfe,\x833\xd8\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbc\x9f\xf3\xd3\xce\xdfS\xb0_-YIK\x9b\xc5\x0f~\xcawH?e6\xef!\xeb\xfeO\xcf6\xfd\x97\xa6\xe2>!\xe49{\xdes\xb7\xb5\xdc1\xf0\xa3\xce\\\xfd\xdf\xb5\xe19\xbfy\x17b\x86\xf1V\xf1C\x86*\xde*\xecP\xde*\xecU\xbcP\xd8\xc5[\xc5\r\xe2\xae\x18\xa1\xbcU\xbcP\xde*\xecP\xde*\xecU\xbc(l`V\xc6\x147\x8a\x1c0+6\xf2]\xf8\x96\xc5\xec\xd8\xfcv\xe6\xa9\xd3\xec9\xaf\xd3F\xaep~\xd5\xe8\xf8rG0\xe5-\x8f\xbc~\xcf\xb9\xf5_`\xbbG\x8f\x0c\xb4\xe7\x9c\x0f\x10\xfe\xa9\xe7\xf2?\xee\x99\x16r/\xa0-8\xa5\xa3\x8a\xbb\x02Z8\xabX\x12\xd6*\xd1\xc0\xad\x1cR\xd1\xc5-`V\xb0%\xa3\x8aZ\xc5Z\xc0\x96\xb1W`U\xa7\x14\xb4p+\xb1KX\x15n)v\x05h\xe2\x96\xb0%Z\x04\xfd\xb3\xf4e\x98\xe3\xd5\xe5=\xa3\xed\x0e\x11\xe0\xc7\x99\xde^\xee\x81_2\x1e5\xb1\x8a[\xc2\xad\x8cU\xbc*\xd8\xc2\x96\xf1V\xc6\x15]\x8a[\x18U\xbc*\xd8\xc5[\xc2\xa9\xdf\x94u/\xa9k1\xab\x1aCu\xfb\x99<*\xc7\xe0?\xf0[}9\x97\xa2\xcb\xc1\x90w\x1d\xbfW\xdb\xf7\xb9\xdaI]\xc3\xe2=\xe3\xf6_\xc8=#:\x16\xe7b\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xaaY\xe6]~\xcb\xcb\xfa%\xd6\xadx\x7ful\x95T\xad\x0b\xb9\xd9\x11}\xd9\xb6\xcbp\xe29&":\xb4j\xb5\x11\xc3\x8c\xce]\x1f\'\xeb\x1a\xb5\xee\xaf\xaa\\\xeaw\xaf\xce\xea\xeaC$\x87\xb6\xfd\x00\xf6Q\xb0\xf6\xce\xbb\x1e1\x08\x88\x8eA\xf3\xac\xd9\xa5\x92fr\xe6P\x996\xa7b\x86\xf1V\xf1C\x86*\xde*\xecP\xde*\xecU\xbcP\xd8\xc5[\xc5\r\xe2\xae\x18\xa1\xbcU\xbcP\xde*\xecP\xde*\xecU\xbc(l`V\xc6\x147\x8a\x1c0*g\xe5\xfb\xff\x00\xa8\xea\x90\xcaO\x18\x9c\xfas\x13@8\xb7r}\x8d\x0ek\xbb[G\xf9\x8d<\xa1\xfc\\\xc7\xbc~)\xdc\xf6\x07h\xfeOY\x0c\x87\xe9\xba\x97\xf5O?\x97?\x83\xd1s\xc9\xdf|Zp%\xa3\x8a\xbb\x02Z8\xabX\x12\xd6*\xd1\xc0\xad\x1cR\xd1\xc5-`V\xb0%\xa3\x8aZ\xc5Z\xc0\x96\xb1W`U\xa7\x14\xb4p+\xb1KX\x15n)v\x05h\xe2\x97*\x96j}\xf8\x81e\xc6\xd6j\xa3\x83\x11\xc9.\x9fiE\x00\x00\xa0\xe83$\n|\xc36id\x99\x9c\xbe\xa2\xbb$\xd6\xd8\xc5-\xe1V\xc6*\xde\x15laKx\xabc\n\xae\xc5-\x8c*\xde\x15lb\xad\xe1V\xc5{\x1a\x1e\xc4u\xc5\xb3\x1c\xccd$9\x87\xaahz\x88\xd44\xbb{\xa2G\xa8\xcbI@\xda\x92/\xc2\xdb|\xc6\xde\xd9\xd2\xe9\xb2\xf8\x98\xc4\xba\xfe\x97g0.\xc7#\xb8Ge\xec\x1d\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1W\xcf\x7f\x9d\xbev\xfd/\xad\r\x0e\xceJ\xe9\xfa[\x111\x07i.z1\xff\x00\x9e\x7fd{\xd7:.\xcc\xd3pG\x8c\xf3\x97\xdc\xf1\x9d\xb9\xae\xf12xq\xfaa\xf7\xfe\xc7\x9a\x0c\xda:\x16\xf1Wb\x86\xf1V\xf1C\x86*\xde*\xecP\xde*\xecU\xbcP\xd8\xc5[\xc5\r\xe2\xae\x18\xa1\xbcU\xbcP\xde*\xecP\xde*\xecU\xbc(l`V\xc6\x147\x8a\x1c0+c\x15z/\x97\xaf\xfe\xbb\xa5C#\x12e\x8czR\x93Ry/rOZ\x8a\x1c\xf3\x0e\xdf\xd1\xf8\x1a\x99W\xd3?P\xf8\xf3\xfb_q\xf6S\xb4\x7f5\xa2\x8d\x9f^?A\xf8r\xf9\x8a\xf8\xda`sH\xf4\xad\x1cU\xd8\x12\xd1\xc5Z\xc0\x96\xb1V\x8e\x05h\xe2\x96\x8e)k\x02\xb5\x81-\x1cR\xd6*\xd6\x04\xb5\x8a\xbb\x02\xad8\xa5\xa3\x81]\x8aZ\xc0\xabqK\xb0+G\x14\xab\xc4\x9cEOS\x97c\x8d<\x17o\xf6\x87\x8d\x97\x82?D>\xd3\xd7\xf5*e\x8e\x81\xbc*\xd8\xc5-\xe1V\xc6*\xde\x15laKx\xabc\n\xae\xc5-\x8c*\xde\x15lb\xad\xe1V\xc6\x14\xb2\xcf!j<.\'\xd3\xdc\xfc3\x0fV\x11\xfeZ\x8a0\xfaV\x9fvl\xbb7-H\xc3\xbf\x7f\xc7\xe3\xa3\xb0\xc1.,u\xd6?q\xfdG\xeff\xd9\xb9f\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5Xo\xe6\xa7\x9d\x07\x96<\xb6\xe6\xdd\xe9\xaa_r\x82\xc4wSO\x8e_\xf6\x00\xed\xeeFf\xe8t\xde,\xf7\xfaG7Y\xda\xba\xdf\x03\x16\xdf\\\xb6\x1f\xaf\xe0\xf9\x84\xb33\x16bK\x13RN\xe4\x93\x9dC\xc1\x16\xc6\x147\x8a\xbb\x147\x8a\xb7\x8a\x1c1V\xf1Wb\x86\xf1Wb\xad\xe2\x86\xc6*\xde(o\x15p\xc5\r\xe2\xad\xe2\x86\xf1Wb\x86\xf1Wb\xad\xe1Cc\x02\xb60\xa1\xbcP\xe1\x81[\x18\xab"\xf2e\xf1\x8a\xfd\xed\x18\xfc\x17\x0bU\xff\x00]7\xff\x00\x88\xd7\xf0\xceo\xda}\x1f\x8b\xa7\xe3\x1fV=\xfe\x07\x9f\xeb{?b;G\xc1\xd5\xf8D\xfar\x8a\xff\x008r\xfd#\xe4\xcc\xcey\xcb\xecm\x1cU\xd8\x12\xd1\xc5Z\xc0\x96\xb1V\x8e\x05h\xe2\x96\x8e)k\x02\xb5\x81-\x1cR\xd6*\xd6\x04\xb5\x8a\xbb\x02\xad8\xa5\xa3\x81]\x8aZ\xc0\xabqK\xb0*\xe8\xd6\xa6\xa7\xa0\xc9F6]?mv\x87\xe5\xf0\xd4~\xb9l?IW\x19{\xe7\x8d\xe1V\xf0\xabc\x14\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xad\x8c*\xbb\x14\xb60\xabxU\xb1\x8a\xb7\x85[\x18R\x88\xb2\xbb\x92\xce\xf2\x1b\xb8\xf7x\x1c8\x1e u_\xf6B\xa3%\t\x98\xc8Hs\r\xfal\x823\x17\xc8\xec}\xdf\xb3\x9b\xd5\xe1\x9a9\xe1\x8eh\x8f(\xe5P\xe8\xde*\xc2\xa0\xe7O\x19\t\x00G"\xe6\xca$\x1a=\x17\xe4\x90\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1U\x93\xcf\r\xbc\x12O;\x88\xe1\x89K\xcb#\x1a\x05U\x15bO\x80\x18@$\xd0D\xa4\x00\xb3\xc8>V\xfc\xc1\xf3|\xdei\xf3$\xf7\xf5"\xce?\xdc\xd8Dv\xe3\n\x9d\x89\x1f\xcc\xff\x00h\xe7W\xa4\xd3\x8cP\x03\xafW\xcf\xbbGXu\x19L\xbf\x87\xa7\xb9\x8d\x8c\xcap[\x18\xa1\xbcU\xd8\xa1\xbcU\xbcP\xe1\x8a\xb7\x8a\xbb\x147\x8a\xbb\x15o\x1461V\xf1Cx\xab\x86(o\x15o\x147\x8a\xbb\x147\x8a\xbb\x15o\n\x1b\x18\x15\xb1\x85\r\xe2\x87\x0c\n\xd8\xc5U \x95\xe1\x9a9\xa34x\xd8:\x9e\xbb\xa9\xa8\xc8\xce\x02Q1<\x8e\xcc\xf1e\x969\x89\xc7iD\xd8\xf7\x87\xa6Z\xdc\xc7um\x15\xc4\x7fbU\x0c\x06\xdbW\xb1\xa7q\x9eC\xad\xd3\x1c\x19\xa5\x8c\xff\x00\t\xfe\xcf\xb1\xfa\x1b\xb3\xb5\xb1\xd5i\xe1\x9a<\xa7\x1b\xf8\xf5\x1f\x03\xb2\xa1\xccW5\xd8\x12\xd1\xc5Z\xc0\x96\xb1V\x8e\x05h\xe2\x96\x8e)k\x02\xb5\x81-\x1cR\xd6*\xd6\x04\xb5\x8a\xbb\x02\xad8\xa5\xa3\x81]\x8aZ\xc0\xabqK\xa9SL\x0cg1\x18\x99\x1d\x80VQAL\xbe"\x83\xe6\x9d\xa3\xad:\x9c\xa6g\x97Or\xf1\x92p[\xc2\xad\xe1V\xc6)o\n\xb61V\xf0\xabc\n[\xc5[\x18Uv)laV\xf0\xabc\x15o\n\xb60\xa5\xbcU\x9e\xf9\x1bQ\xf5\xf4\xd7\xb3sY-\x1b\xe1\xff\x00\x8coR\xbfq\xa8\xf9S7]\x9d\x96\xe0c\xfc\xdf\xb8\xbbA.8\t|\x0f\xc3\xf6W\xc6\xd9&lP\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1W\x91~{y\xdf\xea\xb6k\xe5\x8b\'\xfd\xfd\xd2\x895\x16S\xba\xc3Z\xa4\x7f7"\xa7\xdb\xe7\x9b\x8e\xcb\xd3Y\xf1\x0fNO9\xdb\xda\xee\x18\xf8Q\xe6y\xfb\xbb\xbe/\x0b\xcd\xf3\xc961V\xc6(o\x15v(o\x15o\x148b\xad\xe2\xae\xc5\r\xe2\xae\xc5[\xc5\r\x8cU\xbcP\xde*\xe1\x8a\x1b\xc5[\xc5\r\xe2\xae\xc5\r\xe2\xae\xc5[\xc2\x86\xc6\x05laCx\xa1\xc3\x02\xb61V\xf1C0\xf2e\xff\x00;i,\x9c\xfcP\x9eq\x8e\xfc[\xa8\x1f&\xfdy\xc4{Y\xa3\xa3\x1c\xc3\xaf\xa4\xfe\x8f\xd2\xfa\x87\xb0\x1d\xa3q\x9e\x9a]=Q\xf7\x7f\x17\xdbG\xe2\xc8\xceq\x8f\xa3\xbb\x02Z8\xabX\x12\xd6*\xd1\xc0\xad\x1cR\xd1\xc5-`V\xb0%\xa3\x8aZ\xc5Z\xc0\x96\xb1W`U\xa7\x14\xb4p+\xb1KX\x15n)T\x8d\x7fk\xee\xc9\xc0uyOh\xfbB\x87\x81\x1e\xbb\xcb\xf4\x0f\xd2\xbf-x\xe5\xc3\x14\xb7\x85[\xc2\xad\x8cR\xde\x15lb\xad\xe1V\xc6\x14\xb7\x8a\xb60\xaa\xecR\xd8\xc2\xad\xe1V\xc6*\xde\x15laKx\xaam\xe5\x8dC\xea:\xc4\x121\xa4R\x9fF_\xf5\\\x8a\x1f\xa1\xa8~Y\x93\xa5\xcb\xc1\x90\x1e\x87o\x9f\xeds4r\xdc\xc3\xf9\xdfx\xfc\x11\xf1z^tM\xee\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xa5^h\xf3\r\x97\x97\xb4+\xadZ\xec\xfc\x16\xe9T\x8e\xb42HvD\x1e\xec\xdf\xd7-\xc1\x84\xe4\x98\x88\xea\xe3\xea\xb5\x11\xc3\x8c\xce]\x1f\'j\xfa\xad\xee\xad\xa9\xdc\xeaW\xaf\xea]]Hd\x95\xbd\xcfa\xe0\x00\xd8\x0f\x0c\xeb\xb1\xe3\x10\x88\x88\xe4\x1f<\xcd\x96Y&e.e\t\x93jlb\xad\x8cP\xde*\xecP\xde*\xde(p\xc5[\xc5]\x8a\x1b\xc5]\x8a\xb7\x8a\x1b\x18\xabx\xa1\xbcU\xc3\x147\x8a\xb7\x8a\x1b\xc5]\x8a\x1b\xc5]\x8a\xb7\x85\r\x8c\n\xd8\xc2\x86\xf1C\x86\x05lb\xad\xe2\x84~\x8b}\xf5-F\x19\xc9\xa4`\xf1\x97\xaf\xd8m\x8e\xc3\xad:\xe6\x17h\xe9\x06\xa3\x04\xb1\xf7\x8d\xbd\xfd>\xd7k\xd8\xba\xf3\xa4\xd5C/H\x9d\xff\x00\xaav?c\xd13\xc8\xe5\x12\r\x1eo\xd01\x90\x90\xb1\xc8\xbb"\xc9\xa3\x8a\xb5\x81-b\xad\x1c\n\xd1\xc5-\x1cR\xd6\x05k\x02Z8\xa5\xacU\xac\tk\x15v\x05ZqKG\x02\xbb\x14\xb5\x81ZQSL@\xb7\x17[\xab\x8e\x9f\x11\x99\xe9\xf6\x95Q\x97\x80\xf9\x96l\xb2\xc9#)s-\xe1k\\1KxU\xbc*\xd8\xc5-\xe1V\xc6*\xde\x15laKx\xabc\n\xae\xc5-\x8c*\xde\x15lb\xad\xe1V\xc6\x14\xb7\x8a\xb7@A\x07\xa1\xeb\x86\x93\x19\x18\x90G0\xf4\xef.j_\xa44\x88&f\xe52\x0fN\x7f\x1ei\xb1\'\xfdaF\xfas\xa1\xd2e\xe3\xc6\t\xe7\xc8\xfe>\xd7k:>\xa1\xca[\xfe=\xc7d\xcb2X;\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15|\xef\xf9\xd9\xe7o\xd3:\xd8\xd1\xac\xe4\xe5\xa6\xe9lVB\xa7i.z;|\x93\xec\x8f\xa7\xc7:>\xcd\xd3pC\x88\xfdR\xfb\x9e3\xb6\xf5\xde.N\x08\xfd0\xfb\xff\x00c\xcdsf\xe8\x9b\xc5[\x18\xabc\x147\x8a\xbb\x147\x8a\xb7\x8a\x1c1V\xf1Wb\x86\xf1Wb\xad\xe2\x86\xc6*\xde(o\x15p\xc5\r\xe2\xad\xe2\x86\xf1Wb\x86\xf1Wb\xad\xe1Cc\x02\xb60\xa1\xbcP\xe1\x81[\x18\xabx\xa1z\xe0,\xa2\xcf|\xb9{\xf5\xad.>F\xb2C\xfb\xa7\xff\x00b>\x13\xff\x00\x03L\xf3_h\xf4~\x0e\xa4\xc8}97\xf8\xf5\xfd\x7f\x17\xda\xfd\x8f\xed\x1f\xcch\xc4I\xf5\xe2\xf4\xfc?\x87\xec\xdb\xe0\x99\xe7>\xf5m\x1cU\xac\tk\x15h\xe0V\x8e)h\xe2\x96\xb0+X\x12\xd1\xc5-b\xad`KX\xab\xb0*\xd3\x8aZ8\x15\xd8\xa5\xac\n\xbdE\x07\xbeY\x10\xf0]\xbd\xda\x1e6^\x08\xfd\x10\xfbO_\xd4\xd8\xc9\xba\x16\xf0\xaa\xe1\x8a[\xc2\xad\xe1V\xc6)o\n\xb61V\xf0\xabc\n[\xc5[\x18Uv)laV\xf0\xabc\x15o\n\xb60\xa5\xbcU\xb1\x85Y?\x91\xb5\x1fF\xfeK\x17?\x05\xd0\xe5\x18\xff\x00\x8b\x10Wo\xf5\x93\xf5f\xc3\xb3\xb2\xf0\xcf\x87\xf9\xdfx\xfd\x9fs\xb0\xd3K\x8a\x04\x7f7\x7f\x81\xe7\xf6\xd7\xcc\xb3\x9c\xdd3v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15a_\x9b\x1eu\x1eY\xf2\xdb\x8bg\xe3\xaa\xea\x1c\xa1\xb2\xa7T\x14\xfd\xe4\xbf\xec\x01\xdb\xfc\xa23;A\xa6\xf1g\xbf\xd29\xba\xbe\xd6\xd6\xf8\x18\xb6\xfa\xe5\xb0\xfdo\x98\xeaN\xe7rz\x9c\xea\x1e\x11\xacP\xde*\xd8\xc5[\x18\xa1\xbcU\xd8\xa1\xbcU\xbcP\xe1\x8a\xb7\x8a\xbb\x147\x8a\xbb\x15o\x1461V\xf1Cx\xab\x86(o\x15o\x147\x8a\xbb\x147\x8a\xbb\x15o\n\x1b\x18\x15\xb1\x85\r\xe2\x87\x0c\n\xd8\xc5[\xc5\x0b\xd7\x01e\x14\xfb\xca\xb7\xa2\x0b\xff\x00E\x8d\x12\xe0\x05\xec\x071\xba\xf5\xfaG\xd3\x9c\xff\x00\xb4z?\x1bLd>\xa8z\xbe\x1d~\xcd\xfe\x0fc\xecwh~_X"O\xa7/\xa7\xe3\xfc?n\xdf\x16e\x9ej\xfb+G\x15k\x02Z\xc5Z8\x15\xa3\x8aZ8\xa5\xac\n\xd6\x04\xb4qKX\xabX\x12\xd6*\xec\n\xb4\xe2\x96\x8e\x05v)r\x8d\xeb\x86"\xdd7m\xf6\x87\xe5\xf1T~\xb9\xec?I^2\xd7\xcf\\1V\xf0\xaa\xe1\x8a[\xc2\xad\xe1V\xc6)o\n\xb61V\xf0\xabc\n[\xc5[\x18Uv)laV\xf0\xabc\x15o\n\xb60\xa5\xbcU\xb1\x85Um\xe7\x96\xdex\xee"4\x96\x16\x0e\x9d\x85T\xd6\x87\xd8\xf7\xc2$bls\r\xda|\x9c\x13\x04\xf2\xeb\xee\xea\xf5kK\x98\xae\xadb\xb9\x88\xd69\x90:\xd7\xad\x18W\x7f|\xe9\xb1\xccN"C\x91s\xe7\x1e\x12B\xaeM\x8b\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xa7qq\x05\xb5\xbc\xb7\x17\x0e"\x82\x15i%\x91\x8d\x15UEX\x93\xec0\x80I\xa0\xc6R\x11\x16y\x07\xca\x9e\x7f\xf3t\xfei\xf3%\xc6\xa2j\xb6\xab\xfb\xab\x18\x8f\xecB\xa4\xf1\xa8\xf1o\xb4}\xceu\x9aM8\xc5\x01\x1e\xbd_?\xed\rY\xcf\x94\xcb\xa7Os\x1c\xcc\x97\t\xd8\xa1\xbcU\xb1\x8a\xb61Cx\xab\xb1Cx\xabx\xa1\xc3\x15o\x15v(o\x15v*\xde(lb\xad\xe2\x86\xf1W\x0cP\xde*\xde(o\x15v(o\x15v*\xde\x1460+c\n\x1b\xc5\x0e\x18\x15\xb1\x8a\xb7\x8a\x17\xae\x02\xca*\xd1;\xc6\xca\xe8J\xba\x90\xca\xc3\xa8#pr\x12\x00\x8a.F9\x18\x90G0\xf4{V\x96{\x0b{\xc3\x13$w\x08\x19X\x83\xc4\x9e\x84\x02@\xad\x08#<\x9b\xb4tgO\x9aP\xe8\x0e\xde\xee\x8f\xbevN\xbcj\xb4\xf0\xcb\xd6Q\xdf\xdf\xd7\xed\\s\x05\xd95\x81-b\xad\x1c\n\xd1\xc5-\x1cR\xd6\x05k\x02Z8\xa5\xacU\xac\tk\x15v\x05ZqKG\x02\xbb\x163\x98\x84L\xa5\xb0\x0b\x86X\x05>i\xda\x1a\xc3\xa8\xcafyt\xf2\r\x8c\x93\x84\xe1\x8a\xb7\x85W\x0cR\xde\x15o\n\xb61KxU\xb1\x8a\xb7\x85[\x18R\xde*\xd8\xc2\xab\xb1Kc\n\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xad\x8c*\xde*\xcd\xfc\x89\xa8z\x96\x93X9\xf8\xad\xdb\x9c_\xeaHjG\xd0\xd5\xfb\xc6m\xfb7-\x83\x0e\xef\xd3\xfb~\xf7g\tq\xc0\x1e\xa3c\xfa>\xcd\xbe\x0c\xa36j\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbc\x7f\xf3\xe3\xce\xe6\xde\xdd<\xade%&\xb8\x02]I\x94\xee\xb1\xf5H\xb6\xfe\x7f\xb4\xde\xd4\xf1\xcd\xc7e\xe9\xac\xf8\x87\xe0\xf3}\xbd\xad\xa1\xe1G\x99\xe7\xfa\x9e\x19\x9b\xe7\x94o\x15v(o\x15lb\xad\x8cP\xde*\xecP\xde*\xde(p\xc5[\xc5]\x8a\x1b\xc5]\x8a\xb7\x8a\x1b\x18\xabx\xa1\xbcU\xc3\x147\x8a\xb7\x8a\x1b\xc5]\x8a\x1b\xc5]\x8a\xb7\x85\r\x8c\n\xd8\xc2\x86\xf1C\x86\x05lb\xad\xe2\x85\xeb\x80\xb2\x8a\x7f\xe4\xdf-O\xe6-v\xdfN\x8e\xab\t\xf8\xee\xa5\x1f\xb1\n\xfd\xa3\xf3=\x07\xb9\xccmVq\x8a\x06N\xcf\xb3\xb4\x87Q\x90@r\xeb\xee})ogkmi\x1d\xa41\xaa[B\x828\xe2\x03\xe1\x08\xa2\x80S9I\x9e"I\xde\xdfF\xc7\x11\x00\x04v\x01\x01y\xe5}\x06\xee\xa6KDF?\xb7\x17\xee\xcf\xfc-\x01\xfas\x0f&\x87\x14\xf9\xc7\xe5\xb3\x9d\x8f_\x9a\x1c\xa5\xf3\xdd#\xbc\xfc\xb9\xb6j\x9b;\xb7\x8c\xf6I@q\xf7\xaf\x1f\xd5\x98Y;"?\xc3/\x9b\x9f\x8f\xb6\xa5\xfcQ\xf9$w\x9eG\xd7\xed\xeaR%\xb8Q\xde&\x04\xff\x00\xc0\xb7\x13\x989;74z_\xb9\xd8c\xed\\2\xe6x}\xe9%\xcd\xa5\xd5\xb3p\xb8\x85\xe1o\t\x14\xa9\xfcs\x06x\xe5\x1eb\x9c\xe8d\x8c\xb7\x89\x05D\xe4\x1b\x1a8\xa5\xac\n\xd6\x04\xb4qKX\xabX\x12\xd6*\xec\n\xb4\xe2\x96\x8e\x05p\xc9D<\xa7\xb4}\xa1C\xc0\x89\xf3\x97\xe8\x1f\xa7\xe4\xd8\xc9\xbcz\xe1\x85.\x18\xabxUp\xc5-\xe1V\xf0\xabc\x14\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xad\x8c*\xbb\x14\xb60\xabxU\xb1\x8a\xb7\x85[\x18R\xde*\xd8\xc2\xad\xe2\xa9\x86\x85\xa8~\x8f\xd5`\xb9cH\xab\xc2s\xdb\xd3}\x89?\xea\xec\xdfF]\x83/\x871.\x9d}\xdf\x8d\xdc\xcd\x1c\xbd\\?\xce\xfb\xfa~\xaf\x8b\xd3\xf3\xa4ov*\xecU\xd8\xab\xb1Wb\xa9O\x9a\xfc\xc7g\xe5\xcd\x06\xebV\xba\xdd`_\xddGZ\x19%m\x91\x07\xcc\xfd\xc3|\xbb\x06\x13\x92b!\xc7\xd5\xeac\x87\x19\x99\xe8\xf93T\xd4\xef5MJ\xe3Q\xbd\x7fR\xea\xeaF\x96W\xf7cZ\x0f\x00:\x01\xe1\x9dl #\x11\x11\xc8>y\x97,\xb2H\xca\\\xca\x17&\xd6\xde*\xecP\xde*\xd8\xc5[\x18\xa1\xbcU\xd8\xa1\xbcU\xbcP\xe1\x8a\xb7\x8a\xbb\x147\x8a\xbb\x15o\x1461V\xf1Cx\xab\x86(o\x15o\x147\x8a\xbb\x147\x8a\xbb\x15o\n\x1b\x18\x15\xb1\x85\r\xe2\x87\x0c\n\xd8\xc5[\xc5\x0b\xd7\x01e\x17\xd0\xff\x00\x95\xdeQ\xfd\x01\xa0\xac\xd7)\xc7R\xbf\x0b-\xc5z\xa2S\xe0\x8f\xe8\x06\xa7\xdc\xe71\xaf\xd4\xf8\x93\xa1\xf4\x87\xd0\xfb\x17A\xe0b\xb9}r\xdc\xfe\x80\xcc\xb3\x05\xdc;\x15v*\xecUl\x91\xc7"\x94\x91C\xa1\xea\xac\x01\x07\xe88\x08\x07b\x90H\xdc%\x17\x9eP\xf2\xfd\xd5KZ\xacN\x7fj\x12c\xfc\x07\xc3\xf8f&N\xcf\xc3/\xe1\xafs\x9b\x8f\xb4sC\xf8\xaf\xdf\xbaG{\xf9m\x19\xa9\xb2\xbc+\xe0\x93-\x7f\xe1\x96\x9f\xf1\x1c\xc0\xc9\xd8\xe3\xf8e\xf3v\x18\xbbl\xff\x00\x1c~I\r\xef\x92|\xc3mR \x17\x08?j\x16\r\xff\x00\nh\xdf\x86`\xe4\xec\xdc\xd1\xe9~\xe7a\x8b\xb50O\xad{\xd2Y\xed\xee ~\x13\xc4\xf1?\xf2\xba\x95?q\xcc\x19@\xc4\xd1\x14\xe7Fq\x90\xb0mH\xe4[\x1a\xc5Z\xc0\x96\xb1W`U\xa7\x14\xbb\x17\x13]\xab\x8e\x9f\x11\x99\xf8y\x96\xb2\xc0\xf9\x9eL\x92\x9c\x8c\xa4l\x96\xc6-k\x86\x14\xb8b\xad\xe1U\xc3\x14\xb7\x85[\xc2\xad\x8cR\xde\x15lb\xad\xe1V\xc6\x14\xb7\x8a\xb60\xaa\xecR\xd8\xc2\xad\xe1V\xc6*\xde\x15laKx\xabc\n\xb7\x8a\xb7\xd7\nA\xa7\xa3\xf9[Q7\xda?/\xc7\xe9H/|\x99\xe6+Z\x93jfA\xfbP\x91%\x7f\xd8\x8f\x8b\xf0\xcc\x0c\x9d\x9d\x9a?\xc3~\xed\xdd\x8e.\xd3\xc1?\xe2\xaf~\xdf\xb1&\x96)br\x92\xa3F\xe3\xaa\xb0*G\xd0s\nQ#b\xe7\xc6@\x8b\x1b\xac\xc8\xa5i\xc5-\x1f\x0c\x90\x0f\x01\xdb\xbd\xa1\xe3\xe5\xe0\x8f\xd1\x0f\xb4\xf5.\xc9:6\xc6*\xb8aK\x86*\xde\x15\\1KxU\xbc*\xd8\xc5-\xe1V\xc6*\xde\x15laKx\xabc\n\xae\xc5-\x8c*\xde\x15lb\xad\xe1V\xc6\x14\xb7\x8a\xb60\xabx\xaa\xe1\x85,\x83\xc9z\x87\xd5\xf5Cl\xe6\x91]\xaf\x11\xff\x00\x19\x12\xa5~U\x1c\x87\xdd\x99\xba\x0c\xbc9+\xa4\xbe\xff\x00\xc5\xb9\xdaY\\\x0c{\xb7\x1f\xa7\xf4|\x8b=\xcd\xe3c\xb1Wb\xae\xc5X?\xe6\xdf\x9d\xbf\xc3^[h\xedd\xe3\xabj<\xa1\xb4\xa1\xf8\x91i\xfb\xc9\x7f\xd8\x83A\xeeFgh4\xde,\xf7\xfaC\xaa\xedmo\x81\x8a\x87\xd7._\xad\xf3\x1et\xef\x0c\xde*\xec(o\x15v(o\x15lb\xad\x8cP\xde*\xecP\xde*\xde(p\xc5[\xc5]\x8a\x1b\xc5]\x8a\xb7\x8a\x1b\x18\xabx\xa1\xbcU\xc3\x147\x8a\xb7\x8a\x1b\xc5]\x8a\x1b\xc5]\x8a\xb7\x85\r\x8c\n\xd8\xc2\x86\xf1C\x86\x05lb\xa8\x9d:\xc2\xebP\xbe\x82\xc6\xd1=K\x9b\x97\x11\xc4\x83\xbb1\xa7\xdd\x91\x9c\xc4A\'\x90g\x8b\x14\xb2LF<\xcb\xe9\xff\x00+\xf9z\xd7\xcb\xfa\x1d\xb6\x97o\xbf\xa4\xb5\x9aZP\xc9+n\xee~g\xa7\xb6\xd9\xc8\xea3\x1c\xb32/\xa7h\xb4\x91\xd3\xe2\x18\xc7O\xb4\xa6\xb9K\x96\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xaaW\x16\x96\xb7)\xc2\xe2\x14\x99?\x96E\x0c>\xe3\x90\x9e8\xc8T\x85\xb3\x86ID\xdcI\t%\xef\x91<\xbbuR\xb0\xb5\xb3\x9f\xda\x85\x88\xff\x00\x85nK\xf8f\x16N\xcb\xc3.\x95\xees\xf1v\xb6xu\xe2\xf7\xb0\x9f6yb\xdbC\x11\x18\xef=g\x98\x9e\x102Q\x82\x8e\xacH?\xc34\xba\xdd\x0cp\xd5J\xef\xa3-go\xcb\xc21\x02\xa7.\xb6\xc7\x06`\xbc\x93xU\xb1\x8a\xae\x18R\xe1\x8a\xb7\x85W\x0cR\xde\x15o\n\xb61KxU\xb1\x8a\xb7\x85[\x18R\xde*\xd8\xc2\xab\xb1Kc\n\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xad\x8c*\xde*\xb8aJ\xe8\xe4\x927I#q\xa3H\x8c\xb1\x8b\xb1Wb\xaf\x95?2u\xcd_[\xf3=\xc5\xf6\xa1m5\xa4_\xddX\xdb\xce\x8c\x85 C\xf0\xec\xc3\xabW\x91\xf79\xd4h\x061\x8c\x08\x11.\xfa7\xbb\xc1v\x9e\\\x992\x99N&=\xc0\x8a\xd9\x8b\x0c\xcdu\xcd\xe2\xae\xc2\x86\xf1Wb\x86\xf1V\xc6*\xd8\xc5\r\xe2\xae\xc5\r\xe2\xad\xe2\x87\x0cU\xbcU\xd8\xa1\xbcU\xd8\xabx\xa1\xb1\x8a\xb7\x8a\x1b\xc5\\1Cx\xabx\xa1\xbcU\xd8\xa1\xbcU\xd8\xabxP\xd8\xc0\xad\x8c(o\x148`V\xc6*\xf6_\xc9?\'\xfaP\xbf\x99o\x13\xf7\x92\x86\x8bNV\xec\x9d$\x97\xfd\x97\xd9\x1e\xd5\xf1\xcd\x1fj\xeal\xf8c\xe2\xf6\x1e\xcev}\x0f\x1e]v\x8f\xe9?\xa1\xeb\x19\xa5z\xc7b\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecUN\xe2\xe2\x1bx$\x9ef\t\x14J]\xd8\xf6\n*r2\x90\x88$\xf2\x08&\x85\xbck^\xd6&\xd5\xf5I\xaf$\xa8V\xd6\xd5\x7f\x93\x1f\x1f\xd4\xe1j\xb2\x7f\x08`Y\xa3p\x9b\x18\xa5\xbc*\xd8\xc5W\x0c)p\xc5[\xc2\xab\x86)o\n\xb7\x85[\x18\xa5\xbc*\xd8\xc5[\xc2\xad\x8c)o\x15laU\xd8\xa5\xb1\x85[\xc2\xad\x8cU\xbc*\xd8\xc2\x96\xf1V\xc6\x15o\x15\\0\xa5\xbc*\x8c\xd2\xaf\xcd\x86\xa1\x05\xdf\xec\xc6\xdf\xbd\x1b\xef\x1bl\xfd=\x8dG\xbeY\x8b\'\x04\x84\xbb\xbe\xee\xaeV\x92U>\x1e\x92\xdb\xf5}\xbfc\xd4\x01\x04Tn\x0fC\x9d#\x90\xecU\xd8\xaa_\xac\xc1\xce\x05\x94u\x88\xef\xd7\xec\xb6\xdd\xbd\xe9\x98\x1d\xa3\x8b\x8b\x1d\xf5\x8b\x91\xa6\x9dJ\xbb\xd2|\xd0;\x16\x8e\x05k\x02T\xaemm\xaebhnbI\xe1o\xb5\x1c\x8a\x1dO\xcc5FJ\x19%\x03q$\x1f&\x191\xc6c\x86@\x11\xdcwc:\x97\xe5\x97\x93\xaf\xb97\xd4\xbe\xab#\x7f\xbb-\x98\xc7O\x92o\x1f\xfc.m\xb0{A\xab\xc7\xfc\\C\xfa[\xfd\xbc\xfe\xd7Q\xa8\xf6{I\x97\xf8xO\xf4v\xfb9}\x8cWR\xfc\x93o\x89\xb4\xcdH\x1f\xe5\x8a\xe5)\xf7\xc8\x9f\xf3Fn\xb4\xfe\xd6\x8f\xf2\x90\xf8\xc4\xfe\x83\xfa\xdd&\xa3\xd9\x03\xcf\x14\xfe\x12\x1f\xa4~\xa6+\xa9~[y\xc2\xc2\xa4\xd8\x9b\x98\xc7\xfb\xb2\xd8\x89k\xf2Q\xf1\xff\x00\xc2\xe6\xefO\xdb\xfaL\xbf\xc7\xc2\x7f\xa5\xb7\xdb\xcb\xedtz\x8fg\xf5x\xbf\x83\x88\x7fG\x7f\xb3\x9f\xd8\xc7g\xb7\xb8\xb7\x90\xc5q\x13\xc3(\xea\x92)V\x1fA\xcd\xbc\'\x19\x0b\x89\x04y:\x89\xe3\x94\rH\x10|\xd6d\x98;\x147\x8a\xb7\x8a\x1c1V\xf1Wb\x86\xf1Wb\xad\xe2\x86\xc6*\xde(o\x15p\xc5\r\xe2\xad\xe2\x86\xf1Wb\x86\xf1Wb\xad\xe1Cc\x02\xb60\xa1\xbcP\xd8\xc0\xaf\xa2\xff\x00+\xbc\x9f\xfe\x1e\xf2\xfa\xc9r\x9cu;\xfaKuQ\xf1"\xd3\xe0\x8b\xfd\x88;\xfb\x93\x9c\xbfhj|Y\xed\xf4\x87\xd0\xfb\x17\xb3\xff\x00/\x86\xe5\xf5\xcbs\xfa\x032\xcc\x17r\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xa5\xfa\xfe\xb1\x0e\x91\xa5\xcdy%\x0b(\xe3\n\x7f4\x87\xec\x8f\xeb\xed\x98\xfa\x9c\xe3\x14\x0c\x8b^I\xf0\xc6\xde1qq5\xc4\xf2O3\x17\x96V.\xec{\x9659\xc8JFD\x93\xcc\xba\xa2l\xda\xcc\x08lb\x96\xf0\xabc\x15\\0\xa5\xc3\x15o\n\xae\x18\xa5\xbc*\xde\x15lb\x96\xf0\xabc\x15o\n\xb60\xa5\xbcU\xb1\x85Wb\x96\xc6\x15o\n\xb61V\xf0\xabc\n[\xc5[\x18U\xbcUp\xc2\x96\xf0\xabc\x15z\x07\x945\x0f\xadi\t\x13\x1a\xcbh}\x16\xff\x00T}\x83\xff\x00\x03\xb7\xccf\xefA\x97\x8b\x1du\x8e\xdf\xa9\xda\xca\\@O\xf9\xdf\x7f_\xd7\xf1N\xf35\x83\xb1V\xa4E\x91\x19\x18UX\x15a\xecv\xc0E\x8a*\xc6\xa4\x8d\xe2\x91\xa3\x7f\xb4\x84\x83\xb5+N\xff\x00Nr\xd9\xb1\xf0L\xc7\xb9\xdbc\x97\x10\x05a\xca\x99\xb5\x81.\xc5Z\xc8\xabX\xa5\xd8\x15\x0fwcey\x1f\xa5wo\x1d\xcc_\xef\xb9Q]~\xe6\x04e\x98\xb3O\x19\xb8\x13\x13\xe4i\xaf.\x18d\x158\x89\x0f1lgR\xfc\xaf\xf2\x85\xe8%-\x9a\xceC\xb9{g+\xff\x00\n\xdc\xd3\xee\\\xdci\xfd\xa3\xd5\xe3\xe7.1\xfd!\xfaE\x1f\xb5\xd3j=\x9b\xd2e\xe5\x13\x03\xfd\x13\xfa\r\x8f\xb1\x8bj?\x92\xf7+\xc9\xb4\xddE$\xfeX\xae\x10\xa1\xff\x00\x83NU\xff\x00\x81\xcd\xde\x9f\xda\xe8\x9f\xef G\xf5M\xfd\x86\xbe\xf7G\xa8\xf6>C|S\x07\xcaB\xbe\xd1\x7fs\x17\xd4\x7f/\xfc\xddaS&\x9e\xf3 \xfd\xbbzL\x0f\xbd\x12\xad\xf7\x8c\xdd\xe9\xfbwI\x97\x94\xc0?\xd2\xdb\xef\xd9\xd1j;\x07Y\x8b\x9c\t\x1f\xd1\xf5}\xdb\xfd\x89\x04\x91I\x13\x98\xe4B\x92.\xcc\x8c\x08 \xfb\x83\x9bX\xc8HX\xdc:\x99D\xc4\xd1\x14V\x8c\x93\x16\xf1Wb\x86\xf1Wb\xad\xe2\x86\xc6*\xde(o\x15p\xc5\r\xe2\xad\xe2\x86\xf1Wb\x86\xf1Wb\xad\xe1Cc\x02\xb60\xa1\xbcP\xf4\x1f\xca\x0f\'~\x99\xd6\xbfJ]\xa5t\xed5\x83\x00zI?T_p\xbfh\xfd\x1e9\xac\xed-O\x048G\xd5/\xb9\xdf\xf6\x07g\xf8\xd9|I}\x10\xfbO\xe3w\xbe\xe76\xf7\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1W\x94y\xe7\xcc\x1f\xa55C\x04-[;BR:tg\xfd\xa7\xfe\x03\xfbs\x97\xed-W\x89:\x1fL]f\xa3/\x11\xa1\xc81\xbc\xd747\x85[\x18\xa5\xbc*\xd8\xc5W\x0c)p\xc5[\xc2\xab\x86)o\n\xb7\x85[\x18\xa5\xbc*\xd8\xc5[\xc2\xad\x8c)o\x15laU\xd8\xa5\xb1\x85[\xc2\xad\x8cU\xbc*\xd8\xc2\x96\xf1V\xc6\x15o\x15\\0\xa5\xbc*\xd8\xc5S\xbf(\xea\x1fT\xd5\xd664\x8a\xeczM\xe1\xcf\xacg\xef\xaa\xff\x00\xb2\xcc\xbd\x16^\x0c\x83\xba[~\xaf\xd5\xf1s\xb4\xb2\xb0a\xf1\x1f\xa7\xec\xdf\xe0\xf4\x0c\xde\xb6;\x15v*\x94k0q\x95\'\x02\x82O\x85\xba\x0f\x88t\xf9\xd4~\xac\xd3\xf6\x9e.S\xf89\x9aY\xf3\ti\xcdC\x9a\xd6\x04\xbb\x15k"\xadb\x97`V\xb0%\xd8\xabX\x15\xc7\x02P\xb7\xban\x9d|\x9c/mb\xb9N\xc2TW\xa7\xcb\x909n\x1dNLF\xe1#\x1fq\xa6\x9c\xda|yEN"C\xcc[\x19\xd4\xbf+|\xa7wV\x8a\x19,\x9c\xf7\x81\xcd+\xfe\xab\xf3\x1fu3u\xa7\xf6\x9fW\x8f\x99\x13\x1f\xd2\x1f\xaa\x9d&\xa3\xd9\x8d&N@\xc0\xff\x00D\xfe\x83l_R\xfc\x9b\xbfJ\xb6\x9d\x7f\x1c\xe3\xf9\'S\x19\xf9r^`\xfe\x19\xbc\xd3\xfb_\x8c\xff\x00y\x03\x1fv\xff\x00\xab\xf4\xba-O\xb1\xd9\x07\xf7S\x12\xfe\xb6\xdfu\xfe\x86/\xa8\xf9\x1f\xcdZx&}:FA\xfe\xec\x86\x92\xad<\x7fvZ\x9fNo4\xfd\xb7\xa4\xcb\xf4\xe4\x17\xe7\xb7\xde\xe8\xb5\x1d\x87\xab\xc5\xf5c$yz\xbe\xe4\x91\x95\x95\x8a\xb0*\xc0\xd0\x83\xb1\x076\x80\xde\xe1\xd5\x11[\x16\xb0\xa1\xbcP\xd8\xc5[\xc5\r\xe2\xae\x18\xa1\xbcU\xbcP\xde*\xecP\xde*\xecU\xbc(l`V\xc6\x14"\xb4\xdd:\xefR\xd4-\xec-\x13\xd4\xb9\xb9q\x1cK\xee\xc7\xa9\xf0\x03\xa99\x0c\x93\x10\x89\x91\xe4\x1b0\xe2\x96I\x88G\x99}C\xe5\x8f/\xdah\x1a%\xb6\x97m\xba\xc2\xbf\xbc\x93\xbb\xc8\xdb\xbb\x9f\x99\xfc6\xceG>c\x92fE\xf4\xdd\x1e\x9681\x0cq\xe9\xf6\x94\xd3)r\x9d\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1V3\xe7\xbf0~\x8c\xd3>\xad\x03R\xf2\xf0\x15B:\xaatf\xfe\x03\xfb3[\xdaZ\xaf\x0e\x14>\xa98\xfa\x8c\xbc"\x872\xf2\x91\x9c\xc3\xado\x15o\n\xb61KxU\xb1\x8a\xae\x18R\xe1\x8a\xb7\x85W\x0cR\xde\x15o\n\xb61KxU\xb1\x8a\xb7\x85[\x18R\xde*\xd8\xc2\xab\xb1Kc\n\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xad\x8c*\xde*\xb8aKxU\xb1\x8a\xb6\x0b\x02\n\xb1V\x1b\xab\x0e\xa0\x8d\xc1\x1f,[1d0\x90\x90\xe8\xf4\xfd&\xfdo\xf4\xe8.\xc6\xc6E\xf8\xd4t\x0e>\x17\x1fC\x03\x9d\x1e\x0c\xbe$\x04\x9d\x8c\xe2\x01\xdb\x97Oq\xe4\x8b\xcbX;\x15Q\xbd\x83\xd7\xb6x\xc7\xda\xa5S\xb7\xc47\x1b\xe5Y\xf1q\xc0\xc5\x9c%\xc2Ac\x95\xae\xf9\xcb\x11[;`m\xac\x8a]\x8a\xb5\x91V\xb1K\xb0+X\x12\xecU\xac\n\xe3\x81-`W\x1c\n\xd6)h\xe0T\x1d\xf6\x91\xa5\xdf\xaf\x1b\xdbHnGc*+\x11\xf2$Te\xf85yp\xff\x00w)G\xdc\\|\xfaLY\xbf\xbc\x8ce\xef\x16\xc6u\x0f\xca\xbf+\xdc\xd4\xdb\xac\xb6Nw\x1e\x93\xf2Z\xff\x00\xab\'?\xc0\x8c\xdei\xfd\xaa\xd5\xc3\xea\xe1\x98\xf3\x1f\xaa\x9d\x1e\xa3\xd9M&O\xa7\x8a\x07\xc8\xfe\xbbc:\x87\xe5\x06\xab\x1dZ\xc2\xf2+\x85\xec\xb2\x83\x13|\xb6\xe6\xbf\x88\xcd\xe6\x9f\xdb\x0c2\xdb$%\x1fv\xe3\xf4\x17C\xa8\xf6;4\x7f\xbb\x9ce\xef\xdb\xf5\xfe\x863\xa8y?\xcc\xday?Y\xd3\xe5\xe0:\xc9\x18\xf5R\x9e<\xa3\xe4\x07\xd3\x9b\xed7lis}\x19#}\xc7c\xf24\xe8u=\x8b\xab\xc3\xf5c\x97\xc3q\xf6ZPA\x06\x87b:\x8c\xd9:\xb7b\xae\x18\xa1\xbcU\xbcP\xde*\xecP\xde*\xecU\xbc(l`V\xc6\x14=\xa3\xf2O\xc9\xc6\x0bv\xf3-\xe2RY\xc1\x8fOV\x1b\xac}\x1eO\xf6]\x07\xb5|sC\xda\xba\x9b>\x18\xe9\xcd\xec}\x9c\xec\xfe\x11\xe3K\x99\xfa}\xdd\xff\x00\x1f\xc77\xab\xe6\x99\xea\x9d\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1U;\x9b\x98m\xad\xe4\xb8\x9d\x82C\x12\x97v=\x80\x159\x19\xccD\x12y\x04\x13B\xcb\xc5\xb5\xedbm_S\x9a\xf6]\x83\x1aD\x9f\xcb\x18\xfb+\xfd}\xf3\x8f\xd4\xe79fd]NI\xf1J\xd0\x03(`\xde*\xde\x15lb\x96\xf0\xabc\x15\\0\xa5\xc3\x15o\n\xae\x18\xa5\xbc*\xde\x15lb\x96\xf0\xabc\x15o\n\xb60\xa5\xbcU\xb1\x85Wb\x96\xc6\x15o\n\xb61V\xf0\xabc\n[\xc5[\x18U\xbcUp\xc2\x96\xf0\xabc\x15o\nY_\x91u\nI>\x9e\xe7f\xfd\xfc?1Eq\xff\x00\x11?~l{;-\x13\x0f\x8f\xeb\xfd\x1fk\xb0\xc3.,~q\xdb\xe0\x7fm\xfd\x8c\xbf6\xc9v*\xecU \xd4\xe00\xdd\xbd>\xcc\x9f\x1a\xf5\xef\xd4W\xe7\x9c\xf7hb\xe0\xc9}$\xect\xd3\xb8\xd7r\x130\x1c\x97b\xaddU\xacR\xec\n\xd6\x04\xbb\x15k\x02\xb8\xe0KX\x15\xc7\x02\xb5\x8aZ8\x15\xac\n\xec\tk\x15k\x02P:\x86\x87\xa3\xea\x03\xfd6\xca\x19\xdb\xb3\xba\x02\xc3\xe4\xdfh}\xf9\x95\xa7\xd7\xe7\xc3\xfd\xdc\xe5\x1f\x8e\xdf.N&\xa3A\x837\xf7\x90\x8c\xbd\xe3\x7f\x9b\x19\xbf\xfc\xab\xf2\xe5\xc5M\xabMf\xdd\x8274\xfaC\xf2o\xf8l\xde\xe9\xfd\xad\xd5C\xeb\x11\x98\xf7Q\xfb6\xfb\x1d\x0e\xa3\xd9\x1d$\xfe\x8e({\x8d\x8f\xb6\xcf\xda\xc6\xef\xff\x00)\xb5\x98jl\xee\xa1\xba_\x06\xacN~\x83\xc9\x7f\xe1\xb3{\xa7\xf6\xc3O/\xef#(\x7f\xb2\x1f\xa0\xfd\x8e\x87Q\xecn\xa2?\xdd\xca3\xff\x00b\x7fH\xfbX\xd5\xff\x00\x95\xfc\xc3aSu\xa7\xcc\x8a:\xba\xaf4\x1f\xec\xd3\x92\xfe9\xbe\xd3\xf6\xb6\x977\xd1\x92\'\xca\xe8\xfc\x8e\xee\x83Q\xd9\x1a\xac?^9\x0f\x85\x8f\x98\xb0\x96f\xc1\xd6\xb7\x8a\xbb\x147\x8a\xbb\x15o\n\x1b\x18\x15\x90\xf9\x1b\xca\xd3y\x97\xcc0X\n\xad\xb2\xfe\xf6\xf2Q\xfb0\xa9\x1c\xa9\xee\xdfd{\x9c\xc6\xd5\xea\x06(\x19u\xe8\xe7vn\x88\xeas\x08\x7f\x0f3\xee}9o\x046\xf0Go\x02\x08\xe1\x89BE\x1a\xec\x15TP\x01\xf2\x19\xc9\x92I\xb2\xfaTb"\x00\x1c\x82\xfc\x0c\x9d\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1W\x9f\xfedy\x87\x93.\x8dn\xdb\n=\xe1\x1e=Q?\xe3c\xf4f\x87\xb5\xb5_\xe4\xc7\xc7\xf58:\xac\xbf\xc2\x18\x16h\xdc&\xc6\x14\xb7\x8a\xb7\x85[\x18\xa5\xbc*\xd8\xc5W\x0c)p\xc5[\xc2\xab\x86)o\n\xb7\x85[\x18\xa5\xbc*\xd8\xc5[\xc2\xad\x8c)o\x15laU\xd8\xa5\xb1\x85[\xc2\xad\x8cU\xbc*\xd8\xc2\x96\xf1V\xc6\x15o\x15\\0\xa5\xbc*\xd8\xc5[\xc2\x94E\x85\xe3\xd9^\xc1v\x9b\x98\x1c1\x03\xa9^\x8e>\x95$d\xa13\t\t\x0e\x9f\x8f\xb9\xc8\xd2\xcf\x86tyKc\xf8\xf24^\x9f\xeb\xc3\xe8}c\x98\xf48\xfa\x9e\xa5~\x1e\x14\xaf*\xf8S:>!W\xd1\xcb\xe07]W\xe4\x98\xbb\x15@\xeb\x16\xfe\xa5\xb7\xa8\x07\xc5\x11\xaf\xfb\x13\xb3\x7f_\xa30\xb5\xf8\xb8\xf1\xdfQ\xbb~\x9e|2\xf7\xa4y\xce;7b\xaddU\xacR\xec\n\xd6\x04\xbb\x15k\x02\xb8\xe0KX\x15\xc7\x02\xb5\x8aZ8\x15\xac\n\xec\tk\x15k\x02]\x81Z\xc0\x96\x8e*\xec\tK\xaf\xfc\xbf\xa2j\x157\x960\xcc\xe7\xac\x85@\x7f\xf81F\xfcs7O\xdaz\x8c\x1f\xdd\xce@w^\xdf.N\x0e\xa7\xb3t\xf9\xff\x00\xbc\x84d{\xeb\x7f\x9f67\xa8~U\xe83\xd5\xad%\x9a\xd1\xbb-}D\xfb\x9b\xe2\xff\x00\x86\xcd\xf6\x9b\xdb\rL?\xbc\x11\x9f\xd8~\xcd\xbe\xc7A\xa9\xf6;K?\xa0\xca\x1fh\xfbw\xfbX\xde\xa1\xf9Y\xae\xc0\x0bZK\x15\xda\x8e\x8b_M\xcf\xd0\xdf\x0f\xfc6o\xb4\xde\xd8i\xa7\xb6A(}\xa3\xec\xdf\xect\x1a\x9fcu0\xdf\x1c\xa3?\xf6\'\xed\xdb\xedc\xb7\xfe^\xd6\xec*n\xecf\x89TT\xc8T\x94\xff\x00\x83Z\xaf\xe3\x9b\xfd7ii\xf3\xff\x00w8\xc8\xf7^\xff\x00.o?\xa9\xec\xbdN\x0f\xef1\xc8\x0e\xfa\xdb\xe66K\xb35\xc0o\n\x1bPI\xa0\xdc\x9e\x83\x02\xbe\x90\xfc\xb0\xf2x\xf2\xe7\x97\x94\xdc\'\x1dN\xfb\x8c\xd7\x95\xea\xbb|\x11\x7f\xb0\x07\x7frs\x97\xd7\xea|Y\xed\xf4\x8eO\xa1\xf66\x83\xf2\xf8w\xfa\xe5\xb9\xfd\x03\xe1\xf7\xb3\x0c\xc1v\xee\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xaa[\xe6\x1dj-\x1fJ\x96\xf1\xe8\\|0F\x7fjF\xfb#\xf8\x9fl\xc7\xd5j\x06(\x19\x1f\x87\xbd\xaf.N\x18\xdb\xc5\xe6\x9e[\x89\xe4\x9ef/,\xac^G=K1\xa99\xc7\xcaFF\xcf2\xeaI\xb3k2(laKx\xabxU\xb1\x8a[\xc2\xad\x8cUp\xc2\x97\x0cU\xbc*\xb8b\x96\xf0\xabxU\xb1\x8a[\xc2\xad\x8cU\xbc*\xd8\xc2\x96\xf1V\xc6\x15]\x8a[\x18U\xbc*\xd8\xc5[\xc2\xad\x8c)o\x15laV\xf1U\xc3\n[\xc2\xad\x8cU\xbc)mA&\x80T\x9e\x83\x15g\xdf\xa2\xef\x7f\xc2\x9f\xa3\xf9\x9f\xac\xfa\xc6i\xe7\xbe9J\x1f\xec\x87\xeb\xfbW\xf9/\xf2\xe6-7\xcc\xb0\xdfj\xf7\x11\xcdek\xfb\xd8\x15CU\xa6\x07\xe0\xe6\xb4\xd8/\xda\xeaw\xcd\xa6Ok\xb0e\xc7\xc3R\x84\x8f\x7f/\xb3\xf58\x1aOdr\xe1\xcc\'#\x19\xc2;\x8e\xfb\xf7~\xd7\xb3\xc3wm?\xf7R\xab\xfb\x02+\xf7e\x18\xb58\xf2}2\x05\xdf\xcf\x1c\xa3\xcc*\xe5\xcc\x1d\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1W\x92y\xe7\xcc?\xa5uS\x14\r[+J\xa4T\xe8\xcd\xfbO\xf4\xf4\x1e\xd9\xca\xf6\x8e\xab\xc5\x9d\x0f\xa6.\xb3Q\x97\x8a[r\x0cpf\xbd\xc7o\x15laKx\xabxU\xb1\x8a[\xc2\xad\x8cUp\xc2\x97\x0cU\xbc*\xb8b\x96\xf0\xabxU\xb1\x8a[\xc2\xad\x8cU\xbc*\xd8\xc2\x96\xf1V\xc6\x15]\x8a[\x18U\xbc*\xd8\xc5[\xc2\xad\x8c)o\x15laV\xf1U\xc3\n[\xc2\xad\x8cU\xbc)d~O\xd2>\xb3toeZ\xc3n~\x00z4\x9d\xbf\xe0z\xe6~\x87\x07\x14\xb8\x8f \xdd\x86\x16m\x9b\xe6\xe1\xcbv*\xecU\xd8\xaaS\xad\xc1F\x8eq\xdf\xe0o\xd6?\x8ej{S\r\x811\xees4\x93\xde\x92\xbc\xd2\xb9\xcddU\xacR\xec\n\xd6\x04\xbb\x15k\x02\xb8\xe0KX\x15\xc7\x02\xb5\x8aZ8\x15\xac\n\xec\tk\x15k\x02]\x81Z\xc0\x96\x8e*\xec\tk\x02\xbb\x02\xb5\x81]\x81-\x1c\n\xd6\x05k\x02]\x8a\xa2`\xd5/\xe0\xfe\xeev\xa7\xf2\xb7\xc4>\xe3\\\xcb\xc5\xda\x19\xf1\xfd2?\x7f\xde\xd5=<%\xcc#\xe1\xf3=\xc2\xd0M\x12\xb8\xf1Z\xa9\xfe9\xb1\xc5\xdb\xf9\x07\xd7\x10}\xdb~\xb7\x16}\x9f\x13\xc8\xd2a\x07\x98\xb4\xe96r\xd1\x1f\xf2\x85G\xde+\x9b<]\xb7\x82\\\xee>\xff\x00\xd8\xe3OC\x90r\xdd\x1f\r\xcd\xbc\xc2\xb1H\xb2\x7f\xaaA\xcd\x96,\xf0\xc9\xf4\xc8\x1fs\x8d,r\x8f1J\x99k\x07b\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xac[\xcf\xdea\xfd\x1b\xa6}R\x06\xa5\xe5\xe0*)\xd5#\xe8\xcd\xf4\xf4\x1f\xd9\x9a\xce\xd3\xd5xp\xe1\x1fT\xbe\xe7\x1bS\x97\x84P\xe6^S\x9c\xc3\xadlb\xad\xe2\xad\x8c)o\x15o\n\xb61KxU\xb1\x8a\xae\x18R\xe1\x8a\xb7\x85W\x0cR\xde\x15o\n\xb61KxU\xb1\x8a\xb7\x85[\x18R\xde*\xd8\xc2\xab\xb1Kc\n\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xad\x8c*\xde*\xb8aKxU\xb1\x8a\xab\xd9\xdaMwu\x1d\xb4"\xb2Hh=\xbcI\xf9d\xf1\xc0\xc8\x80\x19DY\xa7\xa6\xd8YCei\x1d\xb4C\xe0\x8cR\xbd\xc9\xeeO\xcc\xe7E\x8f\x18\x84@\x0e|cB\x95\xf2iv*\xecU\xd8\xaa\x95\xd4\x02{w\x88\xf5a\xf0\x93\xd0\x11\xb8;{\xe5yq\x89\xc4\xc4\xf5e\tQ\xb64A\x06\x84\x10GPv#9ID\x83E\xdb\x83b\xda\xc8%\xacR\xec\n\xd6\x04\xbb\x15k\x02\xb8\xe0KX\x15\xc7\x02\xb5\x8aZ8\x15\xac\n\xec\tk\x15k\x02]\x81Z\xc0\x96\x8e*\xec\tk\x02\xbb\x02\xb5\x81]\x81-\x1c\n\xd6\x05k\x02]\x8a\xb5\x81-\x1c\n\xd6\x04\xb6\t\x06\xa0\xd0\x8e\x87\x004\xa8\xa85\x8dJ\x1a\x05\x9d\x88\x1d\x9f\xe2\x1f\x8ds7\x17i\xea1\xf2\x91\xf8\xef\xf7\xb4OK\x8e\\\xc2a\x07\x9af\x1bO\n\xb7\xf9HJ\xfe\x06\xb9\xb3\xc5\xed\x0c\x87\xd7\x10}\xdb~\xb7\x16}\x9c?\x84\xa6\x10y\x8bM\x97fv\x88\xf88\xfe"\xa36x{oO>d\xc7\xdf\xfb\x1ci\xe8r\x0f4\xc2)\xe0\x98V)\x16A\xe2\xa4\x1f\xd5\x9b$\xab\xa7V\xccp\xe2/HUUP\xaa\x00U\x14\x00t\x00g@\x03\x9c\xde*\xecU\xd8\xab\xb1Wb\xae\xc5PZ\xb4\x1e\xa5\xa38\xfbQ|c\xe4>\xd7\xe1\xbea\xeb\xb0\xf1\xe3=\xe3v\xec\x13\xe1\x92C\x9c\xcb\xb4k\x14\xbb\x02\xb5\x81.\xc5Z\xc0\xae8\x12\xd6\x05q\xc0\xadb\x96\x8e\x05k\x02\xbb\x02Z\xc5Z\xc0\x97`V\xb0%\xa3\x8a\xbb\x02Z\xc0\xae\xc0\xad`W`KG\x02\xb5\x81Z\xc0\x97b\xad`KG\x02\xb5\x81.\xc0\xad`K\xb0+Y\x14\xb5\x8a\xbb"\xad`K\xb0+\x92I#nH\xc5\x1b\xc5I\x07\xf0\xc9Fr\x89\xb8\x9a(1\x07\x9a:\r\x7fU\x84PM\xccxH9~=\x7f\x1c\xd8\xe1\xed\x9dN?\xe2\xe2\x1e{\xfe\xd7\x1az,r\xe9O8\xbc7\x06\xeecp\xc5\xe7.\xc6V=K\x13\xb9\xfar\xce>?W{\xc4f\x81\x8c\xcce\xcc\x15!\x8b[xR\xd8\xc5[\xc5[\x18R\xde*\xde\x15lb\x96\xf0\xabc\x15\\0\xa5\xc3\x15o\n\xae\x18\xa5\xbc*\xde\x15lb\x96\xf0\xabc\x15o\n\xb60\xa5\xbcU\xb1\x85Wb\x96\xc6\x15o\n\xb61V\xf0\xabc\n[\xc5[\x18U\xbcUp\xc2\x96\xd4\x12@\x02\xa4\xec\x00\xc2\x15\xe9>]\xd2F\x9b\xa7\xaa0\xff\x00H\x93\xe3\x9c\xfb\x9e\x8b\xfe\xc77\xfa\\>\x1c+\xab\x9d\x8e\x1c!3\xcc\x96\xc7b\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\x19\xba\x80\xc1p\xf1vS\xf0\xf5\xfb\'q\xb9\xf6\xce[W\x87\xc3\xc8GGm\x86|Q\x05G1\x9b]\x81Z\xc0\x97b\xad`W\x1c\tk\x02\xb8\xe0V\xb1KG\x02\xb5\x81]\x81-b\xad`K\xb0+X\x12\xd1\xc5]\x81-`W`V\xb0+\xb0%\xa3\x81Z\xc0\xad`K\xb1V\xb0%\xa3\x81Z\xc0\x97`V\xb0%\xd8\x15\xac\x8aZ\xc5]\x91V\xb0%\xd8\x15n\x05v\x04\xb1\xbf1\xdap\xb9[\x85\x1f\x0c\xa2\x8d\xfe\xb2\xff\x00fg\xe9gb\xbb\x9eW\xb74\xfc9\x04\xc7)}\xe1\'\x19\x94\xe8\xdb\xc2\x96\xc6*\xde*\xd8\xc2\x96\xf1V\xf0\xabc\x14\xb7\x85[\x18\xaa\xe1\x85.\x18\xabxUp\xc5-\xe1V\xf0\xabc\x14\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xad\x8c*\xbb\x14\xb60\xabxU\xb1\x8a\xb7\x85[\x18R\xde*\xd8\xc2\xad\xe2\xab\x86\x14\xb2_&\xe8\xff\x00X\xba7\xd3-a\xb7?\xbb\x07\xf6\xa4\xff\x00\x9bsa\xa0\xc1\xc5.#\xc87\xe0\x85\x9bg\x19\xb9r\xdd\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5R\xbdn\xde\xaa\x97\n7\x1f\x03\xfc\xba\x83\xf4\x1f\xd7\x9a\xae\xd4\xc3q\x13\xeer\xf4\x93\xa3]\xe9>h\x9d\x83\xb0+X\x12\xecU\xac\n\xe3\x81-`W\x1c\n\xd6)h\xe0V\xb0+\xb0%\xacU\xac\tv\x05k\x02Z8\xab\xb0%\xac\n\xec\n\xd6\x05v\x04\xb4p+X\x15\xac\tv*\xd6\x04\xb4p+X\x12\xec\n\xd6\x04\xbb\x02\xb5\x91KX\xab\xb2*\xd6\x04\xbb\x02\xad\xc0\xae\xc0\x94\x1e\xabk\xf5\x9b\x19#\x02\xae\x07$\xff\x00Y\x7f\xafL\xb3\x0c\xf8d\x0b\x85\xda\x1a\x7f\x17\t\x8f^c\xde\x18x\xcd\xab\xc37\x85-\x8cU\xbcU\xb1\x85-\xe2\xad\xe1V\xc6)o\n\xb61U\xc3\n\\1V\xf0\xaa\xe1\x8a[\xc2\xad\xe1V\xc6)o\n\xb61V\xf0\xabc\n[\xc5[\x18Uv)laV\xf0\xabc\x15o\n\xb60\xa5\xbcU\xb1\x85[\xc5Q\x166s^]\xc7m\x08\xac\x92\x9a\x0f\x00;\x93\xf2\x19f8\x19\xc8\x01\xd5\x94cf\x9e\xa1cg\r\x95\xa4v\xd0\x8a$b\x83\xc4\x9e\xe4\xfc\xcetx\xf1\x88D\x00\xec#\x1a\x14\xaf\x93K\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xaa\x9d\xc4+4\x0f\x13tqJ\xd2\xb4=\x8f\xd0r\x19 %\x13\x13\xd514m\x8c2\xb2\xb1V\x14e$0\xebB6#9)\xc0\xc4\x90z;\x98\xca\xc5\xb5\x90KX\x12\xecU\xac\n\xe3\x81-`W\x1c\n\xd6)h\xe0V\xb0+\xb0%\xacU\xac\tv\x05k\x02Z8\xab\xb0%\xac\n\xec\n\xd6\x05v\x04\xb4p+X\x15\xac\tv*\xd6\x04\xb4p+X\x12\xec\n\xd6\x04\xbb\x02\xb5\x91KX\xab\xb2*\xd6\x04\xbb\x02\xad\xc0\xae\xc0\x96\xb0+\x11\xd5\xed~\xad}"\x81D\x7f\x8d>G\xfbsi\x82|Qx\x9e\xd3\xd3\xf8Y\x88\xe8w\x08<\xbd\xc0lb\xad\xe2\xad\x8c)o\x15o\n\xb61KxU\xb1\x8a\xae\x18R\xe1\x8a\xb7\x85W\x0cR\xde\x15o\n\xb61KxU\xb1\x8a\xb7\x85[\x18R\xde*\xd8\xc2\xab\xb1Kc\n\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xad\x8c*\xde*\xce|\x97\xa3\xfa\x16\xc6\xfee\xfd\xf4\xe2\x91\x03\xda?\x1f\xf6_\xab7:\x0c\x1c#\x88\xf3.f\x08P\xb6M\x9b\x16\xf7b\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5R-f\x0fN\xe8H>\xcc\xc2\xbf\xec\x97c\xfc3C\xda\x98jbC\xab\xb0\xd2N\xc5w 3T\xe5\xb5\x81.\xc5Z\xc0\xae8\x12\xd6\x05q\xc0\xadb\x96\x8e\x05k\x02\xbb\x02Z\xc5Z\xc0\x97`V\xb0%\xa3\x8a\xbb\x02Z\xc0\xae\xc0\xad`W`KG\x02\xb5\x81Z\xc0\x97b\xad`KG\x02\xb5\x81.\xc0\xad`K\xb0+Y\x14\xb5\x8a\xbb"\xad`K\xb0*\xdc\n\xec\tk\x02\xa5>a\xb5\xf5-D\xca>(N\xff\x00\xea\xb6\xc72t\xb3\xa9W{\xa6\xed\xbd?\x1e.1\xce?s\x1b\xcd\x93\xc9\xb61V\xf1V\xc6\x14\xb7\x8a\xb7\x85[\x18\xa5\xbc*\xd8\xc5W\x0c)p\xc5[\xc2\xab\x86)o\n\xb7\x85[\x18\xa5\xbc*\xd8\xc5[\xc2\xad\x8c)o\x15laU\xd8\xa5\xb1\x85[\xc2\xad\x8cU\xbc*\xd8\xc2\x96\xf1V\xc6\x15M|\xbb\xa46\xa7\xa8,l\x0f\xd5\xe3\xf8\xe7o\xf2\x7f\x97\xfd\x96d\xe9px\x93\xae\x9d[1C\x88\xbd-T*\x85QE\x02\x80\x0e\x80\x0c\xe8C\x9e\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1T.\xa9nf\xb3p\x05]>5\x02\xbdGQA\xd7j\xe6.\xb3\x0f\x89\x8c\x8e\xad\xb8g\xc3 X\xeer\xce\xd9\xac\tv*\xd6\x05q\xc0\x96\xb0+\x8e\x05k\x14\xb4p+X\x15\xd8\x12\xd6*\xd6\x04\xbb\x02\xb5\x81-\x1cU\xd8\x12\xd6\x05v\x05k\x02\xbb\x02Z8\x15\xac\n\xd6\x04\xbb\x15k\x02Z8\x15\xac\tv\x05k\x02]\x81Z\xc8\xa5\xacU\xd9\x15k\x02]\x81V\xe0W`KX\x15l\x88\xb2F\xc8\xc2\xaa\xc0\xab\x0fc\x884m\x8c\xe0%\x13\x13\xc8\xb0\xbb\x88\x1a\t\xe4\x85\xba\xa1#\xfbsq\tq\x00^\x07>#\x8ef\x07\xa1X2mM\xe2\xad\x8c)o\x15o\n\xb61KxU\xb1\x8a\xae\x18R\xe1\x8a\xb7\x85W\x0cR\xde\x15o\n\xb61KxU\xb1\x8a\xb7\x85[\x18R\xde*\xd8\xc2\xab\xb1Kc\n\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xab\x91Y\x88U\x15bh\x00\xeaI\xc2\x15\xe9\x9e]\xd2\x17L\xd3\x926\x1f\xe9\x12|s\xb7\xf9G\xb7\xfb\x1e\x99\xd0\xe9pxp\xae\xbd\\\xfcp\xe1\t\x9ed\xb6;\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\x1a\xbe\xb7\xfa\xbd\xd3\xc6\x05\x13\xaa\x7f\xaazS\xe5\xd39}v\x1f\x0f!\x1d\x0e\xee\xd7O>(\xa1\xf3\r\xbd\xd8\xabX\x15\xc7\x02Z\xc0\xae8\x15\xacR\xd1\xc0\xad`W`KX\xabX\x12\xec\n\xd6\x04\xb4qW`KX\x15\xd8\x15\xac\n\xec\th\xe0V\xb0+X\x12\xecU\xac\th\xe0V\xb0%\xd8\x15\xac\tv\x05k"\x96\xb1WdU\xac\tv\x05[\x81]\x81-`W`K\x1f\xf3\x1d\xaf\x19R\xe5F\xcf\xf0?\xcct\xfc3?I=\x8c^g\xb7t\xf5!\x90u\xd8\xfe?\x1c\x92a\x99\xaf>\xde*\xd8\xc2\x96\xf1V\xf0\xabc\x14\xb7\x85[\x18\xaa\xe1\x85.\x18\xabxUp\xc5-\xe1V\xf0\xabc\x14\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xad\x8c*\xbb\x14\xb60\xabxU\xb1\x8a\xb7\x85[\x18R\xde*\xca<\x95\xa3z\xf7\'P\x99\x7fs\x01\xa4 \xf7\x93\xc7\xfd\x8f\xeb\xcd\x96\x83\x07\x11\xe3<\x83\x91\x82\x16m\x9c\xe6\xe5\xcbv*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xa9f\xb9o\xca%\x9cuC\xc5\xfa}\x96\xe9\xf8\xfe\xbc\xd6v\xa6\x1e(q\x0eqr\xb4\xb3\xa9WzK\x9c\xf3\xb2v*\xd6\x05q\xc0\x96\xb0+\x8e\x05k\x14\xb4p+X\x15\xd8\x12\xd6*\xd6\x04\xbb\x02\xb5\x81-\x1cU\xd8\x12\xd6\x05v\x05k\x02\xbb\x02Z8\x15\xac\n\xd6\x04\xbb\x15k\x02Z8\x15\xac\tv\x05k\x02]\x81Z\xc8\xa5\xacU\xd9\x15k\x02]\x81V\xe0W`KX\x15\xd8\x12\x86\xd4-\x85\xcd\xa4\x91~\xd1\x15O\xf5\x86\xe3\'\x8a|2\x05\xc5\xd6\xe9\xfc\\F=z{\xd8}\x08$\x1d\x88\xcd\xcb\xc2\x10\xde(laKx\xabxU\xb1\x8a[\xc2\xad\x8cUp\xc2\x97\x0cU\xbc*\xb8b\x96\xf0\xabxU\xb1\x8a[\xc2\xad\x8cU\xbc*\xd8\xc2\x96\xf1V\xc6\x15]\x8a[\x18U\xbc*\xd8\xc5[\xc2\xad\x8c)D\xd8YM{y\x15\xac#\xe3\x94\xd2\xbd\x80\xeeO\xc8e\x98\xb1\x99\xc8Due\x18\xd9\xa7\xa9\xd9Y\xc3gi\x15\xb4"\x91\xc4\xbcG\xbf\x89?3\xbet\x98\xe0!\x10\x07Ga\x18\xd0\xa5l\x9a]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xaa\xd9cYbx\xdb\xec\xb8*i\xd7}\xb23\x88\x90 \xf2)\x06\x8d\xb1gF\x8d\xd9\x1f\xed!*\xd4\xe9Pi\x9c\x8e\\f\x121=\x1d\xcc%\xc4\x01[\x95\xb2k\x02\xb8\xe0KX\x15\xc7\x02\xb5\x8aZ8\x15\xac\n\xec\tk\x15k\x02]\x81Z\xc0\x96\x8e*\xec\tk\x02\xbb\x02\xb5\x81]\x81-\x1c\n\xd6\x05k\x02]\x8a\xb5\x81-\x1c\n\xd6\x04\xbb\x02\xb5\x81.\xc0\xaddR\xd6*\xec\x8a\xb5\x81.\xc0\xabp+\xb0%\xac\n\xec\tk\x01V-\xac\xda\xfa\x17\xcc@\xa2K\xf1\xaf\xcc\xf5\xfcsk\xa6\xc9\xc5\x0fs\xc6v\xb6\x9f\xc3\xcck\x94\xb7\xfdh\x1c\xc8u\x8d\x8c)o\x15o\n\xb61KxU\xb1\x8a\xae\x18R\xe1\x8a\xb7\x85W\x0cR\xde\x15o\n\xb61KxU\xb1\x8a\xb7\x85[\x18R\xde*\xd8\xc2\xab\xb1Kc\n\xb7\x85[\x18\xabxU\xb1\x85,\xf3\xc9Z7\xd5\xadM\xfc\xcbI\xae\x07\xee\x81\xea\xb1\xff\x00\xcd\xd9\xba\xec\xfc\x1c1\xe2<\xcf\xdc\xe6`\x85\x0bd\xd9\xb1ov*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xa4\x9a\xdd\xbf\x0b\x85\x98\x0f\x86QF?\xe5.\xdf\x88\xfdY\xa2\xed\\5!>\xfd\x9c\xfd\x1c\xf61KsP\xe6\xb5\x81\\p%\xac\n\xe3\x81Z\xc5-\x1c\n\xd6\x05v\x04\xb5\x8a\xb5\x81.\xc0\xad`KG\x15v\x04\xb5\x81]\x81Z\xc0\xae\xc0\x96\x8e\x05k\x02\xb5\x81.\xc5Z\xc0\x96\x8e\x05k\x02]\x81Z\xc0\x97`V\xb2)k\x15vEZ\xc0\x97`U\xb8\x15\xd8\x12\xd6\x05v\x04\xb5\x80\xaa[\xae\xdbz\xb6~\xa0\x1f\x1c\'\x97\xfb\x1e\xff\x00\xd724\x998e]\xee\xa7\xb6t\xfcxx\x878o\xf0\xea\xc6\xb3j\xf1\xed\x8c)o\x15o\n\xb61KxU\xb1\x8a\xae\x18R\xe1\x8a\xb7\x85W\x0cR\xde\x15o\n\xb61KxU\xb1\x8a\xb7\x85[\x18R\xde*\xd8\xc2\xab\xb1Kc\n\xb7\x85[\x18\xabxU7\xf2\xd6\x8eu=EQ\x87\xfa4Ty\xcf\xb7e\xff\x00e\x99ZL\x1e$\xfc\x876\xdcP\xe2/L\x00(\x00\n\x01\xb0\x03\xa0\x19\xd19\xee\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xa8mF\xdb\xeb\x16\x8e\x80U\xc7\xc5\x1fJ\xf2\x1e\x15\xf1\xe9\x98\xfa\xac>&3\x16\xccS\xe1\x90,k92\xee\x1d\x81\\p%\xac\n\xe3\x81Z\xc5-\x1c\n\xd6\x05v\x04\xb5\x8a\xb5\x81.\xc0\xad`KG\x15v\x04\xb5\x81]\x81Z\xc0\xae\xc0\x96\x8e\x05k\x02\xb5\x81.\xc5Z\xc0\x96\x8e\x05k\x02]\x81Z\xc0\x97`V\xb2)k\x15vEZ\xc0\x97`U\xb8\x15\xd8\x12\xd6\x05v\x04\xb5\x80\xaa\xd6P\xcaU\x85T\x8a\x11\xecp]"Q\x04Qa\xf7v\xe6\xde\xe6HO\xec\x1d\x8f\x88\xea?\x0c\xdd\xe3\x9f\x14Ax-V\x03\x8b!\x81\xe8T\xc6X\xd0\xde*\xde\x15lb\x96\xf0\xabc\x15\\0\xa5\xc3\x15o\n\xae\x18\xa5\xbc*\xde\x15lb\x96\xf0\xabc\x15o\n\xb60\xa5\xbcU\xb1\x85Wb\x96\xc6\x15o\n\xb61U\xc8\xac\xcc\x15AfcE\x03rI\xc2\x05\xa5\xe9\xfe^\xd2\x17L\xd3\x92\x12\x07\xae\xff\x00\x1c\xed\xfeQ\xed\xf2\x1d3\xa3\xd2\xe0\xf0\xe1]z\xb9\xf8\xe1\xc2\x13<\xc9lv*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xc6\xf5+\x7fB\xf1\xd4}\x96\xf8\xd7\xe4\xdf\xdb\\\xe6;C\x0f\x06S\xdcwv\x9ai\xf1G\xdc\x85\xcc\x17!\xc7\x02Z\xc0\xae8\x15\xacR\xd1\xc0\xad`W`KX\xabX\x12\xec\n\xd6\x04\xb4qW`KX\x15\xd8\x15\xac\n\xec\th\xe0V\xb0+X\x12\xecU\xac\th\xe0V\xb0%\xd8\x15\xac\tv\x05k"\x96\xb1WdU\xac\tv\x05[\x81]\x81-`W`KX\n\xb5\x81)\x1f\x98m\xbf\xbb\xb9Q\xfeC\xfe\xb1\x99\xfa,\x9c\xe2\xf3\x9d\xbd\xa7\xe5\x90{\x8f\xe8I\x86l\x1eq\xbcU\xbc*\xd8\xc5-\xe1V\xc6*\xb8aK\x86*\xde\x15\\1KxU\xbc*\xd8\xc5-\xe1V\xc6*\xde\x15laKx\xabc\n\xae\xc5-\x8c*\xde\x15lb\xac\xaf\xc9\x1a/\xafpu\x19\x97\xf7P\x1a@\x0fy<\x7f\xd8\xfe\xbc\xd9\xf6~\x9e\xcf\x19\xe4998!{\xb3\x9c\xdd9n\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xa5\xda\xdd\xb9{u\x94u\x88\xef\xd7\xec\xb6\xc7\xa7\xbd3]\xdaxx\xf1\xdfX\xb9:Y\xd4\xab\xbd"\xcem\xd9\xb8\xe0KX\x15\xc7\x02\xb5\x8aZ8\x15\xac\n\xec\tk\x15k\x02]\x81Z\xc0\x96\x8e*\xec\tk\x02\xbb\x02\xb5\x81]\x81-\x1c\n\xd6\x05k\x02]\x8a\xb5\x81-\x1c\n\xd6\x04\xbb\x02\xb5\x81.\xc0\xaddR\xd6*\xec\x8a\xb5\x81.\xc0\xabp+\xb0%\xac\n\xec\tk\x01V\xb0%B\xee\xdc\\[I\t\xfd\xa1\xb1\xf0=G\xe3\x92\xc7>\x19\x02\xd1\xaa\xc02\xe30=X\x91R\xa4\xa9\x14#b=\xf3z\x0b\xc0\x90A\xa2\xecP\xde\x15lb\x96\xf0\xabc\x15\\0\xa5\xc3\x15o\n\xae\x18\xa5\xbc*\xde\x15lb\x96\xf0\xabc\x15o\n\xb60\xa5\xbcU\xb1\x85Wb\x96\xc6\x15o\n\xa2t\xdb\x19\xaf\xafb\xb5\x87\xed\xcai^\xc0u$\xfc\x86Y\x8b\x19\x9c\x84GVQ\x8d\x9az\xb5\x95\xa46v\xb1[B)\x1cJ\x15|O\x89>\xe7:lp\x10\x88\x03\xa3\xb1\x8chR\xb6M.\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xb4\xe8\xae\x8c\x8c*\xac\x08a\xe2\x0e\xc7\x01\x00\x8a*\x0b\x15\x9a&\x86W\x89\xbe\xd2\x12\t\xe9_\x7f\xa7\xaer\x19\xf1\x1cs1\xeew8\xe7\xc5\x10V\x1c\xa5\xb1\xac\n\xe3\x81Z\xc5-\x1c\n\xd6\x05v\x04\xb5\x8a\xb5\x81.\xc0\xad`KG\x15v\x04\xb5\x81]\x81Z\xc0\xae\xc0\x96\x8e\x05k\x02\xb5\x81.\xc5Z\xc0\x96\x8e\x05k\x02]\x81Z\xc0\x97`V\xb2)k\x15vEZ\xc0\x97`U\xb8\x15\xd8\x12\xd6\x05v\x04\xb5\x80\xabX\x12\xd6\x05c\x9a\xdd\xb7\xa5xd\x03\xe0\x98r\x1f>\xf9\xb6\xd1\xe4\xe2\x85w<\x7fl\xe9\xfc<\xdcC\x94\xf7\xf8\xf5K\xf3)\xd4\xb7\x85[\x18\xa5\xbc*\xd8\xc5W\x0c)p\xc5[\xc2\xab\x86)o\n\xb7\x85[\x18\xa5\xbc*\xd8\xc5[\xc2\xad\x8c)o\x15laU\xd8\xa5\xb1\x85[\xc2\xac\xff\x00\xc9:/\xd5l\xcd\xf4\xcbI\xeeG\xee\xc1\xea\xb1u\x1f\xf0]~\xec\xdev~\x9f\x86\xf9\xcdv\x9e\x1e\x0c\x969I\xdaigq\xae\xe4\x16k\\\x97\x1c\n\xd6)h\xe0V\xb0+\xb0%\xacU\xac\tv\x05k\x02Z8\xab\xb0%\xac\n\xec\n\xd6\x05v\x04\xb4p+X\x15\xac\tv*\xd6\x04\xb4p+X\x12\xec\n\xd6\x04\xbb\x02\xb5\x91KX\xab\xb2*\xd6\x04\xbb\x02\xad\xc0\xae\xc0\x96\xb0+\xb0%\xac\x05Z\xc0\x96\xb0+\xb0*O\xaf\xdbU\x12\xe0\r\xd7\xe1\x7f\x91\xe9\xf8\xe6~\x87&\xe6.\x83\xb7t\xf7\x11\x90t\xd8\xfe\x8f\xc7\x9aK\x9b7\x98lb\x96\xf0\xabc\x15\\0\xa5\xc3\x15o\n\xae\x18\xa5\xbc*\xde\x15lb\x96\xf0\xabc\x15o\n\xb60\xa5\xbcU\xb1\x85Wb\x96[\xe4]\x17\xd6\x9c\xeas/\xee\xe1\xe7:|p\x11\x88\x88\xe4\x1d\x8cE\nV\xc9\xa5\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xe6P\xcaU\x85T\x8a\x10z\x10q!X\xad\xcc\x06\x0b\x89!;\xf04\x07\xbd:\x82i\xed\x9c~\xab\x0f\x87\x90\xc5\xdc\xe2\x9f\x14AR9\x8e\xd8\xd6)h\xe0V\xb0+\xb0%\xacU\xac\tv\x05k\x02Z8\xab\xb0%\xac\n\xec\n\xd6\x05v\x04\xb4p+X\x15\xac\tv*\xd6\x04\xb4p+X\x12\xec\n\xd6\x04\xbb\x02\xb5\x91KX\xab\xb2*\xd6\x04\xbb\x02\xad\xc0\xae\xc0\x96\xb0+\xb0%\xac\x05Z\xc0\x96\xb0+\xb0+Y\x12\x94\x83[\xb7\xf4\xeeD\xa0|2\x8d\xff\x00\xd6\x1dso\xa1\xc9q\xae\xe7\x92\xed\xbd?\x06^1\xca_z\\35\xd37\x85[\x18\xaa\xe1\x85.\x18\xabxUp\xc5-\xe1V\xf0\xabc\x14\xb7\x85[\x18\xabxU\xb1\x85-\xe2\xad\x8c*\xf4O$\xe8\x9fS\xb2\xfa\xec\xcbK\x8b\xa1\xf0\x83\xd5c\xea?\xe0\xba\xfd\xd9\xbe\xec\xfd?\x04x\x8f3\xf79\xd81\xd0\xb6K\x9b\x16\xf7b\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xa9>\xbdo\xbcw\x03\xfe1\xbf\xeb_\xe3\x9an\xd7\xc3`Lt\xd8\xb9\xba9\xeeb\x94\x1c\xd0;\x06\xb1KG\x02\xb5\x81]\x81-b\xad`K\xb0+X\x12\xd1\xc5]\x81-`W`V\xb0+\xb0%\xa3\x81Z\xc0\xad`K\xb1V\xb0%\xa3\x81Z\xc0\x97`V\xb0%\xd8\x15\xac\x8aZ\xc5]\x91V\xb0%\xd8\x15n\x05v\x04\xb5\x81]\x81-`*\xd6\x04\xb5\x81]\x81Z\xc8\x94\xa0\xf5K\x7f^\xcd\xc0\x15t\xf8\xd7\xe6?\xb3/\xd2\xe4\xe0\x98\xee.\xbf\xb4\xf4\xfe.\x12\x071\xb8cc7\xaf\x12\xde\x15lb\xab\x86\x14\xb8b\xad\xe1U\xc3\x14\xb7\x85[\xc2\xad\x8cR\xde\x15lb\xad\xe1V\xc6\x14\xb7\x8a\xa7~T\xd1N\xa7\xa9(\x90V\xd6\n<\xe7\xb1\xfeT\xff\x00e\xfa\xb33E\xa7\xf1\'\xbf\xd29\xb6\xe1\x87\x11\xf2zx\x00\n\x0e\x99\xd2;\x07b\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5T\xae\xe0\x17\x16\xf2B\x7fhlOb7\x07o|\xaf618\x18\x9e\xac\xa1.\x12\x0b\x15`\xc0\x90\xc0\xab\r\x8a\x9e\xa0\xe7\x1b(\x98\x92\x0fGu\x13b\xda\xc8\xb2h\xe0V\xb0+\xb0%\xacU\xac\tv\x05k\x02Z8\xab\xb0%\xac\n\xec\n\xd6\x05v\x04\xb4p+X\x15\xac\tv*\xd6\x04\xb4p+X\x12\xec\n\xd6\x04\xbb\x02\xb5\x91KX\xab\xb2*\xd6\x04\xbb\x02\xad\xc0\xae\xc0\x96\xb0+\xb0%\xac\x05Z\xc0\x96\xb0+\xb0+Y\x12\x96\xb0+\x19\xd4-\xfd\x0b\xb7@(\xa7\xe2O\x91\xcd\xf6\x9b\'\x1c\x01xn\xd0\xd3\xf8Y\x8czs\x1e\xe2\x87\xcc\x87\t\xb1\x8a\xae\x18R\xe1\x8a\xb7\x85W\x0cR\xde\x15o\n\xb61KxU\xb1\x8a\xb7\x85[\x18R\xbe8\xdeI\x168\xd4\xb3\xb9\n\xaa:\x92v\x00a\x00\x93AC\xd5\xbc\xbd\xa3\xa6\x95\xa6\xc7o\xb1\x99\xbe9\xd8ws\xd7\xe8\x1d\x06t\xfa\\\x1e\x1c+\xafWc\x8e\x1c"\x93,\xc8lv*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\x1e\xd6m\xfd+\xb2\xe0Q&\x1c\x87A\xf1~\xd7\xf5\xfas\x9b\xed\\<98\xbaI\xd9i\'q\xae\xe4\x06j\xdc\xc6\x8e\x05k\x02\xbb\x02Z\xc5Z\xc0\x97`V\xb0%\xa3\x8a\xbb\x02Z\xc0\xae\xc0\xad`W`KG\x02\xb5\x81Z\xc0\x97b\xad`KG\x02\xb5\x81.\xc0\xad`K\xb0+Y\x14\xb5\x8a\xbb"\xad`K\xb0*\xdc\n\xec\tk\x02\xbb\x02Z\xc0U\xac\tk\x02\xbb\x02\xb5\x91)k\x02\xa5\x9a\xe5\xbf(Va\xd63F\xf9\x1f\xed\xcc\xfd\x06J\x91\x8f{\xa3\xed\xcd?\x14\x06A\xfc?qI3n\xf2\xad\x8cUp\xc2\x97\x0cU\xbc*\xb8b\x96\xf0\xabxU\xb1\x8a[\xc2\xad\x8cU\xbc*\xd8\xc2\x96c\xe4=\x13\xd5\x99\xb5I\xd7\xf7q\x12\xb6\xe0\xf7~\xed\xfe\xc7\xa7\xfbY\xb5\xec\xdd=\x9e3\xd3\x93\x93\xa7\xc7\xd5\x9df\xed\xccv*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1T\x16\xb1o\xebY\xb3\x01\xf1\xc5\xf1\x8f\x90\xfb_\x86ak\xf0x\x98\x8fx\xdd\xbfO>\x19\x869\x9c\xa3\xb7h\xe0V\xb0+\xb0%\xacU\xac\tv\x05k\x02Z8\xab\xb0%\xac\n\xec\n\xd6\x05v\x04\xb4p+X\x15\xac\tv*\xd6\x04\xb4p+X\x12\xec\n\xd6\x04\xbb\x02\xb5\x91KX\xab\xb2*\xd6\x04\xbb\x02\xad\xc0\xae\xc0\x96\xb0+\xb0%\xac\x05Z\xc0\x96\xb0+\xb0+Y\x12\x96\xb0*\xd9cY#h\xdb\xec\xb0 \xfd8a#\x12\x08\xe8\xc3.18\x98\x9eD1i#h\xe4h\xdb\xed) \xfd\x19\xd1\xc2B@\x11\xd5\xe02\xe30\x91\x89\xe6\n\xd1\x92k\\0\xa5\xc3\x15o\n\xae\x18\xa5\xbc*\xde\x15lb\x96\xf0\xabc\x15o\n\xa34\xad:mF\xfe+H~\xd4\x87\xe2n\xca\xa3vc\xf2\x19n\x1cG$\x84C8G\x88\xd3\xd6\xed-a\xb4\xb6\x8a\xda\x05\xe3\x14J\x15G\xcb\xf8\x9c\xeaa\x01\x18\x809\x07e\x11B\x95riv*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xacn\xebK\xba\x86G\xe1\x19x\xaax2\xfc_\x0fj\xf7\xce_U\xa0\xc9\x19\x9e\x18\xdc|\x9d\xae\x1dDH\x16wA0 \x90E\x08\xea\x0ek\x88\xaenHk\x02\xbb\x02Z\xc5Z\xc0\x97`V\xb0%\xa3\x8a\xbb\x02Z\xc0\xae\xc0\xad`W`KG\x02\xb5\x81Z\xc0\x97b\xad`KG\x02\xb5\x81.\xc0\xad`K\xb0+Y\x14\xb5\x8a\xbb"\xad`K\xb0*\xdc\n\xec\tk\x02\xbb\x02Z\xc0U\xac\tk\x02\xbb\x02\xb5\x91)k\x02\xbb\x02RMn\xdf\x8c\xcb0\x1b8\xa3|\xc7\xf6f\xdf\xb3\xf2\xdcL{\x9eW\xb74\xfc3\x19\x07\xf1}\xe3\xf6%\xa36\x0e\x89p\xc2\x97\x0cU\xbc*\xb8b\x96\xf0\xabxU\xb1\x8a[\xc2\xad\x8cU\xbc*\xf4\x7f$h\x7fR\xb0\xfa\xe4\xcbK\x9b\xa0\x08\xafU\x8f\xaa\x8f\xf6]O\xd1\x9d\x07g\xe9\xf8#\xc4y\xcb\xees\xf0c\xa1}\xec\x976-\xee\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1U\x92C\x0c\xa2\x92"\xb8\xff\x00(\x03\x90\x9e(\xcf\xea\x00\xb2\x8c\xc8\xe4Pr\xe8\x96/\xf6A\x8c\xff\x00\x92\x7f\x81\xae`d\xec\xac2\xe5\xe9\xf77\xc7W1\xe6\x82\x9b\xcb\xd3\r\xe2\x95[\xd9\x87\x13\xfcs\x03\'cH}2\x07\xde\xe4GZ:\x84\x14\xdam\xf4_j\x16#\xc5~!\xf8f\xbf.\x8749\xc4\xfd\xeeLs\xc2\\\x8a\x10\x82\r\x0f\\\xc4-\xce\xc0\xad`KG\x15v\x04\xb5\x81]\x81Z\xc0\xae\xc0\x96\x8e\x05k\x02\xb5\x81.\xc5Z\xc0\x96\x8e\x05k\x02]\x81Z\xc0\x97`V\xb2)k\x15vEZ\xc0\x97`U\xb8\x15\xd8\x12\xd6\x05v\x04\xb5\x80\xabX\x12\xd6\x05v\x05k"R\xd6\x05v\x04\xa1\xaf\xed\xfd{W@*\xc0rO\x98\xcb\xb4\xd9x&\x0b\x85\xda\x1a\x7f\x17\t\x8f^c\xde\xc6\xc6t/\x0c\xb8aW\x0cU\xbc*\xb8b\x96\xf0\xabxU\xb1\x8a[\xc2\xad\x8cU=\xf2\x96\x89\xfaSR\x06E\xad\xa5\xbd\x1e\x7f\x03\xfc\xa9\xfe\xcb\xf5fv\x87O\xe2O\x7f\xa4sn\xc3\x8f\x88\xf9=C:G`\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xaar\xdb\xc10\xfd\xecj\xfe\xe4\x02r\xac\x98a?\xa8\x02\xce3\x94y\x14\x14\xda\r\x93\xfd\x8eQ\x1fcQ\xf8\xd702\xf6F\x19r\xb8\xfe<\xdc\x88\xeb&9\xee\x81\x9b\xcb\xb7\x0b\xbcR+\x8f\x03\xf0\x9f\xe3\x9a\xfc\xbd\x8b1\xf4\x90~\xc7":\xe8\x9eb\x903i\xd7\xb0\xfd\xb8Z\x83\xb8\x1c\x87\xde+\x9a\xec\xba,\xd0\xe7\x12\xe4\xc3<%\xc8\xa1\xb3\x15\xb5\xac\tv\x05k\x02\xbb\x02Z8\x15\xac\n\xd6\x04\xbb\x15k\x02Z8\x15\xac\tv\x05k\x02]\x81Z\xc8\xa5\xacU\xd9\x15k\x02]\x81V\xe0W`KX\x15\xd8\x12\xd6\x02\xad`KX\x15\xd8\x15\xac\x89KX\x15\xd8\x12\xd1\xc0\xac{Q\xb7\xf4n\xdc\x0f\xb2\xff\x00\x12\xfd?\xdb\x9b\xfd&^8\x0e\xf1\xb3\xc4\xf6\xa6\x9f\xc2\xccGC\xb8C\x0c\xcau\xee\x18\xabxUp\xc5-\xe1V\xf0\xabc\x14\xb7\x85W\xc3\x14\x92\xc8\x91F\xa5\xe4v\n\x8a:\x92M\x00\xc3\x10I\xa0\x9a\xb7\xady\x7fG\x8fJ\xd3c\xb6\x142\x9f\x8ew\x1d\xdc\xf5\xfa\x07A\x9dN\x97\x00\xc5\x00:\xf5v8\xe1\xc2)1\xcc\x86\xc7b\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1U)\xad-f\xfe\xf6%c\xe2F\xff\x00\x7f\\\xa7&\x9b\x1c\xfe\xa8\x82\xce9e\x1eE\x037\x97\xec\x9fx\xcbD|\x01\xa8\xfcw\xfcs]\x97\xb1\xb1K\xe9\xb8\xb90\xd6\xccs\xdd\x017\x97n\xd7\xfb\xa7Y\x07\x87\xd9?\x8e\xdf\x8ek\xb2\xf6.A\xf4\x91/\xb3\xf1\xf3ra\xae\x89\xe6)\x015\x85\xe4?\xde\xc2\xca\x13\x8ef\x07\xa1X2\xc6\x96\xf0\xaa\xe1\x8a[\xc2\xad\xe1V\xc6)F\xe9\x1ad\xfa\x96\xa1\x15\x9c=d?\x1bvU\x1fi\x8f\xc8e\xd80\x9c\x93\x11\x0c\xe1\x1e#O]\xb4\xb5\x86\xd6\xda;h\x17\x8cQ(T\x1e\xc3:\xb8@D\x009\x07d\x05\nU\xc9%\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xaa\x1a}6\xc6\x7f\xef!RO\xed\x01\xc4\xfd\xe2\x99\x89\x97C\x87\'\xd5\x11\xf7}\xcd\xd0\xcf8\xf2(\t\xfc\xb3l\xdb\xc3#F|\x0f\xc4?\x81\xcdn^\xc1\xc6~\x99\x18\xfd\xaeL5\xf2\x1c\xc5\xa5\xf3\xf9sP\x8fx\xf8\xca?\xc94?q\xa6k3v&x\xfd5/\xc7\x9b\x95\rt\x0f=\x92\xe9\xadn`?\xbd\x89\x93\xdd\x81\x03\xef\xcdf]>L\x7fTHr\xa1\x922\xe4mK(f\xd6\x04\xbb\x02\xb5\x91KX\xab\xb2*\xd6\x04\xbb\x02\xad\xc0\xae\xc0\x96\xb0+\xb0%\xac\x05Z\xc0\x96\xb0+\xb0+Y\x12\x96\xb0+\xb0%\xa3\x81Z\xc0U)\xd6`\xa3\xac\xc0l\xdf\x0b|\xc7L\xdbvn[\x06/5\xdb\xbaz\x90\xc8:\xec\x7fBX3h\xf3\xcd\xe1U\xc3\x14\xb7\x85[\xc2\xad\x8cR\xf4\xaf$h\x7fP\xd3\xfe\xb72\xd2\xea\xec\x06\xa1\xea\xb1\xf5U\xfaz\x9c\xe8\xbb;M\xc1\x0e#\xf5K\xees\xf0c\xa1}\xec\x976-\xee\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xc4\x02(zb\xa8I\xf4\x9d:o\xb7\x02\x82{\xaf\xc2\x7f\xe1i\x98Y{;\x06Nq\x1f\r\xbe\xe6\xf8jrG\x91K\xe7\xf2\xb4\rS\x04\xcc\x9e\xcc\x03\x0f\xc2\x99\xab\xcb\xec\xfc\x0f\xd1"=\xfb\xfe\xa7*\x1d\xa3.\xa1.\x9f\xcb\xba\x94u(\xab(\xff\x00 \xef\xf7\x1af\xaf7bj!\xc8\t{\xbfk\x95\rv3\xcfd\xbek{\x88M&\x8d\xa3?\xe5\x02?^j\xf2\xe0\x9e3R\x04{\xdc\xa8\xce2\xe4mK*f\xec\x8a\xb5\x81.\xc0\xabp+\xb0%\xac\n\xec\tk\x01V\xb0%\xac\n\xec\n\xd6D\xa5\xac\n\xec\th\xe0V\xb0\x15Q\xbb\x84M\x03\xc7\xdc\x8f\x87\xe6:e\xba|\xbc\x13\x12q\xb5\x9a\x7f\x17\x11\x8f^\x9e\xf6;B\r\x0f\\\xe9^\x08\x87aU\xc3\x14\xb7\x85[\xc2\xa9\xf7\x93\xf4?\xd2z\x90iV\xb6\x96\xd4y\xab\xd1\x8f\xec\xa7\xd3\xfa\xb37A\xa6\xf1\'\xbf\xd2\x1b\xf0\xe3\xe2>OR\xce\x99\xd8;\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xe2\xa1\x81\x0c\x01\x07\xa88\x08\x04QPPS\xe8\xbal\xdfj\x05S\xe2\x9f\x0f\xea\xcc\x0c\xdd\x95\xa7\xc9\xce {\xb6\xfb\x9c\x88j\xb2G\xaa]?\x95b50NW\xc1\\\x03\xf8\x8af\xab7\xb3\xb1?D\x88\xf7\xb9P\xed\x13\xfcA.\x9f\xcb\xba\x9cU!\x04\xa3\xc5\r\x7f\x03C\x9a\xac\xdd\x89\xa8\x87!\xc5\xeer\xe1\xae\xc6z\xd2_,3D\xdceFF\xf0`G\xeb\xcd^LS\x81\xa9\x02\x0f\x9b\x95\x19\x89r6\xa5\x952v\x04\xb5\x81]\x81-`*\xd6\x04\xb5\x81]\x81Z\xc8\x94\xb5\x81]\x81-\x1c\n\xd6\x02\xaddR\x91\xeapzWD\x81\xf0\xc9\xf1\x0f\x9f|\xe849x\xf1\x8e\xf1\xb3\xc6v\xbe\x9f\xc3\xccH\xe5-\xff\x00Z\x133]Z\xe1\x8a[\xc2\xab\xe1\x8aI\xa5H\xa2R\xf2H\xc1QGRI\xa0\x19(\xc4\x93A [\xd7t\r"=+L\x8a\xd5hd\xfbS\xb8\xfd\xa7=O\xf0\x19\xd5i\xb0\x0cP\x11\xf9\xbb\x7ff\x0f\xf99\xfc\xff\x00X\xfdN\\;O\xf9\xc3\xe4\x95\xdch\x1a\xac5\xac\x05\xd4~\xd4\x7f\x17\xe07\xfc3Q\x9f\xb1u8\xff\x00\x86\xc7\x96\xff\x00\xb5\xcc\x86\xb7\x14\xba\xd7\xbd\x00\xe8\xe8\xc5]J\xb0\xea\x08\xa1\xcd\\\xe0bh\x8a.P \xf2[\x90)k\x02\xbb\x02Z8\x15\xac\x05Z\xc8\xa5\xa2\x01\x04\x1d\xc1\xea1\xba6\x82\x01\x14X\xf5\xc4&\x19\x9e3\xfb\'o\x97l\xea0d\xe3\x80\x97{\xc0\xea\xb0\x1cY%\x0e\xe2\xb0e\xad\x08\xed\x17K\x9bT\xd4b\xb3\x8bnf\xb2?\xf2\xa0\xfbM\x97\xe9\xf0\x9c\x93\x11\x0c\xf1\xc3\x88\xd3\xd7\xedm\xa1\xb5\xb7\x8e\xde\x15\xe3\x14J\x11\x17\xd8gY\x08\x08\x80\x07 \xec\xc0\xa1J\xb9$\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5VK\x04\x13/\x19cY\x17\xc1\x80?\xaf+\xc9\x86\x19\x05H\t{\xc5\xb2\x8c\xccy\x1aKn<\xb3\xa5MR\xb1\x98X\xf7\x8c\xd3\xf05\x19\xa9\xcf\xd8\x1al\x9c\x81\x89\xf2?\xae\xc3\x97\r~X\xf5\xbfzYq\xe4\xf9EM\xbd\xc2\xb7\x82\xb8+\xf8\x8a\xe6\x9f?\xb2\xf2\x1f\xdd\xcc\x1f~\xdf\xad\xcb\x87j\x0f\xe2\te\xc6\x85\xaa\xc1R\xd6\xec\xcb\xfc\xc9\xf1\xff\x00\xc4jsM\x9f\xb1\xf5X\xf9\xc0\x9fv\xff\x00s\x99\rf)r(\x06R\xa4\x86\x14#\xa89\xac \x8d\x8b\x94\n\xdc\x89V\xb2)v\x02\xa9f\xb1\x07\xd8\x98\x7f\xaa\xdf\xc36\xdd\x97\x9b\x9c\x0f\xbd\xe7;{O\xcb \xf7\x1f\xd0\x96\x8c\xdc<\xe3\xd3\xbc\x8f\xa1~\x8f\xd3\xbe\xb52\xd2\xee\xec\x065\xea\xb1\xf5U\xfaz\x9c\xe9;;M\xe1\xc3\x88\xfdR\xfb\x9c\xfd>>\x11}K$\xcd\x8b\x90\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xaaS\xda\xdbN)4I \xff\x00)A\xfdyNm><\x82\xa7\x11/xg\x0c\x92\x8f#Im\xc7\x95\xb4\xa9jQZ\x16\xff\x00 \xed\xf75sO\x9f\xd9\xcd4\xf9\x03\x0fq\xfdv\xe5\xc3\xb4r\xc7\x9e\xe9]\xcf\x93\xaeV\xa6\xdeu\x90x8*\x7f\x0eY\xa6\xcf\xec\xaeA\xfd\xdc\xc4\xbd\xfb~\xb77\x1fjD\xfdB\x92\xab\x9d\x13T\xb7\xa9\x92\xdd\xca\x8f\xdaO\x8c\x7f\xc2\xd74\x9a\x8e\xc8\xd4\xe2\xfa\xa0k\xcb\x7f\xb9\xcc\xc7\xab\xc7.RK\xaea\x12\xc4\xf16\xd5\x14\xf9\x1c\xc2\xc3\x90\xe3\x98\x97ru8F\\f\x1d\xe3\xfb\x1a\xf2n\x80u-S\x9c\xeb\xfe\x8bhCL\x0fFj\xfc)\xfd}\xb3\xb8\xec\xed?\x8b+\xfe\x10\xf0\xf8\xb0\x93*=\x1e\xa5\x9d;\xb0v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\x83\xbe]!\xbe\x1b\xdfB\xa7\xa7\xaaT\x1f\xa0\x9d\xf3_\xac\x8e\x94\xed\x9b\x83\xfc\xea\xfd-\xf8NQ\xf4q|\x1d\xa5C\xa5E\x03\xae\x9ac0\xfa\x8cd10q\xea\x1aV\xa6\xa7~\x99v\x92\x18\xa3\n\xc5\\\x1eF\xfe\xd6\x99\x1b\x91\'\x9d\xef\xefFfR\x1d\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xae\xc5]\x8a\xbb\x15v*\xecU\xd8\xab\xb1Wb\xaf\xff\xd9' >>> assert HTTPResponse in a[29] >>> assert a[29].Transfer_Encoding == b"chunked" >>> assert a[29].Content_Type == b'image/jpeg; charset=utf-8' >>> assert a[29].Http_Version == b'HTTP/1.1' >>> assert a[29].Status_Code == b"200" >>> assert a[29].Reason_Phrase == b"OK" >>> assert len(a[29].load) == 33653 >>> wireshark_data = b'/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNBCUAAAAAABAAAAAAAAAAAAAAAAAAAAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgCtwKdAwERAAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq84/OfzmdJ0caLZycdQ1JT6rKaGO3rRj/z0+yPaubTszTccuM8o/e8/wBva/wsfhx+qf2D9vL5pF5T8z6jPpFvcQXTo6jhMgaq802NV+zv1+nOV7VxT0uplGJIidx7j+rk9n2DqYa3RwnMAzHpl7x+sUfiyq2876pFQTpHcDuSODfeu34Zjw7TyDnRc7J2VjPIkJva+edMkoLiOS3buftr943/AAzMh2njPMEOFk7KyD6SCnFpq+mXdBb3MbseiVo3/AmhzMx6jHPkQ4OTTZIfVEovLml2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoTV9Vs9J0y51K9fhbWqGSQ99ugHux2Hvk8eMzkIjmWrPmjigZy5B8r+Y9evNe1q61W7P724eqpWoRBsiL7Ku2ddhxDHARHR811WplmyGcuZTvyBqXpXktg7fBcDnED/Og3A+a/qznPajR8eEZRzhz9x/a9d7EdoeHqJYCdsg2/rD9Yv5BnZzgn1VrAlrFUba61qtpT0LqRAOik8l/4FqjLoanJDkS0ZNLjn9UQm9r581KOguIY51HcVRj9IqPwzMh2pMfUAXCydk4z9JI+1ObXzzpEtBOslu3csOS/etT+GZsO08Z52HBydlZRyqSc2up6ddgfVrmOUn9lWHL/geuZkM0J/SQXByYJw+oEInLWp2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvD/zu86fW75fLdm9ba0YPfMp+1PT4U27IDv/AJXyzf8AZem4R4h5nl7njfaHX8UvBjyjz9/d8Pv9zyrNu80r2d1LaXcVzEaSQuHX3oehp2OV5sUckDCXKQpt0+eWHJHJH6okEfB67b3EdzbRXERrHKgdD7MKjPJNRgliyShLnE0+/aTUxz4o5I/TMAr8oclrFXHAlrFWjilb3wKmFp5g1m0oIbuQKOiMea/c1cyMeryQ5SLjZNHinziE4tPzAv0oLq3jmX+ZCY2/42H4Zm4+1Zj6gD9jhZOx4H6SR9qdWnnnRJqCUyWzf5a1X715ZmY+08UudhwMnZWWPKpJ1a6hY3QrbXEc3sjAn6QN8zYZYT+kguDkwzh9QIV8sa3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWN/mB5ti8seXZr0EG9l/c2MZ3rKw+1TwQfEfu75laPT+LOunV1/aetGnxGX8R2Hv/Y+YJZpZpXmlcySyMXkdjVmZjUkk9yc6sChQfOZSJNnmtwobxQz7yFqXrafJYufjtm5R/wDGNzX8Gr9+cL7U6PhyRyjlLY+8frH3PqPsN2jx4ZaeR3huP6p5/I/7plGcm941irjgS1irRxStwK0cVaOKWjgS4Eggg0I6EYqmVp5m121oI7t2UfsyfvB/w1cycetyx5S/S4uTQ4Z84j7k6tPzDu1oLu1SQd2jJQ/ceWZuPtaQ+oW4GTsaJ+mVe9O7PzxoNxQSSPbMe0qmn3ryH35m4+08UuZr3uDk7KzR5Di9yc217aXS8raeOZe5jYN+rM2GSMvpILgTxSh9QIVsmwdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirTMqqWYhVUVJOwAGKkvmj8zfOLeZvMUkkLE6ZZ1hsV7EA/FJ83P4UzqdDpvChv9R5vnva2u/MZbH0R2H6/ixEZmuqbxVvFCaeW9S/R+sQTMaROfSmJNBwfapPsaH6M13auj/MaeUP4uY94/FO47B7Q/KauGQ/TdS/qnn8ufwepZ5U+6NYpccCWsVaOKVuBWjirRxS0cCXYFWnFLRxV2BLau6MGRirDowNCPuxBI5IIB5ppZ+bNftaBLtpFH7MtJB97b/jmXj1+aP8V+/dxMnZ+GfONe7ZO7T8x5hQXloreLxMV/4VuX68zcfa5/ij8nAydij+GXzTuz87eX7igaZrdj+zMpH/AAw5L+OZ2PtLDLrXvcDJ2Xmj0v3J1Bc21wnO3lSZP5o2DD7xmbGcZCwbcCcJRNSFKmSYuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV5p+dfnP9F6QNCs5KX2pKfXI6pbVof+RhHH5Vza9mabjlxnlH73n+39f4ePw4/VPn7v2/reCZ0LxLhihvFW8UN4q9Q8sal9f0eGRmrNEPSm3qeSdz8xQ55l29o/A1Mq+mXqHx5/a+1+y/aH5nRxJPrh6T8OXzFfFNM0z0TjgS1irRxStwK0cVaOKWjgS7Aq04paOKuwJaOKtYEtYq0cCtxyyxOHido3HRlJB+8YRIg2FMQRR3Tiz85eYbWgFyZkH7MwD/APDH4vxzMx9o5o9b97hZOzcE/wCGvdt+xPLP8yTsL2z+bwt/xq3/ADVmdj7Y/nR+Tr8vYn8yXz/H6E8svOnl66oPrPoOf2ZgU/4b7P45nY+0cMute9wMvZmeHS/d+LTmKaGZA8MiyIejIQw+8ZmRkCLBtwZRMTRFL8kxdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVQWs6vZaPpdzqd63C2tUMjnuadFX3Y7D3yeLGZyERzLTnzRxQM5cg+VvMOuXmu6zdareH99cvy41qEUbIg9lUAZ1+HEMcREdHzbVaiWbIZy5lL8saHDFDeKt4obxVk3kTUvQ1J7Nz+7ul+H2dASPvFfwznPabR+Jg4x9WP7jz/AEF7H2L7R8HVHEfpyiv84bj9I+IZ9nnj6444EtYq0cUrcCtHFWjilo4EuwKtOKWjirsCWjirWBLWKtHArRxS0cUtYFawJXw3FxbvzgleJ/5kYqfvGSjMx3BpjKEZCiLTqz88eYragM4uEH7Myhv+GHFvxzNx9p5o9b97g5eysE+le5PbL8zIjQXtmy+LwsG/4Vqf8SzOx9sj+KPydfl7DP8ABL5p9ZecfLt3QLdrE5/YmrHT6W+H8cz8faGGf8Ve/Z12Xs3PD+G/dum8ckciB42DoejKQQfpGZgIO4cIxINFdhQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8L/O/wA6G91FfLlnJ/oti3K9ZTs89Nk+UY/4b5Z0HZem4Y8Z5nl7njfaDX8c/Cj9Mefv/Z97yzNs823irhihvFW8UN4qqQTSQTRzRHjJEwdD1oVNRkckBOJieR2Z4ssscxOJqUTY94etWN3HeWcN1H9iZA4HhXqDTuOmeSazTHBlljP8J/s+x9+7P1kdTghljymL/WPgdlY5iua1irRxStwK0cVaOKWjgS7Aq04paOKuwJaOKtYEtYq0cCtHFLRxS1gVrAlo4paxVrAlrFVa2vby1fnbTyQN4xsV/UclDJKJuJIYTxRmKkAU7s/P3mK2oHlS5QfszKK/8EvE/fmdj7VzR5ni97gZeyMEuQ4fcn1l+Z1o1Be2bx+LxMHHzo3Gn35n4+2on6o17nXZew5D6JA+9P7Lzb5dvKCO9RGP7EtYzXw+Og+7M/Hr8M+Uh8dnXZezs8OcT8N/uTZWVlDKQyncEbg5lg24ZFN4UOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVjH5ieb4/LHlya7Ug389YbCM71lYfaI8EHxH7u+Zej0/izrp1dd2nrRp8Rl/Edh7/2PmCSSSWRpZGLyOxZ3Y1JYmpJJ7nOrAp88kSTZaxYt4q4YobxVvFDeKuxQzjyFqXqW02nufihPqRD/ACGPxAfJv15xPtXo6lHMOvpP6Px5PpnsJ2jcZ6eX8Pqj7uv218yyw5xz6G1irRxStwK0cVaOKWjgS7Aq04paOKuwJaOKtYEtYq0cCtHFLRxS1gVrAlo4paxVrAlrFXYFWnFLRwK7FKvaalqFm1bW5kgP/FblQfmAcnjzTh9JIasmGE/qAKfWX5ieYbegmaO6Uf78WjU+acfxzPx9r5o86l73X5exsMuVx937U/sfzP096Le2skB/mjIkX6a8D+vNhi7agfqiR9rrsvYUx9Egffsn9j5p8v3tBBfR8j0Rz6bfc/Gv0Zn4tdhnykPu+912XQZsfOJ+/wC5NQQRUbg9DmW4bsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVad0RGd2CooJZiaAAbkknEBBNPmP8AMrzk/mfzFJNEx/RtpWGwTxQH4pPnId/lQds6rRabwoV/Eeb592rrvzGWx9A2H6/ixQZmOsbxQ3irhihvFW8UN4q7FCYaFqJ0/VILmtIw3GXr9htm6eHXMLtHSDUYJY+pG3v6Oy7H150mqhl6A7/1Tsfs+16pWoqOmeTEEGi+9xkCLHJrAyaOKVuBWjirRxS0cCXYFWnFLRxV2BLRxVrAlrFWjgVo4paOKWsCtYEtHFLWKtYEtYq7Aq04paOBXYpawKtxS7ArRxSirLV9UsSDaXUsIH7KOQv0r0OW49Rkh9MiGnLp8eT6ogsgsvzJ1+CguBFdL3Lrwb70oPwzPxdsZo86k67L2Jhl9Nx/HmyCy/M/SZaC8t5bZj1ZaSIPp+FvwzY4u2sZ+oEfa63L2FkH0kS+xkFj5k0G+p9WvomY9EZuD/8AAvxb8M2GLWYp/TIOty6LNj+qJTLMlxXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8x/O3zp+jdKXQLOSl7qK1uip3S26Ef89Dt8q5tey9NxS4zyj9/wCx57t7XeHDwo/VLn7v2vBM6F4tsYq3ihvFXDFDeKt4obxV2KG8Vek+UtR+uaNEG/vbb9y/yUfCf+Bpnm3tFo/B1JkPpn6vj1+3f4vs3sh2h+Y0Yifqxek+7+H7NvgnOaF6lo4pW4FaOKtHFLRwJdgVacUtHFXYEtHFWsCWsVaOBWjilo4pawK1gS0cUtYq1gS1irsCrTilo4FdilrAq3FLsCtHFLWBLWKtHArRxSjrHXtZsKC0vJYlHRAxKf8AAGq/hl+LVZMf0yIcfLpMWT6ogsgsfzO1yGguoorte5p6b/evw/8AC5sMXbWWP1AS+z8fJ1uXsLFL6SY/b+PmyGx/M/Q5qLdRS2rHq1BIg+lfi/4XNji7axH6gY/b+Pk63L2Flj9JEvs/HzZFY6/ot/QWl7DKx6IGAf8A4A0b8M2GLVYp/TIF1mXSZcf1RIR+ZDjuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoHXNZstF0m61S9bjb2qF28WPRVX3ZqAZZixmchEcy06jPHFAzlyD5U1/W73XNYutVvDWe6csV6hV6Ki+yrQDOuw4hjiIjo+b6nUSzZDOXMpfljQ2MVbxQ3irhihvFW8UN4q7FDeKsh8laiLXVfQc0iuxw3oBzXdP4j6c0HtHo/G0xkPqx7/Dr+v4PV+x3aP5fWCBPoy+n4/w/bt8XoOebvsjRxStwK0cVaOKWjgS7Aq04paOKuwJaOKtYEtYq0cCtHFLRxS1gVrAlo4paxVrAlrFXYFWnFLRwK7FLWBVuKXYFaOKWsCWsVaOBWjilrArRxVrFLRwJTKx8y69YUFrfSoq9Iy3NB/sH5L+GZOLWZcf0yLi5dDhyfVEMk0z8ztaDrFdW0V1/lLWJvpI5L/wubLB21lupAS+x0uu7JwYoHJxGIHx/HzelWtzFc20VxEaxzIHQ+zCudLCYlESHIvOSjwmlTJMXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8H/O/wA6fpDVF8vWclbPT25XZXo9xSnH5Rg0/wBavhnQdl6bhjxnmeXueN7f13HPwo/THn7/ANjy3Ns863ihsYq3ihvFXDFDeKt4obxV2KG8VXRyPHIskbFXQhkYdQQagjAQCKKYyMSCNiHq2m3yX1hBdpsJVBYDsw2YfQds8l7Q0h0+eWPuO3u6fY++9k68avTQzD+Ib+/kftRJzDdktwK0cVaOKWjgS7Aq04paOKuwJaOKtYEtYq0cCtHFLRxS1gVrAlo4paxVrAlrFXYFWnFLRwK7FLWBVuKXYFaOKWsCWsVaOBWjilrArRxVrFLRwJdiqY2EHBPUYfE/T2GZeCFC3hfaLtDxMnhR+mHPzl+z9b0nyBqXrWEli5+O2blH/wAY3Nfwav3jOj7MzXEwPT7j+11+OXFjB7tj8OX2fcyrNol2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVi35j+cI/K/lyW5jYfpC5rDYIf8AfhG708EG/wBw75l6LTeLOug5uu7U1o0+IkfUdh+PJ8wPI8kjSSMXdyWdiakk7kk51YFPnpN7lbihvFDYxVvFDeKuGKG8VbxQ3irsUN4q7FWZ+Q9Rqs+nud1/ewg16HZx99D9+cd7V6OxHMP6p/R+l9F9g+0aM9NI/wBKP3S/Qfmy45xL6WtwK0cVaOKWjgS7Aq04paOKuwJaOKtYEtYq0cCtHFLRxS1gVrAlo4paxVrAlrFXYFWnFLRwK7FLWBVuKXYFaOKWsCWsVaOBWjilrArRxVrFLRwJVrSD1Zd/sLu39MsxQ4i6ntjtD8thJH1y2H6/gmozPfOLTXy3qX6O1iCdm4wsfSnPQcH2JPspo30ZkaXL4eQS6dfd+N3L0cvUY/zvv6fq+L1TOncl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KtSSJGjSSMERAWdiaAAbkk4gWgmhZfL/5kecZPNHmOW5jY/o62rDYIa09MHd6eMh3+VB2zq9FpvChX8R5vn3amtOoykj6RsPx5sWzLda7FW8UNjFW8UN4q4YobxVvFDeKuxQ3irsVRmk3zWGowXQ3EbfGPFTsw/wCBOY2t0wz4ZYz/ABD+z7XN7N1p0uohmH8B+zqPiHqisroGUgqwqpG4IOeRzgYyMTzD9AYskZxEom4yFj3FrIM2jirRxS0cCXYFWnFLRxV2BLRxVrAlrFWjgVo4paOKWsCtYEtHFLWKtYEtYq7Aq04paOBXYpawKtxS7ArRxS1gS1irRwK0cUtYFaOKtYpdQk0G5PQYolIAWeSa28IiiC9+rH3zOxw4Q+a9qa46nMZfwjaPu/aqjLHWrsUg1u9Q8q6l9f0WF2NZof3Mx6nkgFCf9ZaHOk0Wbjxi+Y2Lt5HiqQ/i3/X9qb5lsHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXlv54edP0fpa+XrOSl5qC8rsqd0t604/OQin+rXxzbdl6bilxnkOXved7f13BDwo/VLn7v2vBs6B41vFXYq3ihsYq3ihvFXDFDeKt4obxV2KG8VdireFD0LyfqP1rSFidqy2p9Miorw6oafLb6M869ptH4Wo4x9OTf49f1/F9h9i+0fH0nhyPqxGv83+H9I+CeZzb2DRxVo4paOBLsCrTilo4q7Alo4q1gS1irRwK0cUtHFLWBWsCWjilrFWsCWsVdgVacUtHArsUtYFW4pdgVo4pawJaxVo4FaOKWsCtHFWsUouxgq3qsNhsvz8cvwws28v7R9ocEfBid5fV7u74/d70dmU8U2MKrsUsm8ial9X1NrN2pHdr8NenqJuPvFfwzY9nZeHJw9Jfe5+llcTHu3H6f0fa9BzfNrsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVS/wAwa3ZaHo91qt4aQWqFyvQs3RUX3ZqAZZhxHJIRHVo1OeOHGZy5B8p67rV7rer3WqXrcri6cuwHRR0VF9lWgGddixCEREcg+c6jPLLMzlzKAyxobxV2Kt4obGKt4obxVwxQ3ireKG8VdihvFXYq3hQnnlDUfqmrJGxpFdfumG9OR+wafPb6c0nb+j8fTGvqh6h8Of2PS+yfaP5bWxs+jJ6T8eX2/Zb0LPMX2xo4q0cUtHAl2BVpxS0cVdgS0cVawJaxVo4FaOKWjilrArWBLRxS1irWBLWKuwKtOKWjgV2KWsCrcUuwK0cUtYEtYq0cCtHFLWBWjirccZkcKO/fDEWaaNXqY4MZyS5D8UmqKFUKNgNhmfEUKfL8+eWWZnLnJdhamxhVdilUgmkgmjmiPGWJg6HwZTUfjkgSDY5hsw5OCYl+K6/Y9csLyK9sobuL7EyBwOtCeoPuDtnU4sgnESHV2U40aV8sYuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvA/zu86fpLVl0CzkrZac1boqdnuehH/ADzG3zrnQ9l6bhjxnmfueM7e13iT8KP0x5+/9jzDNq8+7FDeKuxVvFDYxVvFDeKuGKG8VbxQ3irsUN4q7FW8KFyMVYMpIYGoI6g4Ct09Q0i+F9p0F1+06/GOlHGzfiM8o7V0f5fUSh05j3Hl+p977C7Q/N6SGX+Kql/WGx/X8UWc1ztmjilo4EuwKtOKWjirsCWjirWBLWKtHArRxS0cUtYFawJaOKWsVawJaxV2BVpxS0cCuxS1gVbil2BWjilrAlrFWjgVo4pawK0cVR1nDwTmftN+AzKwwoW8L7QdoeLk8OP0Q+0/s5fNEjL3nW8VbGFV2KWxhVnH5f6lzt59Oc/FEfVhH+QxowHybf6c3HZmXYwPTcfp/Hm7PFLixg9Y7fq/V8GXZtkuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVif5l+ck8r+XJJ4mH6Suqw2CHrzI+KSnhGN/nQd8zNFpvFnX8I5ut7U1v5fESPqOw/X8HzCzu7s7sWdiSzE1JJ3JJOdUA+fE21irsUN4q7FW8UNjFW8UN4q4YobxVvFDeKuxQ3irsVbwobGBWWeRdQ4yz2DnZ/3sXT7Q2YeO4p92cl7V6PixxzDnHY+48vt+97/2D7R4MstPI7T9UfeOfzH+5Zgc4R9SaOKWjgS7Aq04paOKuwJaOKtYEtYq0cCtHFLRxS1gVrAlo4paxVrAlrFXYFWnFLRwK7FLWBVuKXYFaOKWsCWsVaOBWjilrAqrbRepJv8AZXc5PHCy6ntntD8th2+uWw/X8EwGZr5y2MKt4q2MKrsUtjCqP0TUTp2qW92T+7RqTDxjbZvuG+XYMvhzEu77nK0c6nw/ztv1fb9j1cEEVHTOocp2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVbLJHFG8srBI4wWd2NAFAqSSewwgWgkAWXy7+YvnCTzR5kmu1JFhBWGwjO1IlP2iP5nPxH7u2dVo9P4UK69Xz3tPWnUZTL+EbD3ftYuMy3Xt4q7FDeKuxVvFDYxVvFDeKuGKG8VbxQ3irsUN4q7FW8KGxgVE6feSWd7DdJ9qJg1OlR3H0jbKdTgjmxyxy5SFOTotXLT5o5Y84EH9nx5PUY5EljSSMhkcBkYdCCKg55DlxSxzMJc4mn6DwZo5ccZx3jIAj4tnK25o4EuwKtOKWjirsCWjirWBLWKtHArRxS0cUtYFawJaOKWsVawJaxV2BVpxS0cCuxS1gVbil2BWjilrAlrFWjgVo4paAJNB1PTFjKQiCTyCYwxiOML37n3zLxxoPmvamuOpzGX8PIe5Uyx1zYwpbxVsYVXYpbGFW8KvSvJ2pfXNFjRjWa1/cv8lHwH/gafTnQaDLx4wOsdv1O2lLjAn/O+/r+v4p3maxdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiryr88vOv1HTl8uWclLu+Xnesp3S3rsnzkI/wCB+ebbsvTcUuM8hy97zvb2u4IeFHnLn7v2vCM6B45wxVvFXYobxV2Kt4obGKt4obxVwxQ3ireKG8VdihvFXYq3hQ2MCtjChnnk3UDcaabdzWS1biOv2G3Xr9Izz72p0fBmGUcp/eP2V9r637Ddo+LpjhkfViO39U/qN/Ynxzl3uGjgS7Aq04paOKuwJaOKtYEtYq0cCtHFLRxS1gVrAlo4paxVrAlrFXYFWnFLRwK7FLWBVuKXYFaOKWsCWsVaOBWjilEWkW/qH5Ll2KPV5b2j7Q4Y+DHmfq93d8fxzRYzIeLbwq2MKW8VbGFV2KWxhVvCrIPJOpfVNXEDmkV4PTP+uN0P61+nM3QZeDJXSW36vx5udpJWDD4j9P2b/B6LnQNzsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqXeYtdstB0W61W8P7m2TlxrQux2RB7sxAy3DiOSQiOrRqdRHDjM5cg+UNb1i91nVbnU71+dzdOXc9h2CrX9lRQD2zrcWMQiIjkHznPmllmZy5lB5Y0uGKt4q7FDeKuxVvFDYxVvFDeKuGKG8VbxQ3irsUN4q7FW8KGxgVsYUJv5Yv8A6nq8RY0jm/cyf7I7H/gqZqe2tH+Y00oj6h6h7x+sbO+9me0fymthI/RL0y9x/UaL0M55Y+6tHAl2BVpxS0cVdgS0cVawJaxVo4FaOKWjilrArWBLRxS1irWBLWKuwKtOKWjgV2KWsCrcUuwK0cUtYEtYq0cCtohdgo79ThAs04+s1UcGI5JdPt8keqhQAOg6ZmAU+YZ80sszOXOS4YWpvCrYwpbxVsYVXYpbGFW8Kro3dHV0Yq6EMjDqCDUH6Dj7mzFkMJCQ6PWdKv01DToLtaD1UBZR2cbMv0MCM6jBl8SAl3uznEA7cunu6IrLWDsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfP/AOd3nX9KawNBs5K2GmsfrBB2kuaUP0Rg8fnXOh7M03BHjPOX3PGdu67xJ+HH6Y8/f+z9bzLNq6BvFDhireKuxQ3irsVbxQ2MVbxQ3irhihvFW8UN4q7FDeKuxVvChsYFbGFDeKHpWh6h9f0yGcmstOM3SvNdiTTx655X21o/y+plEfSdx7j+rk+7+zfaP5vRwmT64+mXvH6xR+KOOal3zsCrTilo4q7Alo4q1gS1irRwK0cUtHFLWBWsCWjilrFWsCWsVdgVacUtHArsUtYFW4pdgVo4pawJaxVo4FRdvHxXkftN+rMjFGt3g/aDtDxcnhxPoh9p/ZyVsuefbGKt4VbGFLeKtjCq7FLYwq3hVsYqzLyBqW9xpzn/AIvh/BXH6j9+bbszLuYH3j9LssMuLH5x2+B5fp+xmWbdk7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxD8z/Oi+V/LkkkDD9J3lYbBe4Yj4paeEYNfnTMzQ6bxZ7/AEjm6ztXXfl8Vj65bD9fwfMLMzMWYlmY1ZjuST3OdS8CS7ChvFDhireKuxQ3irsVbxQ2MVbxQ3irhihvFW8UN4q7FDeKuxVvChsYFbGFDeKGTeSdQ9O6lsXPwzDnEK7c1G4A91/VnLe1Oj48IyjnDn7j+39L3XsL2j4WolgkfTlG39YfrF/IMyOefPrbsCrTilo4q7Alo4q1gS1irRwK0cUtHFLWBWsCWjilrFWsCWsVdgVacUtHArsUtYFW4pdgVo4pawJaxVfDHzep6DrkoRsuo7Z7Q/L4dvrlsP0n4fejBmU+dN4VbGKt4VbGFLeKtjCq7FLYwq3hVsYqi9LvnsNQgu1r+6cFwO6HZh9Kk5ZiyGEhLucnSzEZ0eUtvx7jResI6OiuhDIwBVh0IO4OdQDYsOYQQaLeFDsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiq2aaKGF5pnEcUSl5JGNFVVFSST2AwgWaCJEAWeT5Z/MPzhL5p8yT3oJFjF+5sIztSJT9qn8zn4j93bOr0mn8KFder592lrDqMpl/CNh7mM5lOvbxVvFDhireKuxQ3irsVbxQ2MVbxQ3irhihvFW8UN4q7FDeKuxVvChsYFbGFDeKFW0uZLa5juIz8cTBl60NOxp2OVZsUckDCXKQpv02olhyRyQ+qJBHweoQTRzwxzRmscqh0PswqM8g1OCWHJKEucTT9C6PVR1GGOWP0zAK/KHJWnFLRxV2BLRxVrAlrFWjgVo4paOKWsCtYEtHFLWKtYEtYq7Aq04paOBXYpawKtxS7ArRxS1gS4Ak0HU4sZzEQSdgEXGgRaffmTCNB807S1x1OYz/h5D3Lxk3Abwq2MVbwq2MKW8VbGFV2KWxhVvCrYxVvCr0PyVqP1rSBbuay2Z9M77+md0Pyp8P0ZvezsvFj4esfu6fq+DtuLjiJ9/P3jn+v4sgzPYuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvJ/z087fU7BfLVlJS5vFD37Kd0g/ZTbvIev+T882/Zem4j4h5Dl73nO3tdwx8KPOXP3fteE5v3kXYobxVvFDhireKuxQ3irsVbxQ2MVbxQ3irhihvFW8UN4q7FDeKuxVvChsYFbGFDeKHDArNvJd+JbF7Nj8duap0+w5r9NGrnB+1ej4ckcw5S2PvH7PufVfYLtHjwy055wPEP6p5/I/7pkWci+gLTilo4q7Alo4q1gS1irRwK0cUtHFLWBWsCWjilrFWsCWsVdgVacUtHArsUtYFW4pdgVo4pawJVoE/bP0ZZjj1eU9o+0OEeDHmd5e7oFfMh41sYpbwq2MVbwq2MKW8VbGFV2KWxhVvCrYxVvCqd+UdS+pazGrGkN1+5k8KsfgP/BbfTmXosvBkHcdv1fb97naSV3D4j3j9l/IPSM6FudirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqWeZdfsvL+iXWrXh/dWyVVK0LudkRfdm2y3DiOSYiOrRqtRHDjM5dHyfrGrXur6pc6nevzurqQySHtv0A9lGw9s67HjEIiI5B86zZpZJmcuZQmTanYobxVvFDhireKuxQ3irsVbxQ2MVbxQ3irhihvFW8UN4q7FDeKuxVvChsYFbGFDeKHDAqZ+X7/wCo6pDKTxic+nMTQDi3cn2NDmu7W0f5jTyh/FzHvH4p3PYHaP5PWQyH6bqX9U8/lz+D0XPJ33xacCWjirsCWjirWBLWKtHArRxS0cUtYFawJaOKWsVawJaxV2BVpxS0cCuxS1gVbil2BWjilyqWan34gWXG1mqjgxHJLp9pRQAAoOgzJAp8wzZpZJmcvqK7JNbYxS3hVsYq3hVsYUt4q2MKrsUtjCreFWxireFWxXsaHsR1xbMczGQkOYeqaHqI1DS7e6JHqMtJQNqSL8LbfMbe2dLpsviYxLr+l2cwLscjuEdl7B2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV89/nb52/S+tDQ7OSun6WxExB2kuejH/AJ5/ZHvXOi7M03BHjPOX3PGdua7xMnhx+mH3/seaDNo6FvFXYobxVvFDhireKuxQ3irsVbxQ2MVbxQ3irhihvFW8UN4q7FDeKuxVvChsYFbGFDeKHDArYxV6L5ev/rulQyMSZYx6UpNSeS9yT1qKHPMO39H4GplX0z9Q+PP7X3H2U7R/NaKNn14/Qfhy+Yr42mBzSPStHFXYEtHFWsCWsVaOBWjilo4pawK1gS0cUtYq1gS1irsCrTilo4FdilrAq3FLsCtHFKvEnEVPU5djjTwXb/aHjZeCP0Q+09f1KmWOgbwq2MUt4VbGKt4VbGFLeKtjCq7FLYwq3hVsYq3hVsYUss8hajwuJ9Pc/DMPVhH+Woow+lafdmy7Ny1Iw79/x+OjsMEuLHXWP3H9R+9m2blm7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWG/mp50Hljy25t3pql9ygsR3U0+OX/YA7e5GZuh03iz3+kc3Wdq63wMW31y2H6/g+YSzMxZiSxNSTuSTnUPBFsYUN4q7FDeKt4ocMVbxV2KG8VdireKGxireKG8VcMUN4q3ihvFXYobxV2Kt4UNjArYwobxQ4YFbGKsi8mXxiv3tGPwXC1X/AF03/wCI1/DOb9p9H4un4x9WPf4Hn+t7P2I7R8HV+ET6cor/ADhy/SPkzM55y+xtHFXYEtHFWsCWsVaOBWjilo4pawK1gS0cUtYq1gS1irsCrTilo4FdilrAq3FLsCro1qanoMlGNl0/bXaH5fDUfrlsP0lXGXvnjeFW8KtjFLeFWxireFWxhS3irYwquxS2MKt4VbGKt4VbGFKIsruSzvIbuPd4HDgeIHVf9kKjJQmYyEhzDfpsgjMXyOx937Ob1eGaOeGOaI8o5VDo3irCoOdPGQkARyLmyiQaPRfkkOxV2KuxV2KuxV2KuxV2KuxV2KuxVZPPDbwSTzuI4YlLyyMaBVUVYk+AGEAk0ESkALPIPlb8wfN83mnzJPf1Is4/3NhEduMKnYkfzP8AaOdXpNOMUAOvV8+7R1h1GUy/h6e5jYzKcFsYobxV2KG8VbxQ4Yq3irsUN4q7FW8UNjFW8UN4q4YobxVvFDeKuxQ3irsVbwobGBWxhQ3ihwwK2MVVIJXhmjmjNHjYOp67qajIzgJRMTyOzPFlljmJx2lE2PeHplrcx3VtFcR/YlUMBttXsadxnkOt0xwZpYz/AAn+z7H6G7O1sdVp4Zo8pxv49R8DsqHMVzXYEtHFWsCWsVaOBWjilo4pawK1gS0cUtYq1gS1irsCrTilo4FdilrAq3FLqVNMDGcxGJkdgFZRQUy+IoPmnaOtOpymZ5dPcvGScFvCreFWxilvCrYxVvCrYwpbxVsYVXYpbGFW8KtjFW8KtjClvFWe+RtR9fTXs3NZLRvh/wCMb1K/caj5UzddnZbgY/zfuLtBLjgJfA/D9lfG2SZsUOxV2KuxV2KuxV2KuxV2KuxV2KuxV5F+e3nf6rZr5Ysn/f3SiTUWU7rDWqR/NyKn2+ebjsvTWfEPTk8529ruGPhR5nn7u74vC83zyTYxVsYobxV2KG8VbxQ4Yq3irsUN4q7FW8UNjFW8UN4q4YobxVvFDeKuxQ3irsVbwobGBWxhQ3ihwwK2MVbxQzDyZf8AO2ksnPxQnnGO/FuoHyb9ecR7WaOjHMOvpP6P0vqHsB2jcZ6aXT1R938X20fiyM5xj6O7Alo4q1gS1irRwK0cUtHFLWBWsCWjilrFWsCWsVdgVacUtHArsUtYFW4pVI1/a+7JwHV5T2j7QoeBHrvL9A/Svy145cMUt4Vbwq2MUt4VbGKt4VbGFLeKtjCq7FLYwq3hVsYq3hVsYUt4qm3ljUPqOsQSMaRSn0Zf9VyKH6GoflmTpcvBkB6Hb5/tczRy3MP533j8EfF6XnRN7sVdirsVdirsVdirsVdirsVdiqVeaPMNl5e0K61a7PwW6VSOtDJIdkQe7N/XLcGE5JiI6uPqtRHDjM5dHydq+q3uranc6lev6l1dSGSVvc9h4ADYDwzrseMQiIjkHzzNllkmZS5lCZNqbGKtjFDeKuxQ3ireKHDFW8VdihvFXYq3ihsYq3ihvFXDFDeKt4obxV2KG8VdireFDYwK2MKG8UOGBWxireKEfot99S1GGcmkYPGXr9htjsOtOuYXaOkGowSx9429/T7Xa9i686TVQy9Inf8AqnY/Y9EzyOUSDR5v0DGQkLHIuyLJo4q1gS1irRwK0cUtHFLWBWsCWjilrFWsCWsVdgVacUtHArsUtYFaUVNMQLcXW6uOnxGZ6faVUZeA+ZZssskjKXMt4WtcMUt4Vbwq2MUt4VbGKt4VbGFLeKtjCq7FLYwq3hVsYq3hVsYUt4q3QEEHoeuGkxkYkEcw9O8ual+kNIgmZuUyD05/HmmxJ/1hRvpzodJl48YJ58j+PtdrOj6hylv+PcdkyzJYOxV2KuxV2KuxV2KuxV2KuxV87/nZ52/TOtjRrOTlpulsVkKnaS56O3yT7I+nxzo+zdNwQ4j9UvueM7b13i5OCP0w+/8AY81zZuibxVsYq2MUN4q7FDeKt4ocMVbxV2KG8VdireKGxireKG8VcMUN4q3ihvFXYobxV2Kt4UNjArYwobxQ4YFbGKt4oXrgLKLPfLl79a0uPkayQ/un/wBiPhP/AANM819o9H4OpMh9OTf49f1/F9r9j+0fzGjESfXi9Pw/h+zb4JnnPvVtHFWsCWsVaOBWjilo4pawK1gS0cUtYq1gS1irsCrTilo4FdilrAq9RQe+WRDwXb3aHjZeCP0Q+09f1NjJuhbwquGKW8Kt4VbGKW8KtjFW8KtjClvFWxhVdilsYVbwq2MVbwq2MKW8VbGFWT+RtR9G/ksXPwXQ5Rj/AIsQV2/1k/Vmw7Oy8M+H+d94/Z9zsNNLigR/N3+B5/bXzLOc3TN2KuxV2KuxV2KuxV2KuxVhX5sedR5Z8tuLZ+Oq6hyhsqdUFP3kv+wB2/yiMztBpvFnv9I5ur7W1vgYtvrlsP1vmOpO53J6nOoeEaxQ3irYxVsYobxV2KG8VbxQ4Yq3irsUN4q7FW8UNjFW8UN4q4YobxVvFDeKuxQ3irsVbwobGBWxhQ3ihwwK2MVbxQvXAWUU+8q3ogv/AEWNEuAF7AcxuvX6R9Oc/wC0ej8bTGQ+qHq+HX7N/g9j7Hdofl9YIk+nL6fj/D9u3xZlnmr7K0cVawJaxVo4FaOKWjilrArWBLRxS1irWBLWKuwKtOKWjgV2KXKN64Yi3Tdt9ofl8VR+uew/SV4y189cMVbwquGKW8Kt4VbGKW8KtjFW8KtjClvFWxhVdilsYVbwq2MVbwq2MKW8VbGFVW3nlt547iI0lhYOnYVU1ofY98IkYmxzDdp8nBME8uvu6vVrS5iurWK5iNY5kDrXrRhXf3zpscxOIkORc+ceEkKuTYuxV2KuxV2KuxV2KqdxcQW1vLcXDiKCFWklkY0VVUVYk+wwgEmgxlIRFnkHyp5/83T+afMlxqJqtqv7qxiP7EKk8ajxb7R9znWaTTjFAR69Xz/tDVnPlMunT3MczJcJ2KG8VbGKtjFDeKuxQ3ireKHDFW8VdihvFXYq3ihsYq3ihvFXDFDeKt4obxV2KG8VdireFDYwK2MKG8UOGBWxireKF64CyirRO8bK6Eq6kMrDqCNwchIAii5GORiQRzD0e1aWewt7wxMkdwgZWIPEnoQCQK0IIzybtHRnT5pQ6A7e7o++dk68arTwy9ZR39/X7VxzBdk1gS1irRwK0cUtHFLWBWsCWjilrFWsCWsVdgVacUtHArsWM5iETKWwC4ZYBT5p2hrDqMpmeXTyDYyThOGKt4VXDFLeFW8KtjFLeFWxireFWxhS3irYwquxS2MKt4VbGKt4VbGFLeKtjCreKs38iah6lpNYOfit25xf6khqR9DV+8Zt+zctgw7v0/t+92cJccAeo2P6Ps2+DKM2auxV2KuxV2KuxV2KvH/z487m3t08rWUlJrgCXUmU7rH1SLb+f7Te1PHNx2XprPiH4PN9va2h4UeZ5/qeGZvnlG8VdihvFWxirYxQ3irsUN4q3ihwxVvFXYobxV2Kt4obGKt4obxVwxQ3ireKG8VdihvFXYq3hQ2MCtjChvFDhgVsYq3iheuAsop/5N8tT+Ytdt9OjqsJ+O6lH7EK/aPzPQe5zG1WcYoGTs+ztIdRkEBy6+59KW9na21pHaQxqltCgjjiA+EIooBTOUmeIkne30bHEQAEdgEBeeV9Bu6mS0RGP7cX7s/8LQH6cw8mhxT5x+WznY9fmhyl890jvPy5tmqbO7eM9klAcfevH9WYWTsiP8Mvm5+PtqX8Ufkkd55H1+3qUiW4Ud4mBP8AwLcTmDk7NzR6X7nYY+1cMuZ4feklzaXVs3C4heFvCRSp/HMGeOUeYpzoZIy3iQVE5BsaOKWsCtYEtHFLWKtYEtYq7Aq04paOBXDJRDyntH2hQ8CJ85foH6fk2Mm8euGFLhireFVwxS3hVvCrYxS3hVsYq3hVsYUt4q2MKrsUtjCreFWxireFWxhS3irYwq3iqYaFqH6P1WC5Y0irwnPb032JP+rs30Zdgy+HMS6dfd+N3M0cvVw/zvv6fq+L0/Okb3Yq7FXYq7FXYqlPmvzHZ+XNButWut1gX91HWhklbZEHzP3DfLsGE5JiIcfV6mOHGZno+TNU1O81TUrjUb1/UurqRpZX92NaDwA6AeGdbCAjERHIPnmXLLJIylzKFybW3irsUN4q2MVbGKG8VdihvFW8UOGKt4q7FDeKuxVvFDYxVvFDeKuGKG8VbxQ3irsUN4q7FW8KGxgVsYUN4ocMCtjFW8UL1wFlF9D/AJXeUf0BoKzXKcdSvwstxXqiU+CP6Aan3Ocxr9T4k6H0h9D7F0HgYrl9ctz+gMyzBdw7FXYq7FVskccilJFDoeqsAQfoOAgHYpBI3CUXnlDy/dVLWqxOf2oSY/wHw/hmJk7Pwy/hr3Obj7RzQ/iv37pHe/ltGamyvCvgky1/4Zaf8RzAydjj+GXzdhi7bP8AHH5JDe+SfMNtUiAXCD9qFg3/AApo34Zg5Ozc0el+52GLtTBPrXvSWe3uIH4TxPE/8rqVP3HMGUDE0RTnRnGQsG1I5FsaxVrAlrFXYFWnFLsXE12rjp8Rmfh5lrLA+Z5MkpyMpGyWxi1rhhS4Yq3hVcMUt4Vbwq2MUt4VbGKt4VbGFLeKtjCq7FLYwq3hVsYq3hVsYUt4q2MKt4q31wpBp6P5W1E32jxFzWaD9zL41QChPzUg5vtFl48YvmNvx8HazPFUh/Fv+v7U3zLYOxV2KuxV2KvnP86vO/6c139E2cnLTNLYqSOklx0d/cL9lfp8c6Ps3TcEOI/VL7ni+2td4uTgj9MfvecZsnSuwobxV2KG8VbGKtjFDeKuxQ3ireKHDFW8VdihvFXYq3ihsYq3ihvFXDFDeKt4obxV2KG8VdireFDYwK2MKG8UOGBWxireKGfflH5POta2NRukrpunEOajaSbqifR9pvo8c1vaWp8OHCPql9zv+wOz/Gy8cvoh9p6D9L37Obe+dirsVdirsVdirsVdirsVWTQQzoY5o1lQ9UcBh9xyMoiQoi2UZmJsGkmvfJXl26qfq3oOf2oSU/4XdfwzDydm4ZdK9znYu1M8Ot+/8WkN5+WjbmyvQfBJlp/wy/8ANOYGTsb+bL5uwxdufz4/L8fpSC98meYrWpNqZkH7UJElf9iPi/DMDJ2dmj/Dfu3dji7TwT/ir37fsSaWKWJykqNG46qwKkfQcwpRI2LnxkCLG6zIpWnFLR8MkA8B272h4+Xgj9EPtPUuyTo2xiq4YUuGKt4VXDFLeFW8KtjFLeFWxireFWxhS3irYwquxS2MKt4VbGKt4VbGFLeKtjCreKrhhSyDyXqH1fVDbOaRXa8R/wAZEqV+VRyH3Zm6DLw5K6S+/wDFudpZXAx7tx+n9HyLPc3jY7FXYq7FWD/m352/w15baO1k46tqPKG0ofiRafvJf9iDQe5GZ2g03iz3+kOq7W1vgYqH1y5frfMedO8M3irsKG8VdihvFWxirYxQ3irsUN4q3ihwxVvFXYobxV2Kt4obGKt4obxVwxQ3ireKG8VdihvFXYq3hQ2MCtjChvFDhgVsYqidOsLrUL6CxtE9S5uXEcSDuzGn3ZGcxEEnkGeLFLJMRjzL6f8AK/l618v6HbaXb7+ktZpaUMkrbu5+Z6e22cjqMxyzMi+naLSR0+IYx0+0prlLluxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqVxaWtynC4hSZP5ZFDD7jkJ44yFSFs4ZJRNxJCSXvkTy7dVKwtbOf2oWI/wCFbkv4ZhZOy8Mule5z8Xa2eHXi97CfNnli20MRGO89Z5ieEDJRgo6sSD/DNLrdDHDVSu+jLWdvy8IxAqcutscGYLyTeFWxiq4YUuGKt4VXDFLeFW8KtjFLeFWxireFWxhS3irYwquxS2MKt4VbGKt4VbGFLeKtjCreKrhhSujkkjdJIzxkjYPG3gymqn7xhsjcc23Dk4JCX4rr9j1PT7yO9soLqPZZkDcfA91PuDtnSYsgnESHVz5xo0iMsYuxV2KvlT8ydc1fW/M9xfahbTWkX91Y286MhSBD8OzDq1eR9znUaAYxjAgRLvo3u8F2nlyZMplOJj3AitmLDM11zeKuwobxV2KG8VbGKtjFDeKuxQ3ireKHDFW8VdihvFXYq3ihsYq3ihvFXDFDeKt4obxV2KG8VdireFDYwK2MKG8UOGBWxir2X8k/J/pQv5lvE/eShotOVuydJJf9l9ke1fHNH2rqbPhj4vYeznZ9Dx5ddo/pP6HrGaV6x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVTuLiG3gknmYJFEpd2PYKKnIykIgk8ggmhbxrXtYm1fVJrySoVjxhT+WMfZH9ffOR1Oc5ZmRdVknxG0vGY7BvCrYxVcMKXDFW8KrhilvCreFWxilvCrYxVvCrYwpbxVsYVXYpbGFW8KtjFW8KtjClvFWxhVvFVwwpbwqzDyJqFY59Pc7p++hH+STRx9DUP05tOzcvOHxH6fx5uyxy4sYPWO36v0j4MszaK7FXYqxvVLKH15YJY1khf4hG4DKVbtSlNjUZz+sgcWW47Xu7DCROFHdimp/lt5Nv6s+npbyHo9sTDT/Yr8H/AAuZGDtzVY+U+If0t/2/a4GfsHSZP4OE/wBHb7Bt9jE9T/JCE1bS9SZfCK5QNX/Zpx/4hm5we1h/ykP9L+o/rdLqPZIf5Of+mH6R+pimp/ld5xsAzC0F5GvV7Vg/3IeMh/4HN1p/aDSZNuLhP9Lb7eX2uk1Hs9q8W/DxD+jv9nP7GM3VneWkphu4JLeUdY5UZGH0MAc2+PLGYuJEh5bunyYpQNSBifPZRyxrbxVsYq2MUN4q7FDeKt4ocMVbxV2KG8VdireKGxireKG8VcMUN4q3ihvFXYobxV2Kt4UNjArYwobxQ4YFT/yT5Xn8ya/Bp6VW3H7y7lH7EK/aPzP2R7nMfVagYoGXXo53Z2iOpzCA5dfc+m7a2gtbeK2t0EUEKiOKNdgqqKAD5DOSlIk2eb6ZCAiBEbAKmBk7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwL8x/MH2dGt28HvCPvRP8AjY/Rmj7W1X+THx/U4WqyfwhgWaNwmxilvCrYxVcMKXDFW8KrhilvCreFWxilvCrYxVvCrYwpbxVsYVXYpbGFW8KtjFW8KtjClvFWxhVvFVwwpbwqjNKvzYahBd/sxt+9G+8bbP09jUe+WYsnBIS7vu6uVpJVPh6S2/V9v2PUAQRUbg9DnSOQ7FXYql+swc4FlHWI79fstt296Zgdo4uLHfWLkaadSrvSfNA7Fo4FawJUrm1trmJobmJJ4W+1HIodT8w1RkoZJQNxJB8mGTHGY4ZAEdx3YzqX5ZeTr7k31L6rI3+7LZjHT5JvH/wubbB7QavH/FxD+lv9vP7XUaj2e0mX+HhP9Hb7OX2MV1L8k2+JtM1IH+WK5Sn3yJ/zRm60/taP8pD4xP6D+t0mo9kDzxT+Eh+kfqYrqX5becLCpNibmMf7stiJa/JR8f8AwubvT9v6TL/Hwn+lt9vL7XR6j2f1eL+DiH9Hf7Of2Mdnt7i3kMVxE8Mo6pIpVh9BzbwnGQuJBHk6ieOUDUgQfNZkmDsUN4q3ihwxVvFXYobxV2Kt4obGKt4obxVwxQ3ireKG8VdihvFXYq3hQ2MCtjChvFDYwK+i/wArvJ/+HvL6yXKcdTv6S3VR8SLT4Iv9iDv7k5y/aGp8We30h9D7F7P/AC+G5fXLc/oDMswXcuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kpfr+sQ6Rpc15JQso4wp/NIfsj+vtmPqc4xQMi15J8MbeMXFxNcTyTzMXllYu7HuWNTnISkZEk8y6omzazAhsYpbwq2MVXDClwxVvCq4Ypbwq3hVsYpbwq2MVbwq2MKW8VbGFV2KWxhVvCrYxVvCrYwpbxVsYVbxVcMKW8KtjFXoHlDUPrWkJExrLaH0W/wBUfYP/AAO3zGbvQZeLHXWO36naylxAT/nff1/X8U7zNYOxVqRFkRkYVVgVYex2wEWKKsakjeKRo3+0hIO1K07/AE5y2bHwTMe522OXEAVhypm1gS7FWsirWKXYFQ93Y2V5H6V3bx3MX++5UV1+5gRlmLNPGbgTE+Rpry4YZBU4iQ8xbGdS/K/yheglLZrOQ7l7Zyv/AArc0+5c3Gn9o9Xj5y4x/SH6RR+102o9m9Jl5RMD/RP6DY+xi2o/kvcrybTdRST+WK4Qof8Ag05V/wCBzd6f2uif7yBH9U39hr73R6j2PkN8UwfKQr7Rf3MX1H8v/N1hUyae8yD9u3pMD70SrfeM3en7d0mXlMA/0tvv2dFqOwdZi5wJH9H1fdv9iQSRSROY5EKSLsyMCCD7g5tYyEhY3DqZRMTRFFaMkxbxV2KG8VdireKGxireKG8VcMUN4q3ihvFXYobxV2Kt4UNjArYwobxQ9B/KDyd+mda/Sl2ldO01gwB6ST9UX3C/aP0eOaztLU8EOEfVL7nf9gdn+Nl8SX0Q+0/jd77nNveuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV5R558wfpTVDBC1bO0JSOnRn/af+A/tzl+0tV4k6H0xdZqMvEaHIMbzXNDeFWxilvCrYxVcMKXDFW8KrhilvCreFWxilvCrYxVvCrYwpbxVsYVXYpbGFW8KtjFW8KtjClvFWxhVvFVwwpbwq2MVTvyjqH1TV1jY0iux6TeHPrGfvqv8Assy9Fl4Mg7pbfq/V8XO0srBh8R+n7N/g9AzetjsVdiqUazBxlScCgk+Fug+IdPnUfqzT9p4uU/g5mlnzCWnNQ5rWBLsVayKtYpdgVrAl2KtYFccCULe6bp18nC9tYrlOwlRXp8uQOW4dTkxG4SMfcaac2nx5RU4iQ8xbGdS/K3ynd1aKGSyc94HNK/6r8x91M3Wn9p9Xj5kTH9Ifqp0mo9mNJk5AwP8ARP6DbF9S/Ju/Sradfxzj+SdTGflyXmD+GbzT+1+M/wB5Ax92/wCr9LotT7HZB/dTEv6233X+hi+o+R/NWngmfTpGQf7shpKtPH92Wp9ObzT9t6TL9OQX57fe6LUdh6vF9WMkeXq+5JGVlYqwKsDQg7EHNoDe4dURWxawobxQ2MVbxQ3irhihvFW8UN4q7FDeKuxVvChsYFbGFCK03TrvUtQt7C0T1Lm5cRxL7sep8AOpOQyTEImR5Bsw4pZJiEeZfUPljy/aaBoltpdtusK/vJO7yNu7n5n8Ns5HPmOSZkX03R6WODEMcen2lNMpcp2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVjPnvzB+jNM+rQNS8vAVQjqqdGb+A/szW9parw4UPqk4+oy8Iocy8pGcw61vFW8KtjFLeFWxiq4YUuGKt4VXDFLeFW8KtjFLeFWxireFWxhS3irYwquxS2MKt4VbGKt4VbGFLeKtjCreKrhhS3hVsYq2CwIKsVYbqw6gjcEfLFsxZDCQkOj0/Sb9b/ToLsbGRfjUdA4+Fx9DA50eDL4kBJ2M4gHbl09x5IvLWDsVUb2D17Z4x9qlU7fENxvlWfFxwMWcJcJBY5Wu+csRWztgbayKXYq1kVaxS7ArWBLsVawK44EtYFccCtYpaOBUHfaRpd+vG9tIbkdjKisR8iRUZfg1eXD/AHcpR9xcfPpMWb+8jGXvFsZ1D8q/K9zU26y2Tncek/Ja/wCrJz/AjN5p/arVw+rhmPMfqp0eo9lNJk+nigfI/rtjOoflBqsdWsLyK4XssoMTfLbmv4jN5p/bDDLbJCUfduP0F0Oo9js0f7ucZe/b9f6GM6h5P8zaeT9Z0+XgOskY9VKePKPkB9Ob7TdsaXN9GSN9x2PyNOh1PYurw/Vjl8Nx9lpQQQaHYjqM2Tq3Yq4YobxVvFDeKuxQ3irsVbwobGBWxhQ9o/JPycYLdvMt4lJZwY9PVhusfR5P9l0HtXxzQ9q6mz4Y6c3sfZzs/hHjS5n6fd3/AB/HN6vmmeqdirsVdirsVdirsVdirsVdirsVdirsVdirsVU7m5htreS4nYJDEpd2PYAVORnMRBJ5BBNCy8W17WJtX1Oa9l2DGkSfyxj7K/1984/U5zlmZF1OSfFK0AMoYN4q3hVsYpbwq2MVXDClwxVvCq4Ypbwq3hVsYpbwq2MVbwq2MKW8VbGFV2KWxhVvCrYxVvCrYwpbxVsYVbxVcMKW8KtjFW8KWV+RdQpJPp7nZv38PzFFcf8AET9+bHs7LRMPj+v9H2uwwy4sfnHb4H9t/Yy/Nsl2KuxVINTgMN29PsyfGvXv1FfnnPdoYuDJfSTsdNO413ITMByXYq1kVaxS7ArWBLsVawK44EtYFccCtYpaOBWsCuwJaxVrAlA6hoej6gP9NsoZ27O6AsPk32h9+ZWn1+fD/dzlH47fLk4mo0GDN/eQjL3jf5sZv/yr8uXFTatNZt2CNzT6Q/Jv+Gze6f2t1UPrEZj3Ufs2+x0Oo9kdJP6OKHuNj7bP2sbv/wAptZhqbO6hul8GrE5+g8l/4bN7p/bDTy/vIyh/sh+g/Y6HUexuoj/dyjP/AGJ/SPtY1f8AlfzDYVN1p8yKOrqvNB/s05L+Ob7T9raXN9GSJ8ro/I7ug1HZGqw/XjkPhY+YsJZmwda3irsUN4q7FW8KGxgVkPkbytN5l8wwWAqtsv728lH7MKkcqe7fZHucxtXqBigZdejndm6I6nMIfw8z7n05bwQ28EdvAgjhiUJFGuwVVFAB8hnJkkmy+lRiIgAcgvwMnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXn/5keYeTLo1u2wo94R49UT/jY/Rmh7W1X+THx/U4Oqy/whgWaNwmxhS3ireFWxilvCrYxVcMKXDFW8KrhilvCreFWxilvCrYxVvCrYwpbxVsYVXYpbGFW8KtjFW8KtjClvFWxhVvFVwwpbwq2MVbwpRFhePZXsF2m5gcMQOpXo4+lSRkoTMJCQ6fj7nI0s+GdHlLY/jyNF6f68PofWOY9Dj6nqV+HhSvKvhTOj4hV9HL4DddV+SYuxVA6xb+pbeoB8URr/sTs39fozC1+Ljx31G7fp58Mvekec47N2KtZFWsUuwK1gS7FWsCuOBLWBXHArWKWjgVrArsCWsVawJdgVrAlo4q7AlLr/y/omoVN5YwzOeshUB/+DFG/HM3T9p6jB/dzkB3Xt8uTg6ns3T5/wC8hGR763+fNjeoflXoM9WtJZrRuy19RPub4v8Ahs32m9sNTD+8EZ/Yfs2+x0Gp9jtLP6DKH2j7d/tY3qH5Wa7AC1pLFdqOi19Nz9DfD/w2b7Te2GmntkEofaPs3+x0Gp9jdTDfHKM/9ift2+1jt/5e1uwqbuxmiVRUyFSU/wCDWq/jm/03aWnz/wB3OMj3Xv8ALm8/qey9Tg/vMcgO+tvmNkuzNcBvChtQSaDcnoMCvpD8sPJ48ueXlNwnHU77jNeV6rt8EX+wB39yc5fX6nxZ7fSOT6H2NoPy+Hf65bn9A+H3swzBdu7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlvmHWotH0qW8ehcfDBGf2pG+yP4n2zH1WoGKBkfh72vLk4Y28XmnluJ5J5mLyysXkc9SzGpOcfKRkbPMupJs2syKGxhS3ireFWxilvCrYxVcMKXDFW8KrhilvCreFWxilvCrYxVvCrYwpbxVsYVXYpbGFW8KtjFW8KtjClvFWxhVvFVwwpbwq2MVbwpbUEmgFSegxVn36Lvf8Kfo/mfrPo8abdK19PpSnH4M3XgS8Dg61+B+h2XiS+r+Kvtrn7+vvTvM1DsVaZVZSrCqkUIPQg4qxqeIwzPE25Q0rtuOoO3iN85XUYvDmYu2xT4ogqeUtjWRVrFLsCtYEuxVrArjgS1gVxwK1ilo4FawK7AlrFWsCXYFawJaOKuwJawK7ArWBXYEpXf+WtAv6/WrGF2OxkC8H/4NaN+ObHTdr6rD9GSQ8rsfI2HXansnS5/rxxJ76o/Mbscv/ys0eWps7iW2Y9FakiD6Dxb/hs3+n9s9RH+8jGf+xP6R9joNT7Gaee+OUof7Ifr+1f5L/LmLTfMsN9q9xHNZWv72BVDVaYH4Oa02C/a6nfNpk9rsGXHw1KEj38vs/U4Gk9kcuHMJyMZwjuO+/d+17PDd20/91Kr+wIr92UYtTjyfTIF388co8wq5cwdirsVdirsVdirsVdirsVdirsVdirsVdirsVeSeefMP6V1UxQNWytKpFTozftP9PQe2cr2jqvFnQ+mLrNRl4pbcgxwZr3HbxVsYUt4q3hVsYpbwq2MVXDClwxVvCq4Ypbwq3hVsYpbwq2MVbwq2MKW8VbGFV2KWxhVvCrYxVvCrYwpbxVsYVbxVcMKW8KtjFW8KWR+T9I+s3RvZVrDbn4AejSdv+B65n6HBxS4jyDdhhZtm+bhy3Yq7FXYqlOtwUaOcd/gb9Y/jmp7Uw2BMe5zNJPekrzSuc1kVaxS7ArWBLsVawK44EtYFccCtYpaOBWsCuwJaxVrAl2BWsCWjirsCWsCuwK1gV2BLRwK1gVrAl2KomDVL+D+7nan8rfEPuNcy8XaGfH9Mj9/3tU9PCXMI+HzPcLQTRK48Vqp/jmxxdv5B9cQfdt+txZ9nxPI0mEHmLTpNnLRH/KFR94rmzxdt4Jc7j7/ANjjT0OQct0fDc28wrFIsn+qQc2WLPDJ9Mgfc40sco8xSplrB2KuxV2KuxV2KuxV2KuxV2KsW8/eYf0bpn1SBqXl4Cop1SPozfT0H9maztPVeHDhH1S+5xtTl4RQ5l5TnMOtbGKt4q2MKW8Vbwq2MUt4VbGKrhhS4Yq3hVcMUt4Vbwq2MUt4VbGKt4VbGFLeKtjCq7FLYwq3hVsYq3hVsYUt4q2MKt4quGFLeFWxiqvZ2k13dR20IrJIaD28Sflk8cDIgBlEWaem2FlDZWkdtEPgjFK9ye5PzOdFjxiEQA58Y0KV8ml2KuxV2KqV1AJ7d4j1YfCT0BG4O3vleXGJxMT1ZQlRtjRBBoQQR1B2IzlJRINF24Ni2sglrFLsCtYEuxVrArjgS1gVxwK1ilo4FawK7AlrFWsCXYFawJaOKuwJawK7ArWBXYEtHArWBWsCXYq1gS0cCtYEtgkGoNCOhwA0qKg1jUoaBZ2IHZ/iH41zNxdp6jHykfjv97RPS45cwmEHmmYbTwq3+UhK/ga5s8XtDIfXEH3bfrcWfZw/hKYQeYtNl2Z2iPg4/iKjNnh7b08+ZMff+xxp6HIPNMIp4JhWKRZB4qQf1Zs8eaExcSD7nFlAx5il+WMXYq7FXYq7FVK7uoLS2luZ2CQwqXkY9gBXIzmIxMjyCJEAWXimuavPq2pzXstRzNI0/kQfZX/PvnG6nOcszIuoyTMpWgMpYNjFW8VbGFLeKt4VbGKW8KtjFVwwpcMVbwquGKW8Kt4VbGKW8KtjFW8KtjClvFWxhVdilsYVbwq2MVbwq2MKW8VbGFW8VXDClvCrYxVm3k3SPRtzqEq/vZhSEHsnj/sv1Zt9BgocR5ly8MKFslzYt7sVdirsVdirsVSHVbf0rssBRJfjHhX9r8d/pzQdpYeGfF0k7HSzuNdyCzWOS1il2BWsCXYq1gVxwJawK44FaxS0cCtYFdgS1irWBLsCtYEtHFXYEtYFdgVrArsCWjgVrArWBLsVawJaOBWsCXYFawJdgVrIpcrMrBlJVh0I2OESINhBFo2DW9Th6TFx4P8AF+J3zPxdrajHylfv3ceekxy6JjB5rcbTwA+LIafga/rzaYfaM/xw+X6v2uLPs0fwlMIPMGly0rIYmPaQU/EVH45tMPbemn/Fwnz/ABTiz0WSPS0wjlilXlG6uvipBH4Zs4ZIzFxII8nGlEjmKXZNi87/ADK8w85F0a3b4Uo92R3bqqfR1P0ZoO1tVZ8MfH9TgavL/CGBjNG4TeFLYxVvFWxhS3ireFWxilvCrYxVcMKXDFW8KrhilvCreFWxilvCrYxVvCrYwpbxVsYVXYpbGFW8KtjFW8KtjClvFWxhVvFVwwpbwqmegaU2pX6REH0E+Odv8kdvmemZGmw+JKunVsxw4i9IVVVQqgBVFAB0AGdAA5zeKuxV2KuxV2KuxVBatB6lozj7UXxj5D7X4b5h67Dx4z3jduwT4ZJDnMu0axS7ArWBLsVawK44EtYFccCtYpaOBWsCuwJaxVrAl2BWsCWjirsCWsCuwK1gV2BLRwK1gVrAl2KtYEtHArWBLsCtYEuwK1kUtYq7Iq1gS7ArkkkjbkjFG8VJB/DJRnKJuJooMQeaOg1/VYRQTcx4SDl+PX8c2OHtnU4/4uIee/7XGnosculPOLw3Bu5jcMXnLsZWPUsTufpyzj4/V3vEZoGMzGXMFSGLW3hS2MVbxVsYUt4q3hVsYpbwq2MVXDClwxVvCq4Ypbwq3hVsYpbwq2MVbwq2MKW8VbGFV2KWxhVvCrYxVvCrYwpbxVsYVbxVcMKW1BJAAqTsAMIV6T5d0kabp6ow/wBIk+Oc+56L/sc3+lw+HCurnY4cITPMlsdirsVdirsVdirsVdirGbqAwXDxdlPw9fsncbn2zltXh8PIR0dthnxRBUcxm12BWsCXYq1gVxwJawK44FaxS0cCtYFdgS1irWBLsCtYEtHFXYEtYFdgVrArsCWjgVrArWBLsVawJaOBWsCXYFawJdgVrIpaxV2RVrAl2BVuBXYEsb8x2nC5W4UfDKKN/rL/AGZn6Wdiu55XtzT8OQTHKX3hJxmU6NvClsYq3irYwpbxVvCrYxS3hVsYquGFLhireFVwxS3hVvCrYxS3hVsYq3hVsYUt4q2MKrsUtjCreFWxireFWxhS3irYwq3iq4YUsl8m6P8AWLo30y1htz+7B/ak/wCbc2GgwcUuI8g34IWbZxm5ct2KuxV2KuxV2KuxV2KuxVK9bt6qlwo3HwP8uoP0H9eartTDcRPucvSTo13pPmidg7ArWBLsVawK44EtYFccCtYpaOBWsCuwJaxVrAl2BWsCWjirsCWsCuwK1gV2BLRwK1gVrAl2KtYEtHArWBLsCtYEuwK1kUtYq7Iq1gS7Aq3ArsCUHqtr9ZsZIwKuByT/AFl/r0yzDPhkC4XaGn8XCY9eY94YeM2rwzeFLYxVvFWxhS3ireFWxilvCrYxVcMKXDFW8KrhilvCreFWxilvCrYxVvCrYwpbxVsYVXYpbGFW8KtjFW8KtjClvFWxhVvFURY2c15dx20IrJKaDwA7k/IZZjgZyAHVlGNmnqFjZw2VpHbQiiRig8Se5PzOdHjxiEQA7CMaFK+TS7FXYq7FXYq7FXYq7FXYqp3EKzQPE3RxStK0PY/QchkgJRMT1TE0bYwysrFWFGUkMOtCNiM5KcDEkHo7mMrFtZBLWBLsVawK44EtYFccCtYpaOBWsCuwJaxVrAl2BWsCWjirsCWsCuwK1gV2BLRwK1gVrAl2KtYEtHArWBLsCtYEuwK1kUtYq7Iq1gS7Aq3ArsCWsCsR1e1+rX0igUR/jT5H+3NpgnxReJ7T0/hZiOh3CDy9wGxireKtjClvFW8KtjFLeFWxiq4YUuGKt4VXDFLeFW8KtjFLeFWxireFWxhS3irYwquxS2MKt4VbGKt4VbGFLeKtjCreKs58l6P6Fsb+Zf304pED2j8f9l+rNzoMHCOI8y5mCFC2TZsW92KuxV2KuxV2KuxV2KuxV2KuxVItZg9O6Eg+zMK/7Jdj/DND2phqYkOrsNJOxXcgM1TltYEuxVrArjgS1gVxwK1ilo4FawK7AlrFWsCXYFawJaOKuwJawK7ArWBXYEtHArWBWsCXYq1gS0cCtYEuwK1gS7ArWRS1irsirWBLsCrcCuwJawKlPmG19S1Eyj4oTv8A6rbHMnSzqVd7pu29Px4uMc4/cxvNk8m2MVbxVsYUt4q3hVsYpbwq2MVXDClwxVvCq4Ypbwq3hVsYpbwq2MVbwq2MKW8VbGFV2KWxhVvCrYxVvCrYwpbxVsYVTXy7pDanqCxsD9Xj+Odv8n+X/ZZk6XB4k66dWzFDiL0tVCqFUUUCgA6ADOhDnuxV2KuxV2KuxV2KuxV2KuxV2KuxVC6pbmazcAVdPjUCvUdRQddq5i6zD4mMjq24Z8MgWO5yztmsCXYq1gVxwJawK44FaxS0cCtYFdgS1irWBLsCtYEtHFXYEtYFdgVrArsCWjgVrArWBLsVawJaOBWsCXYFawJdgVrIpaxV2RVrAl2BVuBXYEtYFWyIskbIwqrAqw9jiDRtjOAlExPIsLuIGgnkhbqhI/tzcQlxAF4HPiOOZgehWDJtTeKtjClvFW8KtjFLeFWxiq4YUuGKt4VXDFLeFW8KtjFLeFWxireFWxhS3irYwquxS2MKt4VbGKt4VbGFLeKrkVmIVRViaADqScIV6Z5d0hdM05I2H+kSfHO3+Ue3+x6Z0OlweHCuvVz8cOEJnmS2OxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ksavrf6vdPGBROqf6p6U+XTOX12Hw8hHQ7u108+KKHzDb3Yq1gVxwJawK44FaxS0cCtYFdgS1irWBLsCtYEtHFXYEtYFdgVrArsCWjgVrArWBLsVawJaOBWsCXYFawJdgVrIpaxV2RVrAl2BVuBXYEtYFdgSx/zHa8ZUuVGz/A/zHT8Mz9JPYxeZ7d09SGQddj+PxySYZmvPt4q2MKW8Vbwq2MUt4VbGKrhhS4Yq3hVcMUt4Vbwq2MUt4VbGKt4VbGFLeKtjCq7FLYwq3hVsYq3hVsYUt4qyjyVo3r3J1CZf3MBpCD3k8f9j+vNloMHEeM8g5GCFm2c5uXLdirsVdirsVdirsVdirsVdirsVdirsVdiqWa5b8olnHVDxfp9lun4/rzWdqYeKHEOcXK0s6lXekuc87J2KtYFccCWsCuOBWsUtHArWBXYEtYq1gS7ArWBLRxV2BLWBXYFawK7Alo4FawK1gS7FWsCWjgVrAl2BWsCXYFayKWsVdkVawJdgVbgV2BLWBXYEobULYXNpJF+0RVP9YbjJ4p8MgXF1un8XEY9envYfQgkHYjNy8IQ3ihsYUt4q3hVsYpbwq2MVXDClwxVvCq4Ypbwq3hVsYpbwq2MVbwq2MKW8VbGFV2KWxhVvCrYxVvCrYwpRNhZTXt5Fawj45TSvYDuT8hlmLGZyER1ZRjZp6nZWcNnaRW0IpHEvEe/iT8zvnSY4CEQB0dhGNClbJpdirsVdirsVdirsVdirsVdirsVdirsVdiq2WNZYnjb7Lgqadd9sjOIkCDyKQaNsWdGjdkf7SEq1OlQaZyOXGYSMT0dzCXEAVuVsmsCuOBLWBXHArWKWjgVrArsCWsVawJdgVrAlo4q7AlrArsCtYFdgS0cCtYFawJdirWBLRwK1gS7ArWBLsCtZFLWKuyKtYEuwKtwK7AlrArsCWsBVi2s2voXzECiS/GvzPX8c2umycUPc8Z2tp/DzGuUt/1oHMh1jYwpbxVvCrYxS3hVsYquGFLhireFVwxS3hVvCrYxS3hVsYq3hVsYUt4q2MKrsUtjCreFWxireFWxhSzzyVo31a1N/MtJrgfugeqx/wDN2brs/Bwx4jzP3OZghQtk2bFvdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqSa3b8LhZgPhlFGP+Uu34j9WaLtXDUhPv2c/Rz2MUtzUOa1gVxwJawK44FaxS0cCtYFdgS1irWBLsCtYEtHFXYEtYFdgVrArsCWjgVrArWBLsVawJaOBWsCXYFawJdgVrIpaxV2RVrAl2BVuBXYEtYFdgS1gKpbrtt6tn6gHxwnl/se/wDXMjSZOGVd7qe2dPx4eIc4b/DqxrNq8e2MKW8Vbwq2MUt4VbGKrhhS4Yq3hVcMUt4Vbwq2MUt4VbGKt4VbGFLeKtjCq7FLYwq3hVsYq3hVN/LWjnU9RVGH+jRUec+3Zf8AZZlaTB4k/Ic23FDiL0wAKAAKAbADoBnROe7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhtRtvrFo6AVcfFH0ryHhXx6Zj6rD4mMxbMU+GQLGs5Mu4dgVxwJawK44FaxS0cCtYFdgS1irWBLsCtYEtHFXYEtYFdgVrArsCWjgVrArWBLsVawJaOBWsCXYFawJdgVrIpaxV2RVrAl2BVuBXYEtYFdgS1gKrWUMpVhVSKEexwXSJRBFFh93bm3uZIT+wdj4jqPwzd458UQXgtVgOLIYHoVMZY0N4q3hVsYpbwq2MVXDClwxVvCq4Ypbwq3hVsYpbwq2MVbwq2MKW8VbGFV2KWxhVvCrYxVciszBVBZmNFA3JJwgWl6f5e0hdM05ISB67/ABzt/lHt8h0zo9Lg8OFdern44cITPMlsdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirG9St/QvHUfZb41+Tf21zmO0MPBlPcd3aaafFH3IXMFyHHAlrArjgVrFLRwK1gV2BLWKtYEuwK1gS0cVdgS1gV2BWsCuwJaOBWsCtYEuxVrAlo4FawJdgVrAl2BWsilrFXZFWsCXYFW4FdgS1gV2BLWAq1gSkfmG2/u7lR/kP+sZn6LJzi8529p+WQe4/oSYZsHnG8Vbwq2MUt4VbGKrhhS4Yq3hVcMUt4Vbwq2MUt4VbGKt4VbGFLeKtjCq7FLYwq3hVsYqyvyRovr3B1GZf3UBpAD3k8f9j+vNn2fp7PGeQ5OTghe7Oc3TluxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpdrduXt1lHWI79fstsenvTNd2nh48d9YuTpZ1Ku9Is5t2bjgS1gVxwK1ilo4FawK7AlrFWsCXYFawJaOKuwJawK7ArWBXYEtHArWBWsCXYq1gS0cCtYEuwK1gS7ArWRS1irsirWBLsCrcCuwJawK7AlrAVawJULu3FxbSQn9obHwPUfjksc+GQLRqsAy4zA9WJFSpKkUI2I983oLwJBBouxQ3hVsYpbwq2MVXDClwxVvCq4Ypbwq3hVsYpbwq2MVbwq2MKW8VbGFV2KWxhVvCqJ02xmvr2K1h+3KaV7AdST8hlmLGZyER1ZRjZp6tZWkNnaxW0IpHEoVfE+JPuc6bHAQiAOjsYxoUrZNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirToroyMKqwIYeIOxwEAiioLFZomhleJvtISCelff6euchnxHHMx7nc458UQVhylsawK44FaxS0cCtYFdgS1irWBLsCtYEtHFXYEtYFdgVrArsCWjgVrArWBLsVawJaOBWsCXYFawJdgVrIpaxV2RVrAl2BVuBXYEtYFdgS1gKtYEtYFY5rdt6V4ZAPgmHIfPvm20eTihXc8f2zp/DzcQ5T3+PVL8ynUt4VbGKW8KtjFVwwpcMVbwquGKW8Kt4VbGKW8KtjFW8KtjClvFWxhVdilsYVbwqz/AMk6L9VszfTLSe5H7sHqsXUf8F1+7N52fp+GPEeZ+5zcEKFsmzYt7sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqS67b8ZUuANn+B+n2huPfcfqzSdrYeUx7i52jnzilZzSOe1gVxwK1ilo4FawK7AlrFWsCXYFawJaOKuwJawK7ArWBXYEtHArWBWsCXYq1gS0cCtYEuwK1gS7ArWRS1irsirWBLsCrcCuwJawK7AlrAVawJawKgdYtvWs2IHxxfGPkOv4ZkaXJwz97rO1tP4mEkc47/AK2NZuHjG8KtjFLeFWxiq4YUuGKt4VXDFLeFW8KtjFLeFWxireFWxhS3irYwquxS2MKpx5X0Y6nqKq4/0WGjznxHZf8AZZl6PT+JPfkObZihxF6cAAKDYDoM6N2DsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVUL23+sWskX7RFU7fENxlOoxeJAx72eOfDIFjBzkCK2LuQbayKXHArWKWjgVrArsCWsVawJdgVrAlo4q7AlrArsCtYFdgS0cCtYFawJdirWBLRwK1gS7ArWBLsCtZFLWKuyKtYEuwKtwK7AlrArsCWsBVrAlrArRAIoemBaYpe25t7qSL9kGq/wCqdxm8w5OOILwet0/g5ZR6dPco5c4rYxS3hVsYquGFLhireFVwxS3hVvCrYxS3hVsYq3hVsYUt4q2MKrsUro0d3VEBZ2ICqNySdgBkgLV6l5e0hNL01ICB67/HOw7ue3yHTOl0uDw4V16uwxw4RSZ5kNjsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirHdWtzDeMQPgk+NTv1P2hU++c12nh4MljlJ2mlnca7kFmtclxwK1ilo4FawK7AlrFWsCXYFawJaOKuwJawK7ArWBXYEtHArWBWsCXYq1gS0cCtYEuwK1gS7ArWRS1irsirWBLsCrcCuwJawK7AlrAVawJawK7AqT6/bVRLgDdfhf5Hp+OZ+hybmLoO3dPcRkHTY/o/HmkubN5hsYpbwq2MVXDClwxVvCq4Ypbwq3hVsYpbwq2MVbwq2MKW8VbGFV2KWW+RdF9ac6nMv7uE8bcHu/dv9j+v5ZteztPZ4z05OTgx2bZ1m6ct2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoDWrf1LT1APjh+Kv+Sftf1+jMDtHDx4jXOO7kaafDP3sfzl3auOBWsUtHArWBXYEtYq1gS7ArWBLRxV2BLWBXYFawK7Alo4FawK1gS7FWsCWjgVrAl2BWsCXYFayKWsVdkVawJdgVbgV2BLWBXYEtYCrWBLWBXYFUriFZoXibo4phhPhkD3NefCMkDA9QxN0ZHZGFGUkEe4zoImxYeAnAxJieYcMLFvCrYxVcMKXDFW8KrhilvCreFWxilvCrYxVvCrYwpbxVsYVRemafNqF9FaQ/akNC3ZV7sfkMtw4jOQiGcI2aesWdpDaWsVtAOMUShVH8T7nOnxwEYiI5B2MRQpWyaXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq5lDKVYVUihB6EHEhWK3MBguJITvwNAe9OoJp7Zx+qw+HkMXc4p8UQVI5jtjWKWjgVrArsCWsVawJdgVrAlo4q7AlrArsCtYFdgS0cCtYFawJdirWBLRwK1gS7ArWBLsCtZFLWKuyKtYEuwKtwK7AlrArsCWsBVrAlrArsCtZEpSDW7f07kSgfDKN/wDWHXNvoclxrueS7b0/Bl4xyl96XDM10zeFWxiq4YUuGKt4VXDFLeFW8KtjFLeFWxireFWxhS3irYwq9E8k6J9Tsvrsy0uLofCD1WPqP+C6/dm+7P0/BHiPM/c52DHQtkubFvdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqT69b7x3A/4xv+tf45pu18NgTHTYubo57mKUHNA7BrFLRwK1gV2BLWKtYEuwK1gS0cVdgS1gV2BWsCuwJaOBWsCtYEuxVrAlo4FawJdgVrAl2BWsilrFXZFWsCXYFW4FdgS1gV2BLWAq1gS1gV2BWsiUoPVLf17NwBV0+NfmP7Mv0uTgmO4uv7T0/i4SBzG4Y2M3rxLeFWxiq4YUuGKt4VXDFLeFW8KtjFLeFWxireFWxhS3iqd+VNFOp6kokFbWCjznsf5U/wBl+rMzRafxJ7/SObbhhxHyengACg6Z0jsHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK7gFxbyQn9obE9iNwdvfK82MTgYnqyhLhILFWDAkMCrDYqeoOcbKJiSD0d1E2LayLJo4FawK7AlrFWsCXYFawJaOKuwJawK7ArWBXYEtHArWBWsCXYq1gS0cCtYEuwK1gS7ArWRS1irsirWBLsCrcCuwJawK7AlrAVawJawK7ArWRKWsCsZ1C39C7dAKKfiT5HN9psnHAF4btDT+FmMenMe4ofMhwmxiq4YUuGKt4VXDFLeFW8KtjFLeFWxireFWxhSvjjeSRY41LO5Cqo6knYAYQCTQUPVvL2jppWmx2+xmb452Hdz1+gdBnT6XB4cK69XY44cIpMsyGx2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kse1m39K7LgUSYch0Hxftf1+nOb7Vw8OTi6SdlpJ3Gu5AZq3MaOBWsCuwJaxVrAl2BWsCWjirsCWsCuwK1gV2BLRwK1gVrAl2KtYEtHArWBLsCtYEuwK1kUtYq7Iq1gS7Aq3ArsCWsCuwJawFWsCWsCuwK1kSlrAqWa5b8oVmHWM0b5H+3M/QZKkY97o+3NPxQGQfw/cUkzbvKtjFVwwpcMVbwquGKW8Kt4VbGKW8KtjFW8KtjClmPkPRPVmbVJ1/dxErbg937t/sen+1m17N09njPTk5Onx9WdZu3MdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVQWsW/rWbMB8cXxj5D7X4Zha/B4mI943b9PPhmGOZyjt2jgVrArsCWsVawJdgVrAlo4q7AlrArsCtYFdgS0cCtYFawJdirWBLRwK1gS7ArWBLsCtZFLWKuyKtYEuwKtwK7AlrArsCWsBVrAlrArsCtZEpawKtljWSNo2+ywIP04YSMSCOjDLjE4mJ5EMWkjaORo2+0pIP0Z0cJCQBHV4DLjMJGJ5grRkmtcMKXDFW8KrhilvCreFWxilvCrYxVvCqM0rTptRv4rSH7Uh+JuyqN2Y/IZbhxHJIRDOEeI09btLWG0toraBeMUShVHy/ic6mEBGIA5B2URQpVyaXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxu60u6hkfhGXiqeDL8Xw9q985fVaDJGZ4Y3Hydrh1ESBZ3QTAgkEUI6g5riK5uSGsCuwJaxVrAl2BWsCWjirsCWsCuwK1gV2BLRwK1gVrAl2KtYEtHArWBLsCtYEuwK1kUtYq7Iq1gS7Aq3ArsCWsCuwJawFWsCWsCuwK1kSlrArsCUk1u34zLMBs4o3zH9mbfs/LcTHueV7c0/DMZB/F94/YlozYOiXDClwxVvCq4Ypbwq3hVsYpbwq2MVbwq9H8kaH9SsPrky0uboAivVY+qj/ZdT9GdB2fp+CPEecvuc/BjoX3slzYt7sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVWSQwyikiK4/wAoA5CeKM/qALKMyORQcuiWL/ZBjP8Akn+BrmBk7Kwy5en3N8dXMeaCm8vTDeKVW9mHE/xzAydjSH0yB97kR1o6hBTabfRfahYjxX4h+Ga/Loc0OcT97kxzwlyKEIIND1zELc7ArWBLRxV2BLWBXYFawK7Alo4FawK1gS7FWsCWjgVrAl2BWsCXYFayKWsVdkVawJdgVbgV2BLWBXYEtYCrWBLWBXYFayJS1gV2BKGv7f17V0AqwHJPmMu02XgmC4XaGn8XCY9eY97GxnQvDLhhVwxVvCq4Ypbwq3hVsYpbwq2MVT3ylon6U1IGRa2lvR5/A/yp/sv1ZnaHT+JPf6RzbsOPiPk9QzpHYOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqctvBMP3sav7kAnKsmGE/qALOM5R5FBTaDZP9jlEfY1H41zAy9kYZcrj+PNyI6yY57oGby7cLvFIrjwPwn+Oa/L2LMfSQfsciOuieYpAzadew/bhag7gch94rmuy6LNDnEuTDPCXIobMVtawJdgVrArsCWjgVrArWBLsVawJaOBWsCXYFawJdgVrIpaxV2RVrAl2BVuBXYEtYFdgS1gKtYEtYFdgVrIlLWBXYEtHArHtRt/Ru3A+y/wAS/T/bm/0mXjgO8bPE9qafwsxHQ7hDDMp17hireFVwxS3hVvCrYxS3hVfDFJLIkUal5HYKijqSTQDDEEmgmreteX9Hj0rTY7YUMp+Odx3c9foHQZ1OlwDFADr1djjhwikxzIbHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVKa0tZv72JWPiRv8Af1ynJpsc/qiCzjllHkUDN5fsn3jLRHwBqPx3/HNdl7GxS+m4uTDWzHPdATeXbtf7p1kHh9k/jt+Oa7L2LkH0kS+z8fNyYa6J5ikBNYXkP97CyjxpUfeNs12XSZcf1RIcmGaEuRUMxW1o4FawK1gS7FWsCWjgVrAl2BWsCXYFayKWsVdkVawJdgVbgV2BLWBXYEtYCrWBLWBXYFayJS1gV2BLRwKl+sQc7cSAfFGd/keuZ3Z+Xhnw97pu29Px4uMc4/ckozdvJOGKt4VXDFLeFW8KtjFLeFWZ+QND9SRtVnX4IyUtge7dGb6Ogzb9maaz4h+DlafH/EzvN25jsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVUJrGzm/vYVYnvSh+8b5jZdJiyfVEFshmnHkUBN5ctH3idoz4faH47/jmuy9h4j9JMft/HzcmGukOYtATeXb1N4yso7AHifx2/HNbl7EzR+mpfZ+Pm5UNdA89kvns7uCvqxMg8SNvv6ZrculyY/qiQ5MMsZcio5jtjWBLRwK1gS7ArWBLsCtZFLWKuyKtYEuwKtwK7AlrArsCWsBVrAlrArsCtZEpawK7Alo4FWuqupVhVWFCPY4iRBsMZwEgQeRY1NE0UrxnqppnS45icRIdXgc+E45mB6FYMsaW8KrhilvCreFWxilG6Rpk+pahFZw9ZD8bdlUfaY/IZdgwnJMRDOEeI09dtLWG1to7aBeMUShUHsM6uEBEADkHZAUKVckl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoafTbGf+8hUk/tAcT94pmJl0OHJ9UR933N0M848igJ/LNs28MjRnwPxD+BzW5ewcZ+mRj9rkw18hzFpfP5c1CPePjKP8k0P3GmazN2Jnj9NS/Hm5UNdA89kumtbmA/vYmT3YED781mXT5Mf1RIcqGSMuRtSyhm1gS7ArWRS1irsirWBLsCrcCuwJawK7AlrAVawJawK7ArWRKWsCuwJaOBWsBVKdZgo6zAbN8LfMdM23ZuWwYvNdu6epDIOux/QlgzaPPN4VXDFLeFW8KtjFL0ryRof1DT/rcy0ursBqHqsfVV+nqc6Ls7TcEOI/VL7nPwY6F97Jc2Le7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXEAih6YqhJ9J06b7cCgnuvwn/haZhZezsGTnEfDb7m+GpyR5FL5/K0DVMEzJ7MAw/CmavL7PwP0SI9+/6nKh2jLqEun8u6lHUoqyj/ACDv9xpmrzdiaiHICXu/a5UNdjPPZL5re4hNJo2jP+UCP15q8uCeM1IEe9yozjLkbUsqZuyKtYEuwKtwK7AlrArsCWsBVrAlrArsCtZEpawK7Alo4FawFVG7hE0Dx9yPh+Y6Zbp8vBMScbWafxcRj16e9jtCDQ9c6V4Ih2FVwxS3hVvCqfeT9D/SepBpVraW1Hmr0Y/sp9P6szdBpvEnv9Ib8OPiPk9SzpnYOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuKhgQwBB6g4CARRUFBT6Lps32oFU+KfD+rMDN2Vp8nOIHu2+5yIarJHql0/lWI1ME5XwVwD+IpmqzezsT9EiPe5UO0T/EEun8u6nFUhBKPFDX8DQ5qs3YmohyHF7nLhrsZ60l8sM0TcZUZG8GBH681eTFOBqQIPm5UZiXI2pZUydgS1gV2BLWAq1gS1gV2BWsiUtYFdgS0cCtYCrWRSkepweldEgfDJ8Q+ffOg0OXjxjvGzxna+n8PMSOUt/wBaEzNdWuGKW8Kr4YpJpUiiUvJIwVFHUkmgGSjEk0EgW9d0DSI9K0yK1Whk+1O4/ac9T/AZ1WmwDFAR+bs8cOEUmOZDN2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVp0R14uoZT1BFRkZREhRFhIJHJA3GhaXNuYQjeMfw/gNvwzXZux9Nk/ho+W37HJhrMket+9LbjykOtvPTwWQV/Ef0zU5vZof5Ofz/AFj9TlQ7S/nD5JbceXtUh39L1FHeM8vw6/hmpz9i6nH/AA8Q8t/2/Y5kNbjl1r3pfJFJG3GRCjeDAg/jmryY5RNSBB83JjIHksyssmsCWsCuwK1kSlrArsCWjgVrAVayKUHqkHqWxYfaj+L6O+Z3Z+XhyV0k6ntnT+Jh4hzhv8OqSZv3jlwxS3hVm35faFzdtWnX4UqlqD3boz/R0H05uey9Nf7w/By9Nj/iLO83bmOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVbJFHIvGRA6/wArAEfjkJ44zFSAI80xkRyS+48u6VNU+l6bHvGafhuPwzWZuxNNk/h4fdt+z7HKhrsset+9Lbjyg25t7gHwWQU/4Yf0zT5/Zg/5Ofz/AFj9Tlw7T/nD5JXcaBqsNawF1H7UfxfgN/wzUZ+xdTj/AIbHlv8AtcyGtxS6170A6OjFXUqw6gihzVzgYmiKLlAg8luQKWsCuwJaOBWsBVrIpaIBBB3B6jG6NoIBFFj1xCYZnjP7J2+XbOowZOOAl3vA6rAcWSUO4rBlrQjtF0ubVNRis4tuZrI/8qD7TZfp8JyTEQzxw4jT1+1tobW3jt4V4xRKERfYZ1kICIAHIOzAoUq5JLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVWSwQTLxljWRfBgD+vK8mGGQVICXvFsozMeRpLbjyzpU1SsZhY94zT8DUZqc/YGmycgYnyP67Dlw1+WPW/ellx5PlFTb3Ct4K4K/iK5p8/svIf3cwfft+ty4dqD+IJZcaFqsFS1uzL/Mnx/wDEanNNn7H1WPnAn3b/AHOZDWYpcigGUqSGFCOoOawgjYuUCtyJVrIpdgKpZrEH2Jh/qt/DNt2Xm5wPvec7e0/LIPcf0JaM3Dzj07yPoX6P0761MtLu7AY16rH1Vfp6nOk7O03hw4j9Uvuc/T4+EX1LJM2LkOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqU9rbTik0SSD/AClB/XlObT48gqcRL3hnDJKPI0ltx5W0qWpRWhb/ACDt9zVzT5/ZzTT5Aw9x/Xblw7Ryx57pXc+Trlam3nWQeDgqfw5Zps/srkH93MS9+363Nx9qRP1CkqudE1S3qZLdyo/aT4x/wtc0mo7I1OL6oGvLf7nMx6vHLlJLrmESxPE21RT5HMLDkOOYl3J1OEZcZh3j+xryboB1LVOc6/6LaENMD0Zq/Cn9fbO47O0/iyv+EPD4sJMqPR6lnTuwdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqDvl0hvhvfQqenqlQfoJ3zX6yOlO2bg/zq/S34TlH0cXwdpUOlRQOummMw+oxkMTBx6hpWpqd+mXaSGKMKxVweRv7WmRuRJ53v70ZmUh2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv/9k=' >>> assert a[29].load == base64.b64decode(wireshark_data) ###(001)=[passed] TCPSession - dissect HTTP 1.0 html page with Content_Length >>> load_layer("http") >>> >>> import os >>> >>> filename = scapy_path("/test/pcaps/http_content_length.pcap") >>> >>> expected_data = b"""Google
A faster way to browse the web



 
  Advanced Search
  Language Tools


Advertising Programs - Business Solutions - About Google

©2010 - Privacy

""" >>> >>> >>> conf.contribs["http"]["auto_compression"] = False >>> a = sniff(offline=filename, session=TCPSession) >>> pkt = a[7] >>> assert HTTP in pkt >>> assert HTTPResponse in pkt >>> assert pkt[HTTP].Content_Length == b'5012' >>> assert len(pkt[Raw].load) == 5012 >>> >>> conf.contribs["http"]["auto_compression"] = True >>> a = sniff(offline=filename, session=TCPSession) >>> pkt = a[7] >>> assert HTTP in pkt >>> assert HTTPResponse in pkt >>> print(pkt[Raw].load, expected_data) b'Google
A faster way to browse the web



 
  Advanced Search
  Language Tools


Advertising Programs - Business Solutions - About Google

©2010 - Privacy

' b'Google
A faster way to browse the web



 
  Advanced Search
  Language Tools


Advertising Programs - Business Solutions - About Google

©2010 - Privacy

' >>> assert pkt[Raw].load == expected_data ###(002)=[passed] TCPSession - dissect HTTP 1.0 HEAD response >>> load_layer("http") >>> >>> a = sniff(offline=scapy_path("/test/pcaps/http_head.pcapng.gz"), session=TCPSession) >>> >>> assert HTTPRequest in a[3] >>> assert a[3].Method == b"HEAD" >>> assert a[3].User_Agent == b'curl/7.88.1' >>> >>> assert HTTPResponse in a[6] >>> assert a[6].Content_Type == b'text/html; charset=UTF-8' >>> assert a[6].Expires == b'Mon, 01 Apr 2024 22:25:38 GMT' >>> assert a[6].Reason_Phrase == b'Moved Permanently' >>> assert a[6].X_Frame_Options == b"SAMEORIGIN" ###(003)=[passed] HTTP build with 'chunked' content type >>> pkt = HTTP()/HTTPResponse(Content_Encoding="chunked", Date=b'Sat, 22 Jun 2024 10:00:00 GMT')/(b"A" * 100) >>> assert bytes(pkt) == b'HTTP/1.1 200 OK\r\nContent-Encoding: chunked\r\nDate: Sat, 22 Jun 2024 10:00:00 GMT\r\n\r\n64\r\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n0\r\n\r\n' ###(004)=[passed] HTTP decompression (gzip) >>> conf.debug_dissector = True >>> load_layer("http") >>> >>> import os >>> import gzip >>> >>> filename = scapy_path("/test/pcaps/http_compressed.pcap") >>> >>> >>> conf.contribs["http"]["auto_compression"] = False >>> pkts = sniff(offline=filename, session=TCPSession) >>> >>> data = b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xffEQ]o\xdb0\x0c\xfc+\x9a\x1f\x92\xa7\x9a\x96?\xe4\xb8\x892`I\x81\r\xe8\xda\xa2p1\xec\xa9P-\xd5\x16*[\x86\xa5\xd8K\x7f\xfd\xa8\x14E\x1f\x8e:R\x07\xf2D\xed\xbe\x1d\xef\x0f\xf5\xdf\x87\x1b\xd2\xf9\xde\x90\x87\xa7\x1f\xb7\xbf\x0e$\xba\x02\xf8\x93\x1d\x00\x8e\xf5\x91\xfc\xac\x7f\xdf\x92\xe5?9\x89QV\x01\x02\x00\x00' >>> >>> pkts[2].show() ###[ Ethernet ]### dst = d0:50:99:56:dd:f9 src = 14:0c:76:8f:fe:28 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = None id = 17805 flags = frag = 0 ttl = 121 proto = tcp chksum = None src = 172.217.18.198 dst = 192.168.0.119 \options \ ###[ TCP ]### sport = http dport = 64700 seq = 1367924705 ack = 259396500 dataofs = 5 reserved = 0 flags = PA window = 243 chksum = 0xe94 urgptr = 0 options = [] ###[ HTTP 1 ]### ###[ HTTP Response ]### Http_Version= HTTP/1.1 Status_Code= 200 Reason_Phrase= OK Accept_Patch= None Accept_Ranges= None Access_Control_Allow_Credentials= None Access_Control_Allow_Headers= None Access_Control_Allow_Methods= None Access_Control_Allow_Origin= None Access_Control_Expose_Headers= None Access_Control_Max_Age= None Age = None Allow = None Alt_Svc = None Cache_Control= private, max-age=0 Connection= None Content_Disposition= None Content_Encoding= gzip Content_Language= None Content_Length= 386 Content_Location= None Content_MD5= None Content_Range= None Content_Security_Policy= None Content_Type= text/html; charset=UTF-8 Date = Mon, 22 Apr 2019 15:23:19 GMT Delta_Base= None ETag = None Expires = Mon, 22 Apr 2019 15:23:19 GMT IM = None Keep_Alive= None Last_Modified= None Link = None Location = None P3P = policyref="http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR" Permanent = None Pragma = None Proxy_Authenticate= None Public_Key_Pins= None Refresh = None Retry_After= None Server = cafe Set_Cookie= None Status = None Strict_Transport_Security= max-age=21600 Timing_Allow_Origin= * Tk = None Trailer = None Transfer_Encoding= None Upgrade = None Vary = None Via = None WWW_Authenticate= None Warning = None X_Content_Duration= None X_Content_Security_Policy= None X_Content_Type_Options= nosniff X_Correlation_ID= None X_Frame_Options= None X_Powered_By= None X_Request_ID= None X_UA_Compatible= None X_WebKit_CSP= None X_XSS_Protection= 0 Unknown_Headers= None ###[ Raw ]### load = b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xffEQ]o\xdb0\x0c\xfc+\x9a\x1f\x92\xa7\x9a\x96?\xe4\xb8\x892`I\x81\r\xe8\xda\xa2p1\xec\xa9P-\xd5\x16*[\x86\xa5\xd8K\x7f\xfd\xa8\x14E\x1f\x8e:R\x07\xf2D\xed\xbe\x1d\xef\x0f\xf5\xdf\x87\x1b\xd2\xf9\xde\x90\x87\xa7\x1f\xb7\xbf\x0e$\xba\x02\xf8\x93\x1d\x00\x8e\xf5\x91\xfc\xac\x7f\xdf\x92\xe5?9\x89QV\x01\x02\x00\x00' >>> assert HTTPResponse in pkts[2] >>> assert pkts[2].Expires == b'Mon, 22 Apr 2019 15:23:19 GMT' >>> assert pkts[2].Content_Type == b'text/html; charset=UTF-8' >>> assert pkts[2].load == data >>> >>> >>> conf.contribs["http"]["auto_compression"] = True >>> pkts = sniff(offline=filename, session=TCPSession) >>> >>> pkts[2].show() ###[ Ethernet ]### dst = d0:50:99:56:dd:f9 src = 14:0c:76:8f:fe:28 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = None id = 17805 flags = frag = 0 ttl = 121 proto = tcp chksum = None src = 172.217.18.198 dst = 192.168.0.119 \options \ ###[ TCP ]### sport = http dport = 64700 seq = 1367924705 ack = 259396500 dataofs = 5 reserved = 0 flags = PA window = 243 chksum = 0xe94 urgptr = 0 options = [] ###[ HTTP 1 ]### ###[ HTTP Response ]### Http_Version= HTTP/1.1 Status_Code= 200 Reason_Phrase= OK Accept_Patch= None Accept_Ranges= None Access_Control_Allow_Credentials= None Access_Control_Allow_Headers= None Access_Control_Allow_Methods= None Access_Control_Allow_Origin= None Access_Control_Expose_Headers= None Access_Control_Max_Age= None Age = None Allow = None Alt_Svc = None Cache_Control= private, max-age=0 Connection= None Content_Disposition= None Content_Encoding= gzip Content_Language= None Content_Length= 386 Content_Location= None Content_MD5= None Content_Range= None Content_Security_Policy= None Content_Type= text/html; charset=UTF-8 Date = Mon, 22 Apr 2019 15:23:19 GMT Delta_Base= None ETag = None Expires = Mon, 22 Apr 2019 15:23:19 GMT IM = None Keep_Alive= None Last_Modified= None Link = None Location = None P3P = policyref="http://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR" Permanent = None Pragma = None Proxy_Authenticate= None Public_Key_Pins= None Refresh = None Retry_After= None Server = cafe Set_Cookie= None Status = None Strict_Transport_Security= max-age=21600 Timing_Allow_Origin= * Tk = None Trailer = None Transfer_Encoding= None Upgrade = None Vary = None Via = None WWW_Authenticate= None Warning = None X_Content_Duration= None X_Content_Security_Policy= None X_Content_Type_Options= nosniff X_Correlation_ID= None X_Frame_Options= None X_Powered_By= None X_Request_ID= None X_UA_Compatible= None X_WebKit_CSP= None X_XSS_Protection= 0 Unknown_Headers= None ###[ Raw ]### load = b'' >>> assert HTTPResponse in pkts[2] >>> assert pkts[2].load == b'' ###(005)=[passed] HTTP decompression (gzip) with retransmission >>> import io >>> import gzip >>> >>> pcap = gzip.decompress(bytes.fromhex("1f8b080062b92e6602ff9d586bace4e659f6d964d3e5244b93c08f003f3a52b2e96e9573d69799738e376cd8f15ced33f6dc3cbe0954c6f68cc733b6c739e3b9d840d956085445229590902284442fb4db42aab42ab4a04a5c052d95aa52d01209352090b854a8093fd24a9ba0f2bef69973dbed36b0dad1ccb1fd3ddf7b79dee77dfdfdfd5f7cfea3e7880789f5bfef7f9f2036e0fbb56463d8f8f94d8283dff8c96b370a073ff191773ff2d77ff5b90b44052ec4c10de2e643db1ffffd9ffcee537f7aebf5bff9ca9344ebe557aa9f42949be7eebc617f9420ce3d78fe0b1b0f3c706163e3c17388f8bee78f1133ac0c374324881bc4730f7dfb31444354a2f595275f5a7cf82d40bd75f3f13b6f149f4c115f4134407d172292079bc40ea0eddccbc6cbf134b5f1b3676cbc05a86fb71e3d773ef956e6e95bf126f16fe789f47316e5fcab71882897ffe707a16cfd2b41b49a5d3977f580d9d15a96193bc1b0336e1487d586392c6f87a3305797e5d6556a9bbab8599fcea26bb9e76776b2bdf0b767c97cdb9f0e2e6e162d6b10465b95c09ada6ee05ccb39891b3e93b30743af1fc1fdde6c70b0557406012c16a789eb79fdabf96d3277d99afa613f724d6ff06c4eecf2951c456e93cfe65437b0a7cb594e92733bdbd4b339f9c0b561f1d5c23679e5e266691a44f0d7961c87836bb97e187aae0520d3e0ea6a6bb95c6e0da707fed6fcc01ba03903fb7841631038d1e85a2e9f67a9f46a30b070ddb59ce54d6760e7c5cdb1cd30e4deee4e9f64acfcf0ba5169d04268ba6cd22f5e62caf0ffe980de2587ec80b4eddd7cdebcde3b781ac311c7f6ecfaa53c3958f4bdcbf06df667839dfcfbed019a70f9129d7f3f06f952817befaa6031e490b1f3145328e4df7ba950be72e512c33d3d2fecb014651776addd9d3dfa7ab2d0e9b6c3bb2cad6bfcc2666ca6418f48535dba4d5a19f76b7b0eef8f463a1d7946a9e2f2e5bc63f8ab9191449e4e8f167cb948e97265d92c77dc66395ada747bd750a5a919176971dc2625b5478ab2e01b631d7d3a6dd3f576cd9bf7153631b4f694f73ba1c570335df3868626c4262324bcbb74f871d1dd97a3a2452ba4c6744253558666cd8bfab0462c4d76851abb346a5edcea71a1e9c35a786ebf242cac9a32d7686104eb267d8d478cd0709d89c970f877c8d76713939618a34cc1dfc25c57296fbfd419f648a5ab4c94ae1a0b729b12845eb533ec4c3cb1d32b7072afe76add6c4f1d6c6c695c6ca8f610ed467b74bf9a18b24e6a7407a2c34e8caee3caf5906c56d8b05926ddfdeef268ff26c98dac40180d1476696bd214f6069babb1e52e33bb4aab64a049a93fe0b7676adc10fddc2f4dc2266d2c2c5f81ac38d3b52d7cad9af0a54e68d79468bfcbedf6557dca434c2c8a652cdf23755598813db037607527e18096166600f10c14afc990bb42bd13a571ec66180d975f34fc765ef77946572b243f8e8aa61aa1edd3f5b387311db56b4668d614c8db0872d849c0176010e4d3bd6b9f895dc378f32cda6fd6b9915d734ee215815567f728f6d542a8319267971c17e2e7991eebea9ae4e1fd94236e7ecebb9817696e630cc754d1aa0b9e41b189555b85b8ae41ad2cadbadad34a7b0b58b3b6238b25f0a22f93cb66dc095b75291cf8ca02b9a2d3051263bb2fcf26fdeeec605f3bb66fbde7f087dbe736e234df711613e7c4de02f0a77a80f11fcab35d2350e63a729cce3bb8def445cc2f6597bc5d881769034ff90a97624be3ced0500b6313b886dcb1b57688386730e07a07f8d59eee6bc0774621adba42b654d6d568dbb3ab2cac2f9080435ab103f6e075656ee0f59a327a07aaff7caafa6f9f56fd86b656fd97b709c2741179ad259d51b35671815d94984c9866973fd40bae78cae33a075e4fd65ae24ae5912b96f8393f162662592c001b599316a0f23a5045e09d1c9156e0018b8becdd55384a6c5548ec3ab0aacab6654aea41753f6f94c5442c3b8ce45796222d92862bd88d321f62b6ad843a8e724dc9a25c97283d9048cca04671ad1ed531f9a04749e3c94a54db94448b8c347662de236722301fd8e4998181fbb2ed1a2a518f96aa608f2a2d8c5a6f6a318a0bf6c7a9ea545859a9ce5c73cc33624d2f18323731ca1629d578509c65bc9faa4e9b4546997e35c24ad628a9daf30cf8ccdc1e2975bb0ad7d34843902b4ab3dda3aa6007da306e69c7761ba5e5b251ae842d9944565ea2abbc4b8df9ead21dc49d64a82c5d7e3c751bb4e8682501a229b15a89874ee0f927bd3f83120e480e3886de82e6781ca7541c96770b8171fa1ae85fde6dba2c6531fcc2acb1635d5d2e2cec7be329f0548a1bf40aba5175d638798d91dcbe9adf69304a62b9ece1efc36b69cf843a6228cfac4bdeffc90e52dc695036f40ca81d465c588c97a0ee8909bfdb4ea60b85f6e6460db4336665d0614da62c5a2a4765b05f837a875ab293b318bd638ce3f514b7b06925eed123cfac2d17f6b832174b7bbba976a810d75215b59d1c4046a10ee994115d6032f42fdb4fb5cc1bd4b95956e7c2deb0be0226ad604f057e83b6948ac7ebe4c887bee9e96ada4f907d501d3ce880e808751d7a1eea7571caab4a64d53b05788606663927e386381a60806e427fe94df960b53784ded2a79502ecbd97f56432ddd7469633143bec76a06f205f3816fbaace90c01983327d89ecabec9caf19a8513e6a10f4db13fef033de5d65fa897a04fa090c4fd25ea5b0be0dfa66d73ce81fa28b15803dcd50a9a55d9f804ab4c343bcac8f769d631ec49d494b85d8f9d58246c3fd9213d875e04ad79aa19ee38c61aad5e57ec986ea14481378873912e225703bf52906ce50969f9f1eeb69e1647ff3f7bbbadf87fe8c7c356b55d7848a166a7a28b8fa08fc1966fba09dfa2cb5558ed85331a90b941948e0cf6a66c124a5d333f469063d7c7cd8bf9d3335e788f8817c41dd41cfdb73f91274e734b6f63a7fc17eb7e80b9063c3077bc027cb67630dfc33620bf20ff9cb9e8f74d59b09f1243cb1172828eef50e54ff2055fdb74eab7ee7c25af5ffe821821861679b9838e1c5d07dd7d36d890f81392e6a34fee64b1596af189c5c95aa6809767dab540416a5130f4c65e4142bf3b05b91987dd075eca2881300b30388ecc9aae77b55568466cec2a4e40c622edf8c39b61917277a5cbc4473873bc42d575f610da6be6731f180470bcb63819b5690d6c5a9f839aede05be82ee419f75206f890116038f421378abf78a2b716c416de7978d7105ebc3cd66135853e2233dd07106855ae1528e422dae39e674fc2a70a0b70b75b4eed74eabcb150ddfc33a40fd029eb130db8026d4c569e6c364b75d57e68711c6996299cd63c5131db4386a75d10ef085e162e02599cd0ae91ee087e0d97525365dae67a5f319c51ecf19c608ed3c3b5358f89ba626fbc853a83f7cbe2517ff7fdd09fb4a167b9c7521bb6480dad7ae4bf0a280732acc605093b807c62e8db97ab406e65e09f47614db5d2bc4d90ce6e704d64dad006b519c093003e21431541588af02b119f9605b60a55abcc27af6f4385dbb8419796e9746c5d3f770ffc991aea4fa93d555de50c5ccd65afa3bdbafb677b4a7857a039349df6781f98e5b021ec0fdf05e7ea433a36b657a1614d9769d4bdf5f30c68d920dba34d9b5e951881a0333bd6fa8ac8f1a041c088ff25a81ebf0ae00731c62ccc471916c665a0671916626cca7876bee8e475d58e8149bee899a00fab9e4cba40376c4f02e32ccec4b73e1ac754dec16d996cbadb537b06aded2007de54b36031850273ce854fee879818177915a2fc0aab531e6dda52380b6433c987ecdc377137c8ff04c5a9fe27535a9da18df751ce11ed6016a6f6852b3154e4562b99dc7be30d4ec695f5d817f55a8996c76078d3545e0d8c9dc1a3ea808d64f8a9f4e7b4ba9eca439017c9879e15db47bb856217166f775a87da8cda335e9bb6816afa3e7ef15531d67eac379208d29bcefc17bd09ae7c89753bcc2ba3ae45ed287d9086b1a351f9f43653caacb520774a37d72bfe3e916fa07f488d57e175475dd1f2a1cd8097541b1de007a2bfacf4fa496dce553bed909353734cb59abfe973788f47356f5373e1bcf50f5b79e3aadfaea9752d57fe2dcf9fc3f12449b642560b406936edc87a9a671d8e190c142adc70a752b6af9471583f369622624cce82468738fe94c6406dfdfe1e9b48ef2b0425a34e44217bb491b90b27b9207efa91e5c97ed5aa70a33ce349dda21468d3139817c452d0fe7a00e073317be1d1c72c039ad2587fa855c17659e39d1f79d74ff32f4ec388d37d4a480bd3b3210c3cdbbc06fec26a0f4c7e8a0bca9d515562c4d70b60e1083ca7ca9c34c044adc4c2216660612dfdd3bda686c4094d27900e635e06a76aa5212403785560f666098afe71039881a70b7427916238d0ce063364f5493f53b1dc605f4d7c36fcce537878f107b04917eb22c46dffedace9fdcc8cefc6e7f0c4f117fec17ce9c22be8def6ead4737de9c5f270ecf3711e7f469e4099cfced8fa738c1bd706e020efd7582d8d838bf893c79f915fdb97780f88914d1bf1bb17301105fdf7aeade88f7f1f57753c4d5dd88fa73e0eb1ba39f3de9eb6f03f7f1731667e3c5db9f449cc71fbd27ce131b6fdefc2d82589f60e66892cc35f72f6e96fbd100cf22836772742127f60fe00e9dcf51cc359ab996a7733551beb8d91d1c2c0607d772c5b06f8d0657e9edfc7681ce5dee99f3209a5fb9b8a9f40f62b87bfaf0f3f8b8f1f471e8ddc790543e7fcf53c8d3e79bd160155d1d45bef76cce1af50f6683e87a4fae6eede169e57b5eb8909d7c3f70fecfbef5a31fca3d417c43bdf3d01fbcbd3dffe487b9bff32e2f7fe7a7be9afbe36f7ce017ef7cfda5f9c75efcf1e6ab8f7e977ef83bd75efccdeffdedaf7fe2d5c68d5bc27f773f4fccbff6a12b2ffcfbfcab46e195debbcd7f78fc8b9ff9af2fffc86bbf97ffc0affcf42fc7413ffac3e056d278f89b2f49d35ffa4fe537aa7ffe730f73af7df07bcf5cdebdfd6b7f49bcf4c17f79cf67e4e1e0574f24eb3e49ff549af4c5e964bd60a5c97a6ce3cde1ebc40fc43971dc7ef9f6ad1467fec371d8d123f73b648fd243f64f9f164ffd39c0b261647e70f8cf19ca9de0be28f314e5d63d511e03947fca50fee323f7f5e9d3a94fd1199f6c40fa192cfee177d0a7ff055f2af0bdf5180000")) >>> >>> pkts = sniff(offline=io.BytesIO(pcap), session=TCPSession) >>> >>> assert HTTPRequest in pkts[3] >>> assert pkts[3].Method == b"POST" >>> assert len(pkts[3].load) == 4491 >>> >>> assert HTTPResponse in pkts[8] >>> assert pkts[8].Http_Version == b'HTTP/1.1' >>> assert len(pkts[8].load) == 134 ###(006)=[passed] HTTP decompression (brotli) >>> conf.debug_dissector = True >>> load_layer("http") >>> >>> import os >>> import brotli >>> >>> filename = scapy_path("/test/pcaps/http_compressed-brotli.pcap") >>> >>> >>> conf.contribs["http"]["auto_compression"] = False >>> pkts = sniff(offline=filename, session=TCPSession) >>> >>> data = b'\x1f\x41\x00\xe0\xc5\x6d\xec\x77\x56\xf7\xb5\x8b\x1c\x52\x10\x48\xe0\x90\x03\xf6\x6f\x97\x30\xd0\x40\x24\xb8\x01\x9b\xdb\xa0\xf4\x5c\x92\x4c\xc4\x6f\x89\x58\xf7\x4b\xf7\x4b\x6f\x8c\x2e\x2c\x28\x64\x06\x1d\x03' >>> >>> pkts[0].show() ###[ Ethernet ]### dst = 52:54:00:61:aa:fe src = 00:16:3e:00:00:10 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = None id = 7675 flags = DF frag = 0 ttl = 64 proto = tcp chksum = None src = 192.168.122.33 dst = 192.168.122.1 \options \ ###[ TCP ]### sport = http dport = 52074 seq = 572640221 ack = 1065353370 dataofs = 8 reserved = 0 flags = PA window = 227 chksum = 0x73dc urgptr = 0 options = [('NOP', None), ('NOP', None), ('Timestamp', (3279085496, 1976444231))] ###[ HTTP 1 ]### ###[ HTTP Response ]### Http_Version= HTTP/1.1 Status_Code= 200 Reason_Phrase= OK Accept_Patch= None Accept_Ranges= bytes Access_Control_Allow_Credentials= None Access_Control_Allow_Headers= None Access_Control_Allow_Methods= None Access_Control_Allow_Origin= None Access_Control_Expose_Headers= None Access_Control_Max_Age= None Age = None Allow = None Alt_Svc = None Cache_Control= None Connection= keep-alive Content_Disposition= None Content_Encoding= br Content_Language= None Content_Length= 52 Content_Location= None Content_MD5= None Content_Range= None Content_Security_Policy= None Content_Type= text/plain Date = Sat, 06 Apr 2019 14:24:04 GMT Delta_Base= None ETag = "5ca8b0e3-34" Expires = None IM = None Keep_Alive= None Last_Modified= Sat, 06 Apr 2019 14:00:03 GMT Link = None Location = None P3P = None Permanent = None Pragma = None Proxy_Authenticate= None Public_Key_Pins= None Refresh = None Retry_After= None Server = nginx/1.14.0 (Ubuntu) Set_Cookie= None Status = None Strict_Transport_Security= None Timing_Allow_Origin= None Tk = None Trailer = None Transfer_Encoding= None Upgrade = None Vary = None Via = None WWW_Authenticate= None Warning = None X_Content_Duration= None X_Content_Security_Policy= None X_Content_Type_Options= None X_Correlation_ID= None X_Frame_Options= None X_Powered_By= None X_Request_ID= None X_UA_Compatible= None X_WebKit_CSP= None X_XSS_Protection= None Unknown_Headers= None ###[ Raw ]### load = b'\x1fA\x00\xe0\xc5m\xecwV\xf7\xb5\x8b\x1cR\x10H\xe0\x90\x03\xf6o\x970\xd0@$\xb8\x01\x9b\xdb\xa0\xf4\\\x92L\xc4o\x89X\xf7K\xf7Ko\x8c.,(d\x06\x1d\x03' >>> assert HTTPResponse in pkts[0] >>> assert pkts[0].Content_Encoding == b'br' >>> assert pkts[0].Content_Type == b'text/plain' >>> assert pkts[0].load == data >>> >>> >>> conf.contribs["http"]["auto_compression"] = True >>> pkts = sniff(offline=filename, session=TCPSession) >>> >>> pkts[0].show() ###[ Ethernet ]### dst = 52:54:00:61:aa:fe src = 00:16:3e:00:00:10 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = None id = 7675 flags = DF frag = 0 ttl = 64 proto = tcp chksum = None src = 192.168.122.33 dst = 192.168.122.1 \options \ ###[ TCP ]### sport = http dport = 52074 seq = 572640221 ack = 1065353370 dataofs = 8 reserved = 0 flags = PA window = 227 chksum = 0x73dc urgptr = 0 options = [('NOP', None), ('NOP', None), ('Timestamp', (3279085496, 1976444231))] ###[ HTTP 1 ]### ###[ HTTP Response ]### Http_Version= HTTP/1.1 Status_Code= 200 Reason_Phrase= OK Accept_Patch= None Accept_Ranges= bytes Access_Control_Allow_Credentials= None Access_Control_Allow_Headers= None Access_Control_Allow_Methods= None Access_Control_Allow_Origin= None Access_Control_Expose_Headers= None Access_Control_Max_Age= None Age = None Allow = None Alt_Svc = None Cache_Control= None Connection= keep-alive Content_Disposition= None Content_Encoding= br Content_Language= None Content_Length= 52 Content_Location= None Content_MD5= None Content_Range= None Content_Security_Policy= None Content_Type= text/plain Date = Sat, 06 Apr 2019 14:24:04 GMT Delta_Base= None ETag = "5ca8b0e3-34" Expires = None IM = None Keep_Alive= None Last_Modified= Sat, 06 Apr 2019 14:00:03 GMT Link = None Location = None P3P = None Permanent = None Pragma = None Proxy_Authenticate= None Public_Key_Pins= None Refresh = None Retry_After= None Server = nginx/1.14.0 (Ubuntu) Set_Cookie= None Status = None Strict_Transport_Security= None Timing_Allow_Origin= None Tk = None Trailer = None Transfer_Encoding= None Upgrade = None Vary = None Via = None WWW_Authenticate= None Warning = None X_Content_Duration= None X_Content_Security_Policy= None X_Content_Type_Options= None X_Correlation_ID= None X_Frame_Options= None X_Powered_By= None X_Request_ID= None X_UA_Compatible= None X_WebKit_CSP= None X_XSS_Protection= None Unknown_Headers= None ###[ Raw ]### load = b'This is a test file for testing brotli decompression in Wireshark\n' >>> assert HTTPResponse in pkts[0] >>> assert pkts[0].load == b'This is a test file for testing brotli decompression in Wireshark\n' ###(007)=[passed] HTTP decompression (zstd) >>> conf.debug_dissector = True >>> load_layer("http") >>> >>> import os >>> import zstandard >>> >>> filename = scapy_path("/test/pcaps/http_compressed-zstd.pcap") >>> >>> >>> conf.contribs["http"]["auto_compression"] = False >>> pkts = sniff(offline=filename) >>> >>> data = b'\x28\xb5\x2f\xfd\x04\x58\x45\x03\x00\xf2\x06\x19\x1c\x70\x89\x1b\xf6\x4f\x21\x1a\xbb\x28\xda\x9a\x1c\x34\xb8\x68\x1f\xd2\x82\xd7\x01\x8d\x36\xe5\x57\x1d\x0f\x38\x10\xa9\xa9\x86\x32\x96\x3d\xd4\xce\x2d\xa9\x2b\x01\x92\x94\xa8\x17\x23\xb7\xec\x9f\x6e\x96\x23\xb6\x13\x52\x97\xb2\x14\xf6\x0e\x9d\x57\x70\xf0\x2d\x7b\x87\x4c\x2a\x92\x10\x35\x68\x8d\xd9\xe6\x41\xbc\xf7\x73\x84\x07\x7e\xef\x48\xd1\x91\x0d\xef\x0b\x86\x8e\x6b\x86\x12\xaf\xb6\x05\x04\x01\x00\x29\x52\xd2\xfa' >>> >>> pkts[0].show() ###[ Ethernet ]### dst = 00:00:00:00:00:00 src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 212 id = 11799 flags = DF frag = 0 ttl = 64 proto = tcp chksum = 0xe0b src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ TCP ]### sport = http dport = 48560 seq = 1340929229 ack = 1735910306 dataofs = 8 reserved = 0 flags = PA window = 512 chksum = 0x7bc1 urgptr = 0 options = [('NOP', None), ('NOP', None), ('Timestamp', (1527950463, 1527950455))] ###[ HTTP 1 ]### ###[ HTTP Response ]### Http_Version= HTTP/1.1 Status_Code= 200 Reason_Phrase= OK Accept_Patch= None Accept_Ranges= None Access_Control_Allow_Credentials= None Access_Control_Allow_Headers= None Access_Control_Allow_Methods= None Access_Control_Allow_Origin= None Access_Control_Expose_Headers= None Access_Control_Max_Age= None Age = None Allow = None Alt_Svc = None Cache_Control= None Connection= None Content_Disposition= None Content_Encoding= zstd Content_Language= None Content_Length= None Content_Location= None Content_MD5= None Content_Range= None Content_Security_Policy= None Content_Type= None Date = None Delta_Base= None ETag = None Expires = None IM = None Keep_Alive= None Last_Modified= None Link = None Location = None P3P = None Permanent = None Pragma = None Proxy_Authenticate= None Public_Key_Pins= None Refresh = None Retry_After= None Server = None Set_Cookie= None Status = None Strict_Transport_Security= None Timing_Allow_Origin= None Tk = None Trailer = None Transfer_Encoding= None Upgrade = None Vary = None Via = None WWW_Authenticate= None Warning = None X_Content_Duration= None X_Content_Security_Policy= None X_Content_Type_Options= None X_Correlation_ID= None X_Frame_Options= None X_Powered_By= None X_Request_ID= None X_UA_Compatible= None X_WebKit_CSP= None X_XSS_Protection= None Unknown_Headers= None ###[ Raw ]### load = b'(\xb5/\xfd\x04XE\x03\x00\xf2\x06\x19\x1cp\x89\x1b\xf6O!\x1a\xbb(\xda\x9a\x1c4\xb8h\x1f\xd2\x82\xd7\x01\x8d6\xe5W\x1d\x0f8\x10\xa9\xa9\x862\x96=\xd4\xce-\xa9+\x01\x92\x94\xa8\x17#\xb7\xec\x9fn\x96#\xb6\x13R\x97\xb2\x14\xf6\x0e\x9dWp\xf0-{\x87L*\x92\x105h\x8d\xd9\xe6A\xbc\xf7s\x84\x07~\xefH\xd1\x91\r\xef\x0b\x86\x8ek\x86\x12\xaf\xb6\x05\x04\x01\x00)R\xd2\xfa' >>> assert HTTPResponse in pkts[0] >>> assert pkts[0].Content_Encoding == b'zstd' >>> assert pkts[0].load == data >>> >>> >>> conf.contribs["http"]["auto_compression"] = True >>> pkts = sniff(offline=filename) >>> >>> pkts[0].show() ###[ Ethernet ]### dst = 00:00:00:00:00:00 src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 212 id = 11799 flags = DF frag = 0 ttl = 64 proto = tcp chksum = 0xe0b src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ TCP ]### sport = http dport = 48560 seq = 1340929229 ack = 1735910306 dataofs = 8 reserved = 0 flags = PA window = 512 chksum = 0x7bc1 urgptr = 0 options = [('NOP', None), ('NOP', None), ('Timestamp', (1527950463, 1527950455))] ###[ HTTP 1 ]### ###[ HTTP Response ]### Http_Version= HTTP/1.1 Status_Code= 200 Reason_Phrase= OK Accept_Patch= None Accept_Ranges= None Access_Control_Allow_Credentials= None Access_Control_Allow_Headers= None Access_Control_Allow_Methods= None Access_Control_Allow_Origin= None Access_Control_Expose_Headers= None Access_Control_Max_Age= None Age = None Allow = None Alt_Svc = None Cache_Control= None Connection= None Content_Disposition= None Content_Encoding= zstd Content_Language= None Content_Length= None Content_Location= None Content_MD5= None Content_Range= None Content_Security_Policy= None Content_Type= None Date = None Delta_Base= None ETag = None Expires = None IM = None Keep_Alive= None Last_Modified= None Link = None Location = None P3P = None Permanent = None Pragma = None Proxy_Authenticate= None Public_Key_Pins= None Refresh = None Retry_After= None Server = None Set_Cookie= None Status = None Strict_Transport_Security= None Timing_Allow_Origin= None Tk = None Trailer = None Transfer_Encoding= None Upgrade = None Vary = None Via = None WWW_Authenticate= None Warning = None X_Content_Duration= None X_Content_Security_Policy= None X_Content_Type_Options= None X_Correlation_ID= None X_Frame_Options= None X_Powered_By= None X_Request_ID= None X_UA_Compatible= None X_WebKit_CSP= None X_XSS_Protection= None Unknown_Headers= None ###[ Raw ]### load = b'GET /tmp_echo_zstd_request_for_testing HTTP/1.1\r\nHost: localhost:8080\r\nUser-Agent: curl/7.72.0\r\nAccept: */*\r\n\r\n' >>> assert HTTPResponse in pkts[0] >>> assert b'tmp_echo_zstd_request_for_testing' in pkts[0].load ###(008)=[passed] HTTP PSH bug fix >>> filename = scapy_path("/test/pcaps/http_tcp_psh.pcap.gz") >>> >>> pkts = sniff(offline=filename, session=TCPSession) >>> >>> assert len(pkts) == 14 >>> assert pkts[5].User_Agent == b'example_user_agent' >>> >>> assert int(pkts[7][HTTP].Content_Length.decode()) == len(pkts[7][Raw].load) ###(009)=[passed] HTTP build >>> pkt = TCP()/HTTP()/HTTPRequest(Method=b'GET', Path=b'/download', Http_Version=b'HTTP/1.1', Accept=b'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', Accept_Encoding=b'gzip, deflate', Accept_Language=b'en-US,en;q=0.5', Cache_Control=b'max-age=0', Connection=b'keep-alive', Host=b'scapy.net', User_Agent=b'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0') >>> raw_pkt = raw(pkt) No IP underlayer to compute checksum. Leaving null. >>> raw_pkt b'\x00P\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x00\x00\x00\x00GET /download HTTP/1.1\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-US,en;q=0.5\r\nCache-Control: max-age=0\r\nConnection: keep-alive\r\nContent-Length: 0\r\nHost: scapy.net\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0\r\n\r\n' >>> assert raw_pkt == b'\x00P\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x00\x00\x00\x00GET /download HTTP/1.1\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-US,en;q=0.5\r\nCache-Control: max-age=0\r\nConnection: keep-alive\r\nContent-Length: 0\r\nHost: scapy.net\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0\r\n\r\n' ###(010)=[passed] HTTP 1.1 -> HTTP 2.0 Upgrade (h2c) >>> conf.debug_dissector = True >>> load_layer("http") >>> from scapy.contrib.http2 import H2Frame >>> >>> import os >>> >>> filename = scapy_path("/test/pcaps/http2_h2c.pcap") >>> >>> pkts = sniff(offline=filename, session=TCPSession) >>> >>> assert HTTPResponse in pkts[1] >>> assert pkts[1].Connection == b"Upgrade" >>> assert H2Frame in pkts[1] >>> assert pkts[1][H2Frame].settings[0].id == 3 >>> >>> for i in range(3, 10): ... assert HTTP not in pkts[i] ... assert H2Frame in pkts[i] ... ###(011)=[passed] Test chunked with gzip >>> conf.contribs["http"]["auto_compression"] = False >>> conf.contribs["http"]["auto_chunk"] = False >>> z = b'\x1f\x8b\x08\x00S\\-_\x02\xff\xb3\xc9(\xc9\xcd\xb1\xcb\xcd)\xb0\xd1\x07\xb3\x00\xe6\xedpt\x10\x00\x00\x00' >>> a = IP(dst="1.1.1.1", src="2.2.2.2")/TCP(seq=1)/HTTP()/HTTPResponse(Content_Encoding="gzip", Transfer_Encoding="chunked")/(b"5\r\n" + z[:5] + b"\r\n") >>> b = IP(dst="1.1.1.1", src="2.2.2.2")/TCP(seq=len(a[TCP].payload)+1)/HTTP()/(hex(len(z[5:])).encode()[2:] + b"\r\n" + z[5:] + b"\r\n0\r\n\r\n") >>> xa, xb = IP(raw(a)), IP(raw(b)) >>> conf.contribs["http"]["auto_compression"] = True >>> conf.contribs["http"]["auto_chunk"] = True >>> >>> c = sniff(offline=[xa, xb], session=TCPSession)[0] >>> import gzip >>> assert gzip.decompress(z) == c.load ###### ## Test HTTP client/server ###### ###(012)=[passed] Util function to launch HTTP_server >>> from scapy.layers.http import HTTP_Server, HTTP_AUTH_MECHS >>> >>> class run_httpserver: ... def __init__(self, mech=None, ssp=None, **kwargs): ... self.server = None ... self.mech = mech ... self.ssp = ssp ... self.kwargs = kwargs ... def __enter__(self): ... print("@ Starting http server") ... # Start server ... self.server = HTTP_Server.spawn( ... 8080, ... iface=conf.loopback_name, ... mech=self.mech, ssp=self.ssp, ... bg=True, ... **self.kwargs, ... ) ... # wait for it to start ... for i in range(10): ... sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ... sock.settimeout(1) ... try: ... sock.connect(("127.0.0.1", 8080)) ... break ... except Exception: ... time.sleep(0.5) ... finally: ... sock.close() ... else: ... raise TimeoutError ... print("@ Server started !") ... def __exit__(self, exc_type, exc_value, traceback): ... print("@ Stopping http server !") ... try: ... self.server.shutdown(socket.SHUT_RDWR) ... except OSError: ... pass ... self.server.close() ... if traceback: ... # failed ... print("\nTest failed.") ... raise traceback ... print("@ http server stopped !") ... ###(013)=[passed] HTTP_client fails to ask HTTP_server that required authentication >>> from scapy.layers.http import HTTP_Client >>> >>> with run_httpserver(mech=HTTP_AUTH_MECHS.NTLM, ssp=NTLMSSP(IDENTITIES={"user": MD4le("password")})): ... client = HTTP_Client() ... resp = client.request("http://127.0.0.1:8080") ... client.close() ... @ Starting http server Server HTTP_Server started listening on ('127.0.0.1', 8080) @ Server started ! ┃ Connecting to 127.0.0.1 on port 8080... ┃ Connection received from ('127.0.0.1', 32776) └ Connected from ('127.0.0.1', 32790) >> HTTP / GET '/' ┃ Connection received from ('127.0.0.1', 32790) > CLOSED > HTTP / GET '/' << HTTP / 401 Unauthorized X Connection to ('127.0.0.1', 8080) closed @ Stopping http server ! @ http server stopped ! >>> assert resp.Status_Code == b"401" X Server closed. ###(014)=[passed] HTTP_client asks HTTP_server with NTLMSSP >>> from scapy.layers.http import HTTP_Client >>> >>> with run_httpserver(mech=HTTP_AUTH_MECHS.NTLM, ssp=NTLMSSP(IDENTITIES={"user": MD4le("password")})): ... client = HTTP_Client( ... HTTP_AUTH_MECHS.NTLM, ... ssp=NTLMSSP(UPN="user", PASSWORD="password"), ... ) ... resp = client.request("http://127.0.0.1:8080") ... client.close() ... @ Starting http server Server HTTP_Server started listening on ('127.0.0.1', 8080) @ Server started ! ┃ Connecting to 127.0.0.1 on port 8080... └ Connected from ('127.0.0.1', 32816) >> HTTP / GET '/' ┃ Connection received from ('127.0.0.1', 32802) ┃ Connection received from ('127.0.0.1', 32816) > HTTP / GET '/' > CLOSED << HTTP / 401 Unauthorized >> HTTP / GET '/' > HTTP / GET '/' << HTTP / 401 Unauthorized >> HTTP / GET '/' > HTTP / GET '/' > AUTH OK > HTTP / GET '/' -> 200 OK / Raw << HTTP / 200 OK / Raw X Connection to ('127.0.0.1', 8080) closed @ Stopping http server ! @ http server stopped ! >>> assert resp.load == b'

OK

' > CLOSED X Server closed. ###(015)=[passed] HTTP_Server with native python client with Basic auth >>> import urllib.request >>> from scapy.layers.http import HTTP_Client >>> >>> password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() >>> password_mgr.add_password(None, '127.0.0.1:8080', "user", "password") >>> handler = urllib.request.HTTPBasicAuthHandler(password_mgr) >>> opener = urllib.request.build_opener(handler) >>> >>> with run_httpserver(mech=HTTP_AUTH_MECHS.BASIC, BASIC_IDENTITIES={"user": "password"}): ... with opener.open('http://127.0.0.1:8080/') as f: ... html = f.read().decode('utf-8') ... @ Starting http server Server HTTP_Server started listening on ('127.0.0.1', 8080) @ Server started ! ┃ Connection received from ('127.0.0.1', 32832) ┃ Connection received from ('127.0.0.1', 32838) > CLOSED > HTTP / GET '/' ┃ Connection received from ('127.0.0.1', 32850) > HTTP / GET '/' > AUTH OK > HTTP / GET '/' -> 200 OK / Raw @ Stopping http server ! @ http server stopped ! >>> assert html == "

OK

" > CLOSED X Server closed. ###(016)=[passed] HTTP_Server with native python client without auth >>> import urllib.request >>> >>> with run_httpserver(mech=HTTP_AUTH_MECHS.NONE): ... with urllib.request.urlopen('http://127.0.0.1:8080/') as f: ... html = f.read().decode('utf-8') ... @ Starting http server Server HTTP_Server started listening on ('127.0.0.1', 8080) @ Server started ! ┃ Connection received from ('127.0.0.1', 32854) ┃ Connection received from ('127.0.0.1', 32860) > CLOSED > HTTP / GET '/' -> 200 OK / Raw @ Stopping http server ! @ http server stopped ! >>> assert html == "

OK

" > CLOSED X Server closed. Scapy IPv4 layers tests ━ Run at 01:42:14 from [test/scapy/layers/inet.uts] by UTscapy in 1.157703161239624 └ Passed=64 └ Failed=0 ###### ## Test IP options ###### ###(000)=[passed] IP options individual assembly >>> r = raw(IPOption()) >>> r b'\x00\x02' >>> assert r == b'\x00\x02' >>> r = raw(IPOption_NOP()) >>> r b'\x01' >>> assert r == b'\x01' >>> r = raw(IPOption_EOL()) >>> r b'\x00' >>> assert r == b'\x00' >>> r = raw(IPOption_LSRR(routers=["1.2.3.4","5.6.7.8"])) >>> r b'\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08' >>> assert r == b'\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08' >>> r = raw(IPOption_Timestamp(internet_address='192.168.15.7', timestamp=11223344)) >>> r b'D\x0c\t\x01\xc0\xa8\x0f\x07\x00\xabA0' >>> assert r == b'D\x0c\t\x01\xc0\xa8\x0f\x07\x00\xabA0' >>> r = raw(IPOption_Timestamp(flg=0, length=8)) >>> r b'D\x08\t\x00\x00\x00\x00\x00' >>> assert r == b'D\x08\t\x00\x00\x00\x00\x00' ###(001)=[passed] IP options individual dissection >>> io = IPOption(b"\x00") >>> io >>> assert io.option == 0 and isinstance(io, IPOption_EOL) >>> io = IPOption(b"\x01") >>> io >>> assert io.option == 1 and isinstance(io, IPOption_NOP) >>> lsrr=b'\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08' >>> p=IPOption_LSRR(lsrr) >>> p >>> q=IPOption(lsrr) >>> q >>> assert p == q ###(002)=[passed] IP assembly and dissection with options >>> p = IP(src="9.10.11.12",dst="13.14.15.16",options=IPOption_SDBM(addresses=["1.2.3.4","5.6.7.8"]))/TCP() >>> r = raw(p) >>> r b'H\x00\x004\x00\x01\x00\x00@\x06\xa2q\t\n\x0b\x0c\r\x0e\x0f\x10\x95\n\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00_K\x00\x00' >>> assert r == b'H\x00\x004\x00\x01\x00\x00@\x06\xa2q\t\n\x0b\x0c\r\x0e\x0f\x10\x95\n\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00_K\x00\x00' >>> q=IP(r) >>> q , , ] |> >>> assert isinstance(q.options[0],IPOption_SDBM) >>> assert q[IPOption_SDBM].addresses[1] == "5.6.7.8" >>> p.options[0].addresses[0] = '5.6.7.8' >>> assert IP(raw(p)).options[0].addresses[0] == '5.6.7.8' >>> p = IP(src="9.10.11.12", dst="13.14.15.16", options=[IPOption_NOP(),IPOption_LSRR(routers=["1.2.3.4","5.6.7.8"]),IPOption_Security(transmission_control_code="XYZ")])/TCP() >>> p , , ] |> >>> r = raw(p) >>> r b'K\x00\x00@\x00\x01\x00\x00@\x06\xf3\x83\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08\x82\x0b\x00\x00\x00\x00\x00\x00XYZ\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00o[\x00\x00' >>> assert r == b'K\x00\x00@\x00\x01\x00\x00@\x06\xf3\x83\t\n\x0b\x0c\r\x0e\x0f\x10\x01\x83\x0b\x04\x01\x02\x03\x04\x05\x06\x07\x08\x82\x0b\x00\x00\x00\x00\x00\x00XYZ\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00o[\x00\x00' >>> q = IP(r) >>> q , , , ] |> >>> assert q[IPOption_LSRR].get_current_router() == "1.2.3.4" >>> assert q[IPOption_Security].transmission_control_code == b"XYZ" >>> assert q[TCP].flags == 2 ###### ## Sessions ###### ###(003)=[passed] IPSession - dissect fragmented IP packets on-the-flow >>> packet = IP()/("data"*1000) >>> frags = fragment(packet) >>> tmp_file = get_temp_file() >>> wrpcap(tmp_file, frags) >>> >>> dissected_packets = [] >>> def callback(pkt): ... dissected_packets.append(pkt) ... >>> sniff(offline=tmp_file, session=IPSession, prn=callback) >>> assert len(dissected_packets) == 1 >>> assert raw(dissected_packets[0]) == raw(packet) ###(004)=[passed] IPSession - contains non-IP packets >>> pkts = fragment(IP(dst="10.0.0.5")/ICMP()/("X"*1500)) >>> pkts.insert(1, ARP()) >>> assert len(pkts) == 3 >>> >>> pkts = sniff(offline=pkts, session=IPSession) >>> assert len(pkts) == 2 >>> assert pkts[1].load == b"X" * 1500 ###(005)=[passed] StringBuffer >>> buffer = StringBuffer() >>> assert not buffer >>> >>> buffer.append(b"kie", 5) >>> buffer.append(b"e", 11) >>> buffer.append(b"pi", 2) >>> buffer.append(b"pi", 9) >>> buffer.append(b"n", 4) >>> >>> assert bytes_hex(bytes(buffer)) == b'0070696e6b696500706965' >>> assert len(buffer) == 11 >>> assert buffer >>> >>> buffer = StringBuffer() >>> buffer.append(b"") >>> assert not buffer >>> assert bytes(buffer) == b"" ###### ## Test fragment() / defragment() functions ###### ###(006)=[passed] fragment() create the packet create the fragments count the fragments each fragment except the last one should have MF set each fragment except the last one should have a payload of fragsize bytes >>> payloadlen, fragsize = 100, 8 >>> assert fragsize % 8 == 0 >>> fragcount = (payloadlen // fragsize) + bool(payloadlen % fragsize) >>> pkt = IP() / ("X" * payloadlen) >>> frags = fragment(pkt, fragsize) >>> assert len(frags) == fragcount >>> assert all(p.flags == 1 for p in frags[:-1]) >>> assert frags[-1].flags == 0 >>> assert all(len(p.payload) == 8 for p in frags[:-1]) >>> assert len(frags[-1].payload) == ((payloadlen % fragsize) or fragsize) ###(007)=[passed] fragment() and overloaded_fields >>> pkt1 = Ether() / IP() / UDP() >>> pkt2 = fragment(pkt1)[0] >>> pkt3 = pkt2.__class__(raw(pkt2)) >>> assert pkt1[IP].proto == pkt2[IP].proto == pkt3[IP].proto ###(008)=[passed] fragment() already fragmented packets each fragment except the last one should have MF set fragment offset should be well computed >>> payloadlen = 1480 * 3 >>> ffrags = fragment(IP() / ("X" * payloadlen), 1480) >>> ffrags = fragment(ffrags, 1400) >>> len(ffrags) == 6 True >>> assert all(p.flags == 1 for p in ffrags[:-1]) >>> assert ffrags[-1].flags == 0 >>> plen = 0 >>> for p in ffrags: ... assert p.frag == plen // 8 ... plen += len(p.payload) ... >>> assert plen == payloadlen ###(009)=[passed] fragment() with non-multiple-of-8 MTU >>> paylen = 1400 + 1 >>> frags1 = fragment(IP() / ("X" * paylen), paylen) >>> assert len(frags1) == 1 >>> frags2 = fragment(IP() / ("X" * (paylen + 1)), paylen) >>> assert len(frags2) == 2 >>> assert len(frags2[0]) == 20 + paylen - paylen % 8 >>> assert len(frags2[1]) == 20 + 1 + paylen % 8 ###(010)=[passed] fragment() with fragsize lower than 8 >>> paylen = 5 >>> fragsize = paylen >>> frags1 = fragment(IP() / ("X" * paylen), paylen) fragsize cannot be lower than 8 >>> assert len(frags1) == 1 >>> assert bytes(frags1[0].payload) == b"X" * paylen >>> >>> fragsize = paylen + 1 >>> frags2 = fragment(IP() / ("X" * paylen), fragsize) fragsize cannot be lower than 8 >>> assert len(frags2) == 1 >>> assert bytes(frags2[0].payload) == b"X" * paylen >>> >>> paylen = 16 >>> fragsize = 5 >>> frags3 = fragment(IP() / ("X" * paylen), fragsize) more fragsize cannot be lower than 8 >>> assert len(frags3) == 2 >>> assert bytes(frags3[0].payload) == b"X" * 8 >>> assert bytes(frags3[1].payload) == b"X" * 8 ###(011)=[passed] defrag() >>> nonfrag, unfrag, badfrag = defrag(frags) >>> assert not nonfrag >>> assert not badfrag >>> assert len(unfrag) == 1 ###(012)=[passed] defragment() we should have one single packet which should be the same as pkt reconstructed >>> defrags = defragment(frags) >>> assert len(defrags) == 1 >>> assert bytes(defrags[0]) == bytes(pkt) ###(013)=[passed] defragment() uses timestamp of last fragment >>> payloadlen, fragsize = 100, 8 >>> assert fragsize % 8 == 0 >>> packet = Ether()/IP()/("X" * payloadlen) >>> frags = fragment(packet, fragsize) >>> for i,frag in enumerate(frags): ... frag.time -= 100 + i ... >>> last_time = max(frag.time for frag in frags) >>> defrags = defragment(frags) >>> assert defrags[0].time == last_time >>> nonfrag, defrags, badfrag = defrag(frags) >>> assert defrags[0].time == last_time ###(014)=[passed] defragment() - Missing fragments >>> pkts = fragment(IP(dst="10.0.0.5")/ICMP()/("X"*1500)) >>> assert len(defragment(pkts[1:])) == 1 Fragment overlap (0 < 1480) on > ###(015)=[passed] defrag() / defragment() - Real DNS packets >>> import base64 >>> >>> a = base64.b64decode('bnmYJ63mREVTUwEACABFAAV0U8UgADIR+u0EAgIECv0DxAA1sRIL83Z7gbCBgAABAB0AAAANA255YwNnb3YAAP8AAcAMAAYAAQAAA4QAKgZ2d2FsbDDADApob3N0bWFzdGVywAx4Og5wAAA4QAAADhAAJOoAAAACWMAMAC4AAQAAA4QAmwAGCAIAAAOEWWm9jVlgdP0mfQNueWMDZ292AHjCDBL0C1rEKUjsuG6Zg3+Rs6gj6llTABm9UZnWk+rRu6nPqW4N7AEllTYqNK+r6uFJ2KhfG3MDPS1F/M5QCVR8qkcbgrqPVRBJAG67/ZqpGORppQV6ib5qqo4ST5KyrgKpa8R1fWH8Fyp881NWLOZekM3TQyczcLFrvw9FFjdRwAwAAQABAAADhAAEobkenMAMAC4AAQAAA4QAmwABCAIAAAOEWWm9jVlgdP0mfQNueWMDZ292ABW8t5tEv9zTLdB6UsoTtZIF6Kx/c4ukIud8UIGM0XdXnJYx0ZDyPDyLVy2rfwmXdEph3KBWAi5dpRT16nthlMmWPQxD1ecg9rc8jcaTGo8z833fYJjzPT8MpMTxhapu4ANSBVbv3LRBnce2abu9QaoCdlHPFHdNphp6JznCLt4jwAwAMAABAAADhAEIAQEDCAMBAAF77useCfI+6T+m6Tsf2ami8/q5XDtgS0Ae7F0jUZ0cpyYxy/28DLFjJaS57YiwAYaabkkugxsoSv9roqBNZjD+gjoUB+MK8fmfaqqkSOgQuIQLZJeOORWD0gAj8mekw+S84DECylbKyYEGf8CB3/59IfV+YkTcHhXBYrMNxhMK1Eiypz4cgYxXiYUSz7jbOmqE3hU2GinhRmNW4Trt4ImUruSO+iQbTTj6LtCtIsScOF4vn4gcLJURLHOs+mf1NU9Yqq9mPC9wlYZk+8rwqcjVIiRpDmmv83huv4be1x1kkz2YqTFwtc33Fzt6SZk96Qtk2wCgg8ZQqLKGx5uwIIyrwAwAMAABAAADhAEIAQEDCAMBAAGYc7SWbSinSc3u8ZcYlO0+yZcJD1vqC5JARxZjKNzszHxc9dpabBtR9covySVu1YaBVrlxNBzfyFd4PKyjvPcBER5sQImoCikC+flD5NwXJbnrO1SG0Kzp8XXDCZpBASxuBF0vjUSU9yMqp0FywCrIfrbfCcOGAFIVP0M2u8dVuoI4nWbkRFc0hiRefoxc1O2IdpR22GAp2OYeeN2/tnFBz/ZMQitU2IZIKBMybKmWLC96tPcqVdWJX6+M1an1ox0+NqBZuPjsCx0/lZbuB/rLHppJOmkRc7q2Fw/tpHOyWHV+ulCfXem9Up/sbrMcP7uumFz0FeNhBPtg3u5kA5OVwAwAMAABAAADhACIAQADCAMBAAF5mlzmmq8cs6Hff0qZLlGKYCGPlG23HZw2qAd7N2FmrLRqPQ0R/hbnw54MYiIs18zyfm2J+ZmzUvGd+gjHGx3ooRRffQQ4RFLq6g6oxaLTbtvqPFbWt4Kr2GwX3UslgZCzH5mXLNpPI2QoetIcQCNRdcxn5QpWxPppCVXbKdNvvcAMADAAAQAAA4QAiAEAAwgDAQABqeGHtNFc0Yh6Pp/aM+ntlDW1fLwuAWToGQhmnQFBTiIUZlH7QMjwh5oMExNp5/ABUb3qBsyk9CLanRfateRgFJCYCNYofrI4S2yqT5X9vvtCXeIoG/QqMSl3PJk4ClYufIKjMPgl5IyN6yBIMNmmsATlMMu5TxM68a/CLCh92L3ADAAuAAEAAAOEAJsAMAgCAAADhFlpvY1ZYHT9Jn0DbnljA2dvdgAViVpFoYwy9dMUbOPDHTKt/LOtoicvtQbHeXiUSQeBkGWTLyiPc/NTW9ZC4WK5AuSj/0+V') >>> b = base64.b64decode('bnmYJ63mREVTUwEACABFAAV0U8UgrDIR+kEEAgIECv0DxApz1F5olFRytjhNlG/JbdW0NSAFeUUF4rBRqsly/h6nFWKoQfih35Lm+BFLE0FoMaikWCjGJQIuf0CXiElMSQifiDM+KTeecNkCgTXADAAuAAEAAAOEARsAMAgCAAADhFlpvY1ZYHT9VwUDbnljA2dvdgAdRZxvC6VlbYUVarYjan0/PlP70gSz1SiYCDZyw5dsGo9vrZd+lMcAm5GFjtKYDXeCb5gVuegzHSNzxDQOa5lVKLQZfXgVHsl3jguCpYwKAygRR3mLBGtnhPrbYcPGMOzIxO6/UE5Hltx9SDqKNe2+rtVeZs5FyHQE5pTVGVjNED9iaauEW9UF3bwEP3K+wLgxWeVycjNry/l4vt9Z0fyTU15kogCZG8MXyStJlzIgdzVZRB96gTJbGBDRFQJfbE2Af+INl0HRY4p+bqQYwFomWg6Tzs30LcqAnkptknb5peUNmQTBI/MU00A6NeVJxkKK3+lf2EuuiJl+nFpfWiKpwAwAMwABAAADhAAJAQAADASqu8zdwAwALgABAAADhACbADMIAgAAA4RZab2NWWB0/SZ9A255YwNnb3YAVhcqgSl33lqjLLFR8pQ2cNhdX7dKZ2gRy0vUHOa+980Nljcj4I36rfjEVJCLKodpbseQl0OeTsbfNfqOmi1VrsypDl+YffyPMtHferm02xBK0agcTMdP/glpuKzdKHTiHTlnSOuBpPnEpgxYPNeBGx8yzMvIaU5rOCxuO49Sh/PADAACAAEAAAOEAAoHdndhbGw0YcAMwAwAAgABAAADhAAKB3Z3YWxsMmHADMAMAAIAAQAAA4QACgd2d2FsbDNhwAzADAACAAEAAAOEAAoHdndhbGwxYcAMwAwALgABAAADhACbAAIIAgAAA4RZab2NWWB0/SZ9A255YwNnb3YANn7LVY7YsKLtpH7LKhUz0SVsM/Gk3T/V8I9wIEZ4vEklM9hI92D2aYe+9EKxOts+/py6itZfANXU197pCufktASDxlH5eWSc9S2uqrRnUNnMUe4p3Jy9ZCGhiHDemgFphKGWYTNZUJoML2+SDzbv9tXo4sSbZiKJCDkNdzSv2lfADAAQAAEAAAOEAEVEZ29vZ2xlLXNpdGUtdmVyaWZpY2F0aW9uPWMycnhTa2VPZUxpSG5iY24tSXhZZm5mQjJQcTQzU3lpeEVka2k2ODZlNDTADAAQAAEAAAOEADc2dj1zcGYxIGlwNDoxNjEuMTg1LjIuMC8yNSBpcDQ6MTY3LjE1My4xMzIuMC8yNSBteCAtYWxswAwALgABAAADhACbABAIAgAAA4RZab2NWWB0/SZ9A255YwNnb3YAjzLOj5HUtVGhi/emNG90g2zK80hrI6gh2d+twgVLYgWebPeTI2D2ylobevXeq5rK5RQgbg2iG1UiTBnlKPgLPYt8ZL+bi+/v5NTaqHfyHFYdKzZeL0dhrmebRbYzG7tzOllcAOOqieeO29Yr4gz1rpiU6g75vkz6yQoHNfmNVMXADAAPAAEAAAOEAAsAZAZ2d2FsbDLADMAMAA8AAQAAA4QACwBkBnZ3YWxsNMAMwAwADwABAAADhAALAAoGdndhbGwzwAzADAAPAAEAAAOEAAsACgZ2d2FsbDXADMAMAA8AAQAAA4QACwAKBnZ3YWxsNsAMwAwADwABAAADhAALAAoGdndhbGw3wAzADAAPAAEAAAOEAAsACgZ2d2FsbDjADMAMAA8AAQAAA4QACwBkBnZ3YWxsMcAMwAwALgABAAADhACbAA8IAgAAA4RZab2NWWB0/SZ9A255YwNnb3YAooXBSj6PfsdBd8sEN/2AA4cvOl2bcioO') >>> c = base64.b64decode('bnmYJ63mREVTUwEACABFAAFHU8UBWDIRHcMEAgIECv0DxDtlufeCT1zQktat4aEVA8MF0FO1sNbpEQtqfu5Al//OJISaRvtaArR/tLUj2CoZjS7uEnl7QpP/Ui/gR0YtyLurk9yTw7Vei0lSz4cnaOJqDiTGAKYwzVxjnoR1F3n8lplgQaOalVsHx9UAAQABAAADLAAEobkBA8epAAEAAQAAAywABKG5AQzHvwABAAEAAAMsAASnmYIMx5MAAQABAAADLAAEp5mCDcn9AAEAAQAAAqUABKeZhAvKFAABAAEAAAOEAAShuQIfyisAAQABAAADhAAEobkCKcpCAAEAAQAAA4QABKG5AjPKWQABAAEAAAOEAAShuQI9ynAAAQABAAADhAAEobkCC8nPAAEAAQAAA4QABKG5AgzJ5gABAAEAAAOEAASnmYQMAAApIAAAAAAAAAA=') >>> d = base64.b64decode('////////REVTUwEACABFAABOawsAAIARtGoK/QExCv0D/wCJAIkAOry/3wsBEAABAAAAAAAAIEVKRkRFQkZFRUJGQUNBQ0FDQUNBQ0FDQUNBQ0FDQUFBAAAgAAEAABYP/WUAAB6N4XIAAB6E4XsAAACR/24AADyEw3sAABfu6BEAAAkx9s4AABXB6j4AAANe/KEAAAAT/+wAAB7z4QwAAEuXtGgAAB304gsAABTB6z4AAAdv+JAAACCu31EAADm+xkEAABR064sAABl85oMAACTw2w8AADrKxTUAABVk6psAABnF5joAABpA5b8AABjP5zAAAAqV9WoAAAUW+ukAACGS3m0AAAEP/vAAABoa5eUAABYP6fAAABX/6gAAABUq6tUAADXIyjcAABpy5Y0AABzb4yQAABqi5V0AAFXaqiUAAEmRtm4AACrL1TQAAESzu0wAAAzs8xMAAI7LcTQAABxN47IAAAbo+RcAABLr7RQAAB3Q4i8AAAck+NsAABbi6R0AAEdruJQAAJl+ZoEAABDH7zgAACOA3H8AAAB5/4YAABQk69sAAEo6tcUAABJU7asAADO/zEAAABGA7n8AAQ9L8LMAAD1DwrwAAB8F4PoAABbG6TkAACmC1n0AAlHErjkAABG97kIAAELBvT4AAEo0tcsAABtC5L0AAA9u8JEAACBU36sAAAAl/9oAABBO77EAAA9M8LMAAA8r8NQAAAp39YgAABB874MAAEDxvw4AAEgyt80AAGwsk9MAAB1O4rEAAAxL87QAADtmxJkAAATo+xcAAAM8/MMAABl55oYAACKh3V4AACGj3lwAAE5ssZMAAC1x0o4AAAO+/EEAABNy7I0AACYp2dYAACb+2QEAABB974IAABc36MgAAA1c8qMAAAf++AEAABDo7xcAACLq3RUAAA8L8PQAAAAV/+oAACNU3KsAABBv75AAABFI7rcAABuH5HgAABAe7+EAAB++4EEAACBl35oAAB7c4SMAADgJx/YAADeVyGoAACKN3XIAAA/C8D0AAASq+1UAAOHPHjAAABRI67cAAABw/48=') >>> >>> with no_debug_dissector(): ... plist = PacketList([Ether(x) for x in [a, b, c, d]]) ... >>> left, defragmented, errored = defrag(plist) >>> assert len(left) == 1 >>> assert left[0] == Ether(d) >>> assert len(defragmented) == 1 >>> assert len(defragmented[0]) == 3093 >>> assert defragmented[0][DNSRR].rrname == b'nyc.gov.' >>> assert len(errored) == 0 >>> >>> plist_def = defragment(plist) >>> assert len(plist_def) == 2 >>> assert len(plist_def[0]) == 3093 >>> assert plist_def[0][DNSRR].rrname == b'nyc.gov.' ###(016)=[passed] Packet().fragment() create the packet create the fragments count the fragments each fragment except the last one should have MF set each fragment except the last one should have a payload of fragsize bytes >>> payloadlen, fragsize = 100, 8 >>> assert fragsize % 8 == 0 >>> fragcount = (payloadlen // fragsize) + bool(payloadlen % fragsize) >>> pkt = IP() / ("X" * payloadlen) >>> frags = pkt.fragment(fragsize) >>> assert len(frags) == fragcount >>> assert all(p.flags == 1 for p in frags[:-1]) >>> assert frags[-1].flags == 0 >>> assert all(len(p.payload) == 8 for p in frags[:-1]) >>> assert len(frags[-1].payload) == ((payloadlen % fragsize) or fragsize) ###(017)=[passed] Packet().fragment() and overloaded_fields >>> pkt1 = Ether() / IP() / UDP() >>> pkt2 = pkt1.fragment()[0] >>> pkt3 = pkt2.__class__(raw(pkt2)) >>> assert pkt1[IP].proto == pkt2[IP].proto == pkt3[IP].proto ###(018)=[passed] Packet().fragment() already fragmented packets each fragment except the last one should have MF set fragment offset should be well computed >>> payloadlen = 1480 * 3 >>> ffrags = (IP() / ("X" * payloadlen)).fragment(1480) >>> ffrags = reduce(lambda x, y: x + y, (pkt.fragment(1400) for pkt in ffrags)) >>> len(ffrags) == 6 True >>> assert all(p.flags == 1 for p in ffrags[:-1]) >>> assert ffrags[-1].flags == 0 >>> plen = 0 >>> for p in ffrags: ... assert p.frag == plen / 8 ... plen += len(p.payload) ... >>> assert plen == payloadlen ###### ## TCP/IP tests ###### ###(019)=[passed] TCP options: UTO - basic build >>> raw(TCP(options=[("UTO", 0xffff)])) == b"\x00\x14\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x60\x02\x20\x00\x00\x00\x00\x00\x1c\x04\xff\xff" No IP underlayer to compute checksum. Leaving null. True ###(020)=[passed] TCP options: UTO - basic dissection >>> uto = TCP(b"\x00\x14\x00\x50\x00\x00\x00\x00\x00\x00\x00\x00\x60\x02\x20\x00\x00\x00\x00\x00\x1c\x04\xff\xff") >>> uto[TCP].options[0][0] == "UTO" and uto[TCP].options[0][1] == 0xffff True ###(021)=[passed] TCP options: SAck - basic build >>> raw(TCP(options=[(5, b"abcdefgh")])) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02 \x00\x00\x00\x00\x00\x05\nabcdefgh\x00\x00" No IP underlayer to compute checksum. Leaving null. True ###(022)=[passed] TCP options: SAck - basic dissection >>> sack = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02 \x00\x00\x00\x00\x00\x05\nabcdefgh\x00\x00") >>> sack[TCP].options[0][0] == "SAck" and sack[TCP].options[0][1] == (1633837924, 1701209960) True ###(023)=[passed] TCP options: SAckOK - basic build >>> raw(TCP(options=[('SAckOK', b'')])) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x04\x02\x00\x00" No IP underlayer to compute checksum. Leaving null. True ###(024)=[passed] TCP options: SAckOK - basic dissection >>> sackok = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x04\x02\x00\x00") >>> sackok[TCP].options[0][0] == "SAckOK" and sackok[TCP].options[0][1] == b'' True ###(025)=[passed] TCP options: EOL - basic build >>> raw(TCP(options=[(0, '')])) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x00\x00\x00\x00" No IP underlayer to compute checksum. Leaving null. True ###(026)=[passed] TCP options: EOL - basic dissection >>> eol = TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x00\x02\x00\x00") >>> eol[TCP].options[0][0] == "EOL" and eol[TCP].options[0][1] == None True ###(027)=[passed] TCP options: malformed - build >>> raw(TCP(options=[('unknown', b'')])) == raw(TCP()) Option [unknown] unknown. Skipped. Option [unknown] unknown. Skipped. No IP underlayer to compute checksum. Leaving null. No IP underlayer to compute checksum. Leaving null. True ###(028)=[passed] TCP options: malformed - dissection >>> raw(TCP(b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x03\x00\x00\x00")) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00`\x02 \x00\x00\x00\x00\x00\x03\x00\x00\x00" Malformed TCP option (announced length is 0) True ###(029)=[passed] TCP options: wrong offset >>> TCP(raw(TCP(dataofs=11)/b"o")) No IP underlayer to compute checksum. Leaving null. Malformed TCP option (announced length is 0) ###(030)=[passed] TCP options: MPTCP - basic build using bytes >>> raw(TCP(options=[(30, b"\x10\x03\xc1\x1c\x95\x9b\x81R_1")])) == b"\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02 \x00\x00\x00\x00\x00\x1e\x0c\x10\x03\xc1\x1c\x95\x9b\x81R_1" No IP underlayer to compute checksum. Leaving null. True ###(031)=[passed] TCP options: MD5 build and parse >>> md5sig = b"0123456789abcdef" >>> p = IP() / TCP(options=[('MD5', md5sig)]) >>> md5opt = IP(raw(p))[TCP].options[0] >>> md5opt[0] == 'MD5' True >>> md5opt[1] == md5sig True ###(032)=[passed] TCP options: MD5 IPv4 (depends on default values) >>> p = IP() / TCP() >>> mac = calc_tcp_md5_hash(p[TCP], b"12345") >>> assert mac == bytearray.fromhex("797e69f8dbe44a8b84f687a2832595ed") ###(033)=[passed] TCP options: MD5 IPv6 (depends on default values) >>> p = IPv6() / TCP() >>> mac = calc_tcp_md5_hash(p[TCP], b"12345") >>> assert mac == bytearray.fromhex("3711309b0305a4269ec5dbc27183e9a0") ###(034)=[passed] TCP options: MD5 sign (depends on default values) >>> p = IP() / TCP() >>> sign_tcp_md5(p[TCP], b"12345") >>> raw(p[TCP]) == bytearray.fromhex("001400500000000000000000a0022000fec200001312797e69f8dbe44a8b84f687a2832595ed0000") True >>> md5opt = IP(raw(p))[TCP].options[0] >>> md5opt[1] == bytearray.fromhex("797e69f8dbe44a8b84f687a2832595ed") True ###(035)=[passed] TCP Authentication Option: build >>> opt = TCPAOValue(keyid=1, rnextkeyid=2, mac=b"FAKE") >>> assert opt.keyid == 1 >>> assert opt.rnextkeyid == 2 >>> assert opt.mac == b"FAKE" >>> assert bytes(opt) == b"\x01\x02FAKE" ###(036)=[passed] TCP Authentication Option: parse >>> opt = TCPAOValue(b"\x01\x02FAKE") >>> assert opt.keyid == 1 >>> assert opt.rnextkeyid == 2 >>> assert opt.mac == b"FAKE" ###(037)=[passed] TCP Authentication Option: parse from TCP >>> p = IP(bytes.fromhex("45e0004cdd0f4000ff06bf6b0a0b0c0dac1b1c1de9d700b3fbfbab5a00000000e002ffffcac40000020405b4010303080402080a00155ab7000000001d103d542ee437c6f8ede6d7c4d602e7")) >>> tcpao = get_tcpao(p[TCP]) >>> assert isinstance(tcpao, TCPAOValue) >>> assert tcpao.keyid == 61 >>> assert tcpao.rnextkeyid == 84 >>> assert tcpao.mac == bytearray.fromhex("2ee437c6f8ede6d7c4d602e7") ###(038)=[passed] TCP Authentication Option: build TCP >>> p = TCP(options=[('AO', TCPAOValue(keyid=1, rnextkeyid=2, mac=b"3456"))]) >>> p.summary() 'TCP ftp_data > http S' >>> print(bytes(p)) No IP underlayer to compute checksum. Leaving null. b'\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00p\x02 \x00\x00\x00\x00\x00\x1d\x08\x01\x023456' >>> assert bytes(p).endswith(b"\x01\x023456") No IP underlayer to compute checksum. Leaving null. ###(039)=[passed] TCP options: invalid data offset >>> data = b'\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x80\x02 \x00\x1b\xb8\x00\x00\x02\x04\x05\xb4\x04\x02\x08\x06\xf7\xa26C\x00\x00\x00\x00\x01\x03\x03\x07' >>> p = TCP(data) >>> assert TCP in p and Raw in p and len(p.options) == 3 ###(040)=[passed] TCP options: build oversized packet >>> raw(TCP(options=[('TFO', (1607681672, 2269173587)), ('AltChkSum', (81, 27688)), ('TFO', (253281879, 1218258937)), ('Timestamp', (1613741359, 4215831072)), ('Timestamp', (3856332598, 1434258666))])) No IP underlayer to compute checksum. Leaving null. b'\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x10\x02 \x00\x00\x00\x00\x00"\n_\xd3F\x88\x87@\xd7S\x0e\x05Ql("\n\x0f\x18\xc6WH\x9d\'\xf9\x08\n`/\xbd/\xfbHz \x08\n\xe5\xda\xf76U}\x0c\xea\x00\x00\x00' ###(041)=[passed] TCP random options >>> pkt = TCP() >>> random.seed(0x2807) >>> pkt = fuzz(pkt) >>> options = pkt.options._fix() >>> options [('UTO', (53062,)), ('Timestamp', (725644109, 3830853589)), ('WScale', (69,)), ('TFO', (1740332174, 38044154)), ('Timestamp', (828782501, 1065035911))] ###(042)=[passed] TCP random options - MD5 (#GH3777) >>> random.seed(0x2813) >>> pkt = TCP(options=RandTCPOptions()._fix()) >>> assert pkt.options[0][0] == "MD5" >>> assert pkt.options[0][1] == (b'\xe3\xa0,\xdc\xe4\xae\x87\x18\xad{\xab\xd0b\x12\x9c\xd6',) >>> assert TCP(bytes(pkt)).options[0][0] == "MD5" No IP underlayer to compute checksum. Leaving null. ###(043)=[passed] IP, TCP & UDP checksums (these tests highly depend on default values) Invalid territory >>> pkt = IP() / TCP() >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c >>> >>> pkt = IP(len=40) / TCP() >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c >>> >>> pkt = IP(len=40, ihl=5) / TCP() >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7ccd and bpkt.payload.chksum == 0x917c >>> >>> pkt = IP() / TCP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c >>> >>> pkt = IP(len=50) / TCP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c >>> >>> pkt = IP(len=50, ihl=5) / TCP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7cc3 and bpkt.payload.chksum == 0x4b2c >>> >>> pkt = IP(options=[IPOption_RR()]) / TCP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c >>> >>> pkt = IP(len=54, options=[IPOption_RR()]) / TCP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c >>> >>> pkt = IP(len=54, ihl=6, options=[IPOption_RR()]) / TCP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x70bc and bpkt.payload.chksum == 0x4b2c >>> >>> pkt = IP(options=[IPOption_Timestamp()]) / TCP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x2caa and bpkt.payload.chksum == 0x4b2c >>> >>> pkt = IP() / UDP() >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172 >>> >>> pkt = IP(len=28) / UDP() >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172 >>> >>> pkt = IP(len=28, ihl=5) / UDP() >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7cce and bpkt.payload.chksum == 0x0172 >>> >>> conf.debug_dissector = False >>> >>> pkt = IP() / UDP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17 >>> >>> pkt = IP(len=38) / UDP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17 >>> >>> pkt = IP(len=38, ihl=5) / UDP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x7cc4 and bpkt.payload.chksum == 0xbb17 >>> >>> pkt = IP(options=[IPOption_RR()]) / UDP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17 >>> >>> pkt = IP(len=42, options=[IPOption_RR()]) / UDP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17 >>> >>> pkt = IP(len=42, ihl=6, options=[IPOption_RR()]) / UDP() / ("A" * 10) >>> bpkt = IP(raw(pkt)) >>> assert bpkt.chksum == 0x70bd and bpkt.payload.chksum == 0xbb17 >>> >>> conf.debug_dissector = True ###(044)=[passed] IP with forced-length 0 >>> p = IP()/TCP() >>> p[IP].len = 0 >>> p = IP(raw(p)) >>> >>> assert p.len == 0 ###(045)=[passed] TCP payload with IP Total Length 0 >>> data = b'1234567890abcdef123456789ABCDEF' >>> pkt = IP()/TCP()/data >>> pkt2 = IP(raw(pkt)) >>> pkt2.len = 0 >>> pkt3 = IP(raw(pkt2)) >>> assert pkt3.load == data ###(046)=[passed] TCPSession: test tcp_reassemble with variable orders >>> class CustomPacket(Packet): ... fields_desc = [ ... ByteField("len", 0), ... StrLenField("a", 0, length_from=lambda pkt: pkt.len - 1), ... ] ... @classmethod ... def tcp_reassemble(cls, data, metadata, session): ... length = struct.unpack("!B", data[:1])[0] ... if len(data) < length: ... return None ... return CustomPacket(data) ... >>> >>> bind_layers(TCP, CustomPacket, sport=12345) >>> >>> with no_debug_dissector(reverse=True): ... # incremental order ... pkts = sniff(offline=[ ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=1)/b"\x05a", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=3)/"b", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=4)/"c", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=5)/"d", ... ], session=TCPSession) ... assert pkts[0][CustomPacket].a == b"abcd", "incremental failure" ... # same with a pcapng ... tmp_file = get_temp_file() ... wrpcap(tmp_file, [ ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=1)/b"\x05a", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=3)/"b", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=4)/"c", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=5)/"d", ... ]) ... pkts = sniff(offline=tmp_file, session=TCPSession) ... assert pkts[0][CustomPacket].a == b"abcd", "pcapng failure" ... # messed up order: fragments 2 and 3 arrive in the wrong order ... pkts = sniff(offline=[ ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=1)/b"\x05a", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=4)/"c", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=3)/"b", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=5)/"d", ... ], session=TCPSession) ... assert pkts[0][CustomPacket].a == b"abcd", "messed up order 1 failure" ... # messed up order: fragment 1 arrives not in first position ... pkts = sniff(offline=[ ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=6)/"e", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=4)/"c", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=3)/"b", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=5)/"d", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=1)/b"\x06a", ... ], session=TCPSession) ... assert pkts[0][CustomPacket].a == b"abcde", "messed up order 2 failure" ... # retransmitted packets ... pkts = sniff(offline=[ ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=6)/"e", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=4)/"c", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=6)/"e", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=3)/"b", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=5)/"d", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=6)/"e", ... IP(dst="1.1.1.1", src="2.2.2.2")/TCP(sport=12345, dport=12, seq=1)/b"\x06a", ... ], session=TCPSession) ... assert pkts[0][CustomPacket].a == b"abcde", "retransmitted failure" ... >>> split_layers(TCP, CustomPacket, sport=12345) ###(047)=[passed] Layer binding Test DestMACField & DestIPField Same with IPv6 >>> pkt = Ether(raw(Ether()/IP()/UDP(dport=5353)/DNS())) >>> assert isinstance(pkt, Ether) and pkt.dst == '01:00:5e:00:00:fb' >>> pkt = pkt.payload >>> assert isinstance(pkt, IP) and pkt.dst == '224.0.0.251' >>> pkt = pkt.payload >>> assert isinstance(pkt, UDP) and pkt.dport == 5353 >>> pkt = pkt.payload >>> assert isinstance(pkt, DNS) and isinstance(pkt.payload, NoPayload) >>> >>> pkt = Ether(raw(Ether()/IPv6()/UDP(dport=5353)/DNS())) >>> assert isinstance(pkt, Ether) and pkt.dst == '33:33:00:00:00:fb' >>> pkt = pkt.payload >>> assert isinstance(pkt, IPv6) and pkt.dst == 'ff02::fb' >>> pkt = pkt.payload >>> assert isinstance(pkt, UDP) and pkt.dport == 5353 >>> pkt = pkt.payload >>> assert isinstance(pkt, DNS) and isinstance(pkt.payload, NoPayload) ###(048)=[passed] Layer binding with show() getmacbyip must only be called when building >>> from unittest import mock >>> >>> def _err(*_): ... raise ValueError ... >>> with mock.patch("scapy.layers.l2.getmacbyip", side_effect=_err): ... with mock.patch("scapy.layers.inet.getmacbyip", side_effect=_err): ... # ARP who-has should never call getmacbyip ... pkt1 = Ether() / ARP(pdst="10.0.0.1") ... pkt1.show() ... bytes(pkt1) ... # IP should only call getmacbyip when building ... pkt2 = Ether() / IP(dst="10.0.0.1") ... pkt2.show() ... try: ... bytes(pkt2) ... assert False, "Should have called getmacbyip" ... except ValueError: ... pass ... ###[ Ethernet ]### dst = None src = 52:54:00:a3:0b:7c type = ARP ###[ ARP ]### hwtype = Ethernet (10Mb) ptype = IPv4 hwlen = None plen = None op = who-has hwsrc = 52:54:00:a3:0b:7c psrc = 192.168.122.109 hwdst = 00:00:00:00:00:00 pdst = 10.0.0.1 b'\xff\xff\xff\xff\xff\xffRT\x00\xa3\x0b|\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01RT\x00\xa3\x0b|\xc0\xa8zm\x00\x00\x00\x00\x00\x00\n\x00\x00\x01' ###[ Ethernet ]### dst = None src = 52:54:00:a3:0b:7c type = IPv4 ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = hopopt chksum = None src = 192.168.122.109 dst = 10.0.0.1 \options \ ###(049)=[passed] GRE binding tests Test GRE-in-IP Test GRE-in-IPv6 Test GRE-in-UDP Test GRE-in-UDP (IPv6) >>> pkt = Ether(raw(Ether()/IP()/GRE()/IP()/UDP())) >>> assert isinstance(pkt, Ether) >>> pkt = pkt.payload >>> assert isinstance(pkt, IP) and pkt.proto == 47 >>> pkt = pkt.payload >>> assert isinstance(pkt, GRE) and pkt.proto == 0x0800 >>> pkt = pkt.payload >>> assert isinstance(pkt, IP) >>> pkt = pkt.payload >>> assert isinstance(pkt, UDP) >>> >>> pkt = Ether(raw(Ether()/IPv6()/GRE()/IPv6()/UDP())) >>> assert isinstance(pkt, Ether) >>> pkt = pkt.payload >>> assert isinstance(pkt, IPv6) and pkt.nh == 47 >>> pkt = pkt.payload >>> assert isinstance(pkt, GRE) and pkt.proto == 0x86dd >>> pkt = pkt.payload >>> assert isinstance(pkt, IPv6) >>> pkt = pkt.payload >>> assert isinstance(pkt, UDP) >>> >>> pkt = Ether(raw(Ether()/IP()/UDP()/GRE()/IP()/UDP())) >>> assert isinstance(pkt, Ether) >>> pkt = pkt.payload >>> assert isinstance(pkt, IP) >>> pkt = pkt.payload >>> assert isinstance(pkt, UDP) and pkt.dport == 4754 >>> pkt = pkt.payload >>> assert isinstance(pkt, GRE) and pkt.proto == 0x0800 >>> pkt = pkt.payload >>> assert isinstance(pkt, IP) >>> pkt = pkt.payload >>> assert isinstance(pkt, UDP) >>> >>> pkt = Ether(raw(Ether()/IPv6()/UDP()/GRE()/IPv6()/UDP())) >>> assert isinstance(pkt, Ether) >>> pkt = pkt.payload >>> assert isinstance(pkt, IPv6) >>> pkt = pkt.payload >>> assert isinstance(pkt, UDP) and pkt.dport == 4754 >>> pkt = pkt.payload >>> assert isinstance(pkt, GRE) and pkt.proto == 0x86dd >>> pkt = pkt.payload >>> assert isinstance(pkt, IPv6) >>> pkt = pkt.payload >>> assert isinstance(pkt, UDP) ###### ## inet.py ###### ###(050)=[passed] IPv4 - ICMPTimeStampField >>> test = ICMPTimeStampField("test", None) >>> value = test.any2i("", "07:28:28.07") >>> value == 26908070 True >>> test.i2repr("", value) == '7:28:28.70' True ###(051)=[passed] IPv4 - UDP null checksum >>> with no_debug_dissector(): ... IP(raw(IP()/UDP()/Raw(b"\xff\xff\x01\x6a")))[UDP].chksum == 0xFFFF ... True ###(052)=[passed] IPv4 - (IP|UDP|TCP|ICMP)Error >>> query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/UDP()/DNS() >>> answer = IP(dst="192.168.0.254", src="192.168.0.2", ttl=1)/ICMP()/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/UDPerror()/DNS() >>> >>> query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/UDP()/DNS() >>> answer = IP(dst="192.168.0.254", src="192.168.0.2")/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/UDPerror()/DNS() >>> assert answer.answers(query) == True >>> >>> query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/TCP() >>> answer = IP(dst="192.168.0.254", src="192.168.0.2")/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/TCPerror() >>> >>> assert answer.answers(query) == True >>> >>> query = IP(dst="192.168.0.1", src="192.168.0.254", ttl=1)/ICMP()/"scapy" >>> answer = IP(dst="192.168.0.254", src="192.168.0.2")/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/ICMPerror()/"scapy" >>> assert answer.answers(query) == True ###(053)=[passed] IPv4 - TCPError parsing >>> pkt = Ether(bytes.fromhex('005056a4302ffcbd676360c908004500003800000000f80164b6682ce6b70ad504560b004f410000000045000028400e00000106fdae0ad50456681204d7f73100507d4430f8')) >>> assert TCPerror in pkt and pkt[TCPerror].sport == 63281 and pkt[TCPerror].dport == 80 ###(054)=[passed] IPv4 - mDNS >>> a = IP(dst="224.0.0.251") >>> assert a.hashret() == b"\x00" ###(055)=[passed] IPv4 - utilities >>> l = overlap_frag(IP(dst="1.2.3.4")/ICMP()/("AB"*8), ICMP()/("CD"*8)) >>> assert len(l) == 6 >>> assert [len(raw(p[IP].payload)) for p in l] == [8, 8, 8, 8, 8, 8] >>> assert [(p.frag, p.flags.MF) for p in [IP(raw(p)) for p in l]] == [(0, True), (1, True), (2, True), (0, True), (1, True), (2, False)] ###(056)=[passed] IPv4 - ICMP hashret >>> for x in ICMP(type=range(0,40),code=range(0,40)): ... (IP()/x).hashret() ... b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'' b'' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01\x00\x00\x00\x00' b'\x00\x00\x00\x00\x01' ###(057)=[passed] IPv4 - traceroute utilities >>> ip_ttl = [("192.168.0.%d" % i, i) for i in range(1, 10)] >>> >>> tr_packets = [ (IP(dst="192.168.0.1", src="192.168.0.254", ttl=ttl)/TCP(options=[("Timestamp", "00:00:%.2d.00" % ttl)])/"scapy", ... IP(dst="192.168.0.254", src=ip)/ICMP(type=11)/IPerror(dst="192.168.0.1", src="192.168.0.254", ttl=0)/TCPerror()/"scapy") ... for (ip, ttl) in ip_ttl ] >>> >>> tr = TracerouteResult(tr_packets) >>> assert tr.get_trace() == {'192.168.0.1': {1: ('192.168.0.1', False), 2: ('192.168.0.2', False), 3: ('192.168.0.3', False), 4: ('192.168.0.4', False), 5: ('192.168.0.5', False), 6: ('192.168.0.6', False), 7: ('192.168.0.7', False), 8: ('192.168.0.8', False), 9: ('192.168.0.9', False)}} >>> >>> def test_show(): ... with ContextManagerCaptureOutput() as cmco: ... tr = TracerouteResult(tr_packets) ... tr.show() ... result_show = cmco.get_output() ... expected = " 192.168.0.1:tcp80 \n" ... expected += "1 192.168.0.1 11 \n" ... expected += "2 192.168.0.2 11 \n" ... expected += "3 192.168.0.3 11 \n" ... expected += "4 192.168.0.4 11 \n" ... expected += "5 192.168.0.5 11 \n" ... expected += "6 192.168.0.6 11 \n" ... expected += "7 192.168.0.7 11 \n" ... expected += "8 192.168.0.8 11 \n" ... expected += "9 192.168.0.9 11 \n" ... index_result = result_show.index("\n1") ... index_expected = expected.index("\n1") ... assert result_show[index_result:] == expected[index_expected:] ... >>> test_show() >>> >>> def test_summary(): ... with ContextManagerCaptureOutput() as cmco: ... tr = TracerouteResult(tr_packets) ... tr.summary() ... result_summary = cmco.get_output() ... assert len(result_summary.split('\n')) == 10 ... assert(any( ... "IP / TCP 192.168.0.254:%s > 192.168.0.1:%s S / Raw ==> " ... "IP / ICMP 192.168.0.9 > 192.168.0.254 time-exceeded " ... "ttl-zero-during-transit / IPerror / TCPerror / " ... "Raw" % (ftp_data, http) in result_summary ... for ftp_data in ['20', 'ftp_data'] ... for http in ['80', 'http', 'www_http', 'www'] ... )) ... >>> test_summary() >>> >>> from unittest import mock >>> import scapy.libs.matplot >>> >>> @mock.patch("scapy.libs.matplot.plt") ... def test_timeskew_graph(mock_plt): ... def fake_plot(data, **kwargs): ... return data ... mock_plt.plot = fake_plot ... srl = SndRcvList([(a, a) for a in [IP(raw(p[0])) for p in tr_packets]]) ... ret = srl.timeskew_graph("192.168.0.254") ... assert len(ret) == 9 ... assert ret[0][1] == 0.0 ... >>> test_timeskew_graph() >>> >>> tr = TracerouteResult(tr_packets) >>> saved_AS_resolver = conf.AS_resolver >>> conf.AS_resolver = None >>> tr.make_graph() >>> assert len(tr.graphdef) == 491 >>> tr.graphdef.startswith("digraph trace {") == True True >>> assert ('"192.168.0.9" ->' in tr.graphdef) == True >>> conf.AS_resolver = conf.AS_resolver >>> >>> pl = PacketList(list([Ether()/x for x in itertools.chain(*tr_packets)])) >>> srl, ul = pl.sr() >>> assert len(srl) == 9 and len(ul) == 0 >>> >>> conf_color_theme = conf.color_theme >>> conf.color_theme = BlackAndWhite() >>> assert len(pl.sessions().keys()) == 10 >>> conf.color_theme = conf_color_theme >>> >>> new_pl = pl.replace(IP.src, "192.168.0.254", "192.168.0.42") >>> assert "192.168.0.254" not in [p[IP].src for p in new_pl] ###(058)=[passed] IPv4 - reporting >>> from unittest import mock >>> >>> @mock.patch("scapy.layers.inet.sr") ... def test_report_ports(mock_sr): ... def sr(*args, **kargs): ... return [(IP()/TCP(dport=65081, flags="S"), IP()/TCP(sport=65081, flags="SA")), ... (IP()/TCP(dport=65082, flags="S"), IP()/ICMP(type=3, code=1)), ... (IP()/TCP(dport=65083, flags="S"), IP()/TCP(sport=65083, flags="R"))], [IP()/TCP(dport=65084, flags="S")] ... mock_sr.side_effect = sr ... report = "\\begin{tabular}{|r|l|l|}\n\\hline\n65081 & open & SA \\\\\n\\hline\n?? & closed & ICMP type dest-unreach/host-unreachable from 127.0.0.1 \\\\\n65083 & closed & TCP R \\\\\n\\hline\n65084 & ? & unanswered \\\\\n\\hline\n\\end{tabular}\n" ... assert report_ports("www.secdev.org", [65081,65082,65083,65084]) == report ... >>> test_report_ports() >>> >>> def test_IPID_count(): ... with ContextManagerCaptureOutput() as cmco: ... random.seed(0x2807) ... IPID_count([(IP()/UDP(), IP(id=random.randint(0, 65535))/UDP()) for i in range(3)]) ... result_IPID_count = cmco.get_output() ... lines = [x.strip() for x in result_IPID_count.split("\n")] ... assert len(lines) == 5 ... assert(lines[0] in ["Probably 3 classes: [4613, 53881, 58437]", ... "Probably 3 classes: [9103, 9227, 46399]"]) ... >>> test_IPID_count() ###(059)=[passed] IPv4 - Checksum computation with source routing >>> no_sr = IP(raw(IP(dst="8.8.8.8")/UDP()/DNS())) >>> sr = IP(raw(IP(options=[IPOption_SSRR(routers=["1.1.1.1", "8.8.8.8"])])/UDP()/DNS())) >>> assert no_sr[UDP].chksum == sr[UDP].chksum >>> >>> sr = IP(raw(IP(options=[IPOption_LSRR(routers=["1.1.1.1"]), IPOption_SSRR(routers=["8.8.8.8"])])/UDP()/DNS())) Found 2 Source Routing Options! Falling back to IP.dst for checksum computation. >>> assert no_sr[UDP].chksum != sr[UDP].chksum >>> >>> sr = Ether(src="de:ad:be:ef:aa:55", dst="ca:fe:00:00:00:00")/IP(src="20.0.0.1",dst="100.0.0.1")/ \ ... IP(src="20.0.0.1",dst="100.0.0.1", options=[IPOption_SSRR(copy_flag=1, pointer=4, routers=["1.1.1.1", "8.8.8.8"])])/ \ ... UDP(sport=1111, dport=2222) / VXLAN() / \ ... Ether(src="de:ad:be:ef:aa:55", dst="ca:fe:00:00:00:00")/IP(src="20.0.0.1",dst="100.0.0.1") / \ ... TCP() >>> bytes(sr[UDP]) b'\x04W\x08\xae\x00F\x1ft\x0c\x00\x00\x03\x00\x00\x00\x00\xca\xfe\x00\x00\x00\x00\xde\xad\xbe\xef\xaaU\x08\x00E\x00\x00(\x00\x01\x00\x00@\x06\x02\xce\x14\x00\x00\x01d\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x17}\x00\x00' >>> assert sr[IP:2].dst == "100.0.0.1" ###### ## ICMPv4 extensions ###### ###(060)=[passed] Build ICMP extension from scratch >>> pkt = IP(dst="127.0.0.1", src="127.0.0.1") / ICMP( ... type="time-exceeded", ... code="ttl-zero-during-transit", ... ext=ICMPExtension_Header() / ICMPExtension_InterfaceInformation( ... has_ifindex=1, ... has_ipaddr=1, ... has_ifname=1, ... ip4="10.10.10.10", ... ifname="hey", ... ) ... ) / IPerror(src="12.4.4.4", dst="12.1.1.1") / \ ... UDPerror(sport=42315, dport=33440) / \ ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> assert bytes(pkt) == b'E\x00\x00\xb0\x00\x01\x00\x00@\x01|J\x7f\x00\x00\x01\x7f\x00\x00\x01\x0b\x00\x12/\x00\x00\x00\x00E\x00\x00(\x00\x01\x00\x00@\x11]\xbb\x0c\x04\x04\x04\x0c\x01\x01\x01\xa5K\x82\xa0\x00\x14\xba\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00u\x00\x00\x10\x02\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x03hey' ###(061)=[passed] Check dissection and rebuild of MPLS ICMPv4 extension >>> load_contrib("mpls") >>> pkt = Ether(b'\x00\x15]\x94AY\x00\x15]\x07\xcb\x04\x08\x00E\x00\x00\xb0?2\x00\x00\xe6\x01\x1b\xabh,\x1f\x1d\xac\x1cF\n\x0b\x00Ll\x00\x11\x00\x00E \x00<\x96\xdf\x00\x00\x02\x11\xa7\xc6\xac\x1cF\n(Q_t\xb8-\x82\xb3\x00(xt@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x02\xff\x00\x10\x01\x01\tp2\x01\x05\xde\xd2\x01\x05\x9c\xc3\x02') >>> >>> assert isinstance(pkt[ICMP].ext, ICMPExtension_Header) >>> assert ICMPExtension_MPLS in pkt[ICMP].ext >>> assert all(isinstance(x, MPLS) for x in pkt[ICMP].ext.stack) >>> assert [x.label for x in pkt[ICMP].ext.stack[0].iterpayloads()] == [38659, 24045, 22988] >>> >>> pkt.clear_cache() >>> pkt.ext.chksum = None # Check that chksum rebuilds >>> pkt[IP].chksum = None >>> assert bytes(pkt) == b'\x00\x15]\x94AY\x00\x15]\x07\xcb\x04\x08\x00E\x00\x00\xb0?2\x00\x00\xe6\x01\x1b\xabh,\x1f\x1d\xac\x1cF\n\x0b\x00Ll\x00\x11\x00\x00E \x00<\x96\xdf\x00\x00\x02\x11\xa7\xc6\xac\x1cF\n(Q_t\xb8-\x82\xb3\x00(xt@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x02\xff\x00\x10\x01\x01\tp2\x01\x05\xde\xd2\x01\x05\x9c\xc3\x02' ###(062)=[passed] ICMPv4 extension - Other dissection example >>> load_contrib("mpls") >>> pkt = Ether(b'\x00\x1cs\x03\x12\x06t\x83\xef\x00\n\xd5\x08\x00E\x00\x00\xa8H\x1e\x00\x00\xfb\x01\xf0\xe3\xc0\xa8\x02\x01\xc0\xa8\x03\x01\x0b\x00rr\x00 \x00\x00E\x00\x00>> assert isinstance(pkt[ICMP].ext, ICMPExtension_Header) >>> assert ICMPExtension_MPLS in pkt[ICMP].ext >>> assert all(isinstance(x, MPLS) for x in pkt[ICMP].ext.stack) >>> assert [x.label for x in pkt[ICMP].ext.stack[0].iterpayloads()] == [10003] >>> >>> pkt.clear_cache() >>> pkt.ext.chksum = None # Check that chksum rebuilds >>> pkt[IP].chksum = None >>> assert bytes(pkt) == b'\x00\x1cs\x03\x12\x06t\x83\xef\x00\n\xd5\x08\x00E\x00\x00\xa8H\x1e\x00\x00\xfb\x01\xf0\xe3\xc0\xa8\x02\x01\xc0\xa8\x03\x01\x0b\x00rr\x00 \x00\x00E\x00\x00>> pkt = PPP(b'\xff\x03\x00!E\x00\x00\xf0\xe7 @\x00\xfe\x01z\xde\n\x04\x00\x02\x0c\x04\x04\x04\x0b\x00\xcc\xff\x00\x00\x00\x00E\x00\x00(\xa5Q\x00\x00\x01\x11\xf7j\x0c\x04\x04\x04\x0c\x01\x01\x01\xa5K\x82\xa0\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\xc4\xe4\x00P\x02\x0e\x00\x00\x00\x0f\x00\x01\x00\x00\n\n\n\n?This-is-the-name-of-the-Interface-that-we-are-looking-for-[:-)]') >>> >>> assert isinstance(pkt[ICMP].ext, ICMPExtension_Header) >>> assert ICMPExtension_InterfaceInformation in pkt[ICMP].ext >>> assert pkt[ICMP].ext.ifindex == 15 >>> assert pkt[ICMP].ext.ip4 == "10.10.10.10" >>> assert pkt[ICMP].ext.ifname == b"This-is-the-name-of-the-Interface-that-we-are-looking-for-[:-)]" Scapy IPv6 layers tests ━ Run at 01:42:15 from [test/scapy/layers/inet6.uts] by UTscapy in 1.542438268661499 └ Passed=518 └ Failed=0 ###### ## Test IPv6 Class ###### ###(000)=[passed] IPv6 Class basic Instantiation >>> a=IPv6() ###(001)=[passed] IPv6 Class basic build (default values) >>> raw(IPv6()) == b'`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(002)=[passed] IPv6 Class basic dissection (default values) >>> a=IPv6(raw(IPv6())) >>> a.version == 6 and a.tc == 0 and a.fl == 0 and a.plen == 0 and a.nh == 59 and a.hlim ==64 and a.src == "::1" and a.dst == "::1" True ###(003)=[passed] IPv6 Class with basic TCP stacked - build >>> raw(IPv6()/TCP()) == b'`\x00\x00\x00\x00\x14\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f}\x00\x00' True ###(004)=[passed] IPv6 Class with basic TCP stacked - dissection >>> a=IPv6(raw(IPv6()/TCP())) >>> a.nh == 6 and a.plen == 20 and isinstance(a.payload, TCP) and a.payload.chksum == 0x8f7d True ###(005)=[passed] IPv6 Class with TCP and TCP data - build >>> raw(IPv6()/TCP()/Raw(load="somedata")) == b'`\x00\x00\x00\x00\x1c\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xd5\xdd\x00\x00somedata' True ###(006)=[passed] IPv6 Class with TCP and TCP data - dissection >>> with no_debug_dissector(): ... a=IPv6(raw(IPv6()/TCP(dport=1234, sport=1234)/Raw(load="somedata"))) ... >>> a.nh == 6 and a.plen == 28 and isinstance(a.payload, TCP) and a.payload.chksum == 0xcc9d and isinstance(a.payload.payload, Raw) and a[Raw].load == b"somedata" True ###(007)=[passed] IPv6 Class binding with Ethernet - build >>> raw(Ether(src="00:00:00:00:00:00", dst="ff:ff:ff:ff:ff:ff")/IPv6()/TCP()) == b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x86\xdd`\x00\x00\x00\x00\x14\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f}\x00\x00' True ###(008)=[passed] IPv6 Class binding with Ethernet - dissection >>> a=Ether(raw(Ether()/IPv6()/TCP())) >>> a.type == 0x86dd True ###(009)=[passed] IPv6 Class - summary >>> a = Ether(src="aa:aa:aa:aa:aa:aa", dst="bb:bb:bb:bb:bb:bb")/IPv6(src='c266:a92d:0ed8:dc54:7d6f:9667:3743:a32f', dst='6406:c31f:d0b5:72fc:1700:2081:62e7:fae9') >>> assert a.summary() == 'Ether / c266:a92d:ed8:dc54:7d6f:9667:3743:a32f > 6406:c31f:d0b5:72fc:1700:2081:62e7:fae9 (59)' ###(010)=[passed] IPv6 Class binding with GRE - build >>> s = raw(IP(src="127.0.0.1")/GRE()/Ether(dst="ff:ff:ff:ff:ff:ff", src="00:00:00:00:00:00")/IP()/GRE()/IPv6(src="::1")) >>> s == b'E\x00\x00f\x00\x01\x00\x00@/|f\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00eX\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00@\x00\x01\x00\x00@/|\x8c\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x86\xdd`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(011)=[passed] IPv6 Class binding with GRE - dissection >>> p = IP(s) >>> GRE in p and p[GRE:1].proto == 0x6558 and p[GRE:2].proto == 0x86DD and IPv6 in p True ###(012)=[passed] IPv6 ma_addr coverage on hashret >>> IPv6(dst="ff00::1:ff28:9c5a", src="::").hashret() == b';' True ###(013)=[passed] PseudoIPv6 >>> p = PseudoIPv6(src="fd00::abcd", dst="fd00::1234", uplen=64, nh=socket.IPPROTO_UDP) >>> raw(p) == b"\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xab\xcd\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x34\x00\x00\x00\x40\x00\x00\x00\x11" True ###(014)=[passed] in6_chksum is computed on UDP or TCP build >>> with no_debug_dissector(): ... p = IPv6(raw(IPv6()/UDP()/Raw(load="somedata"))) ... assert p.chksum == 0x45cb ... ###(015)=[passed] IPv6ExtHdrRouting Class - No address - build >>> raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=[])/TCP(dport=80)) ==b'`\x00\x00\x00\x00\x1c+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xa5&\x00\x00' True ###(016)=[passed] IPv6ExtHdrRouting Class - One address - build >>> raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2022::deca"])/TCP(dport=80)) == b'`\x00\x00\x00\x00,+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x02\x00\x01\x00\x00\x00\x00 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91\x7f\x00\x00' True ###(017)=[passed] IPv6ExtHdrRouting Class - Multiple Addresses - build >>> raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"])/TCP(dport=80)) == b'`\x00\x00\x00\x00<+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x04\x00\x02\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91\x7f\x00\x00' True ###(018)=[passed] IPv6ExtHdrRouting Class - Specific segleft (2->1) - build >>> raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"], segleft=1)/TCP(dport=80)) == b'`\x00\x00\x00\x00<+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x04\x00\x01\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x91\x7f\x00\x00' True ###(019)=[passed] IPv6ExtHdrRouting Class - Specific segleft (2->0) - build >>> raw(IPv6(src="2048::deca", dst="2047::cafe")/IPv6ExtHdrRouting(addresses=["2001::deca", "2022::deca"], segleft=0)/TCP(dport=80)) == b'`\x00\x00\x00\x00<+@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x06\x04\x00\x00\x00\x00\x00\x00 \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xa5&\x00\x00' True ###(020)=[passed] IPv6ExtHdrSegmentRouting Class - default - build & dissect >>> s = raw(IPv6()/IPv6ExtHdrSegmentRouting()/UDP()) >>> assert s == b'`\x00\x00\x00\x00 +@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x005\x005\x00\x08\xffr' >>> >>> p = IPv6(s) >>> assert UDP in p and IPv6ExtHdrSegmentRouting in p >>> assert p[IPv6ExtHdrSegmentRouting].lastentry == 0 and len(p[IPv6ExtHdrSegmentRouting].addresses) == 1 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0 ###(021)=[passed] IPv6ExtHdrSegmentRouting Class - addresses list - build & dissect >>> s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=["::1", "::2", "::3"])/UDP()) >>> assert s == b'`\x00\x00\x00\x00@+@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x06\x04\x02\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x005\x005\x00\x08\xffr' >>> >>> p = IPv6(s) >>> assert UDP in p and IPv6ExtHdrSegmentRouting in p >>> assert p[IPv6ExtHdrSegmentRouting].lastentry == 2 and len(p[IPv6ExtHdrSegmentRouting].addresses) == 3 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 0 ###(022)=[passed] IPv6ExtHdrSegmentRouting Class - TLVs list - build & dissect >>> s = raw(IPv6()/IPv6ExtHdrSegmentRouting(tlv_objects=[IPv6ExtHdrSegmentRoutingTLVHMAC()])/TCP()) >>> assert s == b'`\x00\x00\x00\x00<+@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x06\x04\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\x000\x00\x00\x00\x00\x00\x00\x04\x05\x00\x00\x00\x00\x00\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f}\x00\x00' >>> >>> p = IPv6(s) >>> assert TCP in p and IPv6ExtHdrSegmentRouting in p >>> assert p[IPv6ExtHdrSegmentRouting].lastentry == 0 >>> assert len(p[IPv6ExtHdrSegmentRouting].addresses) == 1 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 2 >>> assert isinstance(p[IPv6ExtHdrSegmentRouting].tlv_objects[1], IPv6ExtHdrSegmentRoutingTLVPadN) ###(023)=[passed] IPv6ExtHdrSegmentRouting Class - both lists - build & dissect >>> s = raw(IPv6()/IPv6ExtHdrSegmentRouting(addresses=["::1", "::2", "::3"], tlv_objects=[IPv6ExtHdrSegmentRoutingTLVIngressNode(),IPv6ExtHdrSegmentRoutingTLVEgressNode()])/ICMPv6EchoRequest()) >>> assert s == b'`\x00\x00\x00\x00h+@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01:\x0b\x04\x02\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x01\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80\x00\x7f\xbb\x00\x00\x00\x00' >>> >>> p = IPv6(s) >>> assert p[IPv6ExtHdrSegmentRouting].lastentry == 2 >>> assert ICMPv6EchoRequest in p and IPv6ExtHdrSegmentRouting in p >>> assert len(p[IPv6ExtHdrSegmentRouting].addresses) == 3 and len(p[IPv6ExtHdrSegmentRouting].tlv_objects) == 2 ###(024)=[passed] IPv6ExtHdrSegmentRouting Class - UDP pseudo-header checksum - build & dissect >>> s= raw(IPv6(src="fc00::1", dst="fd00::42")/IPv6ExtHdrSegmentRouting(addresses=["fd00::42", "fc13::1337"][::-1], segleft=1, lastentry=1) / UDP(sport=11000, dport=4242) / Raw('foobar')) >>> assert s == b'`\x00\x00\x00\x006+@\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B\x11\x04\x04\x01\x01\x00\x00\x00\xfc\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x137\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00B*\xf8\x10\x92\x00\x0e\x81\xb7foobar' ###### ## Test in6_get6to4Prefix() ###### ###(025)=[passed] Test in6_get6to4Prefix() - 0.0.0.0 address >>> in6_get6to4Prefix("0.0.0.0") == "2002::" True ###(026)=[passed] Test in6_get6to4Prefix() - 255.255.255.255 address >>> in6_get6to4Prefix("255.255.255.255") == "2002:ffff:ffff::" True ###(027)=[passed] Test in6_get6to4Prefix() - 1.1.1.1 address >>> in6_get6to4Prefix("1.1.1.1") == "2002:101:101::" True ###(028)=[passed] Test in6_get6to4Prefix() - invalid address >>> in6_get6to4Prefix("somebadrawing") is None True ###### ## Test in6_6to4ExtractAddr() ###### ###(029)=[passed] Test in6_6to4ExtractAddr() - 2002:: address >>> in6_6to4ExtractAddr("2002::") == "0.0.0.0" True ###(030)=[passed] Test in6_6to4ExtractAddr() - 255.255.255.255 address >>> in6_6to4ExtractAddr("2002:ffff:ffff::") == "255.255.255.255" True ###(031)=[passed] Test in6_6to4ExtractAddr() - "2002:101:101::" address >>> in6_6to4ExtractAddr("2002:101:101::") == "1.1.1.1" True ###(032)=[passed] Test in6_6to4ExtractAddr() - invalid address >>> in6_6to4ExtractAddr("somebadrawing") is None True ###(033)=[passed] in6_getLinkScopedMcastAddr() : default generation >>> a = in6_getLinkScopedMcastAddr(addr="FE80::") >>> a == 'ff32:ff::' True ###(034)=[passed] in6_getLinkScopedMcastAddr() : different valid scope values >>> a = in6_getLinkScopedMcastAddr(addr="FE80::", scope=0) >>> b = in6_getLinkScopedMcastAddr(addr="FE80::", scope=1) >>> c = in6_getLinkScopedMcastAddr(addr="FE80::", scope=2) >>> d = in6_getLinkScopedMcastAddr(addr="FE80::", scope=3) >>> a == 'ff30:ff::' and b == 'ff31:ff::' and c == 'ff32:ff::' and d is None True ###(035)=[passed] in6_getLinkScopedMcastAddr() : grpid in different formats >>> a = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid=b"\x12\x34\x56\x78") >>> b = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid="12345678") >>> c = in6_getLinkScopedMcastAddr(addr="FE80::A12:34FF:FE56:7890", grpid=305419896) >>> a == b and b == c True ###(036)=[passed] in6_mactoifaceid() conversion function (test 1) >>> in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0) == 'FD00:00FF:FE00:0000' True ###(037)=[passed] in6_mactoifaceid() conversion function (test 2) >>> in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1) == 'FF00:00FF:FE00:0000' True ###(038)=[passed] in6_mactoifaceid() conversion function (test 3) >>> in6_mactoifaceid("FD:00:00:00:00:00") == 'FF00:00FF:FE00:0000' True ###(039)=[passed] in6_mactoifaceid() conversion function (test 4) >>> in6_mactoifaceid("FF:00:00:00:00:00") == 'FD00:00FF:FE00:0000' True ###(040)=[passed] in6_mactoifaceid() conversion function (test 5) >>> in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1) == 'FF00:00FF:FE00:0000' True ###(041)=[passed] in6_mactoifaceid() conversion function (test 6) >>> in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0) == 'FD00:00FF:FE00:0000' True ###(042)=[passed] in6_mactoifaceid() conversion function (test 1) >>> in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00' True ###(043)=[passed] in6_mactoifaceid() conversion function (test 2) >>> in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00' True ###(044)=[passed] in6_mactoifaceid() conversion function (test 3) >>> in6_ifaceidtomac(in6_mactoifaceid("FD:00:00:00:00:00")) == 'fd:00:00:00:00:00' True ###(045)=[passed] in6_mactoifaceid() conversion function (test 4) >>> in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00")) == 'ff:00:00:00:00:00' True ###(046)=[passed] in6_mactoifaceid() conversion function (test 5) >>> in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00' True ###(047)=[passed] in6_mactoifaceid() conversion function (test 6) >>> in6_ifaceidtomac(in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00' True ###(048)=[passed] in6_addrtomac() conversion function (test 1) >>> in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00' True ###(049)=[passed] in6_addrtomac() conversion function (test 2) >>> in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00' True ###(050)=[passed] in6_addrtomac() conversion function (test 3) >>> in6_addrtomac("FE80::" + in6_mactoifaceid("FD:00:00:00:00:00")) == 'fd:00:00:00:00:00' True ###(051)=[passed] in6_addrtomac() conversion function (test 4) >>> in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00")) == 'ff:00:00:00:00:00' True ###(052)=[passed] in6_addrtomac() conversion function (test 5) >>> in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00", ulbit=1)) == 'fd:00:00:00:00:00' True ###(053)=[passed] in6_addrtomac() conversion function (test 6) >>> in6_addrtomac("FE80::" + in6_mactoifaceid("FF:00:00:00:00:00", ulbit=0)) == 'ff:00:00:00:00:00' True ###(054)=[passed] Test in6_getRandomizedIfaceId >>> import socket >>> >>> for a in range(10): ... s1, s2 = in6_getRandomizedIfaceId('20b:93ff:feeb:2d3') ... s1, s2 ... tmp = inet_pton(socket.AF_INET6, "::" + s1)[8:] ... tmp ... assert (orb(tmp[0]) & 0x04) == 0 ... s1, s2 = in6_getRandomizedIfaceId('20b:93ff:feeb:2d3', previous=s2) ... s1, s2 ... tmp = inet_pton(socket.AF_INET6, "::" + s1)[8:] ... assert (orb(tmp[0]) & 0x04) == 0 ... ('99ed:1c26:3eb1:9699', '7039:bc45:1c3e:9a9a') b'\x99\xed\x1c&>\xb1\x96\x99' ('6007:f826:60cf:ff6e', '7601:ec89:fca8:71e') ('1274:d811:e44:5906', 'b80a:ef8:deac:a68e') b'\x12t\xd8\x11\x0eDY\x06' ('3b8f:9a27:a3b8:f7ff', '3824:98b1:3d4a:30f4') ('283c:7ae6:540:4486', '2e0:4c0e:7371:2b6b') b'(>> assert in6_getRandomizedIfaceId('20b:93ff:feeb:2d3', previous='d006:d540:db11:b092') == ('721f:11fa:3743:fc7f', '5946:5272:7fcc:108a') ###(055)=[passed] Test RFC 1924 function - in6_ctop() basic test >>> in6_ctop("4)+k&C#VzJ4br>0wv%Yp") == '1080::8:800:200c:417a' True ###(056)=[passed] Test RFC 1924 function - in6_ctop() with character outside charset >>> in6_ctop("4)+k&C#VzJ4br>0wv%Y'") == None True ###(057)=[passed] Test RFC 1924 function - in6_ctop() with bad length address >>> in6_ctop("4)+k&C#VzJ4br>0wv%Y") == None True ###(058)=[passed] Test RFC 1924 function - in6_ptoc() basic test >>> in6_ptoc('1080::8:800:200c:417a') == '4)+k&C#VzJ4br>0wv%Yp' True ###(059)=[passed] Test RFC 1924 function - in6_ptoc() basic test >>> in6_ptoc('1080::8:800:200c:417a') == '4)+k&C#VzJ4br>0wv%Yp' True ###(060)=[passed] Test RFC 1924 function - in6_ptoc() with bad input >>> in6_ptoc('1080:::8:800:200c:417a') == None True ###(061)=[passed] in6_getAddrType - 6to4 addresses >>> in6_getAddrType("2002::1") == (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL | IPV6_ADDR_6TO4) True ###(062)=[passed] in6_getAddrType - Assignable Unicast global address >>> in6_getAddrType("2001:db8::1") == (IPV6_ADDR_UNICAST | IPV6_ADDR_GLOBAL) True ###(063)=[passed] in6_getAddrType - Multicast global address >>> in6_getAddrType("FF0E::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_MULTICAST) True ###(064)=[passed] in6_getAddrType - Multicast local address >>> in6_getAddrType("FF02::1") == (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_MULTICAST) True ###(065)=[passed] in6_getAddrType - Unicast Link-Local address >>> in6_getAddrType("FE80::") == (IPV6_ADDR_UNICAST | IPV6_ADDR_LINKLOCAL) True ###(066)=[passed] in6_getAddrType - Loopback address >>> in6_getAddrType("::1") == IPV6_ADDR_LOOPBACK True ###(067)=[passed] in6_getAddrType - Unspecified address >>> in6_getAddrType("::") == IPV6_ADDR_UNSPECIFIED True ###(068)=[passed] in6_getAddrType - Unassigned Global Unicast address >>> in6_getAddrType("4000::") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) True ###(069)=[passed] in6_getAddrType - Weird address (FE::1) >>> in6_getAddrType("FE::") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) True ###(070)=[passed] in6_getAddrType - Weird address (FE8::1) >>> in6_getAddrType("FE8::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) True ###(071)=[passed] in6_getAddrType - Weird address (1::1) >>> in6_getAddrType("1::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) True ###(072)=[passed] in6_getAddrType - Weird address (1000::1) >>> in6_getAddrType("1000::1") == (IPV6_ADDR_GLOBAL | IPV6_ADDR_UNICAST) True ###(073)=[passed] ICMPv6DestUnreach Class - Basic Build (no argument) >>> raw(ICMPv6DestUnreach()) == b'\x01\x00\x00\x00\x00\x00\x00\x00' No IPv6 underlayer to compute checksum. Leaving null. True ###(074)=[passed] ICMPv6DestUnreach Class - Basic Build over IPv6 (for cksum and overload) >>> raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()) == b'`\x00\x00\x00\x00\x08:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x01\x00\x14e\x00\x00\x00\x00' True ###(075)=[passed] ICMPv6DestUnreach Class - Basic Build over IPv6 with some payload >>> raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()/IPv6(src="2047::cafe", dst="2048::deca")) == b'`\x00\x00\x00\x000:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x01\x00\x8e\xa3\x00\x00\x00\x00`\x00\x00\x00\x00\x00;@ G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca' True ###(076)=[passed] ICMPv6DestUnreach Class - Dissection with default values and some payload >>> a = IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach()/IPv6(src="2047::cafe", dst="2048::deca"))) >>> a.plen == 48 and a.nh == 58 and ICMPv6DestUnreach in a and a[ICMPv6DestUnreach].type == 1 and a[ICMPv6DestUnreach].code == 0 and a[ICMPv6DestUnreach].cksum == 0x8ea3 and a[ICMPv6DestUnreach].unused == 0 and IPerror6 in a True ###(077)=[passed] ICMPv6DestUnreach Class - Dissection with specific values >>> a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach(code=1, cksum=0x6666, unused=0x7777)/IPv6(src="2047::cafe", dst="2048::deca"))) >>> a.plen == 48 and a.nh == 58 and ICMPv6DestUnreach in a and a[ICMPv6DestUnreach].type == 1 and a[ICMPv6DestUnreach].cksum == 0x6666 and a[ICMPv6DestUnreach].unused == 0x7777 and IPerror6 in a[ICMPv6DestUnreach] True ###(078)=[passed] ICMPv6DestUnreach Class - checksum computation related stuff >>> a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6DestUnreach(code=1, cksum=0x6666, unused=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")/TCP())) >>> b=IPv6(raw(IPv6(src="2047::cafe", dst="2048::deca")/TCP())) >>> a[ICMPv6DestUnreach][TCPerror].chksum == b.chksum True ###(079)=[passed] ICMPv6PacketTooBig Class - Basic Build (no argument) >>> raw(ICMPv6PacketTooBig()) == b'\x02\x00\x00\x00\x00\x00\x05\x00' No IPv6 underlayer to compute checksum. Leaving null. True ###(080)=[passed] ICMPv6PacketTooBig Class - Basic Build over IPv6 (for cksum and overload) >>> raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()) == b'`\x00\x00\x00\x00\x08:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x02\x00\x0ee\x00\x00\x05\x00' True ###(081)=[passed] ICMPv6PacketTooBig Class - Basic Build over IPv6 with some payload >>> raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()/IPv6(src="2047::cafe", dst="2048::deca")) == b'`\x00\x00\x00\x000:@ H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x02\x00\x88\xa3\x00\x00\x05\x00`\x00\x00\x00\x00\x00;@ G\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca' True ###(082)=[passed] ICMPv6PacketTooBig Class - Dissection with default values and some payload >>> a = IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig()/IPv6(src="2047::cafe", dst="2048::deca"))) >>> a.plen == 48 and a.nh == 58 and ICMPv6PacketTooBig in a and a[ICMPv6PacketTooBig].type == 2 and a[ICMPv6PacketTooBig].code == 0 and a[ICMPv6PacketTooBig].cksum == 0x88a3 and a[ICMPv6PacketTooBig].mtu == 1280 and IPerror6 in a True >>> True True ###(083)=[passed] ICMPv6PacketTooBig Class - Dissection with specific values >>> a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig(code=2, cksum=0x6666, mtu=1460)/IPv6(src="2047::cafe", dst="2048::deca"))) >>> a.plen == 48 and a.nh == 58 and ICMPv6PacketTooBig in a and a[ICMPv6PacketTooBig].type == 2 and a[ICMPv6PacketTooBig].code == 2 and a[ICMPv6PacketTooBig].cksum == 0x6666 and a[ICMPv6PacketTooBig].mtu == 1460 and IPerror6 in a True ###(084)=[passed] ICMPv6PacketTooBig Class - checksum computation related stuff >>> a=IPv6(raw(IPv6(src="2048::deca", dst="2047::cafe")/ICMPv6PacketTooBig(code=1, cksum=0x6666, mtu=0x7777)/IPv6(src="2047::cafe", dst="2048::deca")/TCP())) >>> b=IPv6(raw(IPv6(src="2047::cafe", dst="2048::deca")/TCP())) >>> a[ICMPv6PacketTooBig][TCPerror].chksum == b.chksum True ###### ## Test ICMPv6EchoRequest Class ###### ###(085)=[passed] ICMPv6EchoRequest - Basic Instantiation >>> raw(ICMPv6EchoRequest()) == b'\x80\x00\x00\x00\x00\x00\x00\x00' more No IPv6 underlayer to compute checksum. Leaving null. True ###(086)=[passed] ICMPv6EchoRequest - Instantiation with specific values >>> raw(ICMPv6EchoRequest(code=0xff, cksum=0x1111, id=0x2222, seq=0x3333, data="thisissomestring")) == b'\x80\xff\x11\x11""33thisissomestring' True ###(087)=[passed] ICMPv6EchoRequest - Basic dissection >>> a=ICMPv6EchoRequest(b'\x80\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 128 and a.code == 0 and a.cksum == 0 and a.id == 0 and a.seq == 0 and a.data == b"" True ###(088)=[passed] ICMPv6EchoRequest - Dissection with specific values >>> a=ICMPv6EchoRequest(b'\x80\xff\x11\x11""33thisissomerawing') >>> a.type == 128 and a.code == 0xff and a.cksum == 0x1111 and a.id == 0x2222 and a.seq == 0x3333 and a.data == b"thisissomerawing" True ###(089)=[passed] ICMPv6EchoRequest - Automatic checksum computation and field overloading (build) >>> raw(IPv6(dst="2001::cafe", src="2001::deca", hlim=64)/ICMPv6EchoRequest()) == b'`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x80\x00\x95\xf1\x00\x00\x00\x00' True ###(090)=[passed] ICMPv6EchoRequest - Automatic checksum computation and field overloading (dissection) >>> a=IPv6(b'`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x80\x00\x95\xf1\x00\x00\x00\x00') >>> isinstance(a, IPv6) and a.nh == 58 and isinstance(a.payload, ICMPv6EchoRequest) and a.payload.cksum == 0x95f1 True ###### ## Test ICMPv6EchoReply Class ###### ###(091)=[passed] ICMPv6EchoReply - Basic Instantiation >>> raw(ICMPv6EchoReply()) == b'\x81\x00\x00\x00\x00\x00\x00\x00' True ###(092)=[passed] ICMPv6EchoReply - Instantiation with specific values >>> raw(ICMPv6EchoReply(code=0xff, cksum=0x1111, id=0x2222, seq=0x3333, data="thisissomestring")) == b'\x81\xff\x11\x11""33thisissomestring' True ###(093)=[passed] ICMPv6EchoReply - Basic dissection >>> a=ICMPv6EchoReply(b'\x80\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 128 and a.code == 0 and a.cksum == 0 and a.id == 0 and a.seq == 0 and a.data == b"" True ###(094)=[passed] ICMPv6EchoReply - Dissection with specific values >>> a=ICMPv6EchoReply(b'\x80\xff\x11\x11""33thisissomerawing') >>> a.type == 128 and a.code == 0xff and a.cksum == 0x1111 and a.id == 0x2222 and a.seq == 0x3333 and a.data == b"thisissomerawing" True ###(095)=[passed] ICMPv6EchoReply - Automatic checksum computation and field overloading (build) >>> raw(IPv6(dst="2001::cafe", src="2001::deca", hlim=64)/ICMPv6EchoReply()) == b'`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x81\x00\x94\xf1\x00\x00\x00\x00' True ###(096)=[passed] ICMPv6EchoReply - Automatic checksum computation and field overloading (dissection) >>> a=IPv6(b'`\x00\x00\x00\x00\x08:@ \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xde\xca \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe\x80\x00\x95\xf1\x00\x00\x00\x00') >>> isinstance(a, IPv6) and a.nh == 58 and isinstance(a.payload, ICMPv6EchoRequest) and a.payload.cksum == 0x95f1 True ###(097)=[passed] ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 1 >>> b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata") >>> a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="somedata") >>> b.hashret() == a.hashret() True ###(098)=[passed] ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 2 >>> b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata") >>> a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="otherdata") >>> b.hashret() == a.hashret() True ###(099)=[passed] ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 3 >>> b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777,data="somedata") >>> a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x6666, seq=0x8888, data="somedata") >>> b.hashret() != a.hashret() True ###(100)=[passed] ICMPv6EchoRequest and ICMPv6EchoReply - hashret() test 4 >>> b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777,data="somedata") >>> a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x8888, seq=0x7777, data="somedata") >>> b.hashret() != a.hashret() True ###(101)=[passed] ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 5 >>> b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(data="somedata") >>> a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(data="somedata") >>> (a > b) == True True ###(102)=[passed] ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 6 >>> b=IPv6(src="2047::deca", dst="2048::cafe")/ICMPv6EchoReply(id=0x6666, seq=0x7777, data="somedata") >>> a=IPv6(src="2048::cafe", dst="2047::deca")/ICMPv6EchoRequest(id=0x6666, seq=0x7777, data="somedata") >>> (a > b) == True True ###(103)=[passed] ICMPv6EchoRequest and ICMPv6EchoReply - answers() test 7 - IPv6ExtHdrDestOpt >>> b = IPv6(b'`\x0f\\\xe3\x00\x08:@\xfe\x80\x00\x00\x00\x00\x00\x00\x02PV\xff\xfe\x84\x1c\x14\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&\x81\x00\r\xad\x00\x00\x00\x00') >>> a = IPv6(b'`\x00\x00\x00\x00\x10<\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&\xfe\x80\x00\x00\x00\x00\x00\x00\x02PV\xff\xfe\x84\x1c\x14:\x00\x00\x00\x00\x00\x00\x00\x80\x00\x0e\xad\x00\x00\x00\x00') >>> assert a.hashret() == b.hashret() >>> assert b.answers(a) ###(105)=[passed] ICMPv6MRD_Advertisement - Basic instantiation >>> raw(ICMPv6MRD_Advertisement()) == b'\x97\x14\x00\x00\x00\x00\x00\x00' True ###(106)=[passed] ICMPv6MRD_Advertisement - Instantiation with specific values >>> raw(ICMPv6MRD_Advertisement(advinter=0xdd, queryint=0xeeee, robustness=0xffff)) == b'\x97\xdd\x00\x00\xee\xee\xff\xff' True ###(107)=[passed] ICMPv6MRD_Advertisement - Basic Dissection and overloading mechanisms >>> a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Advertisement())) >>> a.dst == "33:33:00:00:00:02" and IPv6 in a and a[IPv6].plen == 8 and a[IPv6].nh == 58 and a[IPv6].hlim == 1 and a[IPv6].dst == "ff02::2" and ICMPv6MRD_Advertisement in a and a[ICMPv6MRD_Advertisement].type == 151 and a[ICMPv6MRD_Advertisement].advinter == 20 and a[ICMPv6MRD_Advertisement].queryint == 0 and a[ICMPv6MRD_Advertisement].robustness == 0 True ###(108)=[passed] ICMPv6MRD_Solicitation - Basic dissection >>> raw(ICMPv6MRD_Solicitation()) == b'\x98\x00\x00\x00' True ###(109)=[passed] ICMPv6MRD_Solicitation - Instantiation with specific values >>> raw(ICMPv6MRD_Solicitation(res=0xbb)) == b'\x98\xbb\x00\x00' True ###(110)=[passed] ICMPv6MRD_Solicitation - Basic Dissection and overloading mechanisms >>> a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Solicitation())) >>> a.dst == "33:33:00:00:00:02" and IPv6 in a and a[IPv6].plen == 4 and a[IPv6].nh == 58 and a[IPv6].hlim == 1 and a[IPv6].dst == "ff02::2" and ICMPv6MRD_Solicitation in a and a[ICMPv6MRD_Solicitation].type == 152 and a[ICMPv6MRD_Solicitation].res == 0 True ###(111)=[passed] ICMPv6MRD_Termination Basic instantiation >>> raw(ICMPv6MRD_Termination()) == b'\x99\x00\x00\x00' True ###(112)=[passed] ICMPv6MRD_Termination - Instantiation with specific values >>> raw(ICMPv6MRD_Termination(res=0xbb)) == b'\x99\xbb\x00\x00' True ###(113)=[passed] ICMPv6MRD_Termination - Basic Dissection and overloading mechanisms >>> a=Ether(raw(Ether()/IPv6()/ICMPv6MRD_Termination())) >>> a.dst == "33:33:00:00:00:6a" and IPv6 in a and a[IPv6].plen == 4 and a[IPv6].nh == 58 and a[IPv6].hlim == 1 and a[IPv6].dst == "ff02::6a" and ICMPv6MRD_Termination in a and a[ICMPv6MRD_Termination].type == 153 and a[ICMPv6MRD_Termination].res == 0 True ###### ## Test HBHOptUnknown Class ###### ###(114)=[passed] HBHOptUnknown - Basic Instantiation >>> raw(HBHOptUnknown()) == b'\x01\x00' True ###(115)=[passed] HBHOptUnknown - Basic Dissection >>> a=HBHOptUnknown(b'\x01\x00') >>> a.otype == 0x01 and a.optlen == 0 and a.optdata == b"" True ###(116)=[passed] HBHOptUnknown - Automatic optlen computation >>> raw(HBHOptUnknown(optdata="B"*10)) == b'\x01\nBBBBBBBBBB' True ###(117)=[passed] HBHOptUnknown - Instantiation with specific values >>> raw(HBHOptUnknown(optlen=9, optdata="B"*10)) == b'\x01\tBBBBBBBBBB' True ###(118)=[passed] HBHOptUnknown - Dissection with specific values >>> a=HBHOptUnknown(b'\x01\tBBBBBBBBBB') >>> a.otype == 0x01 and a.optlen == 9 and a.optdata == b"B"*9 and isinstance(a.payload, Raw) and a.payload.load == b"B" True ###### ## Test Pad1 Class ###### ###(119)=[passed] Pad1 - Basic Instantiation >>> raw(Pad1()) == b'\x00' True ###(120)=[passed] Pad1 - Basic Dissection >>> raw(Pad1(b'\x00')) == b'\x00' True ###### ## Test PadN Class ###### ###(121)=[passed] PadN - Basic Instantiation >>> raw(PadN()) == b'\x01\x00' True ###(122)=[passed] PadN - Optlen Automatic computation >>> raw(PadN(optdata="B"*10)) == b'\x01\nBBBBBBBBBB' True ###(123)=[passed] PadN - Basic Dissection >>> a=PadN(b'\x01\x00') >>> a.otype == 1 and a.optlen == 0 and a.optdata == b"" True ###(124)=[passed] PadN - Dissection with specific values >>> a=PadN(b'\x01\x0cBBBBBBBBBB') >>> a.otype == 1 and a.optlen == 12 and a.optdata == b'BBBBBBBBBB' True ###(125)=[passed] PadN - Instantiation with forced optlen >>> raw(PadN(optdata="B"*10, optlen=9)) == b'\x01\x09BBBBBBBBBB' True ###### ## Test RouterAlert Class (RFC 2711) ###### ###(126)=[passed] RouterAlert - Basic Instantiation >>> raw(RouterAlert()) == b'\x05\x02\x00\x00' True ###(127)=[passed] RouterAlert - Basic Dissection >>> a=RouterAlert(b'\x05\x02\x00\x00') >>> a.otype == 0x05 and a.optlen == 2 and a.value == 00 True ###(128)=[passed] RouterAlert - Instantiation with specific values >>> raw(RouterAlert(optlen=3, value=0xffff)) == b'\x05\x03\xff\xff' True ###(129)=[passed] RouterAlert - Instantiation with specific values >>> a=RouterAlert(b'\x05\x03\xff\xff') >>> a.otype == 0x05 and a.optlen == 3 and a.value == 0xffff True ###### ## Test RPL Option (RFC 6553) ###### ###(130)=[passed] RplOption - Basic Instantiation >>> raw(RplOption()) == b'c\x04\x00\x00\x00\x00' True ###(131)=[passed] RplOption - Basic Dissection >>> a=RplOption(b'c\x04\x00\x00\x00\x00') >>> a.otype == 0x63 and a.optlen == 4 and a.Down == False and a.RankError == 0 and a.ForwardError == 0 and a.RplInstanceId == 0 and a.SenderRank == 0 True ###(132)=[passed] RplOption - Instantiation with specific values >>> a=RplOption(RplInstanceId=0x1e, SenderRank=0x800) >>> a.otype == 0x63 and a.optlen == 4 and a.Down == False and a.RankError == 0 and a.ForwardError == 0 and a.RplInstanceId == 0x1e and a.SenderRank == 0x800 True ###(133)=[passed] RplOption - Instantiation with specific values >>> a=RplOption(Down=True, RplInstanceId=0x1e, SenderRank=0x800) >>> a.otype == 0x63 and a.optlen == 4 and a.Down == True and a.RankError == 0 and a.ForwardError == 0 and a.RplInstanceId == 0x1e and a.SenderRank == 0x800 True >>> raw(a) == b'c\x04\x80\x1e\x08\x00' True ###### ## Test Jumbo Class (RFC 2675) ###### ###(134)=[passed] Jumbo - Basic Instantiation >>> raw(Jumbo()) == b'\xc2\x04\x00\x00\x00\x00' True ###(135)=[passed] Jumbo - Basic Dissection >>> a=Jumbo(b'\xc2\x04\x00\x00\x00\x00') >>> a.otype == 0xC2 and a.optlen == 4 and a.jumboplen == 0 True ###(136)=[passed] Jumbo - Instantiation with specific values >>> raw(Jumbo(optlen=6, jumboplen=0xffffffff)) == b'\xc2\x06\xff\xff\xff\xff' True ###(137)=[passed] Jumbo - Dissection with specific values >>> a=Jumbo(b'\xc2\x06\xff\xff\xff\xff') >>> a.otype == 0xc2 and a.optlen == 6 and a.jumboplen == 0xffffffff True ###### ## Test HAO Class (RFC 3775) ###### ###(138)=[passed] HAO - Basic Instantiation >>> raw(HAO()) == b'\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(139)=[passed] HAO - Basic Dissection >>> a=HAO(b'\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.otype == 0xC9 and a.optlen == 16 and a.hoa == "::" True ###(140)=[passed] HAO - Instantiation with specific values >>> raw(HAO(optlen=9, hoa="2001::ffff")) == b'\xc9\t \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff' True ###(141)=[passed] HAO - Dissection with specific values >>> a=HAO(b'\xc9\t \x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff') >>> a.otype == 0xC9 and a.optlen == 9 and a.hoa == "2001::ffff" True ###(142)=[passed] HAO - hashret >>> p = IPv6()/IPv6ExtHdrDestOpt(options=HAO(hoa="2001:db8::1"))/ICMPv6EchoRequest() >>> p.hashret() == b' \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00' True ###### ## Test IPv6ExtHdrHopByHop() ###### ###(143)=[passed] IPv6ExtHdrHopByHop - Basic Instantiation >>> raw(IPv6ExtHdrHopByHop()) == b';\x00\x01\x04\x00\x00\x00\x00' True ###(144)=[passed] IPv6ExtHdrHopByHop - Instantiation with HAO option >>> raw(IPv6ExtHdrHopByHop(options=[HAO()])) == b';\x02\x01\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(145)=[passed] IPv6ExtHdrHopByHop - Instantiation with RouterAlert option >>> raw(IPv6ExtHdrHopByHop(options=[RouterAlert()])) == b';\x00\x05\x02\x00\x00\x01\x00' True ###(146)=[passed] IPv6ExtHdrHopByHop - Instantiation with RPL option >>> raw(IPv6ExtHdrHopByHop(options=[RplOption()])) == b';\x00c\x04\x00\x00\x00\x00' True ###(147)=[passed] IPv6ExtHdrHopByHop - Instantiation with Jumbo option >>> raw(IPv6ExtHdrHopByHop(options=[Jumbo()])) == b';\x00\xc2\x04\x00\x00\x00\x00' True ###(148)=[passed] IPv6ExtHdrHopByHop - Complete dissection with Jumbo option >>> s = b'`\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01:\x00\xc2\x04\x00\x00\x00\x10\x80\x00\x7f\xbb\x00\x00\x00\x00' >>> p = IPv6(s) >>> assert IPv6ExtHdrHopByHop in p and Jumbo in p and ICMPv6EchoRequest in p >>> >>> s = b'`\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01:\x01\x01\x06\x00\x00\x00\x00\x00\x00\xc2\x04\x00\x00\x00\x18\x80\x00\x7f\xbb\x00\x00\x00\x00' >>> p = IPv6(s) >>> assert IPv6ExtHdrHopByHop in p and PadN in p and Jumbo in p and ICMPv6EchoRequest in p ###(149)=[passed] IPv6ExtHdrHopByHop - Instantiation with Pad1 option >>> raw(IPv6ExtHdrHopByHop(options=[Pad1()])) == b';\x00\x00\x01\x03\x00\x00\x00' True ###(150)=[passed] IPv6ExtHdrHopByHop - Instantiation with PadN option >>> raw(IPv6ExtHdrHopByHop(options=[Pad1()])) == b';\x00\x00\x01\x03\x00\x00\x00' True ###(151)=[passed] IPv6ExtHdrHopByHop - Instantiation with Jumbo, RouterAlert, HAO >>> raw(IPv6ExtHdrHopByHop(options=[Jumbo(), RouterAlert(), HAO()])) == b';\x03\xc2\x04\x00\x00\x00\x00\x05\x02\x00\x00\x01\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(152)=[passed] IPv6ExtHdrHopByHop - Instantiation with HAO, Jumbo, RouterAlert >>> raw(IPv6ExtHdrHopByHop(options=[HAO(), Jumbo(), RouterAlert()])) == b';\x04\x01\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xc2\x04\x00\x00\x00\x00\x05\x02\x00\x00\x01\x02\x00\x00' True ###(153)=[passed] IPv6ExtHdrHopByHop - Instantiation with RouterAlert, HAO, Jumbo >>> raw(IPv6ExtHdrHopByHop(options=[RouterAlert(), HAO(), Jumbo()])) == b';\x03\x05\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\xc2\x04\x00\x00\x00\x00' True ###(154)=[passed] IPv6ExtHdrHopByHop - Hashret >>> (IPv6(src="::1", dst="::1")/IPv6ExtHdrHopByHop()).hashret() == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;' True ###(155)=[passed] IPv6ExtHdrHopByHop - Basic Dissection >>> a=IPv6ExtHdrHopByHop(b';\x00\x01\x04\x00\x00\x00\x00') >>> a.nh == 59 and a.len == 0 and len(a.options) == 1 and isinstance(a.options[0], PadN) and a.options[0].otype == 1 and a.options[0].optlen == 4 and a.options[0].optdata == b'\x00'*4 True ###### ## Test ICMPv6ND_RS() class - ICMPv6 Type 133 Code 0 ###### ###(156)=[passed] ICMPv6ND_RS - Basic instantiation >>> raw(ICMPv6ND_RS()) == b'\x85\x00\x00\x00\x00\x00\x00\x00' True ###(157)=[passed] ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer >>> raw(IPv6(src="2001:db8::1")/ICMPv6ND_RS()) == b'`\x00\x00\x00\x00\x08:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x85\x00M\xfe\x00\x00\x00\x00' True ###(158)=[passed] ICMPv6ND_RS - Basic dissection >>> a=ICMPv6ND_RS(b'\x85\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 133 and a.code == 0 and a.cksum == 0 and a.res == 0 True ###(159)=[passed] ICMPv6ND_RS - Basic instantiation with empty dst in IPv6 underlayer >>> a=IPv6(b'`\x00\x00\x00\x00\x08:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x85\x00M\xfe\x00\x00\x00\x00') >>> assert isinstance(a, IPv6) and a.nh == 58 and a.hlim == 255 and isinstance(a.payload, ICMPv6ND_RS) and a.payload.type == 133 and a.payload.code == 0 and a.payload.cksum == 0x4dfe and a.payload.res == 0 >>> assert a.hashret() == b":" ###### ## Test ICMPv6ND_RA() class - ICMPv6 Type 134 Code 0 ###### ###(160)=[passed] ICMPv6ND_RA - Basic Instantiation >>> raw(ICMPv6ND_RA()) == b'\x86\x00\x00\x00\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00' True ###(161)=[passed] ICMPv6ND_RA - Basic instantiation with empty dst in IPv6 underlayer >>> raw(IPv6(src="2001:db8::1")/ICMPv6ND_RA()) == b'`\x00\x00\x00\x00\x10:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x86\x00E\xe7\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00' True ###(162)=[passed] ICMPv6ND_RA - Basic dissection >>> a=ICMPv6ND_RA(b'\x86\x00\x00\x00\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 134 and a.code == 0 and a.cksum == 0 and a.chlim == 0 and a.M == 0 and a.O == 0 and a.H == 0 and a.prf == 1 and a.res == 0 and a.routerlifetime == 1800 and a.reachabletime == 0 and a.retranstimer == 0 True ###(163)=[passed] ICMPv6ND_RA - Basic instantiation with empty dst in IPv6 underlayer >>> a=IPv6(b'`\x00\x00\x00\x00\x10:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x86\x00E\xe7\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00') >>> isinstance(a, IPv6) and a.nh == 58 and a.hlim == 255 and isinstance(a.payload, ICMPv6ND_RA) and a.payload.type == 134 and a.code == 0 and a.cksum == 0x45e7 and a.chlim == 0 and a.M == 0 and a.O == 0 and a.H == 0 and a.prf == 1 and a.res == 0 and a.routerlifetime == 1800 and a.reachabletime == 0 and a.retranstimer == 0 True ###(164)=[passed] ICMPv6ND_RA - Answers >>> assert ICMPv6ND_RA().answers(ICMPv6ND_RS()) >>> a=IPv6(b'`\x00\x00\x00\x00\x10:\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x86\x00E\xe7\x00\x08\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00') >>> b = IPv6(b"`\x00\x00\x00\x00\x10:\xff\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x85\x00M\xff\x00\x00\x00\x00") >>> assert a.answers(b) ###(165)=[passed] ICMPv6ND_RA - Summary Output >>> ICMPv6ND_RA(chlim=42, M=0, O=1, H=0, prf=1, P=0, routerlifetime=300).mysummary() == "ICMPv6 Neighbor Discovery - Router Advertisement Lifetime 300 Hop Limit 42 Preference High Managed 0 Other 1 Home 0" True ###### ## ICMPv6ND_NS Class Test ###### ###(166)=[passed] ICMPv6ND_NS - Basic Instantiation >>> raw(ICMPv6ND_NS()) == b'\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(167)=[passed] ICMPv6ND_NS - Instantiation with specific values >>> raw(ICMPv6ND_NS(code=0x11, res=3758096385, tgt="ffff::1111")) == b'\x87\x11\x00\x00\xe0\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###(168)=[passed] ICMPv6ND_NS - Basic Dissection >>> a=ICMPv6ND_NS(b'\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.code==0 and a.res==0 and a.tgt=="::" True ###(169)=[passed] ICMPv6ND_NS - Dissection with specific values >>> a=ICMPv6ND_NS(b'\x87\x11\x00\x00\xe0\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') >>> assert a.code==0x11 and a.res==3758096385 and a.tgt=="ffff::1111" >>> assert a.hashret() == b"ffff::1111" ###(170)=[passed] ICMPv6ND_NS - IPv6 layer fields overloading >>> a=IPv6(raw(IPv6()/ICMPv6ND_NS())) >>> a.nh == 58 and a.dst=="ff02::1" and a.hlim==255 True ###### ## ICMPv6ND_NA Class Test ###### ###(171)=[passed] ICMPv6ND_NA - Basic Instantiation >>> raw(ICMPv6ND_NA()) == b'\x88\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(172)=[passed] ICMPv6ND_NA - Instantiation with specific values >>> raw(ICMPv6ND_NA(code=0x11, R=0, S=1, O=0, res=1, tgt="ffff::1111")) == b'\x88\x11\x00\x00@\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###(173)=[passed] ICMPv6ND_NA - Basic Dissection >>> a=ICMPv6ND_NA(b'\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.code==0 and a.R==0 and a.S==0 and a.O==0 and a.res==0 and a.tgt=="::" True ###(174)=[passed] ICMPv6ND_NA - Dissection with specific values >>> a=ICMPv6ND_NA(b'\x88\x11\x00\x00@\x00\x00\x01\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') >>> a.code==0x11 and a.R==0 and a.S==1 and a.O==0 and a.res==1 and a.tgt=="ffff::1111" True >>> assert a.hashret() == b'ffff::1111' ###(175)=[passed] ICMPv6ND_NS - IPv6 layer fields overloading >>> a=IPv6(raw(IPv6()/ICMPv6ND_NS())) >>> a.nh == 58 and a.dst=="ff02::1" and a.hlim==255 True ###### ## ICMPv6ND_ND/ICMPv6ND_ND matching test ###### ###(176)=[passed] ICMPv6ND_ND/ICMPv6ND_ND matching - test 1 >>> a=IPv6(b'`\x00\x00\x00\x00\x18:\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f\x1f\xff\xfe\xcaFP\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87\x00UC\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f4\xff\xfe\x8a\x8a\xa1') >>> b=IPv6(b'n\x00\x00\x00\x00 :\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f4\xff\xfe\x8a\x8a\xa1\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f\x1f\xff\xfe\xcaFP\x88\x00\xf3F\xe0\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x02\x0f4\xff\xfe\x8a\x8a\xa1\x02\x01\x00\x0f4\x8a\x8a\xa1') >>> b.answers(a) True ###### ## ICMPv6NDOptUnknown Class Test ###### ###(177)=[passed] ICMPv6NDOptUnknown - Basic Instantiation >>> b = b'\x00\x01\x00\x00\x00\x00\x00\x00' >>> >>> raw(ICMPv6NDOptUnknown()) == b True ###(178)=[passed] ICMPv6NDOptUnknown - Instantiation with specific values >>> raw(ICMPv6NDOptUnknown(data="somestring")) == b'\x00\x02somestring\x00\x00\x00\x00' True ###(179)=[passed] ICMPv6NDOptUnknown - Basic Dissection >>> b = b'\x00\x01\x00\x00\x00\x00\x00\x00' >>> >>> p = ICMPv6NDOptUnknown(b) >>> p.type == 0 and p.len == 1 and p.data == b'\x00' * 6 True >>> >>> p = ICMPv6NDOptUnknown(b + b'\x00') >>> assert Raw in p and raw(p[Raw]) == b'\x00' >>> >>> p = ICMPv6NDOptUnknown(b + b'\x00\x00') >>> assert raw(p[ICMPv6NDOptUnknown:2]) == b'\x00\x00' ###(180)=[passed] ICMPv6NDOptUnknown - Dissection with specific values >>> p = ICMPv6NDOptUnknown(b'\x00\x01string') >>> assert p.type == 0 and p.len == 1 and p.data == b'string' >>> >>> p = ICMPv6NDOptUnknown(b'\x00\x04somestring') >>> assert p.type == 0 and p.len == 4 and p.data == b'somestring' ###(181)=[passed] ICMPv6NDOptUnknown - Instantiation/Dissection with unknown option in the middle >>> b = b'\x01\x01\x00\x00\x00\x00\x00\x00\x00\x02somestring\x00\x00\x00\x00%\x01\x00\x00\x00\x00\x00\x00' >>> >>> p = ICMPv6NDOptSrcLLAddr()/ICMPv6NDOptUnknown(data='somestring')/ICMPv6NDOptCaptivePortal() >>> assert raw(p) == b >>> >>> p = ICMPv6NDOptSrcLLAddr(b)[ICMPv6NDOptUnknown] >>> assert p.type == 0 and p.len == 2 and p.data == b'somestring\x00\x00\x00\x00' ###(182)=[passed] ICMPv6NDOptUnknown - fuzz >>> assert isinstance(fuzz(ICMPv6NDOptUnknown()).type, RandByte) ###### ## ICMPv6NDOptSrcLLAddr Class Test ###### ###(183)=[passed] ICMPv6NDOptSrcLLAddr - Basic Instantiation >>> raw(ICMPv6NDOptSrcLLAddr()) == b'\x01\x01\x00\x00\x00\x00\x00\x00' True ###(184)=[passed] ICMPv6NDOptSrcLLAddr - Instantiation with specific values >>> raw(ICMPv6NDOptSrcLLAddr(len=2, lladdr="11:11:11:11:11:11")) == b'\x01\x02\x11\x11\x11\x11\x11\x11' True ###(185)=[passed] ICMPv6NDOptSrcLLAddr - Basic Dissection >>> a=ICMPv6NDOptSrcLLAddr(b'\x01\x01\x00\x00\x00\x00\x00\x00') >>> a.type == 1 and a.len == 1 and a.lladdr == "00:00:00:00:00:00" True ###(186)=[passed] ICMPv6NDOptSrcLLAddr - Instantiation with specific values >>> a=ICMPv6NDOptSrcLLAddr(b'\x01\x02\x11\x11\x11\x11\x11\x11') >>> a.type == 1 and a.len == 2 and a.lladdr == "11:11:11:11:11:11" True ###### ## ICMPv6NDOptDstLLAddr Class Test ###### ###(187)=[passed] ICMPv6NDOptDstLLAddr - Basic Instantiation >>> raw(ICMPv6NDOptDstLLAddr()) == b'\x02\x01\x00\x00\x00\x00\x00\x00' True ###(188)=[passed] ICMPv6NDOptDstLLAddr - Instantiation with specific values >>> raw(ICMPv6NDOptDstLLAddr(len=2, lladdr="11:11:11:11:11:11")) == b'\x02\x02\x11\x11\x11\x11\x11\x11' True ###(189)=[passed] ICMPv6NDOptDstLLAddr - Basic Dissection >>> a=ICMPv6NDOptDstLLAddr(b'\x02\x01\x00\x00\x00\x00\x00\x00') >>> a.type == 2 and a.len == 1 and a.lladdr == "00:00:00:00:00:00" True ###(190)=[passed] ICMPv6NDOptDstLLAddr - Instantiation with specific values >>> a=ICMPv6NDOptDstLLAddr(b'\x02\x02\x11\x11\x11\x11\x11\x11') >>> a.type == 2 and a.len == 2 and a.lladdr == "11:11:11:11:11:11" True ###### ## ICMPv6NDOptPrefixInfo Class Test ###### ###(191)=[passed] ICMPv6NDOptPrefixInfo - Basic Instantiation >>> raw(ICMPv6NDOptPrefixInfo()) == b'\x03\x04@\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(192)=[passed] ICMPv6NDOptPrefixInfo - Instantiation with specific values >>> raw(ICMPv6NDOptPrefixInfo(len=5, prefixlen=64, L=0, A=0, R=1, res1=1, validlifetime=0x11111111, preferredlifetime=0x22222222, res2=0x33333333, prefix="2001:db8::1")) == b'\x03\x05@!\x11\x11\x11\x11""""3333 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(193)=[passed] ICMPv6NDOptPrefixInfo - Basic Dissection >>> a=ICMPv6NDOptPrefixInfo(b'\x03\x04\x00\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 3 and a.len == 4 and a.prefixlen == 0 and a.L == 1 and a.A == 1 and a.R == 0 and a.res1 == 0 and a.validlifetime == 0xffffffff and a.preferredlifetime == 0xffffffff and a.res2 == 0 and a.prefix == "::" True ###(194)=[passed] ICMPv6NDOptPrefixInfo - Instantiation with specific values >>> a=ICMPv6NDOptPrefixInfo(b'\x03\x05@!\x11\x11\x11\x11""""3333 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.type == 3 and a.len == 5 and a.prefixlen == 64 and a.L == 0 and a.A == 0 and a.R == 1 and a.res1 == 1 and a.validlifetime == 0x11111111 and a.preferredlifetime == 0x22222222 and a.res2 == 0x33333333 and a.prefix == "2001:db8::1" True ###### ## ICMPv6NDOptRedirectedHdr Class Test ###### ###(195)=[passed] ICMPv6NDOptRedirectedHdr - Basic Instantiation >>> raw(ICMPv6NDOptRedirectedHdr()) == b'\x04\x01\x00\x00\x00\x00\x00\x00' True ###(196)=[passed] ICMPv6NDOptRedirectedHdr - Instantiation with specific values >>> raw(ICMPv6NDOptRedirectedHdr(len=0xff, res="abcdef", pkt="somestringthatisnotanipv6packet")) == b'\x04\xffabcdefsomestringthatisnotanipv' True ###(197)=[passed] ICMPv6NDOptRedirectedHdr - Instantiation with simple IPv6 packet (no upper layer) >>> raw(ICMPv6NDOptRedirectedHdr(pkt=IPv6())) == b'\x04\x06\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(198)=[passed] ICMPv6NDOptRedirectedHdr - Basic Dissection >>> a=ICMPv6NDOptRedirectedHdr(b'\x04\x00\x00\x00') >>> assert a.type == 4 >>> assert a.len == 0 >>> assert a.res == b"\x00\x00" >>> assert a.pkt == b"" ###(199)=[passed] ICMPv6NDOptRedirectedHdr - Disssection with specific values >>> with no_debug_dissector(): ... a=ICMPv6NDOptRedirectedHdr(b'\x04\xff\x11\x11\x00\x00\x00\x00somerawingthatisnotanipv6pac') ... >>> a.type == 4 and a.len == 255 and a.res == b'\x11\x11\x00\x00\x00\x00' and isinstance(a.pkt, Raw) and a.pkt.load == b"somerawingthatisnotanipv6pac" True ###(200)=[passed] ICMPv6NDOptRedirectedHdr - Dissection with cut IPv6 Header >>> with no_debug_dissector(): ... a=ICMPv6NDOptRedirectedHdr(b'\x04\x06\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') ... >>> a.type == 4 and a.len == 6 and a.res == b"\x00\x00\x00\x00\x00\x00" and isinstance(a.pkt, Raw) and a.pkt.load == b'`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(201)=[passed] ICMPv6NDOptRedirectedHdr - Complete dissection >>> x=ICMPv6NDOptRedirectedHdr(b'\x04\x06\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> y=x.copy() >>> del y.len >>> x == ICMPv6NDOptRedirectedHdr(raw(y)) True ###### ## ICMPv6NDOptMTU Class Test ###### ###(202)=[passed] ICMPv6NDOptMTU - Basic Instantiation >>> raw(ICMPv6NDOptMTU()) == b'\x05\x01\x00\x00\x00\x00\x05\x00' True ###(203)=[passed] ICMPv6NDOptMTU - Instantiation with specific values >>> raw(ICMPv6NDOptMTU(len=2, res=0x1111, mtu=1500)) == b'\x05\x02\x11\x11\x00\x00\x05\xdc' True ###(204)=[passed] ICMPv6NDOptMTU - Basic dissection >>> a=ICMPv6NDOptMTU(b'\x05\x01\x00\x00\x00\x00\x05\x00') >>> a.type == 5 and a.len == 1 and a.res == 0 and a.mtu == 1280 True ###(205)=[passed] ICMPv6NDOptMTU - Dissection with specific values >>> a=ICMPv6NDOptMTU(b'\x05\x02\x11\x11\x00\x00\x05\xdc') >>> a.type == 5 and a.len == 2 and a.res == 0x1111 and a.mtu == 1500 True ###(206)=[passed] ICMPv6NDOptMTU - Summary Output >>> ICMPv6NDOptMTU(b'\x05\x02\x11\x11\x00\x00\x05\xdc').mysummary() == "ICMPv6 Neighbor Discovery Option - MTU 1500" True ###### ## ICMPv6NDOptShortcutLimit Class Test (RFC2491) ###### ###(207)=[passed] ICMPv6NDOptShortcutLimit - Basic Instantiation >>> raw(ICMPv6NDOptShortcutLimit()) == b'\x06\x01(\x00\x00\x00\x00\x00' True ###(208)=[passed] ICMPv6NDOptShortcutLimit - Instantiation with specific values >>> raw(ICMPv6NDOptShortcutLimit(len=2, shortcutlim=0x11, res1=0xee, res2=0xaaaaaaaa)) == b'\x06\x02\x11\xee\xaa\xaa\xaa\xaa' True ###(209)=[passed] ICMPv6NDOptShortcutLimit - Basic Dissection >>> a=ICMPv6NDOptShortcutLimit(b'\x06\x01(\x00\x00\x00\x00\x00') >>> a.type == 6 and a.len == 1 and a.shortcutlim == 40 and a.res1 == 0 and a.res2 == 0 True ###(210)=[passed] ICMPv6NDOptShortcutLimit - Dissection with specific values >>> a=ICMPv6NDOptShortcutLimit(b'\x06\x02\x11\xee\xaa\xaa\xaa\xaa') >>> a.len==2 and a.shortcutlim==0x11 and a.res1==0xee and a.res2==0xaaaaaaaa True ###### ## ICMPv6NDOptAdvInterval Class Test ###### ###(211)=[passed] ICMPv6NDOptAdvInterval - Basic Instantiation >>> raw(ICMPv6NDOptAdvInterval()) == b'\x07\x01\x00\x00\x00\x00\x00\x00' True ###(212)=[passed] ICMPv6NDOptAdvInterval - Instantiation with specific values >>> raw(ICMPv6NDOptAdvInterval(len=2, res=0x1111, advint=0xffffffff)) == b'\x07\x02\x11\x11\xff\xff\xff\xff' True ###(213)=[passed] ICMPv6NDOptAdvInterval - Basic dissection >>> a=ICMPv6NDOptAdvInterval(b'\x07\x01\x00\x00\x00\x00\x00\x00') >>> a.type == 7 and a.len == 1 and a.res == 0 and a.advint == 0 True ###(214)=[passed] ICMPv6NDOptAdvInterval - Dissection with specific values >>> a=ICMPv6NDOptAdvInterval(b'\x07\x02\x11\x11\xff\xff\xff\xff') >>> a.type == 7 and a.len == 2 and a.res == 0x1111 and a.advint == 0xffffffff True ###### ## ICMPv6NDOptHAInfo Class Test ###### ###(215)=[passed] ICMPv6NDOptHAInfo - Basic Instantiation >>> raw(ICMPv6NDOptHAInfo()) == b'\x08\x01\x00\x00\x00\x00\x00\x01' True ###(216)=[passed] ICMPv6NDOptHAInfo - Instantiation with specific values >>> raw(ICMPv6NDOptHAInfo(len=2, res=0x1111, pref=0x2222, lifetime=0x3333)) == b'\x08\x02\x11\x11""33' True ###(217)=[passed] ICMPv6NDOptHAInfo - Basic dissection >>> a=ICMPv6NDOptHAInfo(b'\x08\x01\x00\x00\x00\x00\x00\x01') >>> a.type == 8 and a.len == 1 and a.res == 0 and a.pref == 0 and a.lifetime == 1 True ###(218)=[passed] ICMPv6NDOptHAInfo - Dissection with specific values >>> a=ICMPv6NDOptHAInfo(b'\x08\x02\x11\x11""33') >>> a.type == 8 and a.len == 2 and a.res == 0x1111 and a.pref == 0x2222 and a.lifetime == 0x3333 True ###### ## ICMPv6NDOptSrcAddrList Class Test ###### ###(219)=[passed] ICMPv6NDOptSrcAddrList - Basic Instantiation >>> raw(ICMPv6NDOptSrcAddrList()) == b'\t\x01\x00\x00\x00\x00\x00\x00' True ###(220)=[passed] ICMPv6NDOptSrcAddrList - Instantiation with specific values (auto len) >>> raw(ICMPv6NDOptSrcAddrList(res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\t\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###(221)=[passed] ICMPv6NDOptSrcAddrList - Instantiation with specific values >>> raw(ICMPv6NDOptSrcAddrList(len=3, res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\t\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###(222)=[passed] ICMPv6NDOptSrcAddrList - Basic Dissection >>> a=ICMPv6NDOptSrcAddrList(b'\t\x01\x00\x00\x00\x00\x00\x00') >>> a.type == 9 and a.len == 1 and a.res == b'\x00\x00\x00\x00\x00\x00' and not a.addrlist True ###(223)=[passed] ICMPv6NDOptSrcAddrList - Dissection with specific values (auto len) >>> a=ICMPv6NDOptSrcAddrList(b'\t\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') >>> a.type == 9 and a.len == 5 and a.res == b'BBBBBB' and len(a.addrlist) == 2 and a.addrlist[0] == "ffff::ffff" and a.addrlist[1] == "1111::1111" True ###(224)=[passed] ICMPv6NDOptSrcAddrList - Dissection with specific values >>> with no_debug_dissector(): ... a=ICMPv6NDOptSrcAddrList(b'\t\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') ... >>> a.type == 9 and a.len == 3 and a.res == b'BBBBBB' and len(a.addrlist) == 1 and a.addrlist[0] == "ffff::ffff" and isinstance(a.payload, Raw) and a.payload.load == b'\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###### ## ICMPv6NDOptTgtAddrList Class Test ###### ###(225)=[passed] ICMPv6NDOptTgtAddrList - Basic Instantiation >>> raw(ICMPv6NDOptTgtAddrList()) == b'\n\x01\x00\x00\x00\x00\x00\x00' True ###(226)=[passed] ICMPv6NDOptTgtAddrList - Instantiation with specific values (auto len) >>> raw(ICMPv6NDOptTgtAddrList(res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\n\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###(227)=[passed] ICMPv6NDOptTgtAddrList - Instantiation with specific values >>> raw(ICMPv6NDOptTgtAddrList(len=3, res="BBBBBB", addrlist=["ffff::ffff", "1111::1111"])) == b'\n\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###(228)=[passed] ICMPv6NDOptTgtAddrList - Basic Dissection >>> a=ICMPv6NDOptTgtAddrList(b'\n\x01\x00\x00\x00\x00\x00\x00') >>> a.type == 10 and a.len == 1 and a.res == b'\x00\x00\x00\x00\x00\x00' and not a.addrlist True ###(229)=[passed] ICMPv6NDOptTgtAddrList - Dissection with specific values (auto len) >>> a=ICMPv6NDOptTgtAddrList(b'\n\x05BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') >>> a.type == 10 and a.len == 5 and a.res == b'BBBBBB' and len(a.addrlist) == 2 and a.addrlist[0] == "ffff::ffff" and a.addrlist[1] == "1111::1111" True ###(230)=[passed] ICMPv6NDOptTgtAddrList - Instantiation with specific values >>> with no_debug_dissector(): ... a=ICMPv6NDOptTgtAddrList(b'\n\x03BBBBBB\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') ... >>> a.type == 10 and a.len == 3 and a.res == b'BBBBBB' and len(a.addrlist) == 1 and a.addrlist[0] == "ffff::ffff" and isinstance(a.payload, Raw) and a.payload.load == b'\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###### ## ICMPv6NDOptIPAddr Class Test (RFC 4068) ###### ###(231)=[passed] ICMPv6NDOptIPAddr - Basic Instantiation >>> raw(ICMPv6NDOptIPAddr()) == b'\x11\x03\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(232)=[passed] ICMPv6NDOptIPAddr - Instantiation with specific values >>> raw(ICMPv6NDOptIPAddr(len=5, optcode=0xff, plen=40, res=0xeeeeeeee, addr="ffff::1111")) == b'\x11\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###(233)=[passed] ICMPv6NDOptIPAddr - Basic Dissection >>> a=ICMPv6NDOptIPAddr(b'\x11\x03\x01@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 17 and a.len == 3 and a.optcode == 1 and a.plen == 64 and a.res == 0 and a.addr == "::" True ###(234)=[passed] ICMPv6NDOptIPAddr - Dissection with specific values >>> a=ICMPv6NDOptIPAddr(b'\x11\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') >>> a.type == 17 and a.len == 5 and a.optcode == 0xff and a.plen == 40 and a.res == 0xeeeeeeee and a.addr == "ffff::1111" True ###### ## ICMPv6NDOptNewRtrPrefix Class Test (RFC 4068) ###### ###(235)=[passed] ICMPv6NDOptNewRtrPrefix - Basic Instantiation >>> raw(ICMPv6NDOptNewRtrPrefix()) == b'\x12\x03\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(236)=[passed] ICMPv6NDOptNewRtrPrefix - Instantiation with specific values >>> raw(ICMPv6NDOptNewRtrPrefix(len=5, optcode=0xff, plen=40, res=0xeeeeeeee, prefix="ffff::1111")) == b'\x12\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###(237)=[passed] ICMPv6NDOptNewRtrPrefix - Basic Dissection >>> a=ICMPv6NDOptNewRtrPrefix(b'\x12\x03\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 18 and a.len == 3 and a.optcode == 0 and a.plen == 64 and a.res == 0 and a.prefix == "::" True ###(238)=[passed] ICMPv6NDOptNewRtrPrefix - Dissection with specific values >>> a=ICMPv6NDOptNewRtrPrefix(b'\x12\x05\xff(\xee\xee\xee\xee\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') >>> a.type == 18 and a.len == 5 and a.optcode == 0xff and a.plen == 40 and a.res == 0xeeeeeeee and a.prefix == "ffff::1111" True ###### ## ICMPv6NDOptLLA Class Test (RFC 4068) ###### ###(239)=[passed] ICMPv6NDOptLLA - Basic Instantiation >>> raw(ICMPv6NDOptLLA()) == b'\x13\x01\x00\x00\x00\x00\x00\x00\x00' True ###(240)=[passed] ICMPv6NDOptLLA - Instantiation with specific values >>> raw(ICMPv6NDOptLLA(len=2, optcode=3, lla="ff:11:ff:11:ff:11")) == b'\x13\x02\x03\xff\x11\xff\x11\xff\x11' True ###(241)=[passed] ICMPv6NDOptLLA - Basic Dissection >>> a=ICMPv6NDOptLLA(b'\x13\x01\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 19 and a.len == 1 and a.optcode == 0 and a.lla == "00:00:00:00:00:00" True ###(242)=[passed] ICMPv6NDOptLLA - Dissection with specific values >>> a=ICMPv6NDOptLLA(b'\x13\x02\x03\xff\x11\xff\x11\xff\x11') >>> a.type == 19 and a.len == 2 and a.optcode == 3 and a.lla == "ff:11:ff:11:ff:11" True ###### ## ICMPv6NDOptRouteInfo Class Test ###### ###(243)=[passed] ICMPv6NDOptRouteInfo - Basic Instantiation >>> raw(ICMPv6NDOptRouteInfo()) == b'\x18\x01\x00\x00\xff\xff\xff\xff' True ###(244)=[passed] ICMPv6NDOptRouteInfo - Instantiation with forced prefix but no length >>> raw(ICMPv6NDOptRouteInfo(prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01' True ###(245)=[passed] ICMPv6NDOptRouteInfo - Instantiation with forced length values (1/4) >>> raw(ICMPv6NDOptRouteInfo(len=1, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x01\x00\x00\xff\xff\xff\xff' True ###(246)=[passed] ICMPv6NDOptRouteInfo - Instantiation with forced length values (2/4) >>> raw(ICMPv6NDOptRouteInfo(len=2, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x02\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01' True ###(247)=[passed] ICMPv6NDOptRouteInfo - Instantiation with forced length values (3/4) >>> raw(ICMPv6NDOptRouteInfo(len=3, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01' True ###(248)=[passed] ICMPv6NDOptRouteInfo - Instantiation with forced length values (4/4) >>> raw(ICMPv6NDOptRouteInfo(len=4, prefix="2001:db8:1:1:1:1:1:1")) == b'\x18\x04\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00' True ###(249)=[passed] ICMPv6NDOptRouteInfo - Instantiation with specific values >>> raw(ICMPv6NDOptRouteInfo(len=6, plen=0x11, res1=1, prf=3, res2=1, rtlifetime=0x22222222, prefix="2001:db8::1")) == b'\x18\x06\x119"""" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(250)=[passed] ICMPv6NDOptRouteInfo - Basic dissection >>> a=ICMPv6NDOptRouteInfo(b'\x18\x03\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 24 and a.len == 3 and a.plen == 0 and a.res1 == 0 and a.prf == 0 and a.res2 == 0 and a.rtlifetime == 0xffffffff and a. prefix == "::" True ###(251)=[passed] ICMPv6NDOptRouteInfo - Dissection with specific values >>> a=ICMPv6NDOptRouteInfo(b'\x18\x04\x119"""" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.plen == 0x11 and a.res1 == 1 and a.prf == 3 and a.res2 == 1 and a.rtlifetime == 0x22222222 and a.prefix == "2001:db8::1" True ###(252)=[passed] ICMPv6NDOptRouteInfo - Summary Output >>> ICMPv6NDOptRouteInfo(b'\x18\x04\x119"""" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01').mysummary() == "ICMPv6 Neighbor Discovery Option - Route Information Option 2001:db8::1/17 Preference Low" True ###### ## ICMPv6NDOptMAP Class Test ###### ###(253)=[passed] ICMPv6NDOptMAP - Basic Instantiation >>> raw(ICMPv6NDOptMAP()) == b'\x17\x03\x1f\x80\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(254)=[passed] ICMPv6NDOptMAP - Instantiation with specific values >>> raw(ICMPv6NDOptMAP(len=5, dist=3, pref=10, R=0, res=1, validlifetime=0x11111111, addr="ffff::1111")) == b'\x17\x05:\x01\x11\x11\x11\x11\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11' True ###(255)=[passed] ICMPv6NDOptMAP - Basic Dissection >>> a=ICMPv6NDOptMAP(b'\x17\x03\x1f\x80\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.type==23 and a.len==3 and a.dist==1 and a.pref==15 and a.R==1 and a.res==0 and a.validlifetime==0xffffffff and a.addr=="::" True ###(256)=[passed] ICMPv6NDOptMAP - Dissection with specific values >>> a=ICMPv6NDOptMAP(b'\x17\x05:\x01\x11\x11\x11\x11\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x11') >>> a.type==23 and a.len==5 and a.dist==3 and a.pref==10 and a.R==0 and a.res==1 and a.validlifetime==0x11111111 and a.addr=="ffff::1111" True ###### ## ICMPv6NDOptRDNSS Class Test ###### ###(257)=[passed] ICMPv6NDOptRDNSS - Basic Instantiation >>> raw(ICMPv6NDOptRDNSS()) == b'\x19\x01\x00\x00\xff\xff\xff\xff' True ###(258)=[passed] ICMPv6NDOptRDNSS - Basic instantiation with 1 DNS address >>> raw(ICMPv6NDOptRDNSS(dns=["2001:db8::1"])) == b'\x19\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' True ###(259)=[passed] ICMPv6NDOptRDNSS - Basic instantiation with 2 DNS addresses >>> raw(ICMPv6NDOptRDNSS(dns=["2001:db8::1", "2001:db8::2"])) == b'\x19\x05\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' True ###(260)=[passed] ICMPv6NDOptRDNSS - Instantiation with specific values >>> raw(ICMPv6NDOptRDNSS(len=43, res=0xaaee, lifetime=0x11111111, dns=["2001:db8::2"])) == b'\x19+\xaa\xee\x11\x11\x11\x11 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' True ###(261)=[passed] ICMPv6NDOptRDNSS - Basic Dissection >>> a=ICMPv6NDOptRDNSS(b'\x19\x01\x00\x00\xff\xff\xff\xff') >>> a.type==25 and a.len==1 and a.res == 0 and a.dns==[] True ###(262)=[passed] ICMPv6NDOptRDNSS - Dissection (with 1 DNS address) >>> a=ICMPv6NDOptRDNSS(b'\x19\x03\x00\x00\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> a.type==25 and a.len==3 and a.res ==0 and len(a.dns) == 1 and a.dns[0] == "2001:db8::1" True ###(263)=[passed] ICMPv6NDOptRDNSS - Dissection (with 2 DNS addresses) >>> a=ICMPv6NDOptRDNSS(b'\x19\x05\xaa\xee\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') >>> a.type==25 and a.len==5 and a.res == 0xaaee and len(a.dns) == 2 and a.dns[0] == "2001:db8::1" and a.dns[1] == "2001:db8::2" True ###(264)=[passed] ICMPv6NDOptRDNSS - Summary Output >>> a=ICMPv6NDOptRDNSS(b'\x19\x05\xaa\xee\xff\xff\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02') >>> a.mysummary() == "ICMPv6 Neighbor Discovery Option - Recursive DNS Server Option 2001:db8::1, 2001:db8::2" True ###### ## ICMPv6NDOptDNSSL Class Test ###### ###(265)=[passed] ICMPv6NDOptDNSSL - Basic Instantiation >>> raw(ICMPv6NDOptDNSSL()) == b'\x1f\x01\x00\x00\xff\xff\xff\xff' True ###(266)=[passed] ICMPv6NDOptDNSSL - Instantiation with 1 search domain, as seen in the wild >>> raw(ICMPv6NDOptDNSSL(lifetime=60, searchlist=["home."])) == b'\x1f\x02\x00\x00\x00\x00\x00<\x04home\x00\x00\x00' True ###(267)=[passed] ICMPv6NDOptDNSSL - Basic instantiation with 2 search domains >>> raw(ICMPv6NDOptDNSSL(searchlist=["home.", "office."])) == b'\x1f\x03\x00\x00\xff\xff\xff\xff\x04home\x00\x06office\x00\x00\x00' True ###(268)=[passed] ICMPv6NDOptDNSSL - Basic instantiation with 3 search domains >>> raw(ICMPv6NDOptDNSSL(searchlist=["home.", "office.", "here.there."])) == b'\x1f\x05\x00\x00\xff\xff\xff\xff\x04home\x00\x06office\x00\x04here\x05there\x00\x00\x00\x00\x00\x00\x00' True ###(269)=[passed] ICMPv6NDOptDNSSL - Basic Dissection >>> p = ICMPv6NDOptDNSSL(b'\x1f\x01\x00\x00\xff\xff\xff\xff') >>> p.type == 31 and p.len == 1 and p.res == 0 and p.searchlist == [] True ###(270)=[passed] ICMPv6NDOptDNSSL - Basic Dissection with specific values >>> p = ICMPv6NDOptDNSSL(b'\x1f\x02\x00\x00\x00\x00\x00<\x04home\x00\x00\x00') >>> p.type == 31 and p.len == 2 and p.res == 0 and p.lifetime == 60 and p.searchlist == ["home."] True ###(271)=[passed] ICMPv6NDOptDNSSL - Summary Output >>> ICMPv6NDOptDNSSL(searchlist=["home.", "office.", "{"]).mysummary() == "ICMPv6 Neighbor Discovery Option - DNS Search List Option home., office., {" True ###### ## ICMPv6NDOptCaptivePortal Class Test ###### ###(272)=[passed] ICMPv6NDOptCaptivePortal - Basic Instantiation >>> raw(ICMPv6NDOptCaptivePortal()) == b"\x25\x01\x00\x00\x00\x00\x00\x00" True ###(273)=[passed] ICMPv6NDOptCaptivePortal - Instantiation with captive portal URI >>> raw(ICMPv6NDOptCaptivePortal(URI="https://example.com")) == b"\x25\x03https://example.com\x00\x00\x00" True ###(274)=[passed] ICMPv6NDOptCaptivePortal - Instantiation where total length is already a multiple of 8 bytes >>> p = ICMPv6NDOptCaptivePortal(URI="abcdef") >>> len(p) == 8 and raw(p) == b"\x25\x01abcdef" and ICMPv6NDOptCaptivePortal(raw(p)).URI == b"abcdef" True ###(275)=[passed] ICMPv6NDOptCaptivePortal - Basic Dissection >>> p = ICMPv6NDOptCaptivePortal(b"\x25\x01\x00\x00\x00\x00\x00\x00") >>> p.type == 37 and p.len == 1 and p.URI == b"" True ###(276)=[passed] ICMPv6NDOptCaptivePortal - Basic Dissection with captive portal URI >>> p = ICMPv6NDOptCaptivePortal(b"\x25\x03https://example.com\x00\x00\x00") >>> p.type == 37 and p.len == 3 and p.URI == b"https://example.com" True ###(277)=[passed] ICMPv6NDOptCaptivePortal - Dissection with zero length >>> p = ICMPv6NDOptCaptivePortal(b"\x25\x00abcdef\x00\x01") >>> p.type == 37 and p.len == 0 and p.URI == b"abcdef" True >>> pay = p.payload >>> assert pay.type == 0 and pay.len == 1 and pay.data == b"" ###(278)=[passed] ICMPv6NDOptCaptivePortal - Summary Output >>> ICMPv6NDOptCaptivePortal(URI="https://example.com").mysummary() == "ICMPv6 Neighbor Discovery Option - Captive-Portal Option b'https://example.com'" True ###### ## ICMPv6NDOptEFA Class Test ###### ###(279)=[passed] ICMPv6NDOptEFA - Basic Instantiation >>> raw(ICMPv6NDOptEFA()) == b'\x1a\x01\x00\x00\x00\x00\x00\x00' True ###(280)=[passed] ICMPv6NDOptEFA - Basic Dissection >>> a=ICMPv6NDOptEFA(b'\x1a\x01\x00\x00\x00\x00\x00\x00') >>> a.type==26 and a.len==1 and a.res == 0 True ###### ## ICMPv6NDOptPREF64 Class Test ###### ###(281)=[passed] ICMPv6NDOptPREF64 - Basic Instantiation >>> raw(ICMPv6NDOptPREF64()) == b'\x26\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(282)=[passed] ICMPv6NDOptPREF64 - Basic Dissection >>> p = ICMPv6NDOptPREF64(b'\x26\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert p.type == 38 and p.len == 2 and p.scaledlifetime == 0 and p.plc == 0 and p.prefix == '::' ###(283)=[passed] ICMPv6NDOptPREF64 - Instantiation/Dissection with specific values >>> p = ICMPv6NDOptPREF64(scaledlifetime=225, plc='/64', prefix='2003:da8:1::') >>> assert raw(p) == b'\x26\x02\x07\x09\x20\x03\x0d\xa8\x00\x01\x00\x00\x00\x00\x00\x00' >>> >>> p = ICMPv6NDOptPREF64(raw(p)) >>> assert p.type == 38 and p.len == 2 and p.scaledlifetime == 225 and p.plc == 1 and p.prefix == '2003:da8:1::' >>> >>> p = ICMPv6NDOptPREF64(raw(p) + b'\x00\x00\x00\x00') >>> assert ICMPv6NDOptUnknown in p and len(p[ICMPv6NDOptUnknown]) == 4 ###(284)=[passed] ICMPv6NDOptPREF64 - Summary Output >>> ICMPv6NDOptPREF64(prefix='12:34:56::', plc='/32').mysummary() == "ICMPv6 Neighbor Discovery Option - PREF64 Option 12:34:56::/32" True >>> ICMPv6NDOptPREF64(prefix='12:34:56::', plc=6).mysummary() == "ICMPv6 Neighbor Discovery Option - PREF64 Option 12:34:56::[invalid PLC(6)]" True ###### ## Test Node Information Query - ICMPv6NIQueryNOOP ###### ###(285)=[passed] ICMPv6NIQueryNOOP - Basic Instantiation >>> raw(ICMPv6NIQueryNOOP(nonce=b"\x00"*8)) == b'\x8b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(286)=[passed] ICMPv6NIQueryNOOP - Basic Dissection >>> a = ICMPv6NIQueryNOOP(b'\x8b\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 139 and a.code == 1 and a.cksum == 0 and a.qtype == 0 and a.unused == 0 and a.flags == 0 and a.nonce == b"\x00"*8 and a.data == b"" True ###### ## Test Node Information Query - ICMPv6NIQueryName ###### ###(287)=[passed] ICMPv6NIQueryName - single label DNS name (internal) >>> a=ICMPv6NIQueryName(data="abricot").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x07abricot\x00\x00' True ###(288)=[passed] ICMPv6NIQueryName - single label DNS name >>> ICMPv6NIQueryName(data="abricot").data == b"abricot" True ###(289)=[passed] ICMPv6NIQueryName - fqdn (internal) >>> a=ICMPv6NIQueryName(data="n.d.org").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00' True ###(290)=[passed] ICMPv6NIQueryName - fqdn >>> ICMPv6NIQueryName(data="n.d.org").data == b"n.d.org" True ###(291)=[passed] ICMPv6NIQueryName - IPv6 address (internal) >>> a=ICMPv6NIQueryName(data="2001:db8::1").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1' True ###(292)=[passed] ICMPv6NIQueryName - IPv6 address >>> ICMPv6NIQueryName(data="2001:db8::1").data == "2001:db8::1" True ###(293)=[passed] ICMPv6NIQueryName - IPv4 address (internal) >>> a=ICMPv6NIQueryName(data="169.254.253.252").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252' True ###(294)=[passed] ICMPv6NIQueryName - IPv4 address >>> ICMPv6NIQueryName(data="169.254.253.252").data == '169.254.253.252' True ###(295)=[passed] ICMPv6NIQueryName - build & dissection >>> s = raw(IPv6()/ICMPv6NIQueryName(data="n.d.org")) >>> p = IPv6(s) >>> ICMPv6NIQueryName in p and p[ICMPv6NIQueryName].data == b"n.d.org" True ###(296)=[passed] ICMPv6NIQueryName - dissection >>> s = b'\x8b\x00z^\x00\x02\x00\x00\x00\x03g\x90\xc7\xa3\xdd[\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> p = ICMPv6NIQueryName(s) >>> p.show() ###[ ICMPv6 Node Information Query - IPv6 Name Query ]### type = ICMP Node Information Query code = IPv6 Query cksum = 0x7a5e qtype = Node Name unused = 0 flags = nonce = b'\x00\x03g\x90\xc7\xa3\xdd[' data = 'ff02::1' >>> assert ICMPv6NIQueryName in p and p.data == "ff02::1" ###### ## Test Node Information Query - ICMPv6NIQueryIPv6 ###### ###(297)=[passed] ICMPv6NIQueryIPv6 - single label DNS name (internal) >>> a = ICMPv6NIQueryIPv6(data="abricot") >>> ls(a) type : ByteEnumField = 139 ('139') code : NIQueryCodeField = None ('None') cksum : XShortField = None ('None') qtype : ShortEnumField = 3 ('3') unused : BitField (10 bits) = 0 ('0') flags : FlagsField = ('62') nonce : NonceField = ('') data : NIQueryDataField = b'abricot' ("(1, b'\\x00\\x00\\x00')") >>> a = a.getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x07abricot\x00\x00' True ###(298)=[passed] ICMPv6NIQueryIPv6 - single label DNS name >>> ICMPv6NIQueryIPv6(data="abricot").data == b"abricot" True ###(299)=[passed] ICMPv6NIQueryIPv6 - fqdn (internal) >>> a=ICMPv6NIQueryIPv6(data="n.d.org").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00' True ###(300)=[passed] ICMPv6NIQueryIPv6 - fqdn >>> ICMPv6NIQueryIPv6(data="n.d.org").data == b"n.d.org" True ###(301)=[passed] ICMPv6NIQueryIPv6 - IPv6 address (internal) >>> a=ICMPv6NIQueryIPv6(data="2001:db8::1").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1' True ###(302)=[passed] ICMPv6NIQueryIPv6 - IPv6 address >>> ICMPv6NIQueryIPv6(data="2001:db8::1").data == "2001:db8::1" True ###(303)=[passed] ICMPv6NIQueryIPv6 - IPv4 address (internal) >>> a=ICMPv6NIQueryIPv6(data="169.254.253.252").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252' True ###(304)=[passed] ICMPv6NIQueryIPv6 - IPv4 address >>> ICMPv6NIQueryIPv6(data="169.254.253.252").data == '169.254.253.252' True ###### ## Test Node Information Query - ICMPv6NIQueryIPv4 ###### ###(305)=[passed] ICMPv6NIQueryIPv4 - single label DNS name (internal) >>> a=ICMPv6NIQueryIPv4(data="abricot").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x07abricot\x00\x00' True ###(306)=[passed] ICMPv6NIQueryIPv4 - single label DNS name >>> ICMPv6NIQueryIPv4(data="abricot").data == b"abricot" True ###(307)=[passed] ICMPv6NIQueryIPv4 - fqdn (internal) >>> a=ICMPv6NIQueryIPv4(data="n.d.org").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 1 and a[1] == b'\x01n\x01d\x03org\x00' True ###(308)=[passed] ICMPv6NIQueryIPv4 - fqdn >>> ICMPv6NIQueryIPv4(data="n.d.org").data == b"n.d.org" True ###(309)=[passed] ICMPv6NIQueryIPv4 - IPv6 address (internal) >>> a=ICMPv6NIQueryIPv4(data="2001:db8::1").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == '2001:db8::1' True ###(310)=[passed] ICMPv6NIQueryIPv4 - IPv6 address >>> ICMPv6NIQueryIPv4(data="2001:db8::1").data == "2001:db8::1" True ###(311)=[passed] ICMPv6NIQueryIPv4 - IPv4 address (internal) >>> a=ICMPv6NIQueryIPv4(data="169.254.253.252").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 2 and a[1] == '169.254.253.252' True ###(312)=[passed] ICMPv6NIQueryIPv4 - IPv4 address >>> ICMPv6NIQueryIPv4(data="169.254.253.252").data == '169.254.253.252' True ###(313)=[passed] ICMPv6NIQueryIPv4 - dissection >>> s = b'\x8b\x01\x00\x00\x00\x04\x00\x00\xc2\xb9\xc2\x96\xc3\xa1.H\x07freebsd\x00\x00' >>> p = ICMPv6NIQueryIPv4(s) >>> p.show() ###[ ICMPv6 Node Information Query - IPv4 Address Query ]### type = ICMP Node Information Query code = Name Query cksum = 0x0 qtype = IPv4 Address unused = 0 flags = nonce = b'\xc2\xb9\xc2\x96\xc3\xa1.H' data = freebsd >>> assert ICMPv6NIQueryIPv4 in p and p.data == b"freebsd" ###(314)=[passed] ICMPv6NIQueryIPv4 - hashret() >>> random.seed(0x2807) >>> p = IPv6(src="::", dst="::")/ICMPv6NIQueryIPv4(data="freebsd") >>> h = p.hashret() >>> h b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:$#\xb5\xb7\xd0\xbf \xe2' >>> assert h in [ ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:g\x02f1\xbd?\xb3\xc4', ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x88\xccb\x19~\x9e\xe3a', ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:$#\xb5\xb7\xd0\xbf \xe2' ... ] ###### ## Test Node Information Query - Flags tests ###### ###(315)=[passed] ICMPv6NIQuery* - flags handling (Test 1) >>> t = ICMPv6NIQueryIPv6(flags="T") >>> a = ICMPv6NIQueryIPv6(flags="A") >>> c = ICMPv6NIQueryIPv6(flags="C") >>> l = ICMPv6NIQueryIPv6(flags="L") >>> s = ICMPv6NIQueryIPv6(flags="S") >>> g = ICMPv6NIQueryIPv6(flags="G") >>> allflags = ICMPv6NIQueryIPv6(flags="TALCLSG") >>> t.flags == 1 and a.flags == 2 and c.flags == 4 and l.flags == 8 and s.flags == 16 and g.flags == 32 and allflags.flags == 63 True ###(316)=[passed] ICMPv6NIQuery* - flags handling (Test 2) >>> t = raw(ICMPv6NIQueryNOOP(flags="T", nonce="A"*8))[6:8] >>> a = raw(ICMPv6NIQueryNOOP(flags="A", nonce="A"*8))[6:8] >>> c = raw(ICMPv6NIQueryNOOP(flags="C", nonce="A"*8))[6:8] >>> l = raw(ICMPv6NIQueryNOOP(flags="L", nonce="A"*8))[6:8] >>> s = raw(ICMPv6NIQueryNOOP(flags="S", nonce="A"*8))[6:8] >>> g = raw(ICMPv6NIQueryNOOP(flags="G", nonce="A"*8))[6:8] >>> allflags = raw(ICMPv6NIQueryNOOP(flags="TALCLSG", nonce="A"*8))[6:8] >>> t == b'\x00\x01' and a == b'\x00\x02' and c == b'\x00\x04' and l == b'\x00\x08' and s == b'\x00\x10' and g == b'\x00\x20' and allflags == b'\x00\x3F' True ###(317)=[passed] ICMPv6NIReply* - flags handling (Test 1) >>> t = ICMPv6NIReplyIPv6(flags="T") >>> a = ICMPv6NIReplyIPv6(flags="A") >>> c = ICMPv6NIReplyIPv6(flags="C") >>> l = ICMPv6NIReplyIPv6(flags="L") >>> s = ICMPv6NIReplyIPv6(flags="S") >>> g = ICMPv6NIReplyIPv6(flags="G") >>> allflags = ICMPv6NIReplyIPv6(flags="TALCLSG") >>> t.flags == 1 and a.flags == 2 and c.flags == 4 and l.flags == 8 and s.flags == 16 and g.flags == 32 and allflags.flags == 63 True ###(318)=[passed] ICMPv6NIReply* - flags handling (Test 2) >>> t = raw(ICMPv6NIReplyNOOP(flags="T", nonce="A"*8))[6:8] >>> a = raw(ICMPv6NIReplyNOOP(flags="A", nonce="A"*8))[6:8] >>> c = raw(ICMPv6NIReplyNOOP(flags="C", nonce="A"*8))[6:8] >>> l = raw(ICMPv6NIReplyNOOP(flags="L", nonce="A"*8))[6:8] >>> s = raw(ICMPv6NIReplyNOOP(flags="S", nonce="A"*8))[6:8] >>> g = raw(ICMPv6NIReplyNOOP(flags="G", nonce="A"*8))[6:8] >>> allflags = raw(ICMPv6NIReplyNOOP(flags="TALCLSG", nonce="A"*8))[6:8] >>> t == b'\x00\x01' and a == b'\x00\x02' and c == b'\x00\x04' and l == b'\x00\x08' and s == b'\x00\x10' and g == b'\x00\x20' and allflags == b'\x00\x3F' True ###(319)=[passed] ICMPv6NIQuery* - Flags Default values >>> a = ICMPv6NIQueryNOOP() >>> b = ICMPv6NIQueryName() >>> c = ICMPv6NIQueryIPv4() >>> d = ICMPv6NIQueryIPv6() >>> a.flags == 0 and b.flags == 0 and c.flags == 0 and d.flags == 62 True ###(320)=[passed] ICMPv6NIReply* - Flags Default values >>> a = ICMPv6NIReplyIPv6() >>> b = ICMPv6NIReplyName() >>> c = ICMPv6NIReplyIPv6() >>> d = ICMPv6NIReplyIPv4() >>> e = ICMPv6NIReplyRefuse() >>> f = ICMPv6NIReplyUnknown() >>> a.flags == 0 and b.flags == 0 and c.flags == 0 and d.flags == 0 and e.flags == 0 and f.flags == 0 True ###### ## Test Node Information Query - Dispatching ###### ###(321)=[passed] ICMPv6NIQueryIPv6 - dispatch with nothing in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6()) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryIPv6) True ###(322)=[passed] ICMPv6NIQueryIPv6 - dispatch with IPv6 address in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="2001::db8::1")) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryIPv6) True ###(323)=[passed] ICMPv6NIQueryIPv6 - dispatch with IPv4 address in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="192.168.0.1")) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryIPv6) True ###(324)=[passed] ICMPv6NIQueryIPv6 - dispatch with name in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv6(data="alfred")) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryIPv6) True ###(325)=[passed] ICMPv6NIQueryName - dispatch with nothing in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName()) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryName) True ###(326)=[passed] ICMPv6NIQueryName - dispatch with IPv6 address in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="2001:db8::1")) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryName) True ###(327)=[passed] ICMPv6NIQueryName - dispatch with IPv4 address in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="192.168.0.1")) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryName) True ###(328)=[passed] ICMPv6NIQueryName - dispatch with name in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryName(data="alfred")) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryName) True ###(329)=[passed] ICMPv6NIQueryIPv4 - dispatch with nothing in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4()) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryIPv4) True ###(330)=[passed] ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="2001:db8::1")) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryIPv4) True ###(331)=[passed] ICMPv6NIQueryIPv4 - dispatch with IPv6 address in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="192.168.0.1")) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryIPv4) True ###(332)=[passed] ICMPv6NIQueryIPv4 - dispatch with name in data >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIQueryIPv4(data="alfred")) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIQueryIPv4) True ###(333)=[passed] ICMPv6NIReplyName - dispatch >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyName()) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIReplyName) True ###(334)=[passed] ICMPv6NIReplyIPv6 - dispatch >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyIPv6()) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIReplyIPv6) True ###(335)=[passed] ICMPv6NIReplyIPv4 - dispatch >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyIPv4()) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIReplyIPv4) True ###(336)=[passed] ICMPv6NIReplyRefuse - dispatch >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyRefuse()) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIReplyRefuse) True ###(337)=[passed] ICMPv6NIReplyUnknown - dispatch >>> s = raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/ICMPv6NIReplyUnknown()) >>> p = IPv6(s) >>> isinstance(p.payload, ICMPv6NIReplyUnknown) True ###### ## Test Node Information Query - ICMPv6NIReplyNOOP ###### ###(338)=[passed] ICMPv6NIReplyNOOP - single DNS name without hint => understood as string (internal) >>> a=ICMPv6NIReplyNOOP(data="abricot").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"abricot" True ###(339)=[passed] ICMPv6NIReplyNOOP - single DNS name without hint => understood as string >>> ICMPv6NIReplyNOOP(data="abricot").data == b"abricot" True ###(340)=[passed] ICMPv6NIReplyNOOP - fqdn without hint => understood as string (internal) >>> a=ICMPv6NIReplyNOOP(data="n.d.tld").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"n.d.tld" True ###(341)=[passed] ICMPv6NIReplyNOOP - fqdn without hint => understood as string >>> ICMPv6NIReplyNOOP(data="n.d.tld").data == b"n.d.tld" True ###(342)=[passed] ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string (internal) >>> a=ICMPv6NIReplyNOOP(data="2001:0db8::1").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"2001:0db8::1" True ###(343)=[passed] ICMPv6NIReplyNOOP - IPv6 address without hint => understood as string >>> ICMPv6NIReplyNOOP(data="2001:0db8::1").data == b"2001:0db8::1" True ###(344)=[passed] ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string (internal) >>> a=ICMPv6NIReplyNOOP(data="169.254.253.010").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 0 and a[1] == b"169.254.253.010" True ###(345)=[passed] ICMPv6NIReplyNOOP - IPv4 address without hint => understood as string >>> ICMPv6NIReplyNOOP(data="169.254.253.010").data == b"169.254.253.010" True ###### ## Test Node Information Query - ICMPv6NIReplyName ###### ###(346)=[passed] ICMPv6NIReplyName - single label DNS name as a rawing (without ttl) (internal) >>> a=ICMPv6NIReplyName(data="abricot").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 0 and a[1][1] == b'\x07abricot\x00\x00' True ###(347)=[passed] ICMPv6NIReplyName - single label DNS name as a rawing (without ttl) >>> ICMPv6NIReplyName(data="abricot").data == [0, b"abricot"] True ###(348)=[passed] ICMPv6NIReplyName - fqdn name as a rawing (without ttl) (internal) >>> a=ICMPv6NIReplyName(data="n.d.tld").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 0 and a[1][1] == b'\x01n\x01d\x03tld\x00' True ###(349)=[passed] ICMPv6NIReplyName - fqdn name as a rawing (without ttl) >>> ICMPv6NIReplyName(data="n.d.tld").data == [0, b'n.d.tld'] True ###(350)=[passed] ICMPv6NIReplyName - list of 2 single label DNS names (without ttl) (internal) >>> a=ICMPv6NIReplyName(data=["abricot", "poire"]).getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 0 and a[1][1] == b'\x07abricot\x00\x00\x05poire\x00\x00' True ###(351)=[passed] ICMPv6NIReplyName - list of 2 single label DNS names (without ttl) >>> ICMPv6NIReplyName(data=["abricot", "poire"]).data == [0, b"abricot", b"poire"] True ###(352)=[passed] ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn] (internal) >>> a=ICMPv6NIReplyName(data=[42, "abricot", "poire", "n.d.tld"]).getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 2 and type(a[1]) is list and len(a[1]) == 2 and a[1][0] == 42 and a[1][1] == b'\x07abricot\x00\x00\x05poire\x00\x00\x01n\x01d\x03tld\x00' True ###(353)=[passed] ICMPv6NIReplyName - [ttl, single-label, single-label, fqdn] >>> ICMPv6NIReplyName(data=[42, "abricot", "poire", "n.d.tld"]).data == [42, b"abricot", b"poire", b"n.d.tld"] True ###(354)=[passed] ICMPv6NIReplyName - dissection >>> s = b'\x8c\x00\xd1\x0f\x00\x02\x00\x00\x00\x00\xd9$\x94\x8d\xc6%\x00\x00\x00\x00\x07freebsd\x00\x00' >>> p = ICMPv6NIReplyName(s) >>> p.show() ###[ ICMPv6 Node Information Reply - Node Names ]### type = ICMP Node Information Response code = Successful Reply cksum = 0xd10f qtype = Node Name unused = 0 flags = nonce = b'\x00\x00\xd9$\x94\x8d\xc6%' data = ttl:0 freebsd >>> assert ICMPv6NIReplyName in p and p.data == [0, b'freebsd'] ###### ## Test Node Information Query - ICMPv6NIReplyIPv6 ###### ###(355)=[passed] ICMPv6NIReplyIPv6 - one IPv6 address without TTL (internal) >>> a=ICMPv6NIReplyIPv6(data="2001:db8::1").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1" True ###(356)=[passed] ICMPv6NIReplyIPv6 - one IPv6 address without TTL >>> ICMPv6NIReplyIPv6(data="2001:db8::1").data == [(0, '2001:db8::1')] True ###(357)=[passed] ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list) (internal) >>> a=ICMPv6NIReplyIPv6(data=["2001:db8::1"]).getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1" True ###(358)=[passed] ICMPv6NIReplyIPv6 - one IPv6 address without TTL (as a list) >>> ICMPv6NIReplyIPv6(data=["2001:db8::1"]).data == [(0, '2001:db8::1')] True ###(359)=[passed] ICMPv6NIReplyIPv6 - one IPv6 address with TTL (internal) >>> a=ICMPv6NIReplyIPv6(data=[(0, "2001:db8::1")]).getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1" True ###(360)=[passed] ICMPv6NIReplyIPv6 - one IPv6 address with TTL >>> ICMPv6NIReplyIPv6(data=[(0, "2001:db8::1")]).data == [(0, '2001:db8::1')] True ###(361)=[passed] ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of rawings (without TTL) (internal) >>> a=ICMPv6NIReplyIPv6(data=["2001:db8::1", "2001:db8::2"]).getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "2001:db8::1" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "2001:db8::2" True ###(362)=[passed] ICMPv6NIReplyIPv6 - two IPv6 addresses as a list of rawings (without TTL) >>> ICMPv6NIReplyIPv6(data=["2001:db8::1", "2001:db8::2"]).data == [(0, '2001:db8::1'), (0, '2001:db8::2')] True ###(363)=[passed] ICMPv6NIReplyIPv6 - two IPv6 addresses as a list (first with ttl, second without) (internal) >>> a=ICMPv6NIReplyIPv6(data=[(42, "2001:db8::1"), "2001:db8::2"]).getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 3 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 42 and a[1][0][1] == "2001:db8::1" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "2001:db8::2" True ###(364)=[passed] ICMPv6NIReplyIPv6 - two IPv6 addresses as a list (first with ttl, second without) >>> ICMPv6NIReplyIPv6(data=[(42, "2001:db8::1"), "2001:db8::2"]).data == [(42, "2001:db8::1"), (0, "2001:db8::2")] True ###(365)=[passed] ICMPv6NIReplyIPv6 - build & dissection >>> s = raw(IPv6()/ICMPv6NIReplyIPv6(data="2001:db8::1")) >>> p = IPv6(s) >>> ICMPv6NIReplyIPv6 in p and p.data == [(0, '2001:db8::1')] True ###### ## Test Node Information Query - ICMPv6NIReplyIPv4 ###### ###(366)=[passed] ICMPv6NIReplyIPv4 - one IPv4 address without TTL (internal) >>> a=ICMPv6NIReplyIPv4(data="169.254.253.252").getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252" True ###(367)=[passed] ICMPv6NIReplyIPv4 - one IPv4 address without TTL >>> ICMPv6NIReplyIPv4(data="169.254.253.252").data == [(0, '169.254.253.252')] True ###(368)=[passed] ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list) (internal) >>> a=ICMPv6NIReplyIPv4(data=["169.254.253.252"]).getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252" True ###(369)=[passed] ICMPv6NIReplyIPv4 - one IPv4 address without TTL (as a list) >>> ICMPv6NIReplyIPv4(data=["169.254.253.252"]).data == [(0, '169.254.253.252')] True ###(370)=[passed] ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal) >>> a=ICMPv6NIReplyIPv4(data=[(0, "169.254.253.252")]).getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 1 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252" True ###(371)=[passed] ICMPv6NIReplyIPv4 - one IPv4 address with TTL (internal) >>> ICMPv6NIReplyIPv4(data=[(0, "169.254.253.252")]).data == [(0, '169.254.253.252')] True ###(372)=[passed] ICMPv6NIReplyIPv4 - two IPv4 addresses as a list of rawings (without TTL) >>> a=ICMPv6NIReplyIPv4(data=["169.254.253.252", "169.254.253.253"]).getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 0 and a[1][0][1] == "169.254.253.252" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "169.254.253.253" True ###(373)=[passed] ICMPv6NIReplyIPv4 - two IPv4 addresses as a list of rawings (without TTL) (internal) >>> ICMPv6NIReplyIPv4(data=["169.254.253.252", "169.254.253.253"]).data == [(0, '169.254.253.252'), (0, '169.254.253.253')] True ###(374)=[passed] ICMPv6NIReplyIPv4 - two IPv4 addresses as a list (first with ttl, second without) >>> a=ICMPv6NIReplyIPv4(data=[(42, "169.254.253.252"), "169.254.253.253"]).getfieldval("data") >>> type(a) is tuple and len(a) == 2 and a[0] == 4 and type(a[1]) is list and len(a[1]) == 2 and type(a[1][0]) is tuple and len(a[1][0]) == 2 and a[1][0][0] == 42 and a[1][0][1] == "169.254.253.252" and len(a[1][1]) == 2 and a[1][1][0] == 0 and a[1][1][1] == "169.254.253.253" True ###(375)=[passed] ICMPv6NIReplyIPv4 - two IPv4 addresses as a list (first with ttl, second without) (internal) >>> ICMPv6NIReplyIPv4(data=[(42, "169.254.253.252"), "169.254.253.253"]).data == [(42, "169.254.253.252"), (0, "169.254.253.253")] True ###(376)=[passed] ICMPv6NIReplyIPv4 - build & dissection >>> s = raw(IPv6()/ICMPv6NIReplyIPv4(data="192.168.0.1")) >>> p = IPv6(s) >>> ICMPv6NIReplyIPv4 in p and p.data == [(0, '192.168.0.1')] True >>> >>> s = raw(IPv6()/ICMPv6NIReplyIPv4(data=[(2807, "192.168.0.1")])) >>> p = IPv6(s) >>> ICMPv6NIReplyIPv4 in p and p.data == [(2807, "192.168.0.1")] True ###### ## Test Node Information Query - ICMPv6NIReplyRefuse ###### ###(377)=[passed] ICMPv6NIReplyRefuse - basic instantiation >>> raw(ICMPv6NIReplyRefuse())[:8] == b'\x8c\x01\x00\x00\x00\x00\x00\x00' True ###(378)=[passed] ICMPv6NIReplyRefuse - basic dissection >>> a=ICMPv6NIReplyRefuse(b'\x8c\x01\x00\x00\x00\x00\x00\x00\xf1\xe9\xab\xc9\x8c\x0by\x18') >>> a.type == 140 and a.code == 1 and a.cksum == 0 and a.unused == 0 and a.flags == 0 and a.nonce == b'\xf1\xe9\xab\xc9\x8c\x0by\x18' and a.data == b"" True ###### ## Test Node Information Query - ICMPv6NIReplyUnknown ###### ###(379)=[passed] ICMPv6NIReplyUnknown - basic instantiation >>> raw(ICMPv6NIReplyUnknown(nonce=b'\x00'*8)) == b'\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(380)=[passed] ICMPv6NIReplyRefuse - basic dissection >>> a=ICMPv6NIReplyRefuse(b'\x8c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.type == 140 and a.code == 2 and a.cksum == 0 and a.unused == 0 and a.flags == 0 and a.nonce == b'\x00'*8 and a.data == b"" True ###### ## Test Node Information Query - utilities ###### ###(381)=[passed] computeNIGroupAddr >>> computeNIGroupAddr("scapy") == "ff02::2:f886:2f66" True ###### ## IPv6ExtHdrFragment Class Test ###### ###(382)=[passed] IPv6ExtHdrFragment - Basic Instantiation >>> raw(IPv6ExtHdrFragment()) == b';\x00\x00\x00\x00\x00\x00\x00' True ###(383)=[passed] IPv6ExtHdrFragment - Instantiation with specific values >>> raw(IPv6ExtHdrFragment(nh=0xff, res1=0xee, offset=0x1fff, res2=1, m=1, id=0x11111111)) == b'\xff\xee\xff\xfb\x11\x11\x11\x11' True ###(384)=[passed] IPv6ExtHdrFragment - Basic Dissection >>> a=IPv6ExtHdrFragment(b';\x00\x00\x00\x00\x00\x00\x00') >>> a.nh == 59 and a.res1 == 0 and a.offset == 0 and a.res2 == 0 and a.m == 0 and a.id == 0 True ###(385)=[passed] IPv6ExtHdrFragment - Instantiation with specific values >>> a=IPv6ExtHdrFragment(b'\xff\xee\xff\xfb\x11\x11\x11\x11') >>> a.nh == 0xff and a.res1 == 0xee and a.offset==0x1fff and a.res2==1 and a.m == 1 and a.id == 0x11111111 True ###(386)=[passed] IPv6 - IPv6ExtHdrFragment hashret >>> a=IPv6()/IPv6ExtHdrFragment(b'\xff\xee\xff\xfb\x11\x11\x11\x11') >>> a.hashret() == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff' True ###### ## Test fragment6 function ###### ###(387)=[passed] fragment6 - test against a long TCP packet with a 1280 MTU >>> l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280) >>> len(l) == 33 and len(raw(l[-1])) == 644 True ###(388)=[passed] fragment6 - test against a long TCP packet with a 1280 MTU without fragment header >>> l=fragment6(IPv6()/TCP()/Raw(load="A"*40000), 1280) >>> len(l) == 33 and len(raw(l[-1])) == 644 True ###### ## Test defragment6 function ###### ###(389)=[passed] defragment6 - test against a long TCP packet fragmented with a 1280 MTU >>> l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280) >>> raw(defragment6(l)) == (b'`\x00\x00\x00\x9cT\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xe92\x00\x00' + b'A'*40000) True ###(390)=[passed] defragment6 - test against packets with L2 header >>> l=defragment6(fragment6(Ether()/IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*2000), 1280)) >>> Ether in l True ###(391)=[passed] defragment6 - test against a large TCP packet fragmented with a 1280 bytes MTU and missing fragments >>> l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*40000), 1280) >>> del l[2] >>> del l[4] >>> del l[12] >>> del l[18] >>> raw(defragment6(l)) == (b'`\x00\x00\x00\x9cT\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xe92\x00\x00' + 2444*b'A' + 1232*b'X' + 2464*b'A' + 1232*b'X' + 9856*b'A' + 1232*b'X' + 7392*b'A' + 1232*b'X' + 12916*b'A') Expected an offset of 2464. Found 3696. Padding with XXXX Expected an offset of 6160. Found 7392. Padding with XXXX more Expected an offset of 17248. Found 18480. Padding with XXXX True ###(392)=[passed] defragment6 - test against a TCP packet fragmented with a 800 bytes MTU and missing fragments >>> l=fragment6(IPv6()/IPv6ExtHdrFragment()/TCP()/Raw(load="A"*4000), 800) >>> del l[4] >>> del l[2] >>> raw(defragment6(l)) == b'`\x00\x00\x00\x0f\xb4\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb2\x0f\x00\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' True ###(393)=[passed] defragment6 - test the packet length >>> pkts = fragment6(IPv6()/IPv6ExtHdrFragment()/UDP(dport=42, sport=42)/Raw(load="A"*1500), 1280) >>> pkts = [IPv6(raw(p)) for p in pkts] >>> assert defragment6(pkts).plen == 1508 ###### ## Test Route6 class ###### ###(394)=[passed] Fake interfaces >>> conf.ifaces._add_fake_iface("eth0") >>> conf.ifaces._add_fake_iface("lo") >>> conf.ifaces._add_fake_iface("scapy0") ###(395)=[passed] Route6 - Route6 flushing >>> conf_iface = conf.iface >>> conf.iface = "eth0" This interface is not specified in any provider ! See conf.ifaces output >>> conf.route6.routes=[ ... ( '::1', 128, '::', 'lo', ['::1'], 1), ... ( 'fe80::20f:1fff:feca:4650', 128, '::', 'lo', ['::1'], 1)] >>> conf.route6.flush() >>> not conf.route6.routes True ###(396)=[passed] Route6 - Route6.route >>> conf.route6.flush() >>> conf.route6.ipv6_ifaces = set(['lo', 'eth0']) >>> conf.route6.routes=[ ... ( '::1', 128, '::', 'lo', ['::1'], 1), ... ( 'fe80::20f:1fff:feca:4650', 128, '::', 'lo', ['::1'], 1), ... ( 'fe80::', 64, '::', 'eth0', ['fe80::20f:1fff:feca:4650'], 1), ... ('2001:db8:0:4444:20f:1fff:feca:4650', 128, '::', 'lo', ['::1'], 1), ... ( '2001:db8:0:4444::', 64, '::', 'eth0', ['2001:db8:0:4444:20f:1fff:feca:4650'], 1), ... ( '::', 0, 'fe80::20f:34ff:fe8a:8aa1', 'eth0', ['2001:db8:0:4444:20f:1fff:feca:4650', '2002:db8:0:4444:20f:1fff:feca:4650'], 1) ... ] >>> assert conf.route6.route("2002::1") == ('eth0', '2002:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1') >>> assert conf.route6.route("2001::1") == ('eth0', '2001:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1') >>> assert conf.route6.route("fe80::20f:1fff:feab:4870") == ('eth0', 'fe80::20f:1fff:feca:4650', '::') >>> assert conf.route6.route("::1") == ('lo', '::1', '::') >>> assert conf.route6.route("::") == ('eth0', '2001:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1') >>> assert conf.route6.route('ff00::') == ('eth0', '2001:db8:0:4444:20f:1fff:feca:4650', 'fe80::20f:34ff:fe8a:8aa1') >>> conf.iface = conf_iface >>> conf.route6.resync() >>> if not len(conf.route6.routes): ... # IPv6 seems disabled. Force a route to ::1 ... conf.route6.routes.append(("::1", 128, "::", conf.loopback_name, ["::1"], 1)) ... True ... ###(397)=[passed] Route6 - Route6.make_route >>> r6 = Route6() >>> r6.make_route("2001:db8::1", dev=conf.loopback_name) in [ ... ("2001:db8::1", 128, "::", conf.loopback_name, [], 1), ... ("2001:db8::1", 128, "::", conf.loopback_name, ["::1"], 1) ... ] True >>> len_r6 = len(r6.routes) ###(398)=[passed] Route6 - Route6.add & Route6.delt >>> r6.add(dst="2001:db8:cafe:f000::/64", gw="2001:db8:cafe::1", dev="eth0") >>> assert len(r6.routes) == len_r6 + 1 >>> r6.delt(dst="2001:db8:cafe:f000::/64", gw="2001:db8:cafe::1") >>> assert len(r6.routes) == len_r6 ###(399)=[passed] Route6 - Route6.ifadd & Route6.ifdel >>> r6.ifadd("scapy0", "2001:bd8:cafe:1::1/64") >>> r6.ifdel("scapy0") ###(400)=[passed] IPv6 - utils >>> from unittest import mock >>> @mock.patch("scapy.layers.inet6.get_if_hwaddr") ... @mock.patch("scapy.layers.inet6.srp1") ... def test_neighsol(mock_srp1, mock_get_if_hwaddr): ... mock_srp1.return_value = Ether()/IPv6()/ICMPv6ND_NA()/ICMPv6NDOptDstLLAddr(lladdr="05:04:03:02:01:00") ... mock_get_if_hwaddr.return_value = "00:01:02:03:04:05" ... return neighsol("fe80::f6ce:46ff:fea9:e04b", "fe80::f6ce:46ff:fea9:e04b", "scapy0") ... >>> p = test_neighsol() >>> ICMPv6NDOptDstLLAddr in p and p[ICMPv6NDOptDstLLAddr].lladdr == "05:04:03:02:01:00" True >>> >>> >>> @mock.patch("scapy.layers.inet6.neighsol") ... @mock.patch("scapy.layers.inet6.conf.route6.route") ... def test_getmacbyip6(mock_route6, mock_neighsol): ... mock_route6.return_value = ("scapy0", "fe80::baca:3aff:fe72:b08b", "::") ... mock_neighsol.return_value = test_neighsol() ... return getmacbyip6("fe80::704:3ff:fe2:100") ... >>> test_getmacbyip6() == "05:04:03:02:01:00" True ###(401)=[passed] IPv6 - IPerror6 & UDPerror & _ICMPv6Error >>> query = IPv6(dst="2001:db8::1", src="2001:db8::2", hlim=1)/UDP()/DNS() >>> answer = IPv6(dst="2001:db8::2", src="2001:db8::1", hlim=1)/ICMPv6TimeExceeded()/IPerror6(dst="2001:db8::1", src="2001:db8::2", hlim=0)/UDPerror()/DNS() >>> answer.answers(query) == True True >>> >>> from scapy.layers.inet6 import _ICMPv6Error >>> assert _ICMPv6Error().guess_payload_class(None) == IPerror6 >>> assert _ICMPv6Error().hashret() == b'' ###(402)=[passed] reset routes properly >>> conf.ifaces.reload() >>> >>> if WINDOWS: ... from scapy.arch.windows import _route_add_loopback ... _route_add_loopback() ... ###### ## ICMPv6ML ###### ###(403)=[passed] ICMPv6MLQuery - build & dissection >>> s = raw(IPv6(src="fe80::1")/ICMPv6MLQuery()) >>> assert s == b"`\x00\x00\x00\x00\x18:\x01\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x82\x00Y\x17'\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" >>> >>> p = IPv6(s) >>> assert ICMPv6MLQuery in p and p[IPv6].dst == "ff02::1" ###(404)=[passed] Check answers >>> q = IPv6()/IPv6ExtHdrHopByHop(options=[RouterAlert()])/ICMPv6MLQuery() >>> a = IPv6()/IPv6ExtHdrHopByHop(options=[RouterAlert()])/ICMPv6MLReport() >>> >>> assert a.answers(q) ###### ## ICMPv6MLv2 ###### ###(405)=[passed] ICMPv6MLQuery2 - build & dissection >>> p = IPv6()/IPv6ExtHdrHopByHop(options=[RouterAlert()])/ICMPv6MLQuery2(sources=["::1"]) >>> s = raw(p) >>> assert s == b"`\x00\x00\x00\x004\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01:\x00\x05\x02\x00\x00\x01\x00\x82\x00V\x85'\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" >>> >>> p = IPv6(s) >>> assert ICMPv6MLQuery2 in p and p.sources_number == 1 ###(406)=[passed] ICMPv6MLReport2 - build & dissection >>> p = IPv6()/IPv6ExtHdrHopByHop(options=[RouterAlert()])/ICMPv6MLReport2(records=[ICMPv6MLDMultAddrRec(), ICMPv6MLDMultAddrRec(sources=["::1"], auxdata="scapy")]) >>> s = raw(p) >>> assert s == b'`\x00\x00\x00\x00M\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01:\x00\x05\x02\x00\x00\x01\x00\x8f\x00\x1a\xa1\x00\x00\x00\x02\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01scapy' >>> >>> p = IPv6(s) >>> assert ICMPv6MLReport2 in p and p.records_number == 2 ###(407)=[passed] ICMPv6MLReport2 and ICMPv6MLDMultAddrRec - dissection >>> z = b'33\x00\x00\x00\x16\xd0P\x99V\xdd\xf9\x86\xdd`\x00\x00\x00\x00\x1c:\x01\xfe\x80\x00\x00\x00\x00\x00\x00q eX\x98\x86\xfa\x88\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x8f\x00\x13\x4d\x00\x00\x00\x01\x04\x00\x00\x00\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xffR\xf3\xe1' >>> w = Ether(z) >>> >>> assert len(w.records) == 1 >>> assert isinstance(w.records[0], ICMPv6MLDMultAddrRec) >>> assert w.records[0].dst == "ff02::1:ff52:f3e1" ###(408)=[passed] Check answers >>> q = IPv6()/IPv6ExtHdrHopByHop(options=[RouterAlert()])/ICMPv6MLQuery2() >>> a = IPv6()/IPv6ExtHdrHopByHop(options=[RouterAlert()])/ICMPv6MLReport2() >>> >>> assert a.answers(q) ###### ## IPv6 attacks ###### ###(409)=[passed] Define test utilities >>> from unittest import mock >>> >>> @mock.patch("scapy.layers.inet6.sniff") ... @mock.patch("scapy.layers.inet6.sendp") ... def test_attack(function, pktlist, sendp_mock, sniff_mock, options=()): ... pktlist = [Ether(raw(x)) for x in pktlist] ... ret_list = [] ... def _fake_sniff(lfilter=None, prn=None, **kwargs): ... for p in pktlist: ... if lfilter and lfilter(p) and prn: ... prn(p) ... sniff_mock.side_effect = _fake_sniff ... def _fake_sendp(pkt, *args, **kwargs): ... ret_list.append(Ether(raw(pkt))) ... sendp_mock.side_effect = _fake_sendp ... function(*options) ... return ret_list ... ###(410)=[passed] Test NDP_Attack_DAD_DoS_via_NS >>> data = [Ether(src='aa:aa:aa:aa:aa:aa', dst='33:33:ff:00:11:11')/IPv6(src="::", dst="ff02::1:ff00:1111")/ICMPv6ND_NS(tgt="ffff::1111", code=17, res=3758096385), ... Ether(src='aa:aa:aa:aa:aa:aa', dst='33:33:ff:5d:c3:53')/IPv6(src="::", dst="ff02::1:ff5d:c353")/ICMPv6ND_NS(tgt="b643:44c3:f659:f8e6:31c0:6437:825d:c353"), ... Ether()/IP()/ICMP()] >>> results = test_attack(NDP_Attack_DAD_DoS_via_NS, data) Reply NS for target address ffff::1111 (received from aa:aa:aa:aa:aa:aa) Reply NS for target address b643:44c3:f659:f8e6:31c0:6437:825d:c353 (received from aa:aa:aa:aa:aa:aa) >>> assert len(results) == 2 >>> >>> a = results[0][IPv6] >>> assert a[IPv6].src == "::" >>> assert a[IPv6].dst == "ff02::1:ff00:1111" >>> assert a[IPv6].hlim == 255 >>> assert a[ICMPv6ND_NS].tgt == "ffff::1111" >>> >>> b = results[1][IPv6] >>> assert b[IPv6].src == "::" >>> assert b[IPv6].dst == "ff02::1:ff5d:c353" >>> assert b[IPv6].hlim == 255 >>> assert b[ICMPv6ND_NS].tgt == "b643:44c3:f659:f8e6:31c0:6437:825d:c353" ###(411)=[passed] Test NDP_Attack_DAD_DoS_via_NA >>> data = [Ether(src='aa:aa:aa:aa:aa:aa', dst='33:33:ff:00:11:11')/IPv6(src="::", dst="ff02::1:ff00:1111")/ICMPv6ND_NS(tgt="ffff::1111", code=17, res=3758096385), ... Ether(src='aa:aa:aa:aa:aa:aa', dst='33:33:ff:5d:c3:53')/IPv6(src="::", dst="ff02::1:ff5d:c353")/ICMPv6ND_NS(tgt="b643:44c3:f659:f8e6:31c0:6437:825d:c353"), ... Ether()/IP()/ICMP()] >>> results = test_attack(NDP_Attack_DAD_DoS_via_NA, data, options=(None, None, None, "ab:ab:ab:ab:ab:ab")) Reply NA for target address ffff::1111 (received from aa:aa:aa:aa:aa:aa) Reply NA for target address b643:44c3:f659:f8e6:31c0:6437:825d:c353 (received from aa:aa:aa:aa:aa:aa) >>> assert len(results) == 2 >>> results[0].dst = "ff:ff:ff:ff:ff:ff" >>> results[1].dst = "ff:ff:ff:ff:ff:ff" >>> >>> a = results[0] >>> assert a[Ether].dst == "ff:ff:ff:ff:ff:ff" >>> assert a[Ether].src == "ab:ab:ab:ab:ab:ab" >>> assert a[IPv6].src == "ffff::1111" >>> assert a[IPv6].dst == "ff02::1:ff00:1111" >>> assert a[IPv6].hlim == 255 >>> assert a[ICMPv6ND_NA].tgt == "ffff::1111" >>> assert a[ICMPv6NDOptDstLLAddr].lladdr == "ab:ab:ab:ab:ab:ab" >>> >>> b = results[1] >>> assert b[Ether].dst == "ff:ff:ff:ff:ff:ff" >>> assert b[Ether].src == "ab:ab:ab:ab:ab:ab" >>> assert b[IPv6].src == "b643:44c3:f659:f8e6:31c0:6437:825d:c353" >>> assert b[IPv6].dst == "ff02::1:ff5d:c353" >>> assert b[IPv6].hlim == 255 >>> assert b[ICMPv6ND_NA].tgt == "b643:44c3:f659:f8e6:31c0:6437:825d:c353" >>> assert b[ICMPv6NDOptDstLLAddr].lladdr == "ab:ab:ab:ab:ab:ab" ###(412)=[passed] Test NDP_Attack_NA_Spoofing >>> data = [Ether(src='aa:aa:aa:aa:aa:aa', dst='33:33:ff:d4:e5:f6')/IPv6(src="753a:727c:97b5:f71d:51ea:3901:ab52:e110", dst="ff02::1:ffd4:e5f6")/ICMPv6ND_NS(tgt="ff02::1:ffd4:e5f6", code=171, res=3758096), ... Ether(src='aa:aa:aa:aa:aa:aa', dst='33:33:e4:68:c9:4f')/IPv6(src="753a:727c:97b5:f71d:51ea:3901:ab52:e110", dst="fe9c:98b0:52b5:7033:5db0:394f:e468:c94f")/ICMPv6ND_NS(), ... Ether()/IP()/ICMP()] >>> results = test_attack(NDP_Attack_NA_Spoofing, data, options=(None, None, None, "ff:ff:ff:ff:ff:ff", None)) Reply NA for target address ff02::1:ffd4:e5f6 (received from aa:aa:aa:aa:aa:aa) Reply NA for target address :: (received from aa:aa:aa:aa:aa:aa) >>> assert len(results) == 2 >>> >>> a = results[0] >>> assert a[Ether].dst == "aa:aa:aa:aa:aa:aa" >>> assert a[Ether].src == "ff:ff:ff:ff:ff:ff" >>> assert a[IPv6].src == "ff02::1:ffd4:e5f6" >>> assert a[IPv6].dst == "753a:727c:97b5:f71d:51ea:3901:ab52:e110" >>> assert a[IPv6].hlim == 255 >>> assert a[ICMPv6ND_NA].R == 0 >>> assert a[ICMPv6ND_NA].S == 1 >>> assert a[ICMPv6ND_NA].O == 1 >>> assert a[ICMPv6ND_NA].tgt == "ff02::1:ffd4:e5f6" >>> assert a[ICMPv6NDOptDstLLAddr].lladdr == "ff:ff:ff:ff:ff:ff" >>> >>> b = results[1] >>> assert b[Ether].dst == "aa:aa:aa:aa:aa:aa" >>> assert b[Ether].src == "ff:ff:ff:ff:ff:ff" >>> assert b[IPv6].src == "::" >>> assert b[IPv6].dst == "753a:727c:97b5:f71d:51ea:3901:ab52:e110" >>> assert b[IPv6].hlim == 255 >>> assert b[ICMPv6ND_NA].R == 0 >>> assert b[ICMPv6ND_NA].S == 1 >>> assert b[ICMPv6ND_NA].O == 1 >>> assert b[ICMPv6ND_NA].tgt == "::" >>> assert b[ICMPv6NDOptDstLLAddr].lladdr == "ff:ff:ff:ff:ff:ff" ###(413)=[passed] Test NDP_Attack_Kill_Default_Router >>> data = [Ether(src='aa:aa:aa:aa:aa:aa', dst='33:33:ff:d4:e5:f6')/IPv6(src="753a:727c:97b5:f71d:51ea:3901:ab52:e110", dst="ff02::1:ffd4:e5f6")/ICMPv6ND_RA(routerlifetime=1), ... Ether(src='aa:aa:aa:aa:aa:aa', dst='33:33:ab:52:e1:10')/IPv6(src="fe9c:98b0:52b5:7033:5db0:394f:e468:c94f", dst="753a:727c:97b5:f71d:51ea:3901:ab52:e110")/ICMPv6ND_RA(routerlifetime=1), ... Ether()/IP()/"RANDOM"] >>> results = test_attack(NDP_Attack_Kill_Default_Router, data) Fake RA sent with source address 753a:727c:97b5:f71d:51ea:3901:ab52:e110 Fake RA sent with source address fe9c:98b0:52b5:7033:5db0:394f:e468:c94f >>> assert len(results) == 2 >>> >>> a = results[0][IPv6] >>> assert a[IPv6].src == "753a:727c:97b5:f71d:51ea:3901:ab52:e110" >>> assert a[IPv6].dst == "ff02::1" >>> assert a[IPv6].hlim == 255 >>> assert a[ICMPv6ND_RA].M == 0 >>> assert a[ICMPv6ND_RA].O == 0 >>> assert a[ICMPv6ND_RA].H == 0 >>> assert a[ICMPv6ND_RA].P == 0 >>> assert a[ICMPv6ND_RA].routerlifetime == 0 >>> assert a[ICMPv6ND_RA].reachabletime == 0 >>> assert a[ICMPv6ND_RA].retranstimer == 0 >>> assert a[ICMPv6NDOptSrcLLAddr].lladdr == "aa:aa:aa:aa:aa:aa" >>> >>> b = results[1][IPv6] >>> assert b[IPv6].src == "fe9c:98b0:52b5:7033:5db0:394f:e468:c94f" >>> assert b[IPv6].dst == "ff02::1" >>> assert b[IPv6].hlim == 255 >>> assert b[ICMPv6ND_RA].M == 0 >>> assert b[ICMPv6ND_RA].O == 0 >>> assert b[ICMPv6ND_RA].H == 0 >>> assert b[ICMPv6ND_RA].P == 0 >>> assert b[ICMPv6ND_RA].routerlifetime == 0 >>> assert b[ICMPv6ND_RA].reachabletime == 0 >>> assert b[ICMPv6ND_RA].retranstimer == 0 >>> assert b[ICMPv6NDOptSrcLLAddr].lladdr == "aa:aa:aa:aa:aa:aa" ###(414)=[passed] Test NDP_Attack_Fake_Router >>> ra = Ether()/IPv6()/ICMPv6ND_RA() >>> ra /= ICMPv6NDOptPrefixInfo(prefix="2001:db8:1::", prefixlen=64) >>> ra /= ICMPv6NDOptPrefixInfo(prefix="2001:db8:2::", prefixlen=64) >>> ra /= ICMPv6NDOptSrcLLAddr(lladdr="00:11:22:33:44:55") >>> >>> rad = Ether(raw(ra)) >>> >>> data = [Ether(src='aa:aa:aa:aa:aa:aa', dst='33:33:ab:52:e1:10')/IPv6(src="753a:727c:97b5:f71d:51ea:3901:ab52:e110", dst="ff02::1:ffd4:e5f6")/ICMPv6ND_RS(code=11, res=3758096), ... Ether(src='aa:aa:aa:aa:aa:aa', dst='33:33:ab:52:e1:10')/IPv6(src="753a:727c:97b5:f71d:51ea:3901:ab52:e110", dst="fe9c:98b0:52b5:7033:5db0:394f:e468:c94f")/ICMPv6ND_RS(), ... Ether()/IP()/ICMP()] >>> results = test_attack(NDP_Attack_Fake_Router, data, options=(ra,)) Fake RA sent in response to RS from 753a:727c:97b5:f71d:51ea:3901:ab52:e110 Fake RA sent in response to RS from 753a:727c:97b5:f71d:51ea:3901:ab52:e110 >>> assert len(results) == 2 >>> >>> assert results[0] == rad >>> assert results[1] == rad ###(415)=[passed] Test NDP_Attack_NS_Spoofing >>> r = test_attack(NDP_Attack_NS_Spoofing, [], options=("aa:aa:aa:aa:aa:aa", "753a:727c:97b5:f71d:51ea:3901:ab52:e110", "2001:db8::1", 'e4a0:654b:1a24:1b15:761d:2e5d:245d:ba83', "cc:cc:cc:cc:cc:cc", "dd:dd:dd:dd:dd:dd"))[0] >>> >>> assert r[Ether].dst == "dd:dd:dd:dd:dd:dd" >>> assert r[Ether].src == "cc:cc:cc:cc:cc:cc" >>> assert r[IPv6].hlim == 255 >>> assert r[IPv6].src == "753a:727c:97b5:f71d:51ea:3901:ab52:e110" >>> assert r[IPv6].dst == "e4a0:654b:1a24:1b15:761d:2e5d:245d:ba83" >>> assert r[ICMPv6ND_NS].tgt == "2001:db8::1" >>> assert r[ICMPv6NDOptSrcLLAddr].lladdr == "aa:aa:aa:aa:aa:aa" ###### ## Home Agent Address Discovery ###### ###(416)=[passed] in6_getha() >>> in6_getha('2001:db8::') == '2001:db8::fdff:ffff:ffff:fffe' True ###(417)=[passed] ICMPv6HAADRequest - build/dissection >>> p = IPv6(raw(IPv6(dst=in6_getha('2001:db8::'), src='2001:db8::1')/ICMPv6HAADRequest(id=42))) >>> p.cksum == 0x9620 and p.dst == '2001:db8::fdff:ffff:ffff:fffe' and p.R == 1 True ###(418)=[passed] ICMPv6HAADReply - build/dissection >>> p = IPv6(raw(IPv6(dst='2001:db8::1', src='2001:db8::42')/ICMPv6HAADReply(id=42, addresses=['2001:db8::2', '2001:db8::3']))) >>> p.cksum = 0x3747 and p.addresses == [ '2001:db8::2', '2001:db8::3' ] ###(419)=[passed] ICMPv6HAADRequest / ICMPv6HAADReply - build/dissection >>> a=ICMPv6HAADRequest(id=42) >>> b=ICMPv6HAADReply(id=42) >>> not a < b and a > b True ###### ## Mobile Prefix Solicitation/Advertisement ###### ###(420)=[passed] ICMPv6MPSol - build (default values) >>> s = b'`\x00\x00\x00\x00\x08:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x92\x00m\xbb\x00\x00\x00\x00' >>> raw(IPv6()/ICMPv6MPSol()) == s True ###(421)=[passed] ICMPv6MPSol - dissection (default values) >>> p = IPv6(s) >>> p[ICMPv6MPSol].type == 146 and p[ICMPv6MPSol].cksum == 0x6dbb and p[ICMPv6MPSol].id == 0 True ###(422)=[passed] ICMPv6MPSol - build >>> s = b'`\x00\x00\x00\x00\x08:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x92\x00(\x08\x00\x08\x00\x00' >>> raw(IPv6()/ICMPv6MPSol(cksum=0x2808, id=8)) == s True ###(423)=[passed] ICMPv6MPSol - dissection >>> p = IPv6(s) >>> p[ICMPv6MPSol].cksum == 0x2808 and p[ICMPv6MPSol].id == 8 True ###(424)=[passed] ICMPv6MPAdv - build (default values) >>> s = b'`\x00\x00\x00\x00(:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x93\x00\xa8\xd6\x00\x00\x80\x00\x03\x04@\xc0\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> raw(IPv6()/ICMPv6MPAdv()/ICMPv6NDOptPrefixInfo()) == s True ###(425)=[passed] ICMPv6MPAdv - dissection (default values) >>> p = IPv6(s) >>> p[ICMPv6MPAdv].type == 147 and p[ICMPv6MPAdv].cksum == 0xa8d6 and p[ICMPv6NDOptPrefixInfo].prefix == '::' True ###(426)=[passed] ICMPv6MPAdv - build >>> s = b'`\x00\x00\x00\x00(:@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x93\x00(\x07\x00*@\x00\x03\x04@@\xff\xff\xff\xff\x00\x00\x00\x0c\x00\x00\x00\x00 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> raw(IPv6()/ICMPv6MPAdv(cksum=0x2807, flags=1, id=42)/ICMPv6NDOptPrefixInfo(prefix='2001:db8::1', L=0, preferredlifetime=12)) == s True ###(427)=[passed] ICMPv6MPAdv - dissection >>> p = IPv6(s) >>> p[ICMPv6MPAdv].cksum == 0x2807 and p[ICMPv6MPAdv].flags == 1 and p[ICMPv6MPAdv].id == 42 and p[ICMPv6NDOptPrefixInfo].prefix == '2001:db8::1' and p[ICMPv6NDOptPrefixInfo].preferredlifetime == 12 True ###### ## Type 2 Routing Header ###### ###(428)=[passed] IPv6ExtHdrRouting - type 2 - build/dissection >>> p = IPv6(raw(IPv6(dst='2001:db8::1', src='2001:db8::2')/IPv6ExtHdrRouting(type=2, addresses=['2001:db8::3'])/ICMPv6EchoRequest())) >>> p.type == 2 and len(p.addresses) == 1 and p.cksum == 0x2446 True ###(429)=[passed] IPv6ExtHdrRouting - type 2 - hashret >>> p = IPv6()/IPv6ExtHdrRouting(addresses=["2001:db8::1", "2001:db8::2"])/ICMPv6EchoRequest() >>> p.hashret() == b" \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x00\x00\x00\x00" True ###### ## Mobility Options - Binding Refresh Advice ###### ###(430)=[passed] MIP6OptBRAdvice - build (default values) >>> s = b'\x02\x02\x00\x00' >>> raw(MIP6OptBRAdvice()) == s True ###(431)=[passed] MIP6OptBRAdvice - dissection (default values) >>> p = MIP6OptBRAdvice(s) >>> p.otype == 2 and p.olen == 2 and p.rinter == 0 True ###(432)=[passed] MIP6OptBRAdvice - build >>> s = b'\x03*\n\xf7' >>> raw(MIP6OptBRAdvice(otype=3, olen=42, rinter=2807)) == s True ###(433)=[passed] MIP6OptBRAdvice - dissection >>> p = MIP6OptBRAdvice(s) >>> p.otype == 3 and p.olen == 42 and p.rinter == 2807 True ###### ## Mobility Options - Alternate Care-of Address ###### ###(434)=[passed] MIP6OptAltCoA - build (default values) >>> s = b'\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> raw(MIP6OptAltCoA()) == s True ###(435)=[passed] MIP6OptAltCoA - dissection (default values) >>> p = MIP6OptAltCoA(s) >>> p.otype == 3 and p.olen == 16 and p.acoa == '::' True ###(436)=[passed] MIP6OptAltCoA - build >>> s = b'*\x08 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> raw(MIP6OptAltCoA(otype=42, olen=8, acoa='2001:db8::1')) == s True ###(437)=[passed] MIP6OptAltCoA - dissection >>> p = MIP6OptAltCoA(s) >>> p.otype == 42 and p.olen == 8 and p.acoa == '2001:db8::1' True ###### ## Mobility Options - Nonce Indices ###### ###(438)=[passed] MIP6OptNonceIndices - build (default values) >>> s = b'\x04\x10\x00\x00\x00\x00' >>> raw(MIP6OptNonceIndices()) == s True ###(439)=[passed] MIP6OptNonceIndices - dissection (default values) >>> p = MIP6OptNonceIndices(s) >>> p.otype == 4 and p.olen == 16 and p.hni == 0 and p.coni == 0 True ###(440)=[passed] MIP6OptNonceIndices - build >>> s = b'\x04\x12\x00\x13\x00\x14' >>> raw(MIP6OptNonceIndices(olen=18, hni=19, coni=20)) == s True ###(441)=[passed] MIP6OptNonceIndices - dissection >>> p = MIP6OptNonceIndices(s) >>> p.hni == 19 and p.coni == 20 True ###### ## Mobility Options - Binding Authentication Data ###### ###(442)=[passed] MIP6OptBindingAuthData - build (default values) >>> s = b'\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> raw(MIP6OptBindingAuthData()) == s True ###(443)=[passed] MIP6OptBindingAuthData - dissection (default values) >>> p = MIP6OptBindingAuthData(s) >>> p.otype == 5 and p.olen == 16 and p.authenticator == 0 True ###(444)=[passed] MIP6OptBindingAuthData - build >>> s = b'\x05*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xf7' >>> raw(MIP6OptBindingAuthData(olen=42, authenticator=2807)) == s True ###(445)=[passed] MIP6OptBindingAuthData - dissection >>> p = MIP6OptBindingAuthData(s) >>> p.otype == 5 and p.olen == 42 and p.authenticator == 2807 True ###### ## Mobility Options - Mobile Network Prefix ###### ###(446)=[passed] MIP6OptMobNetPrefix - build (default values) >>> s = b'\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> raw(MIP6OptMobNetPrefix()) == s True ###(447)=[passed] MIP6OptMobNetPrefix - dissection (default values) >>> p = MIP6OptMobNetPrefix(s) >>> p.otype == 6 and p.olen == 18 and p.plen == 64 and p.prefix == '::' True ###(448)=[passed] MIP6OptMobNetPrefix - build >>> s = b'\x06*\x02 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> raw(MIP6OptMobNetPrefix(olen=42, reserved=2, plen=32, prefix='2001:db8::')) == s True ###(449)=[passed] MIP6OptMobNetPrefix - dissection >>> p = MIP6OptMobNetPrefix(s) >>> p.olen == 42 and p.reserved == 2 and p.plen == 32 and p.prefix == '2001:db8::' True ###### ## Mobility Options - Link-Layer Address (MH-LLA) ###### ###(450)=[passed] MIP6OptLLAddr - basic build >>> raw(MIP6OptLLAddr()) == b'\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00' True ###(451)=[passed] MIP6OptLLAddr - basic dissection >>> p = MIP6OptLLAddr(b'\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00') >>> p.otype == 7 and p.olen == 7 and p.ocode == 2 and p.pad == 0 and p.lla == "00:00:00:00:00:00" True ###(452)=[passed] MIP6OptLLAddr - build with specific values >>> raw(MIP6OptLLAddr(olen=42, ocode=4, pad=0xff, lla='EE:EE:EE:EE:EE:EE')) == b'\x07*\x04\xff\xee\xee\xee\xee\xee\xee' True ###(453)=[passed] MIP6OptLLAddr - dissection with specific values >>> p = MIP6OptLLAddr(b'\x07*\x04\xff\xee\xee\xee\xee\xee\xee') >>> >>> raw(MIP6OptLLAddr(olen=42, ocode=4, pad=0xff, lla='EE:EE:EE:EE:EE:EE')) b'\x07*\x04\xff\xee\xee\xee\xee\xee\xee' >>> p.otype == 7 and p.olen == 42 and p.ocode == 4 and p.pad == 0xff and p.lla == "ee:ee:ee:ee:ee:ee" True ###### ## Mobility Options - Mobile Node Identifier ###### ###(454)=[passed] MIP6OptMNID - basic build >>> raw(MIP6OptMNID()) == b'\x08\x01\x01' True ###(455)=[passed] MIP6OptMNID - basic dissection >>> p = MIP6OptMNID(b'\x08\x01\x01') >>> p.otype == 8 and p.olen == 1 and p.subtype == 1 and p.id == b"" True ###(456)=[passed] MIP6OptMNID - build with specific values >>> raw(MIP6OptMNID(subtype=42, id="someid")) == b'\x08\x07*someid' True ###(457)=[passed] MIP6OptMNID - dissection with specific values >>> p = MIP6OptMNID(b'\x08\x07*someid') >>> p.otype == 8 and p.olen == 7 and p.subtype == 42 and p.id == b"someid" True ###### ## Mobility Options - Message Authentication ###### ###(458)=[passed] MIP6OptMsgAuth - basic build >>> raw(MIP6OptMsgAuth()) == b'\x09\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' True ###(459)=[passed] MIP6OptMsgAuth - basic dissection >>> p = MIP6OptMsgAuth(b'\x09\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA') >>> p.otype == 9 and p.olen == 17 and p.subtype == 1 and p.mspi == 0 and p.authdata == b"A"*12 True ###(460)=[passed] MIP6OptMsgAuth - build with specific values >>> raw(MIP6OptMsgAuth(authdata="B"*16, mspi=0xeeeeeeee, subtype=0xff)) == b'\t\x15\xff\xee\xee\xee\xeeBBBBBBBBBBBBBBBB' True ###(461)=[passed] MIP6OptMsgAuth - dissection with specific values >>> p = MIP6OptMsgAuth(b'\t\x15\xff\xee\xee\xee\xeeBBBBBBBBBBBBBBBB') >>> p.otype == 9 and p.olen == 21 and p.subtype == 255 and p.mspi == 0xeeeeeeee and p.authdata == b"B"*16 True ###### ## Mobility Options - Replay Protection ###### ###(462)=[passed] MIP6OptReplayProtection - basic build >>> raw(MIP6OptReplayProtection()) == b'\n\x08\x00\x00\x00\x00\x00\x00\x00\x00' True ###(463)=[passed] MIP6OptReplayProtection - basic dissection >>> p = MIP6OptReplayProtection(b'\n\x08\x00\x00\x00\x00\x00\x00\x00\x00') >>> p.otype == 10 and p.olen == 8 and p.timestamp == 0 True ###(464)=[passed] MIP6OptReplayProtection - build with specific values >>> s = raw(MIP6OptReplayProtection(olen=42, timestamp=(72*31536000)<<32)) >>> s == b'\n*\x87V|\x00\x00\x00\x00\x00' True ###(465)=[passed] MIP6OptReplayProtection - dissection with specific values >>> p = MIP6OptReplayProtection(s) >>> p.otype == 10 and p.olen == 42 and p.timestamp == 9752118382559232000 True >>> p.fields_desc[-1].i2repr("", p.timestamp) == 'Mon, 13 Dec 1971 23:50:39 +0000 (9752118382559232000)' True ###### ## Mobility Options - CGA Parameters ###### ###(466)=[passed] MIP6OptCGAParams >>> ###### ## Mobility Options - Signature ###### ###(467)=[passed] MIP6OptSignature >>> ###### ## Mobility Options - Permanent Home Keygen Token ###### ###(468)=[passed] MIP6OptHomeKeygenToken >>> ###### ## Mobility Options - Care-of Test Init ###### ###(469)=[passed] MIP6OptCareOfTestInit >>> ###### ## Mobility Options - Care-of Test ###### ###(470)=[passed] MIP6OptCareOfTest >>> ###### ## Mobility Options - Automatic Padding - MIP6OptBRAdvice ###### ###(471)=[passed] Mobility Options - Automatic Padding - MIP6OptBRAdvice >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptBRAdvice()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x02\x02\x00\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x02\x02\x00\x00\x01\x04\x00\x00\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x02\x02\x00\x00\x01\x04\x00\x00\x00\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x00\x02\x02\x00\x00\x01\x02\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x02\x02\x00\x00\x01\x02\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x02\x02\x00\x00\x01\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x02\x02\x00\x00\x01\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptBRAdvice()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x02\x02\x00\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptAltCoA ###### ###(472)=[passed] Mobility Options - Automatic Padding - MIP6OptAltCoA >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptAltCoA()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptAltCoA()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptAltCoA()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x05\x00\x00\x00\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x04\x00\x00\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x01\x03\x00\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x01\x02\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptAltCoA()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptNonceIndices ###### ###(473)=[passed] Mobility Options - Automatic Padding - MIP6OptNonceIndices >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x04\x10\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x00\x04\x10\x00\x00\x00\x00\x01\x02\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x04\x10\x00\x00\x00\x00\x01\x02\x00\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x00\x04\x10\x00\x00\x00\x00\x01\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x04\x10\x00\x00\x00\x00\x01\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptNonceIndices()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptNonceIndices()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptNonceIndices()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x04\x10\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptBindingAuthData ###### ###(474)=[passed] Mobility Options - Automatic Padding - MIP6OptBindingAuthData >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x01\x03\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x02\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x01\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptBindingAuthData()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptBindingAuthData()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptBindingAuthData()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\x05\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptMobNetPrefix ###### ###(475)=[passed] Mobility Options - Automatic Padding - MIP6OptMobNetPrefix >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptMobNetPrefix()])) == b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x01\x05\x00\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x04\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x03\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x02\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x01\x01\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x01\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptMobNetPrefix()])) == b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptLLAddr ###### ###(476)=[passed] Mobility Options - Automatic Padding - MIP6OptLLAddr >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptLLAddr()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptLLAddr()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptLLAddr()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptLLAddr()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptMNID ###### ###(477)=[passed] Mobility Options - Automatic Padding - MIP6OptMNID >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptMNID()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x08\x01\x01\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMNID()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x08\x01\x01' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x08\x01\x01\x01\x05\x00\x00\x00\x00\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x08\x01\x01\x01\x04\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x08\x01\x01\x01\x03\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x08\x01\x01\x01\x02\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x08\x01\x01\x01\x01\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x08\x01\x01\x01\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptMNID()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x08\x01\x01\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptMsgAuth ###### ###(478)=[passed] Mobility Options - Automatic Padding - MIP6OptMsgAuth >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptMsgAuth()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptMsgAuth()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA\x01\x02\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x01\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptMsgAuth()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x00\t\x11\x01\x00\x00\x00\x00AAAAAAAAAAAA' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptReplayProtection ###### ###(479)=[passed] Mobility Options - Automatic Padding - MIP6OptReplayProtection >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x01\x03\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x01\x02\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x01\x01\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x01\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptReplayProtection()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptReplayProtection()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptReplayProtection()])) ==b';\x04\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00\n\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptCGAParamsReq ###### ###(480)=[passed] Mobility Options - Automatic Padding - MIP6OptCGAParamsReq >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCGAParamsReq()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0b\x00\x01\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCGAParamsReq()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0b\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCGAParamsReq()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0b\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0b\x00\x01\x05\x00\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0b\x00\x01\x04\x00\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0b\x00\x01\x03\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0b\x00\x01\x02\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0b\x00\x01\x01\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCGAParamsReq()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0b\x00\x01\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptCGAParams ###### ###(481)=[passed] Mobility Options - Automatic Padding - MIP6OptCGAParams >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCGAParams()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0c\x00\x01\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCGAParams()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0c\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCGAParams()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0c\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0c\x00\x01\x05\x00\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0c\x00\x01\x04\x00\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0c\x00\x01\x03\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0c\x00\x01\x02\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0c\x00\x01\x01\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCGAParams()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0c\x00\x01\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptSignature ###### ###(482)=[passed] Mobility Options - Automatic Padding - MIP6OptSignature >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptSignature()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\r\x00\x01\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptSignature()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\r\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptSignature()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\r\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\r\x00\x01\x05\x00\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\r\x00\x01\x04\x00\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\r\x00\x01\x03\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\r\x00\x01\x02\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\r\x00\x01\x01\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptSignature()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\r\x00\x01\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptHomeKeygenToken ###### ###(483)=[passed] Mobility Options - Automatic Padding - MIP6OptHomeKeygenToken >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptHomeKeygenToken()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0e\x00\x01\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptHomeKeygenToken()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0e\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptHomeKeygenToken()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0e\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0e\x00\x01\x05\x00\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0e\x00\x01\x04\x00\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0e\x00\x01\x03\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0e\x00\x01\x02\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0e\x00\x01\x01\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptHomeKeygenToken()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0e\x00\x01\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptCareOfTestInit ###### ###(484)=[passed] Mobility Options - Automatic Padding - MIP6OptCareOfTestInit >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCareOfTestInit()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x0f\x00\x01\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCareOfTestInit()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x0f\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCareOfTestInit()])) ==b';\x01\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x0f\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x0f\x00\x01\x05\x00\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x0f\x00\x01\x04\x00\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x0f\x00\x01\x03\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x0f\x00\x01\x02\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x0f\x00\x01\x01\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCareOfTestInit()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x0f\x00\x01\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Mobility Options - Automatic Padding - MIP6OptCareOfTest ###### ###(485)=[passed] Mobility Options - Automatic Padding - MIP6OptCareOfTest >>> a = raw(MIP6MH_BU(seq=0x4242, options=[MIP6OptCareOfTest()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00' >>> b = raw(MIP6MH_BU(seq=0x4242, options=[Pad1(),MIP6OptCareOfTest()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> c = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*0),MIP6OptCareOfTest()])) ==b';\x02\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00' >>> d = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*1),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x01\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00' >>> e = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*2),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x02\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x00\x00\x00' >>> g = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*3),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x03\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x00\x00\x00' >>> h = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*4),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x04\x00\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00' >>> i = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*5),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x05\x00\x00\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00' >>> j = raw(MIP6MH_BU(seq=0x4242, options=[PadN(optdata=b'\x00'*6),MIP6OptCareOfTest()])) ==b';\x03\x05\x00\x00\x00BB\xd0\x00\x00\x03\x01\x06\x00\x00\x00\x00\x00\x00\x10\x08\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00' >>> a and b and c and d and e and g and h and i and j True ###### ## Binding Refresh Request Message ###### ###(486)=[passed] MIP6MH_BRR - Build (default values) >>> raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_BRR()) == b'`\x00\x00\x00\x00\x08\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x00\x00h\xfb\x00\x00' True ###(487)=[passed] MIP6MH_BRR - Build with specific values >>> raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_BRR(nh=0xff, res=0xee, res2=0xaaaa, options=[MIP6OptLLAddr(), MIP6OptAltCoA()])) == b'`\x00\x00\x00\x00(\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\x04\x00\xee\xec$\xaa\xaa\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(488)=[passed] MIP6MH_BRR - Basic dissection >>> a=IPv6(b'`\x00\x00\x00\x00\x08\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x00\x00\x00h\xfb\x00\x00') >>> b=a.payload >>> a.nh == 135 and isinstance(b, MIP6MH_BRR) and b.nh == 59 and b.len == 0 and b.mhtype == 0 and b.res == 0 and b.cksum == 0x68fb and b.res2 == 0 and b.options == [] True ###(489)=[passed] MIP6MH_BRR - Dissection with specific values >>> a=IPv6(b'`\x00\x00\x00\x00(\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xff\x04\x00\xee\xec$\xaa\xaa\x07\x07\x02\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> b=a.payload >>> a.nh == 135 and isinstance(b, MIP6MH_BRR) and b.nh == 0xff and b.len == 4 and b.mhtype == 0 and b.res == 238 and b.cksum == 0xec24 and b.res2 == 43690 and len(b.options) == 3 and isinstance(b.options[0], MIP6OptLLAddr) and isinstance(b.options[1], PadN) and isinstance(b.options[2], MIP6OptAltCoA) True ###(490)=[passed] MIP6MH_BRR / MIP6MH_BU / MIP6MH_BA hashret() and answers() >>> hoa="2001:db8:9999::1" >>> coa="2001:db8:7777::1" >>> cn="2001:db8:8888::1" >>> ha="2001db8:6666::1" >>> a=IPv6(raw(IPv6(src=cn, dst=hoa)/MIP6MH_BRR())) >>> b=IPv6(raw(IPv6(src=coa, dst=cn)/IPv6ExtHdrDestOpt(options=HAO(hoa=hoa))/MIP6MH_BU(flags=0x01))) >>> b2=IPv6(raw(IPv6(src=coa, dst=cn)/IPv6ExtHdrDestOpt(options=HAO(hoa=hoa))/MIP6MH_BU(flags=~0x01))) >>> c=IPv6(raw(IPv6(src=cn, dst=coa)/IPv6ExtHdrRouting(type=2, addresses=[hoa])/MIP6MH_BA())) >>> b.answers(a) and not a.answers(b) and c.answers(b) and not b.answers(c) and not c.answers(b2) 0 >>> >>> len(b[IPv6ExtHdrDestOpt].options) == 2 True ###### ## Home Test Init Message ###### ###(491)=[passed] MIP6MH_HoTI - Build (default values) >>> raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoTI()) == b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x01\x00g\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(492)=[passed] MIP6MH_HoTI - Dissection (default values) >>> a=IPv6(b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x01\x00g\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> b = a.payload >>> a.nh == 135 and isinstance(b, MIP6MH_HoTI) and b.nh==59 and b.mhtype == 1 and b.len== 1 and b.res == 0 and b.cksum == 0x67f2 and b.cookie == b'\x00'*8 True ###(493)=[passed] MIP6MH_HoTI - Build (specific values) >>> raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoTI(res=0x77, cksum=0x8899, cookie=b"\xAA"*8)) == b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x01w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa' True ###(494)=[passed] MIP6MH_HoTI - Dissection (specific values) >>> a=IPv6(b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x01w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa') >>> b=a.payload >>> a.nh == 135 and isinstance(b, MIP6MH_HoTI) and b.nh==59 and b.mhtype == 1 and b.len == 1 and b.res == 0x77 and b.cksum == 0x8899 and b.cookie == b'\xAA'*8 True ###### ## Care-of Test Init Message ###### ###(495)=[passed] MIP6MH_CoTI - Build (default values) >>> raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoTI()) == b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x02\x00f\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(496)=[passed] MIP6MH_CoTI - Dissection (default values) >>> a=IPv6(b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x02\x00f\xf2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> b = a.payload >>> a.nh == 135 and isinstance(b, MIP6MH_CoTI) and b.nh==59 and b.mhtype == 2 and b.len== 1 and b.res == 0 and b.cksum == 0x66f2 and b.cookie == b'\x00'*8 True ###(497)=[passed] MIP6MH_CoTI - Build (specific values) >>> raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoTI(res=0x77, cksum=0x8899, cookie=b"\xAA"*8)) == b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x02w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa' True ###(498)=[passed] MIP6MH_CoTI - Dissection (specific values) >>> a=IPv6(b'`\x00\x00\x00\x00\x10\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x01\x02w\x88\x99\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa') >>> b=a.payload >>> a.nh == 135 and isinstance(b, MIP6MH_CoTI) and b.nh==59 and b.mhtype == 2 and b.len == 1 and b.res == 0x77 and b.cksum == 0x8899 and b.cookie == b'\xAA'*8 True ###### ## Home Test Message ###### ###(499)=[passed] MIP6MH_HoT - Build (default values) >>> raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoT()) == b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03\x00e\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(500)=[passed] MIP6MH_HoT - Dissection (default values) >>> a=IPv6(b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03\x00e\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> b = a.payload >>> a.nh == 135 and isinstance(b, MIP6MH_HoT) and b.nh==59 and b.mhtype == 3 and b.len== 2 and b.res == 0 and b.cksum == 0x65e9 and b.index == 0 and b.cookie == b'\x00'*8 and b.token == b'\x00'*8 True ###(501)=[passed] MIP6MH_HoT - Build (specific values) >>> raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_HoT(res=0x77, cksum=0x8899, cookie=b"\xAA"*8, index=0xAABB, token=b'\xCC'*8)) == b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' True ###(502)=[passed] MIP6MH_HoT - Dissection (specific values) >>> a=IPv6(b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x03w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc') >>> b = a.payload >>> a.nh == 135 and isinstance(b, MIP6MH_HoT) and b.nh==59 and b.mhtype == 3 and b.len== 2 and b.res == 0x77 and b.cksum == 0x8899 and b.index == 0xAABB and b.cookie == b'\xAA'*8 and b.token == b'\xCC'*8 True ###(503)=[passed] MIP6MH_HoT answers >>> a1, a2 = "2001:db8::1", "2001:db8::2" >>> cookie = RandString(8)._fix() >>> p1 = IPv6(src=a1, dst=a2)/MIP6MH_HoTI(cookie=cookie) >>> p2 = IPv6(src=a2, dst=a1)/MIP6MH_HoT(cookie=cookie) >>> p2_ko = IPv6(src=a2, dst=a1)/MIP6MH_HoT(cookie="".join(chr((orb(b'\xff') + 1) % 256))) >>> assert p1.hashret() == p2.hashret() and p2.answers(p1) and not p1.answers(p2) >>> assert p1.hashret() != p2_ko.hashret() and not p2_ko.answers(p1) and not p1.answers(p2_ko) ###### ## Care-of Test Message ###### ###(504)=[passed] MIP6MH_CoT - Build (default values) >>> raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoT()) == b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04\x00d\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(505)=[passed] MIP6MH_CoT - Dissection (default values) >>> a=IPv6(b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04\x00d\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> b = a.payload >>> a.nh == 135 and isinstance(b, MIP6MH_HoT) and b.nh==59 and b.mhtype == 4 and b.len== 2 and b.res == 0 and b.cksum == 0x64e9 and b.index == 0 and b.cookie == b'\x00'*8 and b.token == b'\x00'*8 True ###(506)=[passed] MIP6MH_CoT - Build (specific values) >>> raw(IPv6(src="2001:db8::1", dst="2001:db8::2")/MIP6MH_CoT(res=0x77, cksum=0x8899, cookie=b"\xAA"*8, index=0xAABB, token=b'\xCC'*8)) == b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc' True ###(507)=[passed] MIP6MH_CoT - Dissection (specific values) >>> a=IPv6(b'`\x00\x00\x00\x00\x18\x87@ \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02;\x02\x04w\x88\x99\xaa\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc') >>> b = a.payload >>> a.nh == 135 and isinstance(b, MIP6MH_CoT) and b.nh==59 and b.mhtype == 4 and b.len== 2 and b.res == 0x77 and b.cksum == 0x8899 and b.index == 0xAABB and b.cookie == b'\xAA'*8 and b.token == b'\xCC'*8 True ###### ## Binding Update Message ###### ###(508)=[passed] MIP6MH_BU - build (default values) >>> s= b'`\x00\x00\x00\x00(<@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87\x02\x01\x02\x00\x00\xc9\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x01\x05\x00\xee`\x00\x00\xd0\x00\x00\x03\x01\x02\x00\x00' >>> raw(IPv6()/IPv6ExtHdrDestOpt(options=[HAO()])/MIP6MH_BU()) == s True ###(509)=[passed] MIP6MH_BU - dissection (default values) >>> p = IPv6(s) >>> p[MIP6MH_BU].len == 1 True ###(510)=[passed] MIP6MH_BU - build >>> s = b'`\x00\x00\x00\x00P<@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x87\x02\x01\x02\x00\x00\xc9\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xca\xfe;\x06\x05\x00\xea\xf2\x00\x00\xd0\x00\x00*\x01\x00\x03\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x00\x06\x12\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> raw(IPv6()/IPv6ExtHdrDestOpt(options=[HAO(hoa='2001:db8::cafe')])/MIP6MH_BU(mhtime=42, options=[MIP6OptAltCoA(),MIP6OptMobNetPrefix()])) == s True ###(511)=[passed] MIP6MH_BU - dissection >>> p = IPv6(s) >>> p[MIP6MH_BU].cksum == 0xeaf2 and p[MIP6MH_BU].len == 6 and len(p[MIP6MH_BU].options) == 4 and p[MIP6MH_BU].mhtime == 42 True ###### ## Binding ACK Message ###### ###(512)=[passed] MIP6MH_BA - build >>> s = b'`\x00\x00\x00\x00\x10\x87@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01;\x01\x06\x00\xbc\xb9\x00\x80\x00\x00\x00*\x01\x02\x00\x00' >>> raw(IPv6()/MIP6MH_BA(mhtime=42)) == s True ###(513)=[passed] MIP6MH_BA - dissection >>> p = IPv6(s) >>> p[MIP6MH_BA].cksum == 0xbcb9 and p[MIP6MH_BA].len == 1 and len(p[MIP6MH_BA].options) == 1 and p[MIP6MH_BA].mhtime == 42 True ###### ## Binding ERR Message ###### ###(514)=[passed] MIP6MH_BE - build >>> s = b'`\x00\x00\x00\x00\x18\x87@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01;\x02\x07\x00\xbbY\x02\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02' >>> raw(IPv6()/MIP6MH_BE(status=2, ha='1::2')) == s True ###(515)=[passed] MIP6MH_BE - dissection >>> p = IPv6(s) >>> p[MIP6MH_BE].cksum=0xba10 and p[MIP6MH_BE].len == 1 and len(p[MIP6MH_BE].options) == 1 ###### ## TracerouteResult6 ###### ###(516)=[passed] get_trace() >>> ip6_hlim = [("2001:db8::%d" % i, i) for i in range(1, 12)] >>> >>> tr6_packets = [ (IPv6(dst="2001:db8::1", src="2001:db8::254", hlim=hlim)/UDP()/"scapy", ... IPv6(dst="2001:db8::254", src=ip)/ICMPv6TimeExceeded()/IPerror6(dst="2001:db8::1", src="2001:db8::254", hlim=0)/UDPerror()/"scapy") ... for (ip, hlim) in ip6_hlim ] >>> >>> tr6 = TracerouteResult6(tr6_packets) >>> tr6.get_trace() == {'2001:db8::1': {1: ('2001:db8::1', False), 2: ('2001:db8::2', False), 3: ('2001:db8::3', False), 4: ('2001:db8::4', False), 5: ('2001:db8::5', False), 6: ('2001:db8::6', False), 7: ('2001:db8::7', False), 8: ('2001:db8::8', False), 9: ('2001:db8::9', False), 10: ('2001:db8::10', False), 11: ('2001:db8::11', False)}} True ###(517)=[passed] show() >>> def test_show(): ... with ContextManagerCaptureOutput() as cmco: ... tr6 = TracerouteResult6(tr6_packets) ... tr6.show() ... result = cmco.get_output() ... expected = " 2001:db8::1 :udpdomain \n" ... expected += "1 2001:db8::1 3 \n" ... expected += "2 2001:db8::2 3 \n" ... expected += "3 2001:db8::3 3 \n" ... expected += "4 2001:db8::4 3 \n" ... expected += "5 2001:db8::5 3 \n" ... expected += "6 2001:db8::6 3 \n" ... expected += "7 2001:db8::7 3 \n" ... expected += "8 2001:db8::8 3 \n" ... expected += "9 2001:db8::9 3 \n" ... expected += "10 2001:db8::10 3 \n" ... expected += "11 2001:db8::11 3 \n" ... index_result = result.index("\n1") ... index_expected = expected.index("\n1") ... assert result[index_result:] == expected[index_expected:] ... >>> test_show() ###(518)=[passed] graph() >>> saved_AS_resolver = conf.AS_resolver >>> conf.AS_resolver = None >>> tr6.make_graph() >>> assert len(tr6.graphdef) == 530 >>> assert tr6.graphdef.startswith("digraph trace {") >>> '"2001:db8::1 53/udp";' in tr6.graphdef True >>> conf.AS_resolver = saved_AS_resolver IPsec layer regression tests ━ Run at 01:42:17 from [test/scapy/layers/ipsec.uts] by UTscapy in 1.494314432144165 └ Passed=122 └ Failed=0 ###### ## IPv4 / ESP - Transport - Encryption Algorithms ###### ###(000)=[passed] IPv4 / ESP - Transport - NULL - NULL after decryption the original packet payload should be unaltered >>> import socket >>> >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(001)=[passed] IPv4 / ESP - Transport - DES - NULL the encrypted packet should have an ESP layer after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='DES', crypt_key=b'8bytekey', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\x0f\x6d\x2f\x3d\x1e\xc1\x0b\xc2\xb6\x8f\xfd\x67\x39\xc0\x96\x2c' ... b'\x17\x79\x88\xf6\xbc\x4d\xf7\x45\xd8\x36\x63\x86\xcd\x08\x7c\x08' ... b'\x2b\xf8\xa2\x91\x18\x21\x88\xd9\x26\x00\xc5\x21\x24\xbf\x8f\xf5' ... b'\x6c\x47\xb0\x3a\x8e\xdb\x75\x21\xd9\x33\x85\x5a\x15\xc6\x31\x00' ... b'\x1c\xef\x3e\x12\xce\x70\xec\x8f\x48\xc7\x81\x9b\x66\xcb\xf5\x39' ... b'\x91\xb3\x8e\x72\xfb\x7f\x64\x65\x6c\xf4\xa9\xf2\x5e\x63\x2f\x60', ... seq=1) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###(002)=[passed] IPv4 / ESP - Transport - 3DES - NULL the encrypted packet should have an ESP layer after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='3DES', crypt_key=b'threedifferent8byteskeys', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\x36\x5c\x9b\x41\x37\xc8\x59\x1e\x39\x63\xe8\x6b\xf7\x0d\x97\x54' ... b'\x13\x84\xf6\x81\x66\x19\xe7\xcb\x75\x94\xf1\x0b\x8e\xa3\xf1\xa0' ... b'\x3e\x88\x51\xc4\x50\xd0\xa9\x1f\x16\x25\xc6\xbd\xe9\x0b\xdc\xae' ... b'\xf8\x13\x00\xa3\x8c\x53\xee\x1c\x96\xc0\xfe\x99\x70\xab\x94\x77' ... b'\xd7\xc4\xe8\xfd\x9f\x96\x28\xb8\x95\x20\x86\x7b\x19\xbc\x8f\xf5' ... b'\x96\xb0\x7e\xcc\x04\x83\xae\x4d\xa3\xba\x1d\x44\xf0\xba\x2e\xcd', ... seq=1) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###(003)=[passed] IPv4 / ESP - Transport - AES-CBC - NULL after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\x08\x2f\x94\xe6\x53\xd8\x8e\x13\x70\xe8\xff\x61\x52\x90\x27\x3c' ... b'\xf2\xb4\x1f\x75\xd2\xa0\xac\xae\x1c\xa8\x5e\x1c\x78\x21\x4c\x7f' ... b'\xc3\x30\x17\x6a\x8d\xf3\xb1\xa7\xd1\xa8\x42\x01\xd6\x8d\x2d\x7e' ... b'\x5d\x06\xdf\xaa\x05\x27\x42\xb1\x00\x12\xcf\xff\x64\x02\x5a\x40' ... b'\xcd\xca\x1b\x91\xba\xf8\xc8\x59\xe7\xbd\x4d\x19\xb4\x8d\x39\x25' ... b'\x6c\x73\xf1\x2d\xaa\xee\xe1\x0b\x71\xcd\xfc\x11\x1d\x56\xce\x60' ... b'\xed\xd2\x32\x87\xd4\x90\xc3\xf5\x31\x47\x97\x69\x83\x82\x6d\x38', ... seq=1) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###(004)=[passed] IPv4 / ESP - Transport - AES-CTR - NULL after encryption the original packet payload should NOT be readable after decryption original packet should be preserved Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CTR', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\xc4\xca\x09\x0f\x8b\xd3\x05\x3d\xac\x5a\x2f\x87\xca\x71\x10\x01' ... b'\xa7\x95\xc9\x07\xcc\xd4\x05\x58\x65\x23\x22\x4b\x63\x9b\x1f\xef' ... b'\x55\xb9\x1a\x91\x52\x76\x00\xf7\x94\x7b\x1d\xe1\x8e\x03\x2e\x85' ... b'\xad\xdd\x83\x22\x8a\xc3\x88\x6e\x85\xf5\x9b\xed\xa9\x6e\xb1\xc3' ... b'\x78\x00\x2f\xcd\x77\xe8\x3e\xec\x0e\x77\x94\xb2\x9b\x0f\x64\x5e' ... b'\x09\x83\x03\x7d\x83\x22\x39\xbb\x94\x66\xae\x9f\xbf\x01\xda\xfb', ... seq=1) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###(005)=[passed] IPv4 / ESP - Transport - Blowfish - NULL after encryption the original packet payload should NOT be readable after decryption original packet should be preserved Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='Blowfish', crypt_key=b'sixteenbytes key', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\x93\x9f\x5a\x10\x55\x57\x30\xa0\xb4\x00\x72\x1e\x46\x42\x46\x20' ... b'\xbc\x01\xef\xc3\x79\xcc\x3e\x55\x64\xba\x09\xc2\x6a\x5a\x5c\xb3' ... b'\xcc\xb5\xd5\x87\x82\xb0\x0a\x94\x58\xfc\x50\x37\x40\xe1\x03\xd3' ... b'\x4a\x09\xb2\x23\x53\x56\xa4\x45\x4c\xbb\x81\x1c\xdb\x31\xa7\x67' ... b'\xbd\x38\x8e\xba\x55\xd9\x1f\xf1\x3c\xeb\x07\x4c\x02\xb0\x3e\xc5' ... b'\xf6\x60\xdd\x68\xe1\xd4\xec\xee\x27\xc0\x6d\x1a\x80\xe2\xcc\x7d', ... seq=1) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###(006)=[passed] IPv4 / ESP - Transport - CAST - NULL after encryption the original packet payload should NOT be readable after decryption original packet should be preserved Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='CAST', crypt_key=b'sixteenbytes key', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\xcd\x4a\x46\x05\x51\x54\x73\x35\x1d\xad\x4b\x10\xc1\x15\xe2\x70' ... b'\xbc\x9c\x53\x8f\x4d\x1c\x87\x1a\xc1\xb0\xdf\x80\xd1\x0c\xa4\x59' ... b'\xe6\x50\xde\x46\xdb\x3f\x28\xc2\xda\x6c\x2b\x81\x5e\x7c\x7b\x4f' ... b'\xbc\x8d\xc1\x6d\x4a\x2b\x04\x91\x9e\xc4\x0b\xba\x05\xba\x3b\x71' ... b'\xac\xe3\x16\xcf\x7f\x00\xc5\x87\x7d\x72\x48\xe6\x5b\x43\x19\x24' ... b'\xae\xa6\x2c\xcc\xad\xbf\x37\x6c\x6e\xea\x71\x67\x73\xd6\x11\x9f', ... seq=1) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###### ## IPv4 / ESP - Tunnel - Encryption Algorithms ###### ###(007)=[passed] IPv4 / ESP - Tunnel - NULL - NULL after encryption packet should be encapsulated with the given ip tunnel header after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(008)=[passed] IPv4 / ESP - Tunnel - DES - NULL after encryption packet should be encapsulated with the given ip tunnel header the encrypted packet should have an ESP layer after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='DES', crypt_key=b'8bytekey', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(009)=[passed] IPv4 / ESP - Tunnel - 3DES - NULL after encryption packet should be encapsulated with the given ip tunnel header the encrypted packet should have an ESP layer after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='3DES', crypt_key=b'threedifferent8byteskeys', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(010)=[passed] IPv4 / ESP - Tunnel - AES-CBC - NULL after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(011)=[passed] IPv4 / ESP - Tunnel - AES-CTR - NULL after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CTR', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(012)=[passed] IPv4 / ESP - Tunnel - Blowfish - NULL after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='Blowfish', crypt_key=b'sixteenbytes key', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(013)=[passed] IPv4 / ESP - Tunnel - CAST - NULL after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='CAST', crypt_key=b'sixteenbytes key', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###### ## IPv4 / ESP - Transport - Authentication Algorithms ###### ###(014)=[passed] IPv4 / ESP - Transport - NULL - HMAC-SHA1-96 integrity verification should pass after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d[TCP] == p[TCP] ###(015)=[passed] IPv4 / ESP - Transport - NULL - HMAC-SHA1-96 - altered packet simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError('pkt_icv=b\'S\\x11\\x8a\\r"\\x8b\\x1e/i\\xd78\\xa0\', computed_icv=b\'\\x02\\x0b\\xfe\\xf6\\xe1\\xc5\\xc8\\x87.7\\x7f\\xc9\'') ###(016)=[passed] IPv4 / ESP - Transport - NULL - SHA2-256-128 after encryption the original packet payload should be readable integrity verification should pass after decryption the original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-256-128', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d == p ###(017)=[passed] IPv4 / ESP - Transport - NULL - SHA2-256-128 - altered packet after encryption the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-256-128', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xf8H3-8\\xe6\\xfa\\xcb\\xa0T\\xd1\\xa0\\x03\\x8f\\xba@', computed_icv=b'.S\\xa5\\x9cw\\xf0\\xaeM0;\\x08M/6\\x990'") ###(018)=[passed] IPv4 / ESP - Transport - NULL - SHA2-384-192 after encryption the original packet payload should be readable integrity verification should pass after decryption the original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-384-192', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d == p ###(019)=[passed] IPv4 / ESP - Transport - NULL - SHA2-384-192 - altered packet after encryption the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-384-192', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\x14\\x18\\xf6[\\x0c\\x1dJm\\x1e\\x86@\\xd5E{\\xab\\x95g\\x82j\\x1f>\\xb6R\\xff', computed_icv=b'`\\xcc\\x1bK\\x8e[_\\x02BQ\\x8dm2\\x92\\xcf\\\\;\\xa3\\x08+\\xa0Y\\xe3A'") ###(020)=[passed] IPv4 / ESP - Transport - NULL - SHA2-512-256 after encryption the original packet payload should be readable integrity verification should pass after decryption the original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-512-256', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d == p ###(021)=[passed] IPv4 / ESP - Transport - NULL - SHA2-512-256 - altered packet after encryption the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-512-256', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'lc\\x9e^K\\x00\\xbcI\\x02\\xf5 (\\xe12\\xb9\\x1d\\x0c\\x83\\xbe\\x1b\\xf0\\x8b0\\xd0\\x96-JO!\\xe3\\xaa\\xd3', computed_icv=b'\\n\\x8d\\xde\\x0fV~\\x08\\xad\\xdc\\xc5q\\x9a\\xb3\\n\\x89F3\\x03\\xb4s,\\xea\\xdb\\x9b\\x91)\\xf2\\x8ag]\\x90\\xc7'") ###(022)=[passed] IPv4 / ESP - Transport - NULL - HMAC-MD5-96 after encryption the original packet payload should be readable integrity verification should pass after decryption the original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-MD5-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d == p ###(023)=[passed] IPv4 / ESP - Transport - NULL - HMAC-MD5-96 - altered packet after encryption the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-MD5-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\x98q\\xee\\xf9M\\r1\\x97\\xee\\xb3\\x8c7', computed_icv=b'Y\\xdb\\xec_)\\xbb\\xe1@)\\x05v\\x04'") ###(024)=[passed] IPv4 / ESP - Transport - NULL - AES-CMAC-96 after encryption the original packet payload should be readable integrity verification should pass after decryption the original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d == p ###(025)=[passed] IPv4 / ESP - Transport - NULL - AES-CMAC-96 - altered packet after encryption the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'Q\\xf6\\xa4\\x8c\\xc7<\\x97\\x12\\x05\\x99\\xa3\\xed', computed_icv=b'\\xcf\\xdb\\x01\\x05\\xa4I\\x9a\\xd6\\x00\\r\\x8aC'") ###### ## IPv4 / ESP - Tunnel - Authentication Algorithms ###### ###(026)=[passed] IPv4 / ESP - Tunnel - NULL - HMAC-SHA1-96 after encryption packet should be encapsulated with the given ip tunnel header integrity verification should pass after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d[TCP] == p[TCP] ###(027)=[passed] IPv4 / ESP - Tunnel - NULL - HMAC-SHA1-96 - altered packet after encryption packet should be encapsulated with the given ip tunnel header simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\x94\\xf0#\\xc9\\xbdT\\x05\\x1e^\\xcf\\xd7\\xf0', computed_icv=b'G\\xb2\\xcf\\xbe\\x84\\r(W\\xed\\xb4\\xffz'") ###(028)=[passed] IPv4 / ESP - Tunnel - NULL - SHA2-256-128 after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should be readable integrity verification should pass after decryption the original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-256-128', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d == p ###(029)=[passed] IPv4 / ESP - Tunnel - NULL - SHA2-256-128 - altered packet after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-256-128', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\x92V\\xb0\\xe5\\x12-\\xed\\xf94\\x97(\\xa27\\xeb\\x89\\xbb', computed_icv=b'\\xc3M~\\xdb\\xd4\\x16\\xd7\\x02>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-384-192', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d == p ###(031)=[passed] IPv4 / ESP - Tunnel - NULL - SHA2-384-192 - altered packet after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-384-192', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'B8\\xbb\\xef\\x7f\\xd0\\xfak\\x7f\\xb29\\xd7\\x87\\xf67^\\x18m\\xd1=\\x94>8\\x90', computed_icv=b'\\x00\\x03B\\x19\\xbc\\xad\\xbc\\x9d\\xd8p \\xfd\\xd9s\\xd5\\xe3R\\xc4@\\x92R\\x0b\\x92\\xa4'") ###(032)=[passed] IPv4 / ESP - Tunnel - NULL - SHA2-512-256 after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should be readable integrity verification should pass after decryption the original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-512-256', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d == p ###(033)=[passed] IPv4 / ESP - Tunnel - NULL - SHA2-512-256 - altered packet after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='SHA2-512-256', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError('pkt_icv=b\'\\xc0\\xd4\\xe8\\xd3bpx\\x05L\\xaf|\\x95\\xce\\x18\\xb9i6L\\x19\\x05}\\x9c\\xab\\xcaJ\\xe9"\\xe5`/$-\', computed_icv=b\'\\x95Fn\\x9c\\x1e\\x8a\\x08\\xe9\\xedy\\x9c\\xf4=\\x1fgy\\xdf\\x02\\xf1\\xc1\\x8f\\xbb\\x82H\\x8d\\xec\\xae\\xa6Gu\\x96X\'') ###(034)=[passed] IPv4 / ESP - Tunnel - NULL - HMAC-MD5-96 after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should be readable integrity verification should pass after decryption the original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-MD5-96', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d == p ###(035)=[passed] IPv4 / ESP - Tunnel - NULL - HMAC-MD5-96 - altered packet after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-MD5-96', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'{\\xd09\\x00%\\x02\\xe9\\xba\\x0482\\xd7', computed_icv=b'\\x8a\\xcfF\\xbe\\x9d}\\xda\\x00\\xc5\\xf1\\xe3\\x02'") ###(036)=[passed] IPv4 / ESP - Tunnel - NULL - AES-CMAC-96 after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should be readable integrity verification should pass after decryption the original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d == p ###(037)=[passed] IPv4 / ESP - Tunnel - NULL - AES-CMAC-96 - altered packet after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xef\\xbecVk\\xdf\\\\\\x86\\x9b\\xfb\\xf4T', computed_icv=b'\\xf1\\xbf\\xb8[DQ\\x17O}.y\\xce'") ###### ## IPv4 / ESP - Encryption + Authentication ###### ###(038)=[passed] IPv4 / ESP - Transport - AES-CBC - HMAC-SHA1-96 after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(039)=[passed] IPv4 / ESP - Transport - AES-CBC - HMAC-SHA1-96 - altered packet after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xe8+Px\\xfeFR\\xde\\xab\\xec_o', computed_icv=b'\\xfa\\x00\\xcb\\x19$L[\\xe0\\x91\\xd6\\xb3;'") ###(040)=[passed] IPv4 / ESP - Transport - AES-CBC - HMAC-SHA2-256-128 -- ESN integrity verification should pass >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('hello world') >>> p = IP(raw(p)) >>> p >>> >>> >>> enc_key = bytes.fromhex("85ee354b4675a9c5d16e3d6f4118043b") >>> auth_key = bytes.fromhex("6f79bf94da7dde3c86009934d9258f1b3fc2f5382aca9c9cb8e216eed235f34c") >>> >>> sa = SecurityAssociation(ESP, spi=0xcf54ccdf, crypt_algo='AES-CBC', ... crypt_key=enc_key, ... auth_algo='SHA2-256-128', auth_key=auth_key, ... esn_en=True, esn=68) >>> e = sa.encrypt(p, iv=bytes.fromhex("11223344112233441122334411223344")) >>> >>> >>> assert bytes(e) == bytes.fromhex("4500006c000100004032745a0101010102020202cf54ccdf0000000111223344112233441122334411223344f5bda519c9ae64f283f0fc18a8d253eca8b34c2120c8958a97ec9d8e67756da2523fce9b5541c57fddf090afc2bfd97e8703203953f853eb61482e4c1384d4c8") >>> >>> d = sa.decrypt(e) >>> d >>> ###(041)=[passed] IPv4 / ESP - Transport - AES-GCM - NULL after encryption the original packet payload should NOT be readable after decryption original packet should be preserved Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\x66\x00\x28\x86\xe9\xdf\xc5\x24\xb0\xbd\xfd\x62\x61\x7e\xd3\x76' ... b'\x7b\x48\x28\x8e\x76\xaa\xea\x48\xb8\x40\x30\x8a\xce\x50\x71\xbb' ... b'\xc0\xb2\x47\x71\xd7\xa4\xa0\xcb\x03\x68\xd3\x16\x5a\x7c\x37\x84' ... b'\x87\xc7\x19\x59\xb4\x7c\x76\xe3\x48\xc0\x90\x4b\xd2\x36\x95\xc1' ... b'\xb7\xa4\xb6\x7b\x89\xe6\x4f\x10\xae\xdb\x84\x47\x46\x00\xb4\x44' ... b'\xe6\x6d\x16\x55\x5f\x82\x36\xa5\x49\xf7\x52\x81\x65\x90\x4d\x28' ... b'\x92\xb2\xe3\xf1\xa4\x02\xd2\x37\xac\x0b\x7a\x10\xcf\x64\x46\xb9', ... seq=1) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###(042)=[passed] IPv4 / ESP - Transport - AES-GCM - NULL -- ESN after encryption the original packet payload should NOT be readable after decryption original packet should be preserved Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, esn_en = True, esn = 0x1) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\x66\x00\x28\x86\xe9\xdf\xc5\x24\xb0\xbd\xfd\x62\x61\x7e\xd3\x76' ... b'\x7b\x48\x28\x8e\x76\xaa\xea\x48\xb8\x40\x30\x8a\xce\x50\x71\xbb' ... b'\xc0\xb2\x47\x71\xd7\xa4\xa0\xcb\x03\x68\xd3\x16\x5a\x7c\x37\x84' ... b'\x87\xc7\x19\x59\xb4\x7c\x76\xe3\x48\xc0\x90\x4b\xd2\x36\x95\xc1' ... b'\xb7\xa4\xb6\x7b\x89\xe6\x4f\x10\xae\xdb\x84\x47\x46\x00\xb4\x44' ... b'\xe6\x6d\x16\x55\x5f\x82\x36\xa5\x49\xf7\x52\x81\x65\x90\x4d\x28' ... b'\xfe\x4d\x22\x83\x6a\x81\x0d\x60\x94\xdb\x45\x22\x03\x92\xf6\x94', ... seq=1) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###(043)=[passed] IPv4 / ESP - Transport - AES-GCM - NULL - altered packet after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###(044)=[passed] IPv4 / ESP - Transport - AES-GCM - NULL - altered packet -- ESN after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, esn_en = True, esn = 0x200) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> try: ... d = sa.decrypt(e, esn = 0x201) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###(045)=[passed] IPv4 / ESP - Transport - AES-NULL-GMAC - NULL AES-NULL-GMAC is integrity only, the original packet payload should be readable after decryption original packet should be preserved Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-NULL-GMAC', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\x54\x70\x6c\x6a\x9f\xba\xa6\x18\x45\x00\x00\x54\xbc\x53\x00\x00' ... b'\x40\x01\xa9\x59\x0a\x7d\x00\x01\x0a\x7d\x00\x02\x00\x00\xad\x53' ... b'\xa8\x83\x00\x01\x02\xe6\x09\x64\x00\x00\x00\x00\xd9\x0a\x06\x00' ... b'\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b' ... b'\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b' ... b'\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x01\x02\x02\x04' ... b'\x9b\x76\x32\x30\xf6\x49\x92\xa8\x8f\x6a\x20\x87\x2c\x74\x0c\x18', ... seq=22) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###(046)=[passed] IPv4 / ESP - Transport - AES-NULL-GMAC - NULL -- ESN AES-NULL-GMAC is integrity only, the original packet payload should be readable after decryption original packet should be preserved Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-NULL-GMAC', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, esn_en = True, esn = 0x1) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\x43\xe6\xa1\xce\x70\x9d\x67\xf4\x45\x00\x00\x54\x2e\x4a\x40\x00' ... b'\x40\x01\xf7\x62\x0a\x7d\x00\x02\x0a\x7d\x00\x01\x08\x00\xd3\x32' ... b'\x8f\x4c\x00\x02\x8d\xec\x09\x64\x00\x00\x00\x00\x3c\x5b\x03\x00' ... b'\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b' ... b'\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b' ... b'\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x01\x02\x02\x04' ... b'\x76\xd4\x93\x90\x75\xee\x3f\xa3\xf3\xcf\xcc\x27\xf5\x5b\x12\xb6', ... seq=5) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###(047)=[passed] IPv4 / ESP - Transport - AES-NULL-GMAC - NULL - altered packet AES-NULL-GMAC is integrity only, the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-NULL-GMAC', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###(048)=[passed] IPv4 / ESP - Transport - AES-NULL-GMAC - NULL - altered packet -- ESN AES-NULL-GMAC is integrity only, the original packet payload should be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-NULL-GMAC', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, esn_en = True, esn = 0x200) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> try: ... d = sa.decrypt(e, esn = 0x201) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###(049)=[passed] IPv4 / ESP - Transport - AES-CCM - NULL after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption original packet should be preserved Check for ICMP layer in decrypted reference >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CCM', crypt_key=b'16bytekey3bytenonce', ... crypt_icv_size=8, ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d == p >>> >>> ref = IP() \ ... / ESP(spi=0x222, ... data=b'\x2e\x02\x9f\x1f\xad\x76\x80\x58\x8f\xeb\x45\xf1\x66\xe3\xad\xa6' ... b'\x90\x1b\x2b\x7d\xd3\x3d\xa4\x53\x35\xc8\xfa\x92\xfd\xd7\x42\x2f' ... b'\x87\x60\x9b\x46\xb0\x21\x5e\x82\xfb\x2f\x59\xba\xf0\x6c\xe5\x51' ... b'\xb8\x36\x20\x88\xfe\x49\x86\x60\xe8\x0a\x3d\x36\xb5\x8a\x08\xa9' ... b'\x5e\xe3\x87\xfa\x93\x3f\xe8\xc2\xc5\xbf\xb1\x2e\x6f\x7d\xc5\xa5' ... b'\xd8\xe5\xf3\x25\x21\x81\x43\x16\x48\x10\x7c\x04\x31\x20\x07\x7c' ... b'\x7b\xda\x5d\x1a\x72\x45\xc4\x79', ... seq=1) >>> >>> d_ref = sa.decrypt(ref) >>> d_ref >>> >>> >>> assert d_ref.haslayer(ICMP) ###(050)=[passed] IPv4 / ESP - Transport - AES-CCM - NULL - altered packet after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CCM', crypt_key=b'16bytekey3bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###(051)=[passed] IPv4 / ESP - Tunnel - AES-CBC - HMAC-SHA1-96 after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(052)=[passed] IPv4 / ESP - Tunnel - AES-CBC - HMAC-SHA1-96 - altered packet after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'3\\xdb\\x83t&\\xe6k~\\xd9\\xa9\\x9c\\x11', computed_icv=b'\\xe0f\\x98O\\x8f(\\x87Uf\\xcb\\x19\\xd6'") ###(053)=[passed] IPv4 / ESP - Tunnel - AES-GCM - NULL after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(054)=[passed] IPv4 / ESP - Tunnel - AES-GCM - NULL -- ESN after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22'), esn_en = True, esn = 0x2) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(055)=[passed] IPv4 / ESP - Tunnel - AES-GCM - NULL - altered packet after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###(056)=[passed] IPv4 / ESP - Tunnel - AES-GCM - NULL - altered packet - ESN after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22'), esn_en = True, esn = 0x2) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> try: ... d = sa.decrypt(e, esn = 0x3) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###(057)=[passed] IPv4 / ESP - Tunnel - AES-CTR - NULL - verify no cipher align padding after encryption packet should be padded for 4 byte alignment >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= UDP(sport=1000, dport=1001) >>> p /= Raw("\x00" * 3) >>> p >> >>> print("len p: {}".format(len(p))) len p: 31 >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CTR', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> print("crypt_algo.icv_size {}".format(sa.crypt_algo.icv_size)) crypt_algo.icv_size None >>> print("auth_algo.icv_size {}".format(sa.auth_algo.icv_size)) auth_algo.icv_size 0 >>> >>> e = sa.encrypt(p) >>> e > >>> print("len e: {}".format(len(e))) len e: 72 >>> >>> esp = sa.crypt_algo.decrypt(sa, e[ESP], sa.crypt_key, ... sa.crypt_algo.icv_size or ... sa.auth_algo.icv_size, ... esn_en=sa.esn_en, ... esn=sa.esn) >>> esp <_ESPPlain spi=0x222 seq=1 iv=b'k\x07*\x10\x83u\x13\x88' data=b'E\x00\x00\x1f\x00\x01\x00\x00@\x11t\xc8\x01\x01\x01\x01\x02\x02\x02\x02\x03\xe8\x03\xe9\x00\x0b\xf2\x01\x00\x00\x00' padding=b'\x01\x02\x03' padlen=3 nh=ipv4 icv=b'' |> >>> print("len(esp.data): {}".format(len(esp.data))) len(esp.data): 31 >>> >>> assert len(e) == 72 and esp.padlen == 3, "bad length/padding {}/{}".format(len(e), esp.padlen) ###(058)=[passed] IPv4 / ESP - Tunnel - AES-GCM - NULL - verify no cipher align padding after encryption packet should be padded for 4 byte alignment >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= UDP(sport=1000, dport=1001) >>> p /= Raw("\x00" * 1418) >>> print("len p: {}".format(len(p))) len p: 1446 >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> print("len e: {}".format(len(e))) len e: 1500 >>> >>> esp = sa.crypt_algo.decrypt(sa, e[ESP], sa.crypt_key, ... sa.crypt_algo.icv_size or ... sa.auth_algo.icv_size, ... esn_en=sa.esn_en, ... esn=sa.esn) >>> print("len(esp.data): {}".format(len(esp.data))) len(esp.data): 1446 >>> >>> assert len(e) == 1500 and esp.padlen == 0, "bad length/padding {}/{}".format(len(e), esp.padlen) ###(059)=[passed] IPv4 / ESP - Tunnel - AES-CCM - NULL after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption original packet should be preserved >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CCM', crypt_key=b'16bytekey3bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d == p ###(060)=[passed] IPv4 / ESP - Tunnel - AES-CCM - NULL after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CCM', crypt_key=b'16bytekey3bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###### ## IPv4 / AH - Transport ###### ###(061)=[passed] IPv4 / AH - Transport - HMAC-SHA1-96 the encrypted packet should have an AH layer alter mutable fields in the packet integrity verification should pass after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-SHA1-96', auth_key=b'sixteenbytes key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(062)=[passed] IPv4 / AH - Transport - HMAC-SHA1-96 - altered packet the encrypted packet should have an AH layer simulate the alteration of the packet before decryption integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-SHA1-96', auth_key=b'sixteenbytes key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e[TCP].sport = 5 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'J\\xcbe\\x085/\\xab\\xe8@KC\\x11', computed_icv=b'\\xcf\\x1f\\xdd\\xc4\\xb4X\\xf8\\x1b\\x08aL\\xe2'") ###(063)=[passed] IPv4 / AH - Transport - SHA2-256-128 the encrypted packet should have an AH layer alter mutable fields in the packet integrity verification should pass after decryption the original packet should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-256-128', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(064)=[passed] IPv4 / AH - Transport - SHA2-256-128 - altered packet the encrypted packet should have an AH layer simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-256-128', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e[TCP].dport = 46 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\x97\\x98\\x9e\\xbb\\x17R\\x0e\\x9d\\xc0\\xdb@\\x1c\\xfd\\x85/\\x9f', computed_icv=b'\\xc7\\x07t\\xe5n\\xc9\\x12cR\\xff\\x19\\x1a\\xa4\\xf401'") ###(065)=[passed] IPv4 / AH - Transport - SHA2-384-192 the encrypted packet should have an AH layer alter mutable fields in the packet integrity verification should pass after decryption the original packet should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-384-192', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(066)=[passed] IPv4 / AH - Transport - SHA2-384-192 - altered packet the encrypted packet should have an AH layer simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-384-192', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e[TCP].dport = 46 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'/;u\\x90\\xb0\\xc7U\\xf2\\x1a\\xde#f\\xda\\xea\\x12\\xa6\\xbd/3\\xc1C\\xf2\\xd6\\x7f', computed_icv=b'\\x0b\\x97(\\xed\\xa9A\\x82\\x7f\\x8a\\xa9Hi\\x06m\\xa9\\xf3\\xf6&\\xc5\\x8e(eH0'") ###(067)=[passed] IPv4 / AH - Transport - SHA2-512-256 the encrypted packet should have an AH layer alter mutable fields in the packet integrity verification should pass after decryption the original packet should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-512-256', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(068)=[passed] IPv4 / AH - Transport - SHA2-512-256 - altered packet the encrypted packet should have an AH layer simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-512-256', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e[TCP].dport = 46 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xa7\\xbc`E\\x8e\\xd7I\\x97\\xb0\\xca;\\x02\\xcdpsdu;W\\x8a\\xd4G\\x9b\\xf8m\\xb8\\xc6\\x9e\\xbc\\xb4\\x00\\xce', computed_icv=b'\\xe3Y[\\xb3\\xae\\x97\\xcb\\xe8\\x07\\xc0\\xd5f\\xe5\\x11\\xb3!A\\xa2%[nD\\xf0\\xac\\xca\\xd1\\x16g\\xccB\\x9f\\xa2'") ###(069)=[passed] IPv4 / AH - Transport - HMAC-MD5-96 the encrypted packet should have an AH layer alter mutable fields in the packet integrity verification should pass after decryption the original packet should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-MD5-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(070)=[passed] IPv4 / AH - Transport - HMAC-MD5-96 - altered packet the encrypted packet should have an AH layer simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-MD5-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e[TCP].dport = 46 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'a|FaYF\\xa3K\\x88t2\\xc9', computed_icv=b'D\\xbf\\x8c\\xe3r@&T\\xf5z\\x9a:'") ###(071)=[passed] IPv4 / AH - Transport - AES-CMAC-96 the encrypted packet should have an AH layer alter mutable fields in the packet integrity verification should pass after decryption the original packet should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(072)=[passed] IPv4 / AH - Transport - AES-CMAC-96 - altered packet the encrypted packet should have an AH layer simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e[TCP].dport = 46 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\x9c\\x19\\xe2(\\x9b\\x17\\xb3\\xe3:|\\xce\\xf1', computed_icv=b'^V3D\\x82\\x98\\xa4fJ\\xf0{e'") ###(073)=[passed] IPv4 / AH - Transport - AES-CMAC-96 -- ESN the encrypted packet should have an AH layer alter mutable fields in the packet integrity verification should pass after decryption the original packet should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key', ... esn_en=True, esn=0x200) >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(074)=[passed] IPv4 / AH - Transport - AES-CMAC-96 - altered packet -- ESN the encrypted packet should have an AH layer simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key', ... esn_en=True, esn=0x200) >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e[TCP].dport = 46 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError('pkt_icv=b\'\\x01:C\\x06\\xe5\\xe6\\xeb\\xbbw\\x94\\xef\\x17\', computed_icv=b\'8"\\x7f?\\xe9j\\\\\\x82\\x92\\x00\\x91]\'') ###### ## IPv4 / AH - Tunnel ###### ###(075)=[passed] IPv4 / AH - Tunnel - HMAC-SHA1-96 alter mutable fields in the packet integrity verification should pass after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(076)=[passed] IPv4 / AH - Tunnel - HMAC-SHA1-96 - altered packet simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.dst = '4.4.4.4' >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xb9\\xab\\xbb\\xe51\\xa2\\xaa[\\x92\\x81\\xf2(', computed_icv=b'[\\x1a\\x16>E\\xf6\\xa1\\x0b\\x00\\xa9\\x96\\xfe'") ###(077)=[passed] IPv4 / AH - Tunnel - SHA2-256-128 alter mutable fields in the packet integrity verification should pass after decryption the original packet should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-256-128', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d == p ###(078)=[passed] IPv4 / AH - Tunnel - SHA2-256-128 - altered packet simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-256-128', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.dst = '4.4.4.4' >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xa4.\\x01\\xfcBC\\xeb\\xf2\\xfc\\xecN>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-384-192', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d == p ###(080)=[passed] IPv4 / AH - Tunnel - SHA2-384-192 - altered packet simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-384-192', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.dst = '4.4.4.4' >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xcc\\x1e\\x87\\x06\\x00y\\x02\\xbeY\\xd0\\x9d:\\xb6\\xd7\\x9b\\xe2mE%\\x14\\xf7yW\\xee', computed_icv=b'-\\xad\\x99\\xe5\\x91\\xb9g\\x04\\x9b\\xcaW\\x1d\\x91/l\\xfc\\x99\\x94/>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-512-256', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d == p ###(082)=[passed] IPv4 / AH - Tunnel - SHA2-512-256 - altered packet simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-512-256', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.dst = '4.4.4.4' >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\x9a\\xa8\\xf6=\\xf4\\xc6\\x03r&E\\xc3\\x00\\x89\\xf5\\x83\\x00{h\\xa07cw\\x0ckC\\x16\\xe5k\\xb3\\xb6\\x92v', computed_icv=b'\\x03!\\xc6\\x8e\\xf3\\x8a@~u\\x80\\xe4,\\xf3\\x06\\xa3\\x1ao\\xa7D\\x87^\\x9c\\xbe\\xda4\\x12\\x10\\x1e\\x0c\\xda\\x9f\\xa2'") ###(083)=[passed] IPv4 / AH - Tunnel - HMAC-MD5-96 alter mutable fields in the packet integrity verification should pass after decryption the original packet should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-MD5-96', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d == p ###(084)=[passed] IPv4 / AH - Tunnel - HMAC-MD5-96 - altered packet simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-MD5-96', auth_key=b'secret key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.dst = '4.4.4.4' >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xf9\\xfc\\x98\\xae.\\xbbFY\\x93~\\xd7\\x9e', computed_icv=b'O\\xa7~\\xa4\\x0fb\\xeb\\xa8=\\xbcK\\x91'") ###(085)=[passed] IPv4 / AH - Tunnel - AES-CMAC-96 alter mutable fields in the packet integrity verification should pass after decryption the original packet should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d == p ###(086)=[passed] IPv4 / AH - Tunnel - AES-CMAC-96 - altered packet simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.dst = '4.4.4.4' >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xdd\\x91\\xcb\\xd9U\\xcb\\xe2\\x18\\x1cA\\x1d|', computed_icv=b'\\x1dT\\x1b\\x85\\xbb\\xfb\\x0bAya\\xf5S'") ###(087)=[passed] IPv4 / AH - Tunnel - AES-CMAC-96 -- ESN alter mutable fields in the packet integrity verification should pass after decryption the original packet should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22'), ... esn_en=True, esn=0x200) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.ttl = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d == p ###(088)=[passed] IPv4 / AH - Tunnel - AES-CMAC-96 - altered packet -- ESN simulate the alteration of the packet before verification integrity verification should fail >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='AES-CMAC-96', auth_key=b'sixteenbytes key', ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22'), ... esn_en=True, esn=0x200) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.dst = '4.4.4.4' >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError('pkt_icv=b\'Z\\xb1\\xff\\x07p\\xb1:\\xa4\\x0fcnZ\', computed_icv=b"\'\\xe9\\xe8\\xe9\\xb6\\xae\\xe0<:C\\x9b\\xd0"') ###### ## IPv4 / UDP / ESP - NAT-Traversal ###### ###(089)=[passed] IPv4 / UDP / ESP - NAT-Traversal - Tunnel after encryption packet should be encapsulated with the given ip tunnel header the encrypted packet should have an UDP layer after decryption the original packet payload should be unaltered >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='NULL', auth_key=None, ... tunnel_header=IP(src='11.11.11.11', dst='22.22.22.22'), ... nat_t_header=UDP(dport=5000)) >>> >>> e = sa.encrypt(p) >>> e >> >>> >>> assert isinstance(e, IP) >>> assert e.src == '11.11.11.11' and e.dst == '22.22.22.22' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_UDP >>> assert e.haslayer(UDP) >>> assert e[UDP].sport == 4500 >>> assert e[UDP].dport == 5000 >>> assert e[UDP].chksum == 0 >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(090)=[passed] IPv4 / UDP / ESP - NAT-Traversal - Transport the encrypted packet should have an UDP layer after decryption the original packet payload should be unaltered >>> import socket >>> >>> p = IP(src='1.1.1.1', dst='2.2.2.2') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IP(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='NULL', auth_key=None, ... nat_t_header=UDP(dport=5000)) >>> >>> e = sa.encrypt(p) >>> e >> >>> >>> assert isinstance(e, IP) >>> assert e.src == '1.1.1.1' and e.dst == '2.2.2.2' >>> assert e.chksum != p.chksum >>> assert e.proto == socket.IPPROTO_UDP >>> assert e.haslayer(UDP) >>> assert e[UDP].sport == 4500 >>> assert e[UDP].dport == 5000 >>> assert e[UDP].chksum == 0 >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(091)=[passed] IPv6 / ESP - NAT-Traversal - Transport the encrypted packet should have an UDP layer after decryption the original packet payload should be unaltered >>> import socket >>> >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=3333, dport=55) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='NULL', auth_key=None, ... nat_t_header=UDP(dport=5000)) >>> >>> e = sa.encrypt(p) >>> e >> >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.chksum != p.chksum >>> assert e.nh == socket.IPPROTO_UDP >>> assert e.haslayer(UDP) >>> assert e[UDP].sport == 4500 >>> assert e[UDP].dport == 5000 >>> assert e[UDP].chksum == 0 >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> >>> d = sa.decrypt(e) >>> d >> >>> >>> assert d[TCP] == p[TCP] >>> assert not d.haslayer(UDP) >>> assert d[Raw] == p[Raw] ###### ## IPv6 / ESP ###### ###(092)=[passed] IPv6 / ESP - Transport - NULL - NULL after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(093)=[passed] IPv6 / ESP - Transport - AES-CBC - NULL after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(094)=[passed] IPv6 / ESP - Transport - NULL - HMAC-SHA1-96 integrity verification should pass after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d[TCP] == p[TCP] ###(095)=[passed] IPv6 / ESP - Transport - NULL - HMAC-SHA1-96 - altered packet simulate the alteration of the packet before decryption integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError('pkt_icv=b\'\\x86\\xa5\\xc9)\\x87\\x89\\xd9\\xd3Xg$\\x87\', computed_icv=b\'"%\\xfa3=\\xec\\xff\\x11\\x98\\x10\\nG\'') ###(096)=[passed] IPv6 / ESP - Transport - AES-CBC - HMAC-SHA1-96 after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(097)=[passed] IPv6 / ESP - Transport - AES-CBC - HMAC-SHA1-96 - altered packet after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError('pkt_icv=b"\'\\xe9\\xd07\\xeaGay9)aF", computed_icv=b\'\\x8e.\\x90\\xb4J\\x7f\\xbe\\xe3l\\n^X\'') ###(098)=[passed] IPv6 / ESP - Transport - AES-GCM - NULL after encryption the original packet payload should NOT be readable after decryption original packet should be preserved >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(099)=[passed] IPv6 / ESP - Transport - AES-GCM - NULL - altered packet after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###(100)=[passed] IPv6 / ESP - Transport - AES-CCM - NULL after encryption the original packet payload should NOT be readable after decryption original packet should be preserved >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CCM', crypt_key=b'16bytekey3bytenonce', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(101)=[passed] IPv6 / ESP - Transport - AES-CCM - NULL - altered packet after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CCM', crypt_key=b'16bytekey3bytenonce', ... auth_algo='NULL', auth_key=None) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###(102)=[passed] IPv6 / ESP - Tunnel - NULL - NULL after encryption packet should be encapsulated with the given ip tunnel header after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='NULL', auth_key=None, ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(103)=[passed] IPv6 / ESP - Tunnel - AES-CBC - NULL after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(104)=[passed] IPv6 / ESP - Tunnel - NULL - HMAC-SHA1-96 after encryption packet should be encapsulated with the given ip tunnel header integrity verification should pass after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> d = sa.decrypt(e) >>> >>> assert d[TCP] == p[TCP] ###(105)=[passed] IPv6 / ESP - Tunnel - NULL - HMAC-SHA1-96 - altered packet after encryption packet should be encapsulated with the given ip tunnel header simulate the alteration of the packet before decryption integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='NULL', crypt_key=None, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' in e[ESP].data >>> >>> e[ESP].data = e[ESP].data.replace(b'\x01', b'\x21') >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError('pkt_icv=b\'=\\xe0&\\xe9\\r\\xfb\\xdb\\x91\\x81R\\xfe\\x91\', computed_icv=b\'\\x10\\xa3\\xb4W"\\x84\\xea\\x9e1*\\xda\\xf5\'') ###(106)=[passed] IPv6 / ESP - Tunnel - AES-CBC - HMAC-SHA1-96 after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(107)=[passed] IPv6 / ESP - Tunnel - AES-CBC - HMAC-SHA1-96 - altered packet after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CBC', crypt_key=b'sixteenbytes key', ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xee\\xa4\\x932\\x9d\\x1c4\\xf7\\xbdp\\x96\\xc0', computed_icv=b'\\x82\\x06F\\x05\\xadw\\xb1\\x15\\x8508\\r'") ###(108)=[passed] IPv6 / ESP - Tunnel - AES-GCM - NULL after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable after decryption original packet should be preserved >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(109)=[passed] IPv6 / ESP - Tunnel - AES-GCM - NULL - altered packet after encryption packet should be encapsulated with the given ip tunnel header after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-GCM', crypt_key=b'16bytekey+4bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###(110)=[passed] IPv6 / ESP - Tunnel - AES-CCM - NULL after encryption the original packet payload should NOT be readable after decryption original packet should be preserved >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CCM', crypt_key=b'16bytekey3bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(111)=[passed] IPv6 / ESP - Tunnel - AES-CCM - NULL - altered packet after encryption the original packet payload should NOT be readable simulate the alteration of the packet before decryption integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(ESP, spi=0x222, ... crypt_algo='AES-CCM', crypt_key=b'16bytekey3bytenonce', ... auth_algo='NULL', auth_key=None, ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e > >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_ESP >>> assert e.haslayer(ESP) >>> assert not e.haslayer(TCP) >>> assert e[ESP].spi == sa.spi >>> assert b'testdata' not in e[ESP].data >>> >>> e[ESP].seq += 1 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError(InvalidTag()) ###### ## IPv6 / AH ###### ###(112)=[passed] IPv6 / AH - Transport - HMAC-SHA1-96 the encrypted packet should have an AH layer alter mutable fields in the packet integrity verification should pass after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.hlim = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(113)=[passed] IPv6 / AH - Transport - HMAC-SHA1-96 - altered packet the encrypted packet should have an AH layer simulate the alteration of the packet before verification integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e[TCP].dport = 46 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\x8e\\xed\\x8c8\\x05k\\xaa\\xb6\\xe4Z\\xfd\\x93', computed_icv=b'\\xdd;\\xfeR\\xcb\\xb0\\x9d+\\x0c\\xb3h\\xf6'") ###(114)=[passed] IPv6 / AH - Transport - SHA2-256-128 the encrypted packet should have an AH layer alter mutable fields in the packet integrity verification should pass after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-256-128', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.hlim = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d[TCP] == p[TCP] ###(115)=[passed] IPv6 / AH - Transport - SHA2-256-128 - altered packet the encrypted packet should have an AH layer simulate the alteration of the packet before verification integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-256-128', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e >>>> >>> >>> assert isinstance(e, IPv6) >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert e.nh == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e[TCP].dport = 46 >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'j\\x18\\xc4\\xc3<\\x93\\x05\\xf3.D7\\x05\\x06\\xea3\\xfe', computed_icv=b'\\x1c\\x06\\xfdM\\xbc\\x01\\xcf\\x80:bb$\\x17\\x93J\\xfe'") ###(116)=[passed] IPv6 / AH - Tunnel - HMAC-SHA1-96 after encryption packet should be encapsulated with the given ip tunnel header alter mutable fields in the packet integrity verification should pass after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.hlim = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d == p ###(117)=[passed] IPv6 / AH - Tunnel - HMAC-SHA1-96 - altered packet after encryption packet should be encapsulated with the given ip tunnel header simulate the alteration of the packet before verification integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key', ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.src = 'cc::ee' >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError('pkt_icv=b\'x*\\\\;\\xec\\xe5`\\xa8\\xf0\\x99o\\xd5\', computed_icv=b\'\\xad\\x01\\xe6Nz\\xfb\\x07\\xa8\\xf5\\xa2"~\'') ###(118)=[passed] IPv6 / AH - Tunnel - SHA2-256-128 after encryption packet should be encapsulated with the given ip tunnel header alter mutable fields in the packet integrity verification should pass after decryption the original packet payload should be unaltered >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-256-128', auth_key=b'secret key', ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.hlim = 2 >>> >>> d = sa.decrypt(e) >>> d >>> >>> >>> assert d == p ###(119)=[passed] IPv6 / AH - Tunnel - SHA2-256-128 - altered packet after encryption packet should be encapsulated with the given ip tunnel header simulate the alteration of the packet before verification integrity verification should fail >>> p = IPv6(src='11::22', dst='22::11') >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p >>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='SHA2-256-128', auth_key=b'secret key', ... tunnel_header=IPv6(src='aa::bb', dst='bb::aa')) >>> >>> e = sa.encrypt(p) >>> e >>>>> >>> >>> assert isinstance(e, IPv6) >>> assert e.src == 'aa::bb' and e.dst == 'bb::aa' >>> assert e.nh == socket.IPPROTO_AH >>> assert e.haslayer(AH) >>> assert e.haslayer(TCP) >>> assert e[AH].spi == sa.spi >>> >>> e.src = 'cc::ee' >>> >>> try: ... d = sa.decrypt(e) ... assert False ... except IPSecIntegrityError as err: ... err ... IPSecIntegrityError("pkt_icv=b'\\xe3\\xdfI5\\xb3W\\x82`\\x00\\x8d\\x08\\x1an\\xdb\\x1eP', computed_icv=b'\\xd4\\x83\\xaa\\x0e\\x18\\xbe\\xa83\\xda\\xae4b\\xd5N\\xe3\\x98'") ###### ## IPv6 + Extensions / AH ###### ###(120)=[passed] IPv6 + Extensions / AH - Transport AH header should be inserted between the routing header and the dest options header >>> p = IPv6(src='11::22', dst='22::11') >>> p /= IPv6ExtHdrHopByHop() >>> p /= IPv6ExtHdrDestOpt() >>> p /= IPv6ExtHdrRouting() >>> p /= IPv6ExtHdrDestOpt() >>> p /= IPv6ExtHdrFragment() >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p ] |] |] |>>>>>>>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e ] |] |] |>>>>>>>>> >>> >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert isinstance(e[AH].underlayer, IPv6ExtHdrRouting) >>> assert isinstance(e[AH].payload, IPv6ExtHdrDestOpt) ###(121)=[passed] IPv6 + Routing Header / AH - Transport AH header should be inserted between the routing header and TCP reorder the routing header as the receiver will get it integrity verification should pass >>> p = IPv6(src='11::22', dst='22::11') >>> p /= IPv6ExtHdrHopByHop() >>> p /= IPv6ExtHdrRouting(addresses=['aa::bb', 'cc::dd', 'ee::ff']) >>> p /= TCP(sport=45012, dport=80) >>> p /= Raw('testdata') >>> p = IPv6(raw(p)) >>> p ] |>>>>> >>> >>> sa = SecurityAssociation(AH, spi=0x222, ... auth_algo='HMAC-SHA1-96', auth_key=b'secret key') >>> >>> e = sa.encrypt(p) >>> e ] |>>>>>> >>> >>> assert e.src == '11::22' and e.dst == '22::11' >>> assert isinstance(e[AH].underlayer, IPv6ExtHdrRouting) >>> assert isinstance(e[AH].payload, TCP) >>> >>> final = e[IPv6ExtHdrRouting].addresses.pop() >>> e[IPv6ExtHdrRouting].addresses.insert(0, e.dst) >>> e.dst = final >>> e[IPv6ExtHdrRouting].segleft = 0 >>> >>> d = sa.decrypt(e) >>> d ] |>>>>> Scapy ISAKMP layer tests ━ Run at 01:42:17 from [test/scapy/layers/isakmp.uts] by UTscapy in 0.036467552185058594 └ Passed=8 └ Failed=0 ###### ## ISAKMP tests ###### ###(000)=[passed] ISAKMP - Phase 1 - Aggressive Security Association dissection >>> pkt = UDP(b'\x01\xf4\x01\xf4\x02\xf0\x01\xca/\xa8\xd0\xc9\x15zT\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x04\x00\x00\x00\x00\x00\x00\x00\x02\xe8\x04\x00\x008\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00,\x01\x01\x00\x01\x00\x00\x00$\x01\x01\x00\x00\x80\x01\x00\x07\x80\x0e\x00\x80\x80\x02\x00\x01\x80\x04\x00\x10\x80\x03\x00\x01\x80\x0b\x00\x01\x80\x0c\x00\x84\n\x00\x02\x04n[}p2s\xf3\x91H=\xea\xafhV\xb1\xec\x01\xf0\x1b\xdfG[\x1c\xbd\x07\xa6\xb7\xe9\xc6P2i\\\xbd\xdf\xefI\xe1\\\x04\xd8L\xdd\xbb7\xc8,\xd0G\x12x\x82t\x9f\x8c\xee\xcd\xad\x16P\x7f%\xc6|G\xf2\x8f\x14\xa7\xa0w\x1ax\x87\x8b\x80\xaa\xf2\x0b\x82\xb5k\xcc\xcb\xdb5\xc0j\xc0\xb1\xd2\x0e\xb3\x05\xd3\x9d\x0bY\xb4}[~\n,W;]\xe0|\x08\xed\xe6\xb4\x82QoDE\xa7\xd5\x91\x92j@\xa1vb\xdd\xc3\xc8%\x81\xaf\xcd\xc2$V\xd90d\xc4\x06$\xd1\xce\x92\xe0:\x0fQ\xa2\xdb\xd8\x11\xaf\xf5\xeb\xde\xbcih\xc1n\x80\xe4\x8a\t\xa2\xcd{\x7f\xa3\t)\x9b\xbc\xe2v3\xa6>9\x87D"\x1a9\xad\x9b\x16q\xbe\x02\xb0\x1f/\xe6\xd7\x81\xeb\x98j\x91\xdf\xabf\xa9M+1\xdc\xc5\xc5\xd71\xc7\x11\xc5\xdcU\xe9L\x10\x9f\x00\xc2\x97S\x90\'\xa8\xd6dNy})F\x99Z\x82\xa7\x1a\t\x03\xa4\xe5\xb5M\x9b$\x9a\x10fX\x10\xa6\xc6\xdf#\xe1\xc7E2\xdf\xc2\x1d}\xd7\x90820b\xcd`\xc7\x1f\xca\xde\xa0\xd7\xb6\x87\xe4\xad\xc4-\xe9\xce\xd9Rx\xc8\xab\xeaI+;\x07\x07-\xaa\xb4\xa2\xd1\xd7-\xe0\x85\x93\xbe\x1dqw\xff\x17\x97\xecku\xf3H%\x9e\x95,W\xa7\xbaU\xc7*\xcd!\xdb\x83\x8dNv~\x1cq\xc8~S\xd1"\xbf\x03(\xac\xf5\xec\xeb+*\xfd:\x9d.h\xcb\x15;\xf1_E\x02(:\xab\xa0}d\xb2\xce\x1d\xff4\xc7\x15{\x80Iy.\t7\x96\x95\x96\xda\x1f\xcf\xab\x03P=\xd0\t\x05!\x904\xaf\xdb\xfa\xcc6k"\xffB##\x8a\xacWx\xf3J\xe6[\xe0\x80\x0b\xc8\x9a\x9a\x87gS\xac\xd6<\r\x1f\x10%\x14\x90}\x94m\xd78$\x95\xf3>>i\x15\x1f\x9ax\x00\xbc\x14\xcf\xd0\xbe;XLl\xfa\xa1\x8f\x8c\xa6\xc5\x03\xcd\xc38\xf6\xb3V\xf0|5&\xf7\xb3\x99\x8f\x81\x9a\x93G\xf3\xf4S\xddl\x08-\xec\xa2\x87\xcf\x14x\xdc\xef\x0326\x82J\x05\x00\x00$\xb0G9\xbdI[@\xedT\x81\xa0\xe5\\]\xd2\x03}+\x1c\xfd\x1b\x88\xed\xa5\xb0y\xfd\x8d&\xe3\x08\x98\r\x00\x00\x0c\x01\x00\x00\x00\x02\x02\x02\x02\r\x00\x00\x0c\t\x00&\x89\xdf\xd6\xb7\x12\r\x00\x00\x14\xaf\xca\xd7\x13h\xa1\xf1\xc9k\x86\x96\xfcwW\x01\x00\r\x00\x00\x18@H\xb7\xd5n\xbc\xe8\x85%\xe7\xde\x7f\x00\xd6\xc2\xd3\x80\x00\x00\x00\r\x00\x00\x14J\x13\x1c\x81\x07\x03XE\\W(\xf2\x0e\x95E/\x00\x00\x00\x14\x90\xcb\x80\x91>\xbbin\x08c\x81\xb5\xecB{\x1f') >>> >>> assert pkt.prop.proto == 1 >>> assert pkt.prop.trans.transforms == [ ... ('Encryption', 'AES-CBC'), ... ('KeyLength', 128), ... ('Hash', 'MD5'), ... ('GroupDesc', '4096MODPgr'), ... ('Authentication', 'PSK'), ... ('LifeType', 'Seconds'), ... ('LifeDuration', 132) ... ] >>> assert ISAKMP_payload_KE in pkt >>> assert pkt[ISAKMP_payload_KE].length == 516 >>> assert len(pkt[ISAKMP_payload_KE].load) == 512 >>> assert ISAKMP_payload_ID in pkt >>> assert pkt[ISAKMP_payload_ID].IdentData == "2.2.2.2" >>> assert pkt.getlayer(ISAKMP_payload_VendorID, 5) ###(001)=[passed] ISAKMP - Over NAT-Transversal - dissection >>> pkt = UDP(b'\x11\x94\x11\x94\x01H4\xea\x00\x00\x00\x00/\xa8\xd0\xc9\x15zT\xc0\x95Y\x06\xaf\x97\x1fd\x8d\x08\x10 \x01\xa8!\x97U\x00\x00\x01<\xc8\xba\x8434r\xf8\xc5J\x84W:v4\x1e\x05\x10\xcc.\xd8\xb6\tC\x01~\xad\xd7l\x9c^\x06\tc\xadL\xc4\xc6\xd0P\x98\xb1~\x05\x07\xa0\x0b2&\x05\xa7\xa3\x8c*: \xbe\xa4F\x9d\xa5\xa9\xf7T\x88.\xa9\xe1K\xa29N3%\x19\x80\xd8!\x12^)\x1cJt\xfb\xe1\xca\xab\xb5\xf2\x01\xe83T\x0f\xd4\xfd\xb6\xc4\xe4z\x03`\xd0t\xbc3\xa9\x9b\x8d\xac\x89\x7f\xad\xc2|\x82\x8a\xe4`d\xe6I\xfcVS\x17c7\xce>> >>> assert NON_ESP in pkt >>> assert pkt[ISAKMP].exch_type == 32 >>> assert pkt[ISAKMP].version == 0x10 >>> assert pkt[ISAKMP].id == 2820773717 >>> assert pkt[ISAKMP].length == 316 >>> assert len(pkt[ISAKMP]) == 316 >>> assert len(pkt[ISAKMP].load) == 288 ###(002)=[passed] ISAKMP - Phase 2 - Security Association dissection >>> pkt = ISAKMP_payload_Hash(b'\x01\x00\x00\x14\xee\x80u\x92\xdbp\xd7\xbc\xa1f\x07\xcb@\xecg\x8b\n\x00\x004\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00(\x01\x03\x04\x01\xcc=\xae\x0f\x00\x00\x00\x1c\x01\x03\x00\x00\x80\x05\x00\x02\x80\x03\x00\x02\x80\x04\x00\x01\x80\x01\x00\x01\x80\x02\x00!\x04\x00\x00$\t\x17\x8c\x89\xfb\x9aZ&Q\x16\xe3\x89&\xc4\x12|\x13\xe7\x99\x9e\x00f\xe9\xa8\xc7\xd0\xd4\x00>\x13\xd0\x1b\x05\x00\x00\x84\x80\x9cNz\x14\x93\xe7\xb1\x03\x97y\x16\x1f/\x08\x98uE}\xc0\xc3\xe3\x18c\x80w\x13\xad\x96\xe2N*+d%\x9d7\xff\xf1\xd4\xb21\xca\x19E\x98\x96Xil\xf0\x7fN\x80\xf8qc\x10\x96M}\xa5_\x06\xf4"A1\xd5%{\xab\x1ePc\xfa\xa0n\x1c\xd3R\xaeT\x87d\x86\xdf,?\x9e\x88\xb5l\xfaI\xc2v\xcb\xf6\xae1\\i\x07\xf5\xac]@9\xd3\xd7\x8a\xc0\xda\xde\xb2\x97\x8b\x7f\xe8\xfa\xa5V\x80\x0c\xf0o\x0b\x05\x00\x00\x10\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert ISAKMP_payload_SA in pkt >>> assert pkt[ISAKMP_payload_SA].prop.proto == 3 >>> assert pkt[ISAKMP_payload_SA].prop.trans.transforms == [ ... ('AuthenticationAlgorithm', 'HMAC-SHA'), ... ('GroupDesc', '1024MODPgr'), ... ('EncapsulationMode', 'Tunnel'), ... ('LifeType', 'seconds'), ... ('LifeDuration', 33) ... ] >>> assert ISAKMP_payload_ID in pkt ###(003)=[passed] ISAKMP_payload_Transform >>> p=IP(src='192.168.8.14',dst='10.0.0.1')/UDP()/ISAKMP()/ISAKMP_payload_SA(doi=0, prop=ISAKMP_payload_Proposal(trans=ISAKMP_payload_Transform(transforms=[('Encryption', 'AES-CBC'), ('Hash', 'MD5'), ('Authentication', 'PSK'), ('GroupDesc', '1536MODPgr'), ('KeyLength', 256), ('LifeType', 'Seconds'), ('LifeDuration', 86400)])/ISAKMP_payload_Transform(res2=12345,transforms=[('Encryption', '3DES-CBC'), ('Hash', 'SHA'), ('Authentication', 'PSK'), ('GroupDesc', '1024MODPgr'), ('LifeType', 'Seconds'), ('LifeDuration', 86400)]))) >>> >>> r = p[ISAKMP_payload_Transform:2] >>> r >>> r.res2 == 12345 True ###(004)=[passed] ISAKMP_payload_Transform build >>> hexdump(p) 0000 45 00 00 96 00 01 00 00 40 11 A7 9F C0 A8 08 0E E.......@....... 0010 0A 00 00 01 01 F4 01 F4 00 82 BF 1F 00 00 00 00 ................ 0020 00 00 00 00 00 00 00 00 00 00 00 00 01 10 00 00 ................ 0030 00 00 00 00 00 00 00 7A 00 00 00 5E 00 00 00 00 .......z...^.... 0040 00 00 00 01 00 00 00 52 01 01 00 00 03 00 00 27 .......R.......' 0050 00 01 00 00 80 01 00 07 80 02 00 01 80 03 00 01 ................ 0060 80 04 00 05 80 0E 01 00 80 0B 00 01 00 0C 00 03 ................ 0070 01 51 80 00 00 00 23 00 01 30 39 80 01 00 05 80 .Q....#..09..... 0080 02 00 02 80 03 00 01 80 04 00 02 80 0B 00 01 00 ................ 0090 0C 00 03 01 51 80 ....Q. >>> assert raw(p) == b"E\x00\x00\x96\x00\x01\x00\x00@\x11\xa7\x9f\xc0\xa8\x08\x0e\n\x00\x00\x01\x01\xf4\x01\xf4\x00\x82\xbf\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00z\x00\x00\x00^\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00R\x01\x01\x00\x00\x03\x00\x00'\x00\x01\x00\x00\x80\x01\x00\x07\x80\x02\x00\x01\x80\x03\x00\x01\x80\x04\x00\x05\x80\x0e\x01\x00\x80\x0b\x00\x01\x00\x0c\x00\x03\x01Q\x80\x00\x00\x00#\x00\x0109\x80\x01\x00\x05\x80\x02\x00\x02\x80\x03\x00\x01\x80\x04\x00\x02\x80\x0b\x00\x01\x00\x0c\x00\x03\x01Q\x80" ###(005)=[passed] ISAKMP_payload_Transform dissection >>> q=IP(raw(p)) >>> q.show() ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 150 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0xa79f src = 192.168.8.14 dst = 10.0.0.1 \options \ ###[ UDP ]### sport = isakmp dport = isakmp len = 130 chksum = 0xbf1f ###[ ISAKMP ]### init_cookie= 0000000000000000 resp_cookie= 0000000000000000 next_payload= SA version = 0x10 exch_type = None flags = id = 0 length = 122 ###[ ISAKMP SA ]### next_payload= None res = 0 length = 94 doi = ISAKMP situation = identity \prop \ |###[ IKE proposal ]### | next_payload= None | res = 0 | length = 82 | proposal = 1 | proto = ISAKMP | SPIsize = 0 | trans_nb = 0 | SPI = b'' | \trans \ | |###[ IKE Transform ]### | | next_payload= Transform | | res = 0 | | length = 39 | | transform_count= 0 | | transform_id= KEY_IKE | | res2 = 0 | | transforms= [('Encryption', 'AES-CBC'), ('Hash', 'MD5'), ('Authentication', 'PSK'), ('GroupDesc', '1536MODPgr'), ('KeyLength', 256), ('LifeType', 'Seconds'), ('LifeDuration', 86400)] | |###[ IKE Transform ]### | | next_payload= None | | res = 0 | | length = 35 | | transform_count= 0 | | transform_id= KEY_IKE | | res2 = 12345 | | transforms= [('Encryption', '3DES-CBC'), ('Hash', 'SHA'), ('Authentication', 'PSK'), ('GroupDesc', '1024MODPgr'), ('LifeType', 'Seconds'), ('LifeDuration', 86400)] >>> r = q[ISAKMP_payload_Transform:2] >>> r >>> r.res2 == 12345 True ###(006)=[passed] ISAKMP_payload_Notify >>> pkt = ISAKMP()/ISAKMP_payload_Notify( ... notify_msg_type="INVALID-FLAGS", ... notify_data="Erreur", ... )/ISAKMP_payload_Notify() >>> >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00:\x0b\x00\x00\x12\x00\x00\x00\x00\x01\x00\x00\x08Erreur\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x00\x00\x00' >>> >>> pkt = ISAKMP(bytes(pkt)) >>> assert pkt[ISAKMP_payload_Notify].notify_data == b"Erreur" >>> assert not pkt[ISAKMP_payload_Notify:2].next_payload ###(007)=[passed] ISAKMP_payload_delete >>> pkt = ISAKMP()/ISAKMP_payload_Delete() >>> pkt.SPIs = [b"A" * 16, b"B" * 16] >>> assert raw(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00,\x00\x00\x00\x00\x01\x10\x00\x02AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBB' >>> pkt = ISAKMP(raw(pkt)) >>> assert pkt.SPIcount == 2 >>> assert pkt.SPIsize == 16 >>> assert pkt.length == 72 >>> assert pkt[ISAKMP_payload_Delete].length == 44 Same test ccache as kerberos.rst ━ Run at 01:42:21 from [test/scapy/layers/kerberos.uts] by UTscapy in 4.629677772521973 └ Passed=63 └ Failed=0 ###### ## Kerberos dissection tests ###### ###(000)=[passed] Parse AS-REQ >>> pkt = IP(b'E\x00\x00\xd9\xff\xff@\x00\xff\x11\x00\x00\x7f\x00\x00\x15\x00\x00\x00\x00;o\x00X\x00\xc5\x00\x00j\x81\xba0\x81\xb7\xa1\x03\x02\x01\x05\xa2\x03\x02\x01\n\xa3\x0e0\x0c0\n\xa1\x04\x02\x02\x00\x95\xa2\x02\x04\x00\xa4\x81\x9a0\x81\x97\xa0\x07\x03\x05\x00\x00\x01\x00\x10\xa1\x150\x13\xa0\x03\x02\x01\x01\xa1\x0c0\n\x1b\x08LOCALDC$\xa2\x13\x1b\x11SAMBA.EXAMPLE.COM\xa3&0$\xa0\x03\x02\x01\x02\xa1\x1d0\x1b\x1b\x06krbtgt\x1b\x11SAMBA.EXAMPLE.COM\xa5\x11\x18\x0f20150130151703Z\xa7\x06\x02\x04\x14\xe1\x18\xa7\xa8\x1d0\x1b\x02\x01\x12\x02\x01\x11\x02\x01\x10\x02\x01\x17\x02\x01\x19\x02\x01\x1a\x02\x01\x01\x02\x01\x03\x02\x01\x02') >>> >>> assert isinstance(pkt.root, KRB_AS_REQ) >>> assert pkt.root.reqBody.cname.nameString[0] == b'LOCALDC$' >>> assert pkt.root.reqBody.realm == b'SAMBA.EXAMPLE.COM' >>> assert pkt.root.reqBody.sname.nameString[0] == b"krbtgt" >>> assert pkt.root.reqBody.nonce == 0x14e118a7 >>> assert pkt.root.reqBody.etype == [0x12, 0x11, 0x10, 0x17, 0x19, 0x1a, 0x1, 0x3, 0x2] ###(001)=[passed] Parse KRB-ERROR >>> pkt = IP(b'E\x00\x02c\xff\xff@\x00\xff\x11\x00\x00\x7f\x00\x00\x15\x7f\x00\x00\x15\x00X;o\x02O\x00\x00~\x82\x02C0\x82\x02?\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x1e\xa2\x11\x18\x0f19810206083031Z\xa4\x11\x18\x0f20150129151703Z\xa5\x05\x02\x03\t\xae\xc0\xa6\x03\x02\x01\x19\xa7\x13\x1b\x11SAMBA.EXAMPLE.COM\xa8\x150\x13\xa0\x03\x02\x01\x01\xa1\x0c0\n\x1b\x08LOCALDC$\xa9\x13\x1b\x11SAMBA.EXAMPLE.COM\xaa&0$\xa0\x03\x02\x01\x02\xa1\x1d0\x1b\x1b\x06krbtgt\x1b\x11SAMBA.EXAMPLE.COM\xab\x10\x1b\x0eNEEDED_PREAUTH\xac\x82\x01\x84\x04\x82\x01\x800\x82\x01|0\n\xa1\x04\x02\x02\x00\x88\xa2\x02\x04\x000\x82\x01R\xa1\x03\x02\x01\x13\xa2\x82\x01I\x04\x82\x01E0\x82\x01A07\xa0\x03\x02\x01\x12\xa10\x1b.SAMBA.EXAMPLE.COMhostlocaldc.samba.example.com07\xa0\x03\x02\x01\x11\xa10\x1b.SAMBA.EXAMPLE.COMhostlocaldc.samba.example.com07\xa0\x03\x02\x01\x03\xa10\x1b.SAMBA.EXAMPLE.COMhostlocaldc.samba.example.com07\xa0\x03\x02\x01\x01\xa10\x1b.SAMBA.EXAMPLE.COMhostlocaldc.samba.example.com07\xa0\x03\x02\x01\x01\xa10\x1b.SAMBA.EXAMPLE.COMhostlocaldc.samba.example.com0"\xa0\x03\x02\x01\x17\xa1\x1b\x1b\x19SAMBA.EXAMPLE.COMLOCALDC$0\t\xa1\x03\x02\x01\x02\xa2\x02\x04\x000\r\xa1\x04\x02\x02\x00\x85\xa2\x05\x04\x03MIT') >>> >>> assert isinstance(pkt.root, KRB_ERROR) >>> assert pkt.root.cname.nameString[0] == b"LOCALDC$" >>> assert pkt.root.realm == b"SAMBA.EXAMPLE.COM" >>> assert pkt.root.eText == b"NEEDED_PREAUTH" >>> assert len(pkt.root.eData.seq) == 4 >>> assert pkt.root.eData.seq[0].padataType == 0x88 >>> assert pkt.root.eData.seq[1].padataType == 0x13 >>> assert pkt.root.eData.seq[3].padataType == 0x85 >>> assert pkt.root.eData.seq[3].padataValue == b"MIT" >>> >>> etype_info2 = pkt.root.eData.seq[1] >>> assert etype_info2.padataValue.seq[0].salt == b'SAMBA.EXAMPLE.COMhostlocaldc.samba.example.com' ###(002)=[passed] Parse AS-REP >>> pkt = IP(b'E\x00\x05\x95\xff\xff@\x00\xff\x11\x00\x00\x7f\x00\x00\x15\x7f\x00\x00\x15\x00X;p\x05\x81\x00\x00k\x82\x05u0\x82\x05q\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0b\xa2H0F0D\xa1\x03\x02\x01\x13\xa2=\x04;0907\xa0\x03\x02\x01\x12\xa10\x1b.SAMBA.EXAMPLE.COMhostlocaldc.samba.example.com\xa3\x13\x1b\x11SAMBA.EXAMPLE.COM\xa4\x150\x13\xa0\x03\x02\x01\x00\xa1\x0c0\n\x1b\x08LOCALDC$\xa5\x82\x03\xafa\x82\x03\xab0\x82\x03\xa7\xa0\x03\x02\x01\x05\xa1\x13\x1b\x11SAMBA.EXAMPLE.COM\xa2&0$\xa0\x03\x02\x01\x02\xa1\x1d0\x1b\x1b\x06krbtgt\x1b\x11SAMBA.EXAMPLE.COM\xa3\x82\x03a0\x82\x03]\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\x01\xa2\x82\x03O\x04\x82\x03K\t\x05\xd7\x91\xdc\x14\xaa\xe2\xfb\xcc\x85\x1f*?\xbau\xbc0\x0f\x80\x8bc\x87\xe5z\x1a4i\xa3\x9bL[-\xb1\xb7\xaa\xd9-\x01\xc2\xf2\xdfs\x17<\xf3&\x99\'1\xfa\x80\xd9\x02\xae\xf5\xb3S\x14\xc2L\xc3e\xc9\x94\x03dH\xe2\xa9\xfd\x9a\xc6\xffs\x10\xf3er\xbd\xa0\xfep[~\x82+\xde0\x91%tc\xdcx\xfe\xd0\xd8\xc4\xb6u\x91\xe7\xe1C\x00y\xb8\x15\xd9\x91j\x0f\xe7\xa0\xe24m\xd94\xe5.I\xc51\x8f\x1do\t\xe9\x98\xb8\xad\xa6\x92\xf3\x15f\xc98o\x92\x0ch\x08\\\x8f\xab\xfau\xaf\x19v\xcc\xcb!v\xb5v2\xeb(h\x1c+o\xea\xc3\x0b\xcf\x81\xc8\x89\xe8i\xdd?\xd1\xaa\x0f3\xc9\xe9\xf2\xd7\x8a\x93`\x02\x9d\xb2 LV\xda\x0f&>,~\xb3\xecK\xe76v\x9a\xc3\x88\xe3\rj\\/\xd6\x9e_X\x14z\xc2w\x1d.|\xbf\x18\x01\xc8`].\xd2\xc2\x1e\xd0\x89\x8f\xd2\x18\xb9U\xaf\x98\xe9V\xe2\x19\xa1\xbb\xc45\xd9\x16\x08c\xaf$\xef\xf2\xf4S\xeco\xa1\xa1\xe5)\x99\xc9b#[\xd1:O\xbej\xb91\xb3i\xbepb\x06\xd8\x14\xc3\xdf\xbb\x18\xbf]\xf1\x82+\x18*\x85D\xecy\x0eu_\xe2\xfa\xbcd\x82A>\x88p\xa2\xc1\xf6\x9c\x89Qj\xfdM\x99\xd1\x84r\x0fp\x06$\xab\xc2\xb5\xae4\xe8\xf1\xbb}\x98\xedWX\xe2*uB\x93\x11\x1c\xc7f\x1c\xce\xc9\xff\t\x88\x94\xddN\xcf\xa68O\x0c^I\x9ew\x81\xba\xc3\xbc\xa8\x07\x8b\xd4\xdf\x7f(\xc2\x15gX\xd0oN\x00u\x1aU@\xbd\xb8\xa9)Ur\x94\xc1\xcf\xa1\xd8k\xc1F\x19\xd3rR\xaa\x93\xe2\x06D#\x12\x07M\xe3\x15\xd6\xd0\xb3\xa6\x89\x0c\xfeLO6\xe6\xf0w\x1a\x80\x0f\xffO\xf2N\xf4(\n\xdb-\x96`\xa4\xb7\xd3g\x16\xbfY\xff\xad\x95\x19\xd9\x9cS\xaa\xe3\x06W\xf3\xc2\x18it5\xda\x1c\x99\x8a\xaf\xfa"MT\xc7$#j,P\x9b\xf9\r\xbbA\xd0w\x15.\xc3PC\xc4\xe7vL/\xca0h7\x1c4z\x8bS@\x0ej\xb4q\xde\x19\xd8so\x9c\xea\x8f^w7\x1e\x92\x1c\xcc\xe2\xa60\xe8\xce}\xee\xb1\x87F!n\x80\xe4l"\xed\xc2fI \xb9\t\x14\t\x8d\xect\xa4\xb48\xe0\xfd\xf3\xe5\x8es\xd2\x08;\x9f\xb2\xb8q\x1bX\xadd\xbb\x07z\x16\tZ\xb0z1+h\x0e\xf7\x98w\x0bX\xf0W\t\xa6\x86.\x1e\x9c\xc2\x9d\xac+\xca\xdf&\xa9\xf3\xcb\xa7\xca\x1fn\xe8\x8a]h\xf6\xeb\xe9\xd4\xa0\x16\x1b\xb4\x8d\xc7\xaf\xe3\xf0.\x85\x1e\xc2\xa5\xf2DhhgQ\xe0\xb8y\xb8\xbd\x98\xf8\xa0\rW\x93/\x07>0\xf5\x92Y\x15Y\x0bD\xdb\xd6\xac#\xd8z\xbdeY\x87\xf2\x97\xfdZ\x0c\x1d\xbc\xefXONv\xc9\xfdp\xdd^\x16\x83\xc3\xeb\x9e\x96+\xe8\xed\x0c<$\x83A\xeb\xc6e\x94\x0c\x11\x19\xb4\x99\xcd\x17\xeb\xcb.\x0b}\x01i\x88\x03R\xde\x1a\xea\x03\x10\xa9Z\x8e\xf7\x87\r\xa6\x08@\xf7\x96\xc8\xa5g\xde\x8dE\xf8\xb0\xe8\xe6T\x80=\x0cm\xe0z\xa5\x03\xa2X\xed\'\x17\x001O\xee\xfb\x87\xbe\xf7\xbbS\xc1p\xaeZ\x17\x92}\xc2\x07\x01\x81\xaew\xd9\xc5\x9c\xe5k\x8d+\x13\xd2\x00Q\xd4\xe5M\x9d\x06\xc7)\xac\x06\xb2+\xd1\x83\xcb\xfe\xb9\xf9\x0bbRN\x04\xe7\xd8\xa0\xf9\xe3\xc3m\x18\xc4\x108\xfa\xa6\x82\x01:0\x82\x016\xa0\x03\x02\x01\x12\xa2\x82\x01-\x04\x82\x01)/pDi\x13\xee\x0b\x8ehN2\x01P\x19|\xda\x1a\xde\xec\xde\rt\xcbe7\x00-sG&\x8b\xfc\xa4\x92~~[,\xd5\rAj\xd6[\xbe\xeeB\xf8X\\x\xa6$Z\x83\xf6\x1bq\xc5\x8fm\\\x94\xd7l\xc5\x89#\xcb\xcd\xaf\xff\x15\x1b\x8f;7\xb0\xc8u\x19\xb1\xd0\xb0\x93\xa7z\x9cz\x14\x0b\x86q\x01\xb8<\xa7\xa4\xceb\x1f\x88\x14\xe3S0\xe3]\xa5\x9b\xa0\x0e\x97#\x87\x9a\xe0\x90a\xdfj.\x1e6x\x87GV\xc0/\xa4\xab}\xdbS\xd5\xff>> >>> assert isinstance(pkt.root, KRB_AS_REP) >>> assert pkt.root.padata[0].padataType == 0x13 >>> assert pkt.root.crealm == b"SAMBA.EXAMPLE.COM" >>> assert pkt.root.cname.nameString[0] == b"LOCALDC$" >>> assert isinstance(pkt.root.ticket, KRB_Ticket) >>> assert pkt.root.ticket.sname.nameType == 0x2 >>> assert pkt.root.ticket.sname.nameString == [b"krbtgt", b"SAMBA.EXAMPLE.COM"] >>> assert len(pkt.root.ticket.encPart.cipher.val) == 843 >>> assert len(pkt.root.encPart.cipher.val) == 297 ###(003)=[passed] Parse TGS-REQ >>> pkt = IP(b'E\x00\x06V\xff\xff@\x00\xff\x11\x00\x00\x7f\x00\x00\x1d\x00\x00\x00\x00;\x97\x00X\x06B\x00\x00l\x82\x0660\x82\x062\xa1\x03\x02\x01\x05\xa2\x03\x02\x01\x0c\xa3\x82\x05\xac0\x82\x05\xa80\x82\x04\xc1\xa1\x03\x02\x01\x01\xa2\x82\x04\xb8\x04\x82\x04\xb4n\x82\x04\xb00\x82\x04\xac\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0e\xa2\x07\x03\x05\x00\x00\x00\x00\x00\xa3\x82\x03\xcca\x82\x03\xc80\x82\x03\xc4\xa0\x03\x02\x01\x05\xa1\x13\x1b\x11SAMBA.EXAMPLE.COM\xa2&0$\xa0\x03\x02\x01\x02\xa1\x1d0\x1b\x1b\x06krbtgt\x1b\x11SAMBA.EXAMPLE.COM\xa3\x82\x03~0\x82\x03z\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\x01\xa2\x82\x03l\x04\x82\x03hr\xb6;\xb7\x93\xfb4\xadU\x17A\x93\xf27\xc0\x88I\x1f\x0f\x8eG\xbfk\x13ZF\x1a|l\xc9\xbd\xfe\xc1\xe8\xd6\x9a\x18t\xc7\x04\x05\xfe\xa8\xcaN\xb7`\x14t\xdf\xf8\x82R`m\xac\xd6\x17\\b\xa5\xe3\x98\xca\x97\xb7\xaam\xbf\xd1\x19\x05\x16k\xbb\xf451,H\x88e\xed\xbc\x1a\x87\xe1\xfb\xad\xf0\xd1\xc0\xb5L=\x95\xca\xd7\xc6;\t7%QI\x98s!\xf9\xfe\xfe_\xe9\xae\xeaj\x1e\xb8\x0eN9\x8e_\xcd\x1d,\xfd\x16\x0c\xad\xfc@\xd9\x97\xa2n)\x17\x02\xffL\xff\xcd{\n\r\xb3\x07W7\xcb\x93\x0f\x1b\xc3\xae\xb7\xc9f{\x1c\xa7\xc6\xf3\xe8\x1cz\x16\x8a\x15\xf5H6k\xc2\r6L\xf1\x99\x80Z\xd2R\xce\xd5\xbc\x82c_p[JG\nu\x1a\xa5Xz\x96&\xec\xf8\xe8\xa2 8\xfaGD87\x11\xac\x87\xb5E\xf7\'x\x0b,\xa5,=\xd2;s\xf9\xbb\xc1\xc30|\xb2y\xa5\xd5\xee\xe3\\\xeam`\xa4\xd3\xd1\n\x11\xb5\xd3\xc8\xcats{\xa8\x07\x18\xdc\x12d\x0b\xab-eB\x1f\xd7&\xf2\x1e\xb7\r\xdf\xe6\xb7\xa3{_\xd0.xrFG\x03\xe0r\xcfu\xbd\x14>\xc1\x9f\xeb\xae\xcb\x04\x071\xf1x\xff\xe5M\xfc\xbct\xea^e!\xce!|\x893/\xa1\n.\xb7T\xc5Ph\t\xf1\xbak\xcd\xdb\xff+c\xab\xcfY\x8a;*/\xd8\xa5\xd0\xd7c\xc6\x02B\xed\x82\xcf\xa0\xe5\xdf@rq\x8cRG\x1a\xdey_#\x18\t\x9d\xac\xa4\xfe\xd0\xeb{\xcb(E\xb8\xac\xc9\xe3\x06\xe0\x15}\xb89\xb1L>\x060\x93\x1dtl\x1f\xa0\\s\xdb\x85\x82\xdf\xb3L\x80\xe7/\xae\x0e\x11V\xdeH:J K\xb1g\x95\n\xc2\xd2\xc2\x83k\\6\x0eg\xd0{v\'\xa4\x1c\xe2\x10-\xeb\'\xc7?F\xd8J\xe8\x90Z4V\x12\\\x9e\xc2\x05\xfc|\xb3\x01\xe5\x1b\x14\n\xaa\xff\xb9\xff\x07\x03L\x10\x1d\xc8\xa8\xed\x00A\xf3\xf2\x16\xa3\xd8":!\x04m\x10Uo\x11\xa5d5\xc1\x1es\xde=\xa6\xdd\x9b\'\x03(L(*\x92C\xca\xc8\x92\x1b\x08\x06z/\xb4=\xd8Mz\x816\x9f-\xc0\xe8\xcf\xd2A\xfeyk)WH\x11\xdf\'\xf4\xefG\xfc\xef\xd0\xb5\xec\x91\x87\xf4}b\xb2\x1e>\x1f\x9d4~h\xa0=\xfd(i0|\x03\x98k\x05#Y\xe35\x1c\x7fn\xac\xf2\x896\xa6p\x13\xc1\x94&Q\x8f\x1c\x07\x8cN\xb0\xb6=\x83R46\x04\xfa\x86\xbc\xc1UO\x03\xd8\x0e\x0c\x9f\xbd/\x02f\x90\xa8\x9e\xd3 \xb4\\\n!\xf9"\xc3\n\xe7\xe2\x92\x05t\x11\xa1\x9e<$i+U\\d1\t^\'\xb7\x12\xfd\xe5\xd7\xc4\xd4\xb2\xa9!`\xd8\x97\x8b\x9a\x0c:\xcc\x85\x90)_\x11\xefR\x00\xe5k\x12I\xe2\xf6\xf4h\xa4.\x97\xf2\xea?\x1e\xf9\xcf\xe6\xac\xc7\xdd\xd0\x8f\x0bml\xcb[\x801\xce\xae\xd28\xc0\xe9\xb1\xb0\x19\xc9r\xd2\xd4=\xdaw\xff\xc7\xbd\xe7\xf8\xa9\x8d\xc6\xda\xa9y\x9b\x98\x19\x05\xb1]\xbc\xe2\xe3\xaf\x8c8\xcd\x12\xf8\x90\xea\xd0\xe3\xc3\xba|\xe28(\x8f\x99\xba\xden\xefJ\xc4r\x9e\x17\xe8&\xd6\xe4\x83 \x92\x19d?\xa6\xcc\xbd\xff\xa5\x83@\x17\x13\xefY\xd7\xa7\x1e\xe4\r\xd2\x846\xf8~!L\xe5\xdd\xb3\xb4(\x14\x1e\x1a\xfcP\x8ezE\x1ffFJ.\x82\x1f\xd3\xc5l\x9e\x0b3u4b\x0c\x94\xd6R\xc0\xe5\x96\x83\x95\xa1\x12\xa2\x18;\x96\x9di\xca\xc8\xd9\x15\x81\n\xa9\xc3\xe8\x1eS \x93j\xeb\xa4\x81\xc60\x81\xc3\xa0\x03\x02\x01\x12\xa2\x81\xbb\x04\x81\xb8-Y=\xd3\xfc\xeb \xd8\x16\xd9\xb2O\xfc1\xc9\xd5\'zN\xd2\xb6\xf4\xc6Q7\xaa"B\xe7\xac3\x19\x86\xad\xd5@\xa6\x1f\xd8a#EN\n\xba\xc3\xd95\xe5\x93\x07,j\x97V [o\xe3\x91!d\xe6|\xa4\x94\x14\x9dj1J\x82as[\x83\x80\x99\xa3\xec\xc1\xda_\xe7\nLej\\\x9eW\x11\'7\xfeq=)\xef-\xf5K\x15\x8e\xbf\xb8]m\xb6\xc2\xce\xb4xN,\xdb\xbeaB\x86\'\x068\x05\\\xafF\x08DFpJtX\x0c\xc1\xdfw\x9b\xb1\xf8x\x93\xac\xf9\x14X;h\xe3E\xc0\xe4i\x19\xe5:\xe7\xe5\x86\xa7{\x96\t|\x9aG\xc0\x169\x08\x03A\xa6\xc4j\'-\x07\xf4\x9c\x88"\xc00\x81\xe0\xa1\x04\x02\x02\x00\x88\xa2\x81\xd7\x04\x81\xd4\xa0\x81\xd10\x81\xce\xa1\x170\x15\xa0\x03\x02\x01\x10\xa1\x0e\x04\x0cW\xb7\xdc~\x96.\'\x92\x1a\xdfh\xb9\xa2\x81\xb20\x81\xaf\xa0\x03\x02\x01\x12\xa2\x81\xa7\x04\x81\xa4\x9b\xfc\xb3\x8c\xc5\x1e\xa1q\x19"\xf0\\\xa7\xa6`\xc9:\xd6KA\xd5\xac\xa9$\x8a\x18z\x81\xce\xc9\x0f\xe0\xd5\xad\x848t\xb7\xe3\xf1\xffC\'\x16Z\xc6\xe1of5\xf2R\xb31\xbf\xfa\xaf$\xe5\x1d\xa8\xd3sf\xbb$\xc5%\x17\x0c\x98\x98\x08\x85\xd18\x91o\x8d\x83\x86P\x9e\t\xd9V\xd1\xe4\xeb\xa8\x11\xd6\xaa\xb7\x88\xde\xbe2\xbf7\xb8\xca\x1c\x90\x10GB\x06\x046\xc8\xff\n\x02$_\xce\xcfk\xc9xd\xe5\xbf!4q\x83*/B[\x8fJ\xfa\xf4\xad97\xd8\x8f,3b\xb7\xe0\x94\xca\n\x12]\xc9\xfc\x7f\xbb{2p\xa0\x8f1e6$\xa4v0t\xa0\x07\x03\x05\x00@\x81\x00\x00\xa2\x13\x1b\x11SAMBA.EXAMPLE.COM\xa3,0*\xa0\x03\x02\x01\x01\xa1#0!\x1b\x04ldap\x1b\x19localdc.samba.example.com\xa5\x11\x18\x0f20150130011709Z\xa7\x06\x02\x04T\xcaN\xf5\xa8\x0b0\t\x02\x01\x12\x02\x01\x11\x02\x01\x17') >>> >>> assert isinstance(pkt.root, KRB_TGS_REQ) >>> assert pkt.root.padata[0].padataType == 0x1 >>> assert len(pkt.root.padata[0].padataValue) == 1204 >>> assert pkt.root.padata[0].padataType == 0x1 >>> assert isinstance(pkt.root.padata[0].padataValue, KRB_AP_REQ) >>> assert pkt.root.padata[1].padataType == 0x88 >>> assert len(pkt.root.padata[1].padataValue) == 212 >>> assert pkt.root.padata[1].padataType == 0x88 >>> assert pkt.root.padata[1].padataValue.armoredData.encFastReq.etype == 0x12 >>> assert pkt.root.reqBody.kdcOptions.val == '01000000100000010000000000000000' >>> assert pkt.root.reqBody.sname.nameString == [b'ldap', b'localdc.samba.example.com'] >>> assert pkt.root.reqBody.till.val == '20150130011709Z' ###(004)=[passed] Parse TGS-REP >>> pkt = IP(b'E\x00\x06V\xff\xff@\x00\xff\x11\x00\x00\x7f\x00\x00\x15\x7f\x00\x00\x1d\x00X;\x97\x06B\x00\x00m\x82\x0660\x82\x062\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\r\xa2\x81\xe90\x81\xe60\x81\xe3\xa1\x04\x02\x02\x00\x88\xa2\x81\xda\x04\x81\xd7\xa0\x81\xd40\x81\xd1\xa0\x81\xce0\x81\xcb\xa0\x03\x02\x01\x12\xa2\x81\xc3\x04\x81\xc0\x8cqa\xdf\xfe\x13<7\xc1:\x8d\x0bshxOC\xd6\xcb\xbdz\x1a\xf5\xaa\x9c8\xce\x9f\xed\x99\xeb\xd8A\xba\xdcj\xffF4|\xc7\xab\x84~\xb9\x8f\x04\x0e<\xf1p#\xf7kK\x86\x05+%\\:\xcb^\xc8e\xeb\x0f\x81\x92\xa0\xf3"\xcd\xbb\xf3\xb9\x91\xc8\x94\xa27\x8c\xae\xc44\xa8\xd27\xd1J`K\x93M\xe3\xefUy\xda\xc6\xb7\xe6\xc8\xed\xa79\xd4\xd5\x9a\x12f\t\x1c\xb5\xa7A\x95\xaf\xa1\xac\x1d\xde\xfb\x1c\x0ec<5\t\xabYU\xd4\xd4\r\xf4]\xec\x00t^K\xed\xca\x81\xad\xbe\x99\xdc\x10g\x9c$\xfb\x82s?\xf4\xb9\xa5\x8eW\x02\x7f\x87A\xf7\xc4;2q \xd2\xbc\x10\x13\xc9\xa0w[\r\x01Pt\x7f\x95^\\\x8e\xbe\xee+\xa3\x13\x1b\x11SAMBA.EXAMPLE.COM\xa4\x1a0\x18\xa0\x03\x02\x01\x01\xa1\x110\x0f\x1b\rAdministrator\xa5\x82\x03\xe5a\x82\x03\xe10\x82\x03\xdd\xa0\x03\x02\x01\x05\xa1\x13\x1b\x11SAMBA.EXAMPLE.COM\xa2,0*\xa0\x03\x02\x01\x01\xa1#0!\x1b\x04ldap\x1b\x19localdc.samba.example.com\xa3\x82\x03\x910\x82\x03\x8d\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\x01\xa2\x82\x03\x7f\x04\x82\x03{\x97\x9c\xac\xf1\n\xe6;\xd8\xe28m\xba\xb7\xea#\x19\xd3Zf\x1c@\x00H\xf9"\xe7\xb4\xf3&3\x02X\xb5\xc0{e\xffm\xc8\xcf\xe2\xf9p\xb57~\xd8\x91?/5\x7f\xde\xc4/\xaa\x1c\x08pQ(\xff@\x8e\xb7\xf0\x91N\xbcK&0\xbdWo_W\xf8\xbe\xd6(\xd1`\xba\x8f.\x86\xc29\x88\xe5:,\x16ui\x98y\x100Q\xf6k1\xe6\xe5-e\xdc\x80\xc0@\x87i9Z\x7f\x07\xeb\xf2\x8f\xb1\xc4\x83*z\xbbq\xbfZs\xd7\xefFAZ\x84w\xa2-\xc8\xca\xa3\x84\xa2\x0bm\xce7 pIX\xa1\x05\x83\x01t\x06\xabI\xa3dp\xe3\xaa\xd0\xd6\xb0!\xfd\xbea\x9buL\x0f\x99\xbfg\x11|J?\xfdl\xcd\xb6\xae\n\xdc\x06kS\xc60\xad\xf3\xacq\x0f\xd5lbX\x8d^\xf9\x83\x80ax\x1c\x12\xaa\xe3\x07Y\x1ef\xae\xd6\xc9\xd4y\x94\xb5\x93\x83\x03m\x03U\xf3\x9a}L3Xi \xf94\xffFf}\x99\xfd\x04I\xe3\xcd\x9f\r\xb7>r\x0e\xcf\xeb$\xc8\xdcO\x95\x88\x04\x1c\xf0\xf9\t2\x92\xc4\xe3\x10\xfa\xb0\x14\xb5\xfb\xf0.\xcc\xa3\xdc\xab\x0f\xd76\x8e\xbf\xd8\x7f@U-x\xc8 \xd42\xf8\xfd\xce8\xdbl\x16\xc1\xaa\xb3\xe32\x87\xd3\xecIc-\xcf\xab7\x0b\xd9b\x9f9\x06\x88|q\xca[\xb8\n\xfb\xf7\x0bl]:\xbc\xe1\xab:K;w6\xcf\x1c\xa6\x1a\xec\xc0\xe2\xea\x89\xe6u\xe4(\xec\xec\xda!\x06\xfd\x9c\xeeZb4\xeb\xff\x06j\xbc\xfe\x90\xb6\x93\x0b:t\xf1|\xa3`\xfb\xc5\x9a\xa5\x11w\xb2}oP\xccj\x10M\xf3\x98\xbdCj\xa9\xcd\x93\x83\xf9N"\xbc!z8\xf6\xca\xe3\xbc\x04\x92\x14\x16i\xa40\xbf~\xb5\x12\xbeC\x83\x9e\xbdH\x13\xcasxFM\\\xd7\xc9\xd3B\xacM\xe7\x1c\x8ej\x12\x197\x06\xae\xbd\x1c\x84J}\xab\x8b\x05F\x8a\x13\xbe@]\r\xc2-\x9fA\x19\x94Jl\x12\xba\n\xad\x16T\x94\xb85U\xc1o\t\x04\xb2F\xa1\x17M4\xc3\xb2N\x17\x8f\xfe\x190\xc2\x11q\xc3A\xd9\xafn\xc8\xc909\xc4\x05\x03\xf3\xb2\x8e\x97\xfcL>E`\x11`\xce\xe5n\x15\x84\x84~\xdfZ\x98S\x0f[\xc3\xaa\x8e\xcf\x9cU\x93\x94\x04>\x05\x90\x1c\x00\x1a7\xb7\xe9\xc9\xc9\xb6Eq\x13\x1e\xb5\x86\xc3}&\xe7\x1b\xe5(\xce\xe3b\xd5\t\x11\x1f\x1e\xe3;O\xd9J\x85\xc5\xfa\x82\xd2\xc9\x88\xc5\xa8\t\xf5\xdb\x85vi\x1d\x97\x12j\xe8\xabL\xf0J\xd3\xbe\x1c\x7f\x1a\xb7$k\x87\x9e\xc3\x9aH\x1e\x96>\x19\x0fE\xff\xe2\xc8\xc2|W4\x12\xe4\xc7G[\xdc\x93\x17E%ur\xcem\x169\xf2I\xab\xbb\x8d\xca\x0fM0n\x19\x06\xeb<\x03\xa7fw^\xdd(V:\xc0\x14+\x08L\x17\xbe\xc9\xa6\x82\x01\x1e0\x82\x01\x1a\xa0\x03\x02\x01\x12\xa2\x82\x01\x11\x04\x82\x01\r\xeeN\xd0\x1b\xa0\xc4\xb0C\x12,\xdd\xbd\x96\xe8\xbai"j\xbc[O\xff}Z\n5%\x98\xfc{`Q\x92\xe4\x95\x1azM\x15b\x98Ah\x02\xb2V\xd5\x0f9\xb3\xd5\xcf!\xdf\x1e\x9c\xd4\xc08\xc0|\x10\xc8\xb0ol\xcd\xa6?\x19\xfa\xb9\x0b\x9d\x96\xaa_,O\xe2 @4;\x1f!\x12\x8e\xf3h\xbc\x95\xa2\xcfE\xaey\\U\xdcc\xbe\xecN\x9e\xaa\x9d\x83\x1a\x9ad\x11\x15X\xdf)L\xd8Z\xe3\xa2&\x1c\x1b\xf8\xd1\x8e\xfb~\xdd\x16^\xfa\xf9\x15\x96s\x03\xf8T\x86\x12B\xdf\xf7m@\xfa\xf5L\xdd\xb6\xa8\x9af\x90\x90\xcd\xa9\xdf\x97`\xd3\x1c)\xc5n\xe8\xc1\xe0\xb4\xc7"\x16\x91<}\n\x94\xec\x8d\xc6.d\xe1\xf5/i\x89$\x9a\xebW\x0c\xf7\xfe\xc5\x12\x10\xb8\xa5\x193\x88hR\xa0\xf7t\xa9\xc6\xc2\x15E\xbd\xd6\xf09\x1d\x12\x83o\xb35>o\xa0\x98\xda\xf2\xad-1\xd0\x94\x12Be\xe0\x04\xe0\xf7\xcf\xbbAZ\xf5\x1c\x88\xf5\xef\xb2\x9bi\xdc\xd0\x07\x8f\xca\r^\x92\x02\x15\x87\xef\xd5\x90\xb5') >>> >>> assert isinstance(pkt.root, KRB_TGS_REP) >>> assert pkt.root.cname[0].nameString[0] == b'Administrator' >>> assert isinstance(pkt.root.ticket, KRB_Ticket) >>> assert pkt.root.ticket.sname.nameString == [b'ldap', b'localdc.samba.example.com'] >>> assert len(pkt.root.ticket.encPart.cipher.val) == 891 >>> assert pkt.root.encPart.etype == 0x12 ###### ## Kerberos dissection and decryption tests ###### ###(005)=[passed] Create Key (RC4_HMAC) >>> from scapy.libs.rfc3961 import EncryptionType, Key >>> key = Key.string_to_key(EncryptionType.RC4_HMAC, "Password1!", None) >>> assert key.key == b'\x7f\xac\xdcI\x8e\xd1h\x0cO\xd1D\x83\x19\xa8\xc0O' ###(006)=[passed] Parse AS-REQ (no preauth) >>> pkt = KerberosTCPHeader(b'\x00\x00\x00\xd4j\x81\xd10\x81\xce\xa1\x03\x02\x01\x05\xa2\x03\x02\x01\n\xa3\x150\x130\x11\xa1\x04\x02\x02\x00\x80\xa2\t\x04\x070\x05\xa0\x03\x01\x01\xff\xa4\x81\xaa0\x81\xa7\xa0\x07\x03\x05\x00@\x81\x00\x00\xa1\x120\x10\xa0\x03\x02\x01\x01\xa1\t0\x07\x1b\x05User1\xa2\x0e\x1b\x0cDOMAIN.LOCAL\xa3!0\x1f\xa0\x03\x02\x01\x02\xa1\x180\x16\x1b\x06krbtgt\x1b\x0cDOMAIN.LOCAL\xa5\x11\x18\x0f20231213110146Z\xa6\x11\x18\x0f20231213110146Z\xa7\x06\x02\x048\xa6\xb8x\xa8\x080\x06\x02\x01\x03\x02\x01\x17\xa9\x1d0\x1b0\x19\xa0\x03\x02\x01\x14\xa1\x12\x04\x10WIN10 ') >>> >>> assert pkt.len == 212 >>> assert pkt.root.padata[0].padataValue.includePac >>> assert pkt.root.reqBody.etype == [0x3, 0x17] ###(007)=[passed] Parse and decrypt AS-REP (no preauth, RC4) >>> pkt = KerberosTCPHeader(b'\x00\x00\x06\x1dk\x82\x06\x190\x82\x06\x15\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0b\xa3\x0e\x1b\x0cDOMAIN.LOCAL\xa4\x120\x10\xa0\x03\x02\x01\x01\xa1\t0\x07\x1b\x05User1\xa5\x82\x04\xa0a\x82\x04\x9c0\x82\x04\x98\xa0\x03\x02\x01\x05\xa1\x0e\x1b\x0cDOMAIN.LOCAL\xa2!0\x1f\xa0\x03\x02\x01\x02\xa1\x180\x16\x1b\x06krbtgt\x1b\x0cDOMAIN.LOCAL\xa3\x82\x04\\0\x82\x04X\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\x03\xa2\x82\x04J\x04\x82\x04Fm[\x1a\xa0G\xd5 \xee\x9c\x0c\t\xfb\xc3\xee\xd8Ki\xca\xaa6~\x87\x0fu\xde\xfd\x8d9\trl\x9d\xe9\xf0\x10\x0b\x85SO\xc2\xae0\xb1\xc1\x9a\x8c\xa0\xcb/\xad\x94\xaa\xe0\xb1R\'C\xd0uqw\'\xa6zF\x9d7\xf7\x08\xd8[(\xd5\x11\xc6:\xf5\r:\xde\xf9\xdd\xd9/T\xaa\xe1Q/\x9eD\x91\x01\xa8X\xf0O\xde\x88\xcb\xc4\xc7\x87\xb1pv\xd4\xb0r\xc1\x10\x80W9\xf7\xe7+\xd9M:\xf2\x8f\xdf\xa4\xc1\xa5\x95lU\xc02A\rf\x0b\xef\xc8\xc9A\'\x87\xff\x92W\xd4\xed\xb9\xd0|{\\\xbd\xf2\xfb%h\xe3\xb8\xccs\xec_\xe7\xf9\x90\xae\xb8E\xab\xf6!\xe6z@\xf1-nO\xcf X\x1eh\x86L\xba\x0ef_\xde]\xe2_\x94\xb0\x13\xccN\r/\xd3\xf2\x81\x07\x1b\x14\xfd6\x00Y~\xc0?\xaeYb\x7f\x16\x139\xe5P:\x93\xe3N3\x08iB\xc5m\xa3\xb5\x10d\xd1~\x0eb~wk{u\xec\xbe_!w{\xb7Z\\\xcf\xf5\xd9\xc3\xea\xe5\xfd\xfd\x03\x18\x07\xab\xe3\x06\x07\x9a\xa1\x9c\xc2C.\x0e\xb7c\x14\xf6\\\xd2\x82\xf2\xfc\x01>\xed\xfb6&<\x8f\xab\xe0\xfe5\x86!e{\xadr\xa3\xab\x87\xbc;p\xbdh|\x04\xf5\xffJ6\x94\xca\xacLc\xeb\x91\x14\xb94\xe7\xf4k+_V\xefh\xd4G@\x16\xc7?\x92\x94\xa3\x87\x81#\xbc\xa6>\xefh\xdd\x91\xe2\xce\x06\xba+\x96\x83\xb5n\xb2\x0c\xc3\xf9\x1f\x15\xe8\xba\x10\xf7V\x8b\xf4\xc1Rg\x86S\xfa\x89\x90\xe4\xceJ\x8d4\xc1Bh\xb5S\xa8\']8z,j-z\x0c\xc28Z\x06d\xd9\x90\x19\xf4\xc2)\xc7\x86\x9dk\x17{\x12/\t\x8a.\xc4\xe7\xdb~t\x92\xadx\xb2\x91\xb5\x96@\xf6\xa8ftuM\xdf\x17\xc4V\xa0y\xd0\xdf\x1f\x1a\xc9y>\xc0\xd1\x85\xde\xf4\xee#\xc8\x82F\xc8H\xa6h\xe8\x02H\x9bE5U`o\x98\xc0P\x9c\xd9L\xb9D\xff\xd8G\xd0k\xc0\x07\xda\xd2#\xc3"\xb7\xb8\xf2)\x9c\x164\xaa\xe4\x18-i(\xabn\xb7\xeaB5\xe4\xb7\xdc$$\x9e|\xcdA\x03\xf3\xd7n\xd3\xc1\xd7\xe6e\xb6\\\xd3)\xfah\xb7\x88\x0e\xeby \xfe\xd2!.Q\xa0\x97\xa8\xe2O\x1d\x99\x02#9\xf4\x1c\x0e\x1fN\xc9;\xd5?\x0fm=\xee\x0efj\xc1\xcb\x14\xb5\xa9}\xe2:F\xd7\x1d\x07\xfd\xaf\x96D\xfc\x007q\x11\xe1\xf6\x12\xdc%\xf7\x92ML\xbfH$\x10\x8a\xb9\xfbp\x9b\xff\x07\\N\x83\xf5\x11\xaex\xf2\x171F\xe3\xfc\xf6\x89\xc3\xdf]\xaa:\x8f\x99\'\x16` P\xe6X\x04\xe9@\x89\x90\x8cP\xc5b\xf82\t+\x14+\xb7\xa3\xfa\xba\xa4*r\xb41i\x070!\xba\xc8\xb17\x06\x12\xf2\xce\xa0\t9P\xd9]\xe4p1i\xf3\xed\xc0oT\'\x99\xc0\x7f\xa8s\x0bW\xc7S\x90w\xe6\xa7\x91\xe1\x84\xd3V5$\x92\xa3\x81\x90\x02\xdfVu\xd7\xb7x\x13+p\x8djP\xfa\x0eL\xc5}=\x12t\xc3\xa6\xa5\x12\xd9H+w\xea\t\x92km\xf9$\x0c\xa0Y\xda\xea\x15\xd0\xa1\xbe\x85\xa3\xd3\x9fQ\x1a\xd8A\xabf\x9d\x9c \x19\xa5\x8e\t\xb4c\xac\xe3\x99\x00\xf4i\xc4\x14c\xd7h\xd3\xc6x\x11\xa5\xa0`\xe5\x8d"\xae\xa3\xa7\xba\xb8\xc4~\x87\xad\x1d\xa6\x19\xe3v\xdd^(-w7d\xd1\xb0D<\xeaW\x84\x90=\x9e\xee\xa3\xe3u\xa7\x074\xf3:6{\xbd-\x87\xfee\xd6b\x8a\xe5\xa9v\x0c\xe8N\x1c\x10\x12\x91\x1e~\x92\x02Uh)\xdd\xb5f\xf9\xcc\xadf\xf3:\xa7\x9f\xfd\xe1>\xd19\x10U1\xf0\xf8\xb1G\xe8H\xcb!h\xab\x14q\xe51d\xb2A\xf07\xda\x11\x81\xd9\xff') >>> >>> assert pkt.root.cname.nameString[0].val == b'User1' >>> >>> asrep = pkt.root.encPart.decrypt(key) >>> sessionkey = asrep.key.toKey() >>> assert asrep.encryptedPaData[0].padataValue.flags == 0x5001f ###(008)=[passed] Parse and decrypt TGS-REQ (DES-CBC-MD5) >>> pkt = KerberosTCPHeader(b'\x00\x00\x05\xd1l\x82\x05\xcd0\x82\x05\xc9\xa1\x03\x02\x01\x05\xa2\x03\x02\x01\x0c\xa3\x82\x05=0\x82\x0590\x82\x055\xa1\x03\x02\x01\x01\xa2\x82\x05,\x04\x82\x05(n\x82\x05$0\x82\x05 \xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0e\xa2\x03\x03\x01\x00\xa3\x82\x04\xa0a\x82\x04\x9c0\x82\x04\x98\xa0\x03\x02\x01\x05\xa1\x0e\x1b\x0cDOMAIN.LOCAL\xa2!0\x1f\xa0\x03\x02\x01\x02\xa1\x180\x16\x1b\x06krbtgt\x1b\x0cDOMAIN.LOCAL\xa3\x82\x04\\0\x82\x04X\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\x03\xa2\x82\x04J\x04\x82\x04Fm[\x1a\xa0G\xd5 \xee\x9c\x0c\t\xfb\xc3\xee\xd8Ki\xca\xaa6~\x87\x0fu\xde\xfd\x8d9\trl\x9d\xe9\xf0\x10\x0b\x85SO\xc2\xae0\xb1\xc1\x9a\x8c\xa0\xcb/\xad\x94\xaa\xe0\xb1R\'C\xd0uqw\'\xa6zF\x9d7\xf7\x08\xd8[(\xd5\x11\xc6:\xf5\r:\xde\xf9\xdd\xd9/T\xaa\xe1Q/\x9eD\x91\x01\xa8X\xf0O\xde\x88\xcb\xc4\xc7\x87\xb1pv\xd4\xb0r\xc1\x10\x80W9\xf7\xe7+\xd9M:\xf2\x8f\xdf\xa4\xc1\xa5\x95lU\xc02A\rf\x0b\xef\xc8\xc9A\'\x87\xff\x92W\xd4\xed\xb9\xd0|{\\\xbd\xf2\xfb%h\xe3\xb8\xccs\xec_\xe7\xf9\x90\xae\xb8E\xab\xf6!\xe6z@\xf1-nO\xcf X\x1eh\x86L\xba\x0ef_\xde]\xe2_\x94\xb0\x13\xccN\r/\xd3\xf2\x81\x07\x1b\x14\xfd6\x00Y~\xc0?\xaeYb\x7f\x16\x139\xe5P:\x93\xe3N3\x08iB\xc5m\xa3\xb5\x10d\xd1~\x0eb~wk{u\xec\xbe_!w{\xb7Z\\\xcf\xf5\xd9\xc3\xea\xe5\xfd\xfd\x03\x18\x07\xab\xe3\x06\x07\x9a\xa1\x9c\xc2C.\x0e\xb7c\x14\xf6\\\xd2\x82\xf2\xfc\x01>\xed\xfb6&<\x8f\xab\xe0\xfe5\x86!e{\xadr\xa3\xab\x87\xbc;p\xbdh|\x04\xf5\xffJ6\x94\xca\xacLc\xeb\x91\x14\xb94\xe7\xf4k+_V\xefh\xd4G@\x16\xc7?\x92\x94\xa3\x87\x81#\xbc\xa6>\xefh\xdd\x91\xe2\xce\x06\xba+\x96\x83\xb5n\xb2\x0c\xc3\xf9\x1f\x15\xe8\xba\x10\xf7V\x8b\xf4\xc1Rg\x86S\xfa\x89\x90\xe4\xceJ\x8d4\xc1Bh\xb5S\xa8\']8z,j-z\x0c\xc28Z\x06d\xd9\x90\x19\xf4\xc2)\xc7\x86\x9dk\x17{\x12/\t\x8a.\xc4\xe7\xdb~t\x92\xadx\xb2\x91\xb5\x96@\xf6\xa8ftuM\xdf\x17\xc4V\xa0y\xd0\xdf\x1f\x1a\xc9y>\xc0\xd1\x85\xde\xf4\xee#\xc8\x82F\xc8H\xa6h\xe8\x02H\x9bE5U`o\x98\xc0P\x9c\xd9L\xb9D\xff\xd8G\xd0k\xc0\x07\xda\xd2#\xc3"\xb7\xb8\xf2)\x9c\x164\xaa\xe4\x18-i(\xabn\xb7\xeaB5\xe4\xb7\xdc$$\x9e|\xcdA\x03\xf3\xd7n\xd3\xc1\xd7\xe6e\xb6\\\xd3)\xfah\xb7\x88\x0e\xeby \xfe\xd2!.Q\xa0\x97\xa8\xe2O\x1d\x99\x02#9\xf4\x1c\x0e\x1fN\xc9;\xd5?\x0fm=\xee\x0efj\xc1\xcb\x14\xb5\xa9}\xe2:F\xd7\x1d\x07\xfd\xaf\x96D\xfc\x007q\x11\xe1\xf6\x12\xdc%\xf7\x92ML\xbfH$\x10\x8a\xb9\xfbp\x9b\xff\x07\\N\x83\xf5\x11\xaex\xf2\x171F\xe3\xfc\xf6\x89\xc3\xdf]\xaa:\x8f\x99\'\x16` P\xe6X\x04\xe9@\x89\x90\x8cP\xc5b\xf82\t+\x14+\xb7\xa3\xfa\xba\xa4*r\xb41i\x070!\xba\xc8\xb17\x06\x12\xf2\xce\xa0\t9P\xd9]\xe4p1i\xf3\xed\xc0oT\'\x99\xc0\x7f\xa8s\x0bW\xc7S\x90w\xe6\xa7\x91\xe1\x84\xd3V5$\x92\xa3\x81\x90\x02\xdfVu\xd7\xb7x\x13+p\x8djP\xfa\x0eL\xc5}=\x12t\xc3\xa6\xa5\x12\xd9H+w\xea\t\x92km\xf9$\x0c\xa0Y\xda\xea\x15\xd0\xa1\xbe\x85\xa3\xd3\x9fQ\x1a\xd8A\xabf\x9d\x9c \x19\xa5\x8e\t\xb4>> >>> assert pkt.root.reqBody.kdcOptions == '01000000100000010000000000000000' >>> assert pkt.root.reqBody.etype == [0x3, 0x17] >>> >>> apreq = pkt.root.padata[0].padataValue >>> auth = apreq.authenticator.decrypt(sessionkey) >>> assert auth.ctime == '20231213010146Z' >>> assert auth.crealm == b'DOMAIN.LOCAL' ###(009)=[passed] Parse and decrypt TGS-REP (DES-CBC-MD5) >>> pkt = KerberosTCPHeader(b'\x00\x00\x05\xdfm\x82\x05\xdb0\x82\x05\xd7\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\r\xa3\x0e\x1b\x0cDOMAIN.LOCAL\xa4\x120\x10\xa0\x03\x02\x01\x01\xa1\t0\x07\x1b\x05User1\xa5\x82\x04\x9aa\x82\x04\x960\x82\x04\x92\xa0\x03\x02\x01\x05\xa1\x0e\x1b\x0cDOMAIN.LOCAL\xa2#0!\xa0\x03\x02\x01\x03\xa1\x1a0\x18\x1b\x04cifs\x1b\x10dc1.domain.local\xa3\x82\x04T0\x82\x04P\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\x0b\xa2\x82\x04B\x04\x82\x04>\xcc@\xf6_\xdd\x85\xb9\\\x9f\xf5P\'\x9ae\xf0\x925\x884W\xde\x9fn\xb3q.\x08e\xd4\t\xf2;\xb5\xd0\xcb\xe8\x1b\x9e\x15\x83~ q]\xdaw\xd2X\xac\t=aV\xa7\x9c\xfb\xee\xe2n\xf7\x9a\xf1\'t[\xe2\xcc\xaeL\xb9\xe1\xbc\x87C\xddG-\xdeJ\x9d\x8d\xa4\xb4W\x83\xb8\xf0(\xa4\x92\xf9\xa9OJ\xb2s\x07\xfa*\x0f\xf9\xbf\x17Z\x15\xd5\x867\xe3\xfd\xa6r\xb3\x9f\xca\xb5\x9dth\n\xc4\xe3\xc4P\x08\xfe\xd6Fd=R\xde\xe6\x80CC,\xe9l=\x89,\x82\xed\xc5<\xec \x8b\x19\xe1\x88\xaf\xf2\x8b\xbby\x8f\xf1\x88\x84?\xcc\xa4\xb5\x7f\x84\x99\x9d\x85\xedEs\xfc\xc6f\xfc\xb8\x04=\xa5\xcf\x0f3\xb3\xed\'\x01\xa2(\xb5\xec\x1d9\xcd\x88%\x86\xf4u\x91\x11\xe6O\xfc:I7\x1b\xd4\xc0\x11u\x80\x1dt\xc1\x81\xd5#\x10\xff4\x03Fs;O^\x0c\xfb9v\xcb\rt\xd2\xfb\xa3-\x01\\\xa4\xd2\x07\xcdm\xe4*\x85)A\xf6[\xf7\xbbOarb\x0f\xd8\xbaq2LL%0\x1c\xc5\xfa\x94L-M\xab\x90<\xb1\x0e`\x81%\xc3\x1b\xe9\x80\n\xf2\x89}t\x07\xe6\x9e\x02\x80\x998@\xd6G>\x88\x18\x0e\xdb\xc329\x7fD~\xbe\xac\xc1\xd9\x05z\x8aP\x175\xad\xf90\x13\xaa\x13/=|\xf6T\xb9\xf5f\x95\xe1?\xaf\xca\xbfq\\^\xa2\t\xe9G\x81\xbd\x01\'\x9a\xed\xe4\x87\xee\xee\xd1\xaa\xd4\x1b\xd45\xa9\xb1\x14\xc4\x98)0\xde9/\xfe{~/\xd3\x05:|\xd4\x9d~\xde\xce\x8a\xd8\x80\xad\xc6\x19\xddzk\\\xb8$\xafY/\x90\xd3*L\xf7\xf5V\xd3\xa7E\x86\xf1Y=\x81\xfd\xcd\xa6n\xd3\xe4\xa362\xb6\xed\xa5\x8e\xa4\xb3\x0eC\xee^i^_\xaa\xf8\xc1\x93f\x7f\xb1\xdcr\xd8\xcc\x9bV\x17\xec\x14W\x0e\xbcUPw\x02"/L\xbc\x1b\xdb\x8c\x91G\xae\xfaI\xfbY\x8f\x9d\xa1\xab\xf0)\xb0J\x9b#\xc4a\xccw\xc9\xc3\x89A3\x9b\xcc\x87\xccx\xb2\x8c\xa4\xb4\xe6c\xc9\xd3Y:\x1d\xc8=\xd8K\x8bn\xe7\xf6\xa3\xf2\xc7\xe1\xffm\x14\xf1m\x80\xb91\x81`&\xc5\xab#Q+r\x14\xb4\xa6!tI\x8aNS\x179r9\x8b\x95\xbe\xf8\r\xd0P\x1f\x06\xe7\xd7V\xe3\x06\x98\xec\xa1\xeby\xe6cm\x88\xd3\xd6<\x1c\xea\x12%\xb5\x1b\x9b\r\xe6\xb4\xfba\x04\x81\xa2\xd1W-x\xe9\xb9\xc5e`\xf1\xcd\x9e\x83Z\x10\xeb-[\xa0\x95\xe1]\xf2)\x0f+{fW6C\x19$\xddd\x8a\n\xa4^\xbe\xf6\n\xe9\x1eI\x1fD\xf5\xdc9O\xe95!\xd9p\x87\x06\xbbgCh\x10\xebjI\xc9\x13n\x8e\xa0\x1bU\xf3./\xb1xU\xab\x1e\xe1\r\xcd\x8d\xa4Od\x14~R\x83\xe4F5r\xbb\xd8-{=\xb5\x9f<\x1er\xe7v\xf7&8\xdfD\x9f\xab/B\xcf\x0e\x87\xf4\xc9G\x8c\x1e\xf77Bem\x96D)!t\x1af\xbe\x84\x91\xe2\x10\x0bmb\xee\xa7%3\x95\xf6\xdc\xcd\xfc\xfd\x00S\xe3\xa13\xbc\xa33m\xfe\xa4\x91\xc7\xaeG%\\\x87)\xdc\xd2=\xef$\xb5\x8ew\x13\xba\xa2\xc0\xfc\xaal,!>\x17>\xd0D\xf7un\x8cI\x98D\x056@\x88y@"\x05T\xec\xd5a\xe66\x1d)\xf2\x80 \xf5&o\xa5\xda\xcd\xde_\x86-\x00\xcb\x02\xfa\xc7\t\x05\xfcX"\x9d\xb8\xbbSe=\xdey\x0e\xbb@\x00\xba\x9bpb\xbd\x98\xe1\x9az\xa9\xdd\xdd\xd5\x00B\xecu\xb0\x08\xf8\xbb\x0f\xf7z\xfb\xd8j\x14\xe9i]\xced\x00\xf7\xdb\x01\xe2\x03\xda\xf2\xbf)-\xad*,\x05\xd7\x11\xbc\xfc,[\x0f\xcb\x8b#\xfdt\x04A\x11\xfb\x95\xe5\xd1\x1e\xbf\x81\x16t\xa4\x81,\r\xb6\x02\x17\xcd\xa1t\xb4MX.\xbd\xcabFn\x0c\xa6\xb8g@\x0f\x14g~_"\xb9\xe9\x8cu\x94\xcc\x8dX~V\xacv\x86v\x98\t\x8d\xbc\xfe\x80\xee\x1c%\xcdJMj\x18\x90\xcf\t\xb4\x8d\rw\x1eK\xfd\xb3n\x0f\xf8|9/\x04\xd2\tIC\x8f\xfe%\xef;\x86\xb2Sm\x7f\x8f\x87\xb2\xa79(\x1a\x15\xb6\x80G\x81)\x9cg\xe0\x19# \xdd\x11Z)\x8f\x87\xc2s$.\xa89\xeb\xd8\x14\xbb#\x8a\xf0\xbc\xd5\xa9\x00\x10\xf9W[M\xf9\xc37B-.\xd9\x8e]\xfa \xf9\x01\x9b\x1fb\x13h~\x12\x11\x86\xf1\xd0\xcb\x8c>B\xf2\xfe\x82!\x8f\xb2\xa1vi\xf5i\\\xcfD\xcc\xb3\xfe\xda\xdcpin}\xa4t\xc9\x02\xa5\xe4\x1c\x17\xf9\x05H\xdf\x02\xf2\xa3n\xac(*\x9f\xb2\xec\xf0`\xbe\r\xb8\x04\xfd\x0f\x19\xd7&v\xd4\x9dA\xa5l\x01\xc7\xa7\xd8\x97B\x83\xe1\x9bD`v\xb4\xad\xe9\xcc+\xc1J\xa6\xb8\xe0\xc1\xf6\x9e\x8e@\xb3\x00\rc\x9e\x08\xbe\xedq%~"\xa0\x19J\x90\x96a\xb8\xc5\x8c\x012$M\x97K\x14e\x068\xda\x03D\x13On\xff\xd9\x1f\x88\xb6`\xe4K\xda\xed\x9b-\x02w,t\xc8\xd8\x18\xe9f\xfd\xa9\xc4\x82\xc9p\x04\xf9CJ\x18\x9e\x13\x07\xce>(') >>> >>> tgsrep = pkt.root.encPart.decrypt(sessionkey) >>> assert tgsrep.nonce == 0x7a33e06a >>> assert tgsrep.flags == '01000000100001010000000000000000' >>> assert tgsrep.renewTill == '20231213110146Z' >>> assert tgsrep.encryptedPaData[0].padataValue.flags == 0x1f ###### ## Kerberos FAST tests ###### ###(010)=[passed] FAST - Parse FAST AS-Req >>> pkt = Ether(bytes.fromhex('52540013d0835254003ea3be08004502089636a1400080063ad3c0a87fd2c0a87fc8fecc0058eea93069573b278e50180402897400000000086a6a82086630820862a103020105a20302010aa38207a23082079e3082079aa10402020088a28207900482078ca082078830820784a082064a30820646a003020101a182063d048206396e82063530820631a003020105a10302010ea20703050000000000a38205796182057530820571a003020105a10c1b0a444f4d312e4c4f43414ca21f301da003020102a11630141b066b72627467741b0a444f4d312e4c4f43414ca382053930820535a003020112a103020102a282052704820523acc8b7671c0d50522f1a8d8452ce450aceb40fff0229e8ee546bccf1512e4877ef93dde465595260a6a5a8e85ea38600ce8dff7d510f3c744e2c43eb9d3187d638f716c29b6e7aa9eb407de28d0161f49013966eda0a161ff174dad42e7aa500cfe298541215448013ffe4883b6b1166f908f50de129487fe77fff874fd4102cdcce8db8dbeb8da02f08cc88b3790cdad5ec499959c7e79d6fef107d1e17ce80cc3df050b7e7a1c31f278e4fd4ea9523c950876f174be363234f8495b9550de1560ba17daeafbf133f78991053d929ad3fd668327d42288e6581671daaef908682ee282e17c31d8f8bb55d27fce155ee2e84a2ff8bc9600891be15e6ede3e1bbd2742a7af8b0a32c48973c9e3776a69647bab11592756c5a15b9101c392efa35d000abb3dabccd97e64426e3fd8d47e0e369c83b5391f38947d536d351c061081d654eef1a3861cdb2ea2bc48222b450d1b7d09c0670493bccc60dfcaa5cfe46fd50adf8e388204a4691dc5f0c3dbae0b4da6ac2dd781f149a444840aaa3a3c3befb5a5c04ee0405baed66afcf9b988d10ea14a955f43df79465e6fc02a12bce3870988950f1ab48e1a4f876f351671c5061e6399a63cb0479f7bd017dfd9bc5be192faf6d4f11e6ee6003933eeaf632f0056c4c1ccd183d7977cfca85419fe5b039674419d802068e792c9576ae2a88bfbeb1f59273226782c6efb288717d8f7a4bc3bf4c697fcac1adc1829f0a914f2559b278ccadd108eb87a11dacc88e4302e9af627474e57171192b94c6b358f8f98e308596215d2fb9d9c2b49c4cbedcb43fc231b86f0493d56b82962cf3383a84f8922c2b99f8fa8fdd85797b09a6e60f72007c0379988be2ff1cfc16f21300c1b4b784174005a9185f760e68ef94b9384eb24decee31b63d1b92278cd75b85d4d80c4e83306533a9d95aa6207cbfbeb0970a41c44aba59839f007923ecd8ff0de8314990a435dbea4dedbee16faf5ab2be9f96d691cfa983a6c843bd183f84c1b4998a3eaa907cae6b82b0ae8363f3edd8cb03d3c9c60ff55a84d8a292ea20555fbd6ce5ad4ad7a6b4bc5bff2e02c477a7a8a98d5a387d389caa172c400b151d95871b2aa16a040dc71a9be5f0774b06a5ca87674ccb4109a2c41db9e3160704218ad495d0751194fbef4becae4d7be24b9d968da592256a2b22cf724e989e71a60d0603b59bebd475285f793794b7a18af49a2b68670e3a6247c453274e35c863a16b5023c6c94659e25abb27c760f989ac0bbf9a5b125d0ea34fb03225cc93d5b8b6829e906883ee76cf8ee61dfacc488e8dc5cbc8ba9705a9e915a68f838232394f97fb1aac4a2a90fe17d46f9c51946a2bf9598df7f5b5e7ee692a78860eea3cef748a5be36529228e40b4aec83ebc8bb14176a4c565b06500e9517229b8340c55812101dbbc6bee693c35873082a5a1a53b35cf3509193d4dc5175c9360a00da71692ba205b3264aecc9ecc8bca31fec43efc8701423bb484f6f21699439dd30f71228f16eaab96b7de3547721d1635bbfe50678900ac378a4958b6c34964f3e0dc843880dbde57fb4a76ab85eba2b190bfdaefc7ba17e109f839493b0f2d6fc7ea17403bebe06f2809314ca514606f54668082364ed6752019f27e1df74f93fcf1c25630a29713a89d4a998c444bc91279c6fc66e0aa5dec72be316e1160cf9f90d5915c464b6bfec5216e901be4726db596a15745511c63736a69ac9ecb9e86601c631b4992653c320e6983562fa613134560cb606621e9661ac5961313ee70868ab48d6010173d8a96fffdb2baf4afe18c846d3fed6f30b9a809d72e647735fc536edec543abc232480d28660395a4819e30819ba003020112a281930481901273d5af61ad426d51d0757e897917caeb6fc1b6950554e8d750f95d27f444e3aaf7ae0bf4595b5e906d9682dbdeedcf6eb42a84ab8092997b783f57710127228165deeb2ce5e09e2ddc71555dc31970a8312d888b8ae766382098276d62b4bd76f34cbc889e24ad5405ec037ceb724fdb71fe247fe2a414a037ed33c796f4475fcfb5993eed147b6d63d740d58da5b0a1173015a003020110a10e040c75f02d8d2954e0ae1a9e0653a282011930820115a003020112a282010c04820108ae9bbc4629c80f4a383a69c4583824295c75f34b000b3fdbdaab073a042935e32c29e0ee2b2b446e4a6a2592362d0d593cddd74dacc24f16353776e1b5d192ad1cf5e63f66f40a134ecb87c077c30922bc0cab00ae23d187d56090d9098f843c54fabe7c012ff87e317dfe339c40911264609d489b041a4e9b52c0eb03ee88a393d17da92786bd1716b92eb0d7a5a24a64ade0870dea8a7e138acdf209ee277cb3fadeedab173fd64cc10a1004010774658b94852639bda10a5e8aff29174e3d2c7032c32631b074afdac0e6832bae74de9be19e522f63bc8499753a209291fee1861c29096cc8ee3cfda5be235b0aa95635916edcfcdaf90b896e2eaa5a57d5e4da0b00408f4201a481af3081aca00703050040810010a11a3018a003020101a111300f1b0d61646d2d302d66617374656e62a2061b04444f4d31a3193017a003020102a110300e1b066b72627467741b04444f4d31a511180f32303337303931333032343830355aa611180f32303337303931333032343830355aa70602043f58a7a0a81530130201120201110201170201180202ff79020103a91d301b3019a003020114a112041053525620202020202020202020202020')) >>> >>> fastreq = pkt.root.padata[0].padataValue >>> >>> assert isinstance(fastreq, PA_FX_FAST_REQUEST) ###(011)=[passed] FAST - Decrypt fast ticket in AS-REQ >>> from scapy.libs.rfc3961 import Key, EncryptionType >>> krbtgt_hex = "ac67a63d7155791fe31dace230ab516e818c453dfdbd44cbe691b240725c4907" >>> krbtgt = Key(EncryptionType.AES256_CTS_HMAC_SHA1_96, key=bytes.fromhex(krbtgt_hex)) >>> >>> enc = fastreq.armoredData.armor.armorValue.ticket.encPart >>> encticketpart = enc.decrypt(krbtgt) >>> assert encticketpart.authtime == '20220712230225Z' >>> assert encticketpart.cname.nameString[0] == b"SRV$" ###(012)=[passed] FAST - Decrypt authenticator in AS-REQ >>> ticket_session_key = encticketpart.key.toKey() >>> assert ticket_session_key.key == b'\xe3\xa2\x0f\x8e\xb2\xe1*\xe0\x7f\x86\xcc\x88\xe6,\x08>B\xd8)m/G\x82B;\x9f+\x86\xcd\xcd\xf4\x05' >>> >>> enc = fastreq.armoredData.armor.armorValue.authenticator >>> authenticator = enc.decrypt(ticket_session_key) >>> >>> assert authenticator.crealm == b"DOM1.LOCAL" >>> assert authenticator.seqNumber == 0 >>> assert authenticator.ctime == "20220712235437Z" ###(013)=[passed] FAST - Compute the armor key >>> subkey = authenticator.subkey.toKey() >>> assert subkey.key == b'%\xa4n\xe1\xd0\xf5\x8d\xc4\x8d\xecv\xe8\x9c\xd3\xc9\xee\x1bu\xc9\xa5\xa6\xf8\x83f\x98\xa1\xd9\xe7*I\x9b\xf8' >>> >>> from scapy.libs.rfc3961 import KRB_FX_CF2 >>> armorkey = KRB_FX_CF2(subkey, ticket_session_key, b"subkeyarmor", b"ticketarmor") >>> assert armorkey.key == b'\x9f\x18L]I\x16\xd0\xe5\xa6\xd9\x92+\xbf\xbc\xe0\n\xd1\xcb6\xf3\xd1.C\xc2\xdcp\xf0H(\x99\x14\x80' ###(014)=[passed] FAST - Decrypt KDC REQ BODY from AS-REQ >>> enc = fastreq.armoredData.encFastReq >>> krbfastreq = enc.decrypt(armorkey) >>> >>> assert krbfastreq.padata[0].padataType == 0x80 >>> assert krbfastreq.padata[0].padataValue.includePac >>> assert krbfastreq.padata[1].padataValue.options == "10000000000000000000000000000000" >>> assert krbfastreq.reqBody.cname.nameString[0] == b"adm-0-fastenb" >>> assert krbfastreq.reqBody.etype == [0x12, 0x11, 0x17, 0x18, -0x87, 0x3] >>> assert krbfastreq.reqBody.addresses[0].address == b'SRV ' ###(015)=[passed] FAST - Check Fast Armor checksum >>> data = bytes(pkt.root.reqBody) >>> fastreq.armoredData.reqChecksum.verify(armorkey, data) ###### ## Advanced Kerberos tests ###### ###(016)=[passed] Test Kerberos InnerToken wrapping (ancient RFC1964) >>> pkt = GSSAPI_BLOB(b'`\x82\n\xc2\x06\x06+\x06\x01\x05\x05\x02\xa0\x82\n\xb60\x82\n\xb2\xa0\r0\x0b\x06\t*\x86H\x82\xf7\x12\x01\x02\x02\xa2\x82\n\x9f\x04\x82\n\x9b`\x82\n\x97\x06\t*\x86H\x86\xf7\x12\x01\x02\x02\x01\x00n\x82\n\x860\x82\n\x82\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0e\xa2\x07\x03\x05\x00 \x00\x00\x00\xa3\x82\x03\xf9a\x82\x03\xf50\x82\x03\xf1\xa0\x03\x02\x01\x05\xa1\x13\x1b\x11SAMBA.EXAMPLE.COM\xa2\x1a0\x18\xa0\x03\x02\x01\x01\xa1\x110\x0f\x1b\x04cifs\x1b\x07localdc\xa3\x82\x03\xb70\x82\x03\xb3\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\x01\xa2\x82\x03\xa5\x04\x82\x03\xa1\x8eA^\xd1\xa6!\x0f\x82\xb9\xbe\x82\xd0\xe8\x8c\xd7\x1bs\xb7\xb4&h\xec\xd6]\x0f\xdc\xc30n\x9f\xc2\xbb\xf03\x93\x027\x88_\xd7\x85I\x81\xf1\xba7\xcf \xa4\xf4\xa3\xc5C\x1d\xe8z\x1f\xb7\x97\xb1\x1e\x93\xcc\x1e\xc2\'\x94\xee\xf3v\xael\x95\x9d5x\xde\xcf\xad\x16\x1c=\x0eDbb\x9e\xbaE\xfc\x9d\xddnu\x19\x1c\xa4x\xf0#\xc8\x1fTI:\xfb\x94\xd7#,\x9f\xf8\xca\t\xf5\xdd\xcf\xd4\'qLy\x85\xac#\xcb\xde\xe1\xc1\x02+\xf8\xf4{.\xe6\xd7`)\x9d[\xfd\xb8\xc3+\xcaF\t\xa1\x97\xd4\x8c\xe3.\xa4\x80\xd1v2\xf8\xff\xb7\x89y\x98\x13&\x94\xe4\x95\\\x12l\xd8j)\xa7\xa4^\xed\xa9\xee\x92\xaf\x99a\x18\x08\x96M\x8d\xe2\xed\xf4J\xf9\xa8\xb9L0b6\xfc\xa6\x82\x84\xa5`Z\\\xe3\x8e\xaaW\xffj\x94\x05\x88(D$\x84\x11\xe3f1\xfb@\x05g\x00\xad\xf9\x92\x9a\x92^/\xe5\xd4J\xbd\x1bH\x98\xe4#\xb2\x87S^p\xb30\xe6hdK\x1fpp\xde\xf3\xf8\x1b1C\x9c\x9f^e\xfa\x1e\r%\xf6@\xe1=#\xd6\xbf\x82\x8c\'\xca\xcf\xf1\xda\xaa\xdch\x7f\x99\x8e\xa8{4_\xb6\xc1\x1a\xb2\xd0\x16Pfb"\x0b\xde\x02\xb8)=\xbbF\xdfg\xd3\xa4CGb\xfd\xe3\xc0\xff\x96\x8a)\xd9\xd4d\x15\xaa\x01\xa7\xa6\x8f\x81\xf3\xedl\xeb\x8a@\x86\xf6dv\x17\xc4\xda\x14a\xbb5\x80\x08\xa4BPR\xe3);\xb7I\xd3\x90\xaa\xb5\x02\xcb ?\xd2\xb5T\x9d\xd0Ho`\xb0r\xd9R\x9fI\x05\xf9b\xd9\xa6\xa8\xae2Q\xed\x1f/@\x1b=bC\xc8\x1d\xbb1\t\xc7\xabBNK\xf4\x0f0Q\x13\x8e\'\xf9\x91\n\x90\xa4\x97\x81S\xda7u\x92<\xa7@\xa0LO\xb7\xa5\x88\x0b\xa8\xd8p\xbbs\x97f\x17\x16\x87\xbe\xff\x84\xcf\xbf\xba=n\xd0w\xeb\x99x\x03\n\xb5\'\x0ewQ\x90;\xed~}}\x1a\xaf\xe5\x9d\xc4r\xe8\xa6\x97\x07AYl\xec\x8b\xc8\xf5I#\x0f\x04#\xf1\xf9\xec\xdf=\xd7\xc25\tC\xa2\x00\x0cr\xa7N\xfa\x1d\x18\x0es\x05\xef\x11\x84\xc2}\xee\xecKW\xc3\xaeo\x8eS\xa3\xa2n\xb3\xd3\xf1\xb0\xfc\xd8\xe8\xd7jp\xf7$\x11\xd2\xafZ\x83\';*\x87\xa6\xc2\n\xd9:\x8cy9d8\x1a\xf7B\n\nr\xa9M\xcf\xf5?\xe1\xa0\xdca\xd3\xc9\xdc\xc6\x04KyQ\x7f)g;\xc8s?0\xab\xf7\xd7\xd7\x85\xdd1]\xd2\x12\xb5\x1c\x87\x05/\xf4\xe4\x8ci\xe3+\xdeH"\xc2\xe7Z\x17\xaa \xd2\xbaKr\xcc\xd0\xa9\x1d\xe2u\xab\xcc\xd9\xc0\x05\xc5\xf2\t\xf5\xb1M\xa4\x84\x1fS\xfe\xb1\x18r\x81\xba\xc9\xfe\x8f\x01\x8c\x12\xd2\xa6Jy\n\x98\xe9\xd1\xfa\x89\x9c\x84\xf8\xd5\x7f3\x92\'\xed\xa9\xc3\xc1\xcd\xcd\xb9\x19\xec\xb2\x08\xa2\xd0\xc1@\x80\xf1\xc1\x1b(\\\xd3\x17\x04\xf8\xbf\x1a\xb4>.\xcbzP>R\xe9\x84V\x04\x92\xf3\r\x9a\xd2\x99\xf0q>K\\\xb5f\x8e\x9c\xc2\xb3\x1f\xebL\x19~\xda^\x1dY\n\x9d\xd11B;n\xcc\xd3\x1e\x1d\xe0\xe2o\x14\xd8_\xaf\'f\r\xe1 \xfaD\xaa\xad7\xac\x81\xd2\xfd\xf1-D\xba\xa8*\x07J\xbb4\x1b\x19ny\x81\x113\x0e]\xfa|T\x91ayS\xe8\xf6y\x9d\x8b1\xf5\xbb\\\xfb8JD\x17Fq\xd4\x8aF\x16\x9ed\x1cJ\x864p\x94k\xe2\xdd\xdc\x15\xb7\x0f*\xae\xa3@\xc2\x92\xcd\x17>|\xc8\xb7\xd7\x1ay \x8b\xbdZ\xef3*~S\x81D\x12}$\x0c\xce\xa7`\xcam\x9a4q\xdfK\x0eE\xbe\xbf,\xfe\x8a\xe6\xd0Q\x03\xe2\x19\xefx\xb6`%\xcb/\xfa&\\\x15\xc8\xa3\x83V\x18N\xad\xce|6r\x01tW\xa4\x82\x06n0\x82\x06j\xa0\x03\x02\x01\x12\xa2\x82\x06a\x04\x82\x06]\xbe\x88N^mh#\x18\xc2\xf0\x8e\xda\xe5E\xab\xe8\x811\xd2\x0e\xd2q\x96\xf3\xb6\r\xa2s\xcf\xe70s\x0eF\x1b\x01~\x9ev\xcc\xb0h`5\x11\x8d\xb4f}\xad\xc9\xbeGG\xe4\x1f,\x08\x8f\xde}\xad\x0f\xee\x00\n`j\xb2\x9fy]>\xd3)w)8\xc4\x88\xf3]2ea\xce\xf5.R1\xe5G\x87\xeb\xa8\x0f4\xcf\x13\xe7\x1d\xcd\x16\x00\xe8\xf5\xc4_1\x95\xb6\x16\xa0b*\xf6\x8e\xd2\xd5\x19s\x1b\xce\x86\xd4)R\xa9\x13i"\xe7}\xda\x8d_\x961\xb3\x8b=\xd3R\xa9\xb8c,\xb3\xb7#\xdbt*\x04\x15\xa5\xa8f\x80m\xe8m\x1b\xb2\xe9\x1f\x1f\\\x1a\xbb\x90x{&@\xc3v\xa5#>\xd2\xb7\xd1y\x1f\xf6&wz\x88\xe2\xdd\xdb\xc0\xbfP\xec\xbf\x9a\xff\xf0"\xdf\x9e\xdd\x87\xb4\x06)2\x12\xd7\xad\x99\xf0\x98\xfdB6<\x8d\x1e\xf5\x0c0\x9e+\x19\xa4\x91E\xcet5\xbbz@M\xd8\x18\t\xdd\xaa\x16V\x87Ii\x0f\xe5)P\x0e\xd32\xbfK\x06j\x14\xcc\x8e&TZ\xfa\x89\x87\xe6\xd0\xe5\xe5[`\x97\x13|0s\x1c\x841Y\xbcT\x19\xa1\x8b\xef\x16k\xde\xf6\x0e\x9fPA^\xfe\xa3S\xd9-\xab\xf2{Y#b(\xcb\x13\x1b\xae\xb0h\x91wy\xfd\xff\x01\x13\x92O\xcc<\xf1\x88\xb7\x07\xc5\xe8,\xa3\x8et\xe7\x186FP\xe9?\x862\x881\xd3E\x91\xea\xf0\xa3I\xba\xc1^\xa1\x1b\xce\xeftZn\xb1m\x1ah\xfa\xe8\xf2z\xb8\x11\xa19Z\x13Y{1\x8a\xa4\xc5LRl(\x91\xf7\xcaI7\x13\xf6\xe4\x1c\xb1\xf6!\xe9;/U~\r\x17\xcd5}J\xcd\x18\xe0\xae\x1a\xca\xdb\x99\x02\x13\xbc\x93\xff\xfe\x82\x90&|\xf4\xf2fI\xbb\xfc\x81m\xc0\x94\xcb\x9a\x0f{\xd3\xa2<\x86g N2\xd8\x8f]NA\x0c?\x8d\x80 S\r\xde\xa6\x87\xd4"W\x9c\xa1\x18p\xbf\xc5e(\x06Bc\x1c\x8e<\xf8D\xb8\xd8\x8b\x88_Q\nh\xb6xW\xd7\xc1l\x08t\xce\xc2\n\x06\xb1\x1b\xe1\x16x\xe6\xb9Q \xba\xdfa\x97\xa9\x9c\xf1\xf3N\x97w\xf8\xfd:!\x93\xa6\xc7\xfc\xcd\xf3\x12\x14\xe5\x8dB\x9d\xe2uY{3\xc8bukA\xfa\x95\xa5\xa3\xcc(-\xf6\\\x9f\x14OD\xef\x0f\x8c\xde\xd0B\'<\xd36hT\xbd\xa0\'\x89\x1f\'\x15`\xbb[\xf8Zx\xdc\xcdx0)\xc2\x8dD-\xa9m\xe3\xd7\x91w\x10\x8aD\xd37+\x8b\xf7\xa7\xa2\x8d{\x0c\xd8\x80\xe1<)lg\xb9\xbfr\x95^)^\x0e\xe5*\xbfGk!5/$01z\xf7\xcf\x86\x1aF\xf2V\x12\xa8w\xad\x070\xf3\x10\x86\xd6\x19\r\xdd\x88\xbe\xc4\xef\xbb\xd2\t,\xa2\xcd9\xbd\x11\x03\xed\xc9X\x98_\x00\xf5\xfa\t<\x9d\xfco/\x84\xca:\x1e\xc6A\xb0\x1f\x8d\x07\x18\x11\\WC\r\x7f\\\xa0\xea\'\xcc\x96\xc7\xd8\x9a\xb4-\r\x88\xc8\x12\x1f\x8b`\n#\x9a\x92\xa9\x86\x85z\x0ctB\xff:\xaf\xbc\xd4F\xcf$R\x8a\x81\xbd\x84\xe03F\x95\xa0\xbb\xdc\xd9\x7f\xc9\x91/\xc3\x9c~m\x9d\xbb\xfd\x8a\x80\xa8\x81\xb1VC\xf5y\x13N\xa6\x1dq\x1bn\xa0\x83\xeaQ\xe4-\xe3m\x99\xcf\xe6\xb2n\xe7\x0e\xea*\x01\xb5\xdb\xf5P\x03\x96\x82\x91\xe9\xa7\x9bm\x9c\x98\xe3j\x85UG\xd9\x0f\xb5\xb47\xd18d\x9f~VL\xa6\x98\xf2.\xf3\x821\xc8\x03\\fP\'\xee\x85\xbf\xdbd\xc1\x023\xf9\xb5D\xda\xe6Y\x0b[\x86\x9b\xbd\x96z\xe67\x05\xba\x1f\xfd\x1f\xb2F\xf2P\xbd<\xd7\xbdUj\xb1@O\xa2}\x02C\xc4\x01eu\x7f%b\xb4\xfc\xe1D\x02\x8f\xbfj\xd7~E\xd5^h\xc8\xc3\xf9\xb3\x1e\xf0\xbb\x02\xfb\x8c\xc4\xc2\xa8&xn)\x08^\xc0H\xbc\x19\xb7-a?N=?\x93\x97\xb2Q\xe0\x04`T\x1bS2\xd8\xbc3d\xef?\x1e\xab\xc2\x82\xcc\xa4\xe7\xd9\xe6\xe2\xd3\xe9Q\x83\x11\xf4\xfb\x82\xa4y\x176\xaf\xf4_\xbf\xa196\xb4\x05B\xc7\xb3\xd2\x0c\x8c\x18\x95\xe1\xba\x97=Y|\x19k\x0c\xf2\xb3\x0fAV\xd1\x04\xeffX\xcd*?\x03S\x92\x0b\x85\x00\x99x+sh\x07\xd2zl\xbbUS\xf0A\x1aS\xa1\x1fFRf\xc6\x9b\x8dV\x85\x14kE\xae\xef\x05\x18Nx\t\xc8K\xd2\xfd1\xc2\xb9H\xde:L\xd5h%c\xa5,$b\xf9\xa2\xce\xa6\xe5X\x11\xb9\x12\xe7\xd6\x1d\x1f\x03\x8e\xba\xc8>=\x8f\xca\xdf\x80U\xce\x16\xb50w\xaes\xa9)\xdd\x863f\xad2\xc6t`\xc1>\x9d;7o\xa6\xef\x08}1S\xb3\xf7\xdf\xa6\xa0@\xae=\xa3\xb8H\x89\x0f\xdd\x7f\xed\xa4\x19\xf5\x94\xc91\xb9B\xca"\x93\xc1\x05&\xbd\x8c\x82\xdf;C\xcb\xd4R\xc8>\xde\xd8j@\x81\xb6\xa7r\xe9\xb5\xb2\xe0\r:\x8d+\x89\xe1\xee\xf5Aj\x8d\xfb\xa0\xd8?\x06\x10D\xcc\xa6?@\'\xc06^\xfa^s\xe6\r\x8d\x1e\x9cv\xd6\xce\xda)Q\x7f\x83\xba\xe0\xc7R\x82\xe9\xbf\xb8\x88\x12\xe7\x13\xc4\xc4/\x8f\x1d\xde\x197\xe8\x9aFe:\xc33\x02\xbc\x85q7\xbc\xde#\x1e\xdb\x7f\xf2#\xda\x80IT,\xc5\xe7\xe7)\x1a\xb0\x0e-\xbe\xf8\x14\xee\xa1\x82\x1c\x99j\xe4}\x84\xb4\xcc\x10\x84\xean\xc8\x9f\xe7=a2\xa7\x84\xa1\x87\x00n\xd7\x9b\xd2\xe8c\xc7\x9f\xca\xbd=\xdch*\x1b\x0f\xceH\x81\xf7\xdc\x1a\x93A\xdbJ\xe3\x936\xe3\xff\xfb!\'\xe3\x1b"\xff\xc6\x1b4\x98\xde\xc1%A3\x16\x7f&\xafM\xdfX\xfb\\\x1d\x91Vp\x19\xcd\xd8\xe3$\x13J\x9c\x89\xbc~\x07O\xac?\x0c\xa6\x80yZ\xef0\xef}\x89BA\xe9k\xfa\xf9P\x97\xe5\x14\xd4+/_\xa6\xba\xf9\x04Ph\xe1\x1a\xb5=\xd6nq\xd8\x13L\x03\xd5\x19V\xd9e&\xdfJ\x99\x90\xca\xc7\x84\xfb\x08H\xa6Y\xc0T[\x87\xbeok\xb4\xeb\xca\xdb\x9d\xcf|\xbdn\x9f\xde\xb10\xecnWc\x80\x18\x07\xfb\x1eYb{Q\x0e\x0f\xfc\xcbE\xcct\xfe\xd7\x8a\xb6\x1a\x17\xba\xeb\xfdG\xdbz\xa8\xe89\xb5[\x0e\x83kO\xdc|\x14\x92\xdc3\nc\x05~e1') >>> >>> assert isinstance(pkt.innerToken.token.mechToken.value.root, GSSAPI_BLOB) >>> assert pkt.innerToken.token.mechToken.value.root.innerToken.TOK_ID == b'\x01\x00' >>> krb = pkt.innerToken.token.mechToken.value.root.innerToken.root >>> assert isinstance(krb, KRB_AP_REQ) >>> assert krb.ticket.sname.nameString == [b"cifs", b"localdc"] ###(017)=[passed] MSPAC - Parse WIN2K-PAC (real life) >>> from scapy.layers.msrpce.mspac import * >>> >>> >>> data = b'\x08\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\xd0\x01\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x12\x00\x00\x00X\x02\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00x\x00\x00\x00p\x02\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\xf0\x00\x00\x00\xe8\x02\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x08\x00\x00\x00\xd8\x03\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x1c\x00\x00\x00\xe0\x03\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x10\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x10\x00\x00\x00\x10\x04\x00\x00\x00\x00\x00\x00\x01\x10\x08\x00\xcc\xcc\xcc\xcc\xc0\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x1f\x1cssC\x96\xd8\x01\xff\xff\xff\xff\xff\xff\xff\x7f\xff\xff\xff\xff\xff\xff\xff\x7fT=pE\xcav\xd8\x01T\xfd\xd9o\x93w\xd8\x01\xff\xff\xff\xff\xff\xff\xff\x7f\x08\x00\x08\x00\x04\x00\x02\x00\x00\x00\x00\x00\x08\x00\x02\x00\x00\x00\x00\x00\x0c\x00\x02\x00\x00\x00\x00\x00\x10\x00\x02\x00\x00\x00\x00\x00\x14\x00\x02\x00\x00\x00\x00\x00\x18\x00\x02\x00F\x00\x00\x00P\x04\x00\x00\x03\x02\x00\x00\x01\x00\x00\x00\x1c\x00\x02\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x08\x00 \x00\x02\x00\x08\x00\n\x00$\x00\x02\x00(\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00,\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00S\x00R\x00V\x00$\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x03\x02\x00\x00\x07\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00D\x00C\x001\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00D\x00O\x00M\x001\x00\x04\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00\xfa*@1\xb2f\xa6\x1c\x11dp\\\x02\x00\x00\x000\x00\x02\x00\x07\x00\x00\x004\x00\x02\x00\x07\x00\x00\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\x01\x00\x00\x01\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x12\x01\x00\x00\x00\x80\xd6^sC\x96\xd8\x01\x08\x00S\x00R\x00V\x00$\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x18\x00\x14\x008\x00\x03\x00\x00\x00\x08\x00P\x00\x1c\x00X\x00\x00\x00\x00\x00S\x00R\x00V\x00$\x00@\x00d\x00o\x00m\x001\x00.\x00l\x00o\x00c\x00a\x00l\x00\x00\x00D\x00O\x00M\x001\x00.\x00L\x00O\x00C\x00A\x00L\x00\x00\x00\x00\x00S\x00R\x00V\x00$\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00\xfa*@1\xb2f\xa6\x1c\x11dp\\P\x04\x00\x00\x00\x00\x00\x00\x01\x10\x08\x00\xcc\xcc\xcc\xcc\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb8\x00\x00\x00\x04\x00\x02\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x01\x10\x08\x00\xcc\xcc\xcc\xcc\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x04\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x08\x00\x02\x00\x01\x00\x00\x00\x0c\x00\x02\x00\x03\x00\x03\x00\x01\x00\x00\x00\x10\x00\x02\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00a\x00d\x00:\x00/\x00/\x00e\x00x\x00t\x00/\x00A\x00u\x00t\x00h\x00e\x00n\x00t\x00i\x00c\x00a\x00t\x00i\x00o\x00n\x00S\x00i\x00l\x00o\x00\x00\x00\x01\x00\x00\x00\x14\x00\x02\x00\x08\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00T\x000\x00-\x00s\x00i\x00l\x00o\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00\xfa*@1\xb2f\xa6\x1c\x11dp\\P\x04\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00d\xb0qv\xf8\xd3X\x0b\x7f4\xfe\xda\x10\x00\x00\x00\x835J\xa7\x80\xb1S\xcez\x8b\xd2\xc2' >>> >>> pkt = PACTYPE(data) >>> assert len(pkt.Buffers) == 8 >>> assert len(pkt.Payloads) == 8 >>> assert [type(x) for x in pkt.Payloads] == [ ... NDRSerialization1Header, ... PAC_CLIENT_INFO, ... UPN_DNS_INFO, ... NDRSerialization1Header, ... PAC_ATTRIBUTES_INFO, ... PAC_REQUESTOR, ... PAC_SIGNATURE_DATA, ... PAC_SIGNATURE_DATA, ... ] >>> >>> assert pkt.Payloads[2].Upn == 'SRV$@dom1.local' >>> assert pkt.Payloads[2].DnsDomainName == 'DOM1.LOCAL' >>> assert pkt.Payloads[2].SamName == 'SRV$' >>> assert pkt.Payloads[2].Sid.summary() == 'S-1-5-21-826288890-480667314-1550869521-1104' >>> >>> assert pkt.Payloads[3].value.Claims.ClaimsSet.value.value[0].value.ClaimsArrays.value.value[0].usClaimsSourceType == 1 >>> claimentry = pkt.Payloads[3].value.Claims.ClaimsSet.value.value[0].value.ClaimsArrays.value.value[0].ClaimEntries.value.value[0] >>> assert claimentry.Id.value.value[0].value == b'ad://ext/AuthenticationSilo' >>> assert claimentry.Values.value.StringValues.value.value[0].value.value[0].value == b'T0-silo' >>> >>> assert pkt.Payloads[4].Flags[0].PAC_WAS_REQUESTED >>> >>> assert pkt.Payloads[5].Sid.summary() == 'S-1-5-21-826288890-480667314-1550869521-1104' >>> >>> assert pkt.Payloads[6].SignatureType == 16 >>> assert pkt.Payloads[6].Signature == b'd\xb0qv\xf8\xd3X\x0b\x7f4\xfe\xda' >>> >>> assert pkt.Payloads[7].SignatureType == 16 >>> assert pkt.Payloads[7].Signature == b'\x835J\xa7\x80\xb1S\xcez\x8b\xd2\xc2' ###(018)=[passed] MSPAC - Parse WIN2K-PAC (MS-PAC sect 3) >>> data = b'0\x82\x05R0\x82\x05N\xa0\x04\x02\x02\x00\x80\xa1\x82\x05D\x04\x82\x05@\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\xb0\x04\x00\x00H\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x12\x00\x00\x00\xf8\x04\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x14\x00\x00\x00\x10\x05\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x14\x00\x00\x00(\x05\x00\x00\x00\x00\x00\x00\x01\x10\x08\x00\xcc\xcc\xcc\xcc\xa0\x04\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xd1\x86f\x0fej\xc6\x01\xff\xff\xff\xff\xff\xff\xff\x7f\xff\xff\xff\xff\xff\xff\xff\x7f\x17\xd49\xfexJ\xc6\x01\x17\x94\xa3(BK\xc6\x01\x17T$\x97z\x81\xc6\x01\x08\x00\x08\x00\x04\x00\x02\x00$\x00$\x00\x08\x00\x02\x00\x12\x00\x12\x00\x0c\x00\x02\x00\x00\x00\x00\x00\x10\x00\x02\x00\x00\x00\x00\x00\x14\x00\x02\x00\x00\x00\x00\x00\x18\x00\x02\x00T\x10\x00\x00\x97y,\x00\x01\x02\x00\x00\x1a\x00\x00\x00\x1c\x00\x02\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00\x18\x00 \x00\x02\x00\n\x00\x0c\x00$\x00\x02\x00(\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00,\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00l\x00z\x00h\x00u\x00\x12\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00L\x00i\x00q\x00i\x00a\x00n\x00g\x00(\x00L\x00a\x00r\x00r\x00y\x00)\x00 \x00Z\x00h\x00u\x00\t\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00n\x00t\x00d\x00s\x002\x00.\x00b\x00a\x00t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x00\x00\x00a\xc43\x00\x07\x00\x00\x00\t\xc3-\x00\x07\x00\x00\x00^\xb42\x00\x07\x00\x00\x00\x01\x02\x00\x00\x07\x00\x00\x00\x97\xb9,\x00\x07\x00\x00\x00+\xf12\x00\x07\x00\x00\x00\xce03\x00\x07\x00\x00\x00\xa7..\x00\x07\x00\x00\x00*\xf12\x00\x07\x00\x00\x00\x98\xb9,\x00\x07\x00\x00\x00b\xc43\x00\x07\x00\x00\x00\x94\x013\x00\x07\x00\x00\x00v\xc43\x00\x07\x00\x00\x00\xae\xfe-\x00\x07\x00\x00\x002\xd2,\x00\x07\x00\x00\x00\x16\x082\x00\x07\x00\x00\x00B[.\x00\x07\x00\x00\x00_\xb42\x00\x07\x00\x00\x00\xca\x9c5\x00\x07\x00\x00\x00\x85D-\x00\x07\x00\x00\x00\xc2\xf02\x00\x07\x00\x00\x00\xe9\xea1\x00\x07\x00\x00\x00\xed\x8e.\x00\x07\x00\x00\x00\xb6\xeb1\x00\x07\x00\x00\x00\xab..\x00\x07\x00\x00\x00r\x0e.\x00\x07\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00N\x00T\x00D\x00E\x00V\x00-\x00D\x00C\x00-\x000\x005\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00N\x00T\x00D\x00E\x00V\x00\x00\x00\x04\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b\r\x00\x00\x000\x00\x02\x00\x07\x00\x00\x004\x00\x02\x00\x07\x00\x00 8\x00\x02\x00\x07\x00\x00 <\x00\x02\x00\x07\x00\x00 @\x00\x02\x00\x07\x00\x00 D\x00\x02\x00\x07\x00\x00 H\x00\x02\x00\x07\x00\x00 L\x00\x02\x00\x07\x00\x00 P\x00\x02\x00\x07\x00\x00 T\x00\x02\x00\x07\x00\x00 X\x00\x02\x00\x07\x00\x00 \\\x00\x02\x00\x07\x00\x00 `\x00\x02\x00\x07\x00\x00 \x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00\xb90\x1b.\xb7ALl\x8c;5\x15\x01\x02\x00\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0btT/\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b\xe882\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b\xcd82\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b]\xb42\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0bA\x165\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b\xe8\xea1\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b\xc1\x192\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b)\xf12\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b\x0f_.\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b/[.\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b\xef\x8f1\x00\x05\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00YQ\xb8\x17fr]%dc;\x0b\x07_.\x00\x00\x00\x00\x00\x00I\xd9\x0eej\xc6\x01\x08\x00l\x00z\x00h\x00u\x00\x00\x00\x00\x00\x00\x00v\xff\xff\xffA\xed\xce\x9a4\x81]:\xef{\xc9\x88t\x80]%\x00\x00\x00\x00v\xff\xff\xff\xf7\xa54\xda\xb2\xc0)\x86\xef\xe0\xfb\xe5\x11\nO2\x00\x00\x00\x00' >>> >>> pkt = AuthorizationData(data) >>> >>> assert isinstance(pkt.seq[0].adData.Payloads[0], NDRSerialization1Header) >>> k = pkt.seq[0].adData.Payloads[0].value >>> assert isinstance(k, KERB_VALIDATION_INFO) >>> assert k.EffectiveName.Buffer.value.value[0].value == b'lzhu' >>> assert k.LogonDomainName.Buffer.value.value[0].value == b"NTDEV" >>> assert "S%s" % "-".join(str(x) for x in k.LogonDomainId.value.SubAuthority) == 'S21-397955417-626881126-188441444' >>> assert len(k.ExtraSids.value.value) == 13 >>> assert [x.RelativeId for x in k.GroupIds.value.value] == [3392609, 2999049, 3322974, 513, 2931095, 3338539, 3354830, 3026599, 3338538, 2931096, 3392610, 3342740, 3392630, 3014318, 2937394, 3278870, 3038018, 3322975, 3513546, 2966661, 3338434, 3271401, 3051245, 3271606, 3026603, 3018354] >>> >>> >>> assert isinstance(pkt.seq[0].adData.Payloads[1], PAC_CLIENT_INFO) >>> assert pkt.seq[0].adData.Payloads[1].Name == 'lzhu' >>> >>> assert isinstance(pkt.seq[0].adData.Payloads[2], PAC_SIGNATURE_DATA) >>> assert len(pkt.seq[0].adData.Payloads[2].Signature) == 16 >>> >>> assert isinstance(pkt.seq[0].adData.Payloads[3], PAC_SIGNATURE_DATA) >>> assert pkt.seq[0].adData.Payloads[3].Signature == b'\xf7\xa54\xda\xb2\xc0)\x86\xef\xe0\xfb\xe5\x11\nO2' ###(019)=[passed] MSPAC - Build WIN2K-PAC (MS-PAC sect 3) >>> pkt = PACTYPE( ... Buffers=[ ... PAC_INFO_BUFFER(ulType=1, cbBufferSize=1200, Offset=72), ... PAC_INFO_BUFFER(ulType=10, cbBufferSize=18, Offset=1272), ... PAC_INFO_BUFFER(ulType=6, cbBufferSize=20, Offset=1296), ... PAC_INFO_BUFFER(ulType=7, cbBufferSize=20, Offset=1320), ... ], ... Payloads=[ ... NDRSerialization1Header( ... Version=1, ... Endianness=16, ... CommonHeaderLength=8, ... Filler=3435973836, ... ) ... / NDRSerialization1PrivateHeader(ObjectBufferLength=1184, Filler=0) ... / NDRPointer( ... referent_id=131072, ... value=KERB_VALIDATION_INFO( ... LogonTime=FILETIME(dwLowDateTime=258377425, dwHighDateTime=29780581), ... LogoffTime=FILETIME( ... dwLowDateTime=4294967295, dwHighDateTime=2147483647 ... ), ... KickOffTime=FILETIME( ... dwLowDateTime=4294967295, dwHighDateTime=2147483647 ... ), ... PasswordLastSet=FILETIME( ... dwLowDateTime=4265202711, dwHighDateTime=29772408 ... ), ... PasswordCanChange=FILETIME( ... dwLowDateTime=681808919, dwHighDateTime=29772610 ... ), ... PasswordMustChange=FILETIME( ... dwLowDateTime=2535740439, dwHighDateTime=29786490 ... ), ... EffectiveName=RPC_UNICODE_STRING( ... Length=8, ... MaximumLength=8, ... Buffer=NDRPointer( ... referent_id=131076, ... value=NDRConformantArray( ... max_count=4, ... value=[ ... NDRVaryingArray(offset=0, actual_count=4, value=b"lzhu") ... ], ... ), ... ), ... ), ... FullName=RPC_UNICODE_STRING( ... Length=36, ... MaximumLength=36, ... Buffer=NDRPointer( ... referent_id=131080, ... value=NDRConformantArray( ... max_count=18, ... value=[ ... NDRVaryingArray( ... offset=0, ... actual_count=18, ... value=b"Liqiang(Larry) Zhu", ... ) ... ], ... ), ... ), ... ), ... LogonScript=RPC_UNICODE_STRING( ... Length=18, ... MaximumLength=18, ... Buffer=NDRPointer( ... referent_id=131084, ... value=NDRConformantArray( ... max_count=9, ... value=[ ... NDRVaryingArray( ... offset=0, ... actual_count=9, ... value=b"ntds2.bat", ... ) ... ], ... ), ... ), ... ), ... ProfilePath=RPC_UNICODE_STRING( ... Length=0, ... MaximumLength=0, ... Buffer=NDRPointer( ... referent_id=131088, ... value=NDRConformantArray( ... max_count=0, ... value=[ ... NDRVaryingArray(offset=0, actual_count=0, value=b"") ... ], ... ), ... ), ... ), ... HomeDirectory=RPC_UNICODE_STRING( ... Length=0, ... MaximumLength=0, ... Buffer=NDRPointer( ... referent_id=131092, ... value=NDRConformantArray( ... max_count=0, ... value=[ ... NDRVaryingArray(offset=0, actual_count=0, value=b"") ... ], ... ), ... ), ... ), ... HomeDirectoryDrive=RPC_UNICODE_STRING( ... Length=0, ... MaximumLength=0, ... Buffer=NDRPointer( ... referent_id=131096, ... value=NDRConformantArray( ... max_count=0, ... value=[ ... NDRVaryingArray(offset=0, actual_count=0, value=b"") ... ], ... ), ... ), ... ), ... UserSessionKey=USER_SESSION_KEY( ... data=[ ... CYPHER_BLOCK(data=b"\x00\x00\x00\x00\x00\x00\x00\x00"), ... CYPHER_BLOCK(data=b"\x00\x00\x00\x00\x00\x00\x00\x00"), ... ] ... ), ... LogonServer=RPC_UNICODE_STRING( ... Length=22, ... MaximumLength=24, ... Buffer=NDRPointer( ... referent_id=131104, ... value=NDRConformantArray( ... max_count=12, ... value=[ ... NDRVaryingArray( ... offset=0, ... actual_count=11, ... value=b"NTDEV-DC-05", ... ) ... ], ... ), ... ), ... ), ... LogonDomainName=RPC_UNICODE_STRING( ... Length=10, ... MaximumLength=12, ... Buffer=NDRPointer( ... referent_id=131108, ... value=NDRConformantArray( ... max_count=6, ... value=[ ... NDRVaryingArray( ... offset=0, actual_count=5, value=b"NTDEV" ... ) ... ], ... ), ... ), ... ), ... Reserved1=[0, 0], ... Reserved3=[0, 0, 0, 0, 0, 0, 0], ... LogonCount=4180, ... BadPasswordCount=0, ... UserId=2914711, ... PrimaryGroupId=513, ... GroupCount=26, ... GroupIds=NDRPointer( ... referent_id=131100, ... value=NDRConformantArray( ... max_count=26, ... value=[ ... GROUP_MEMBERSHIP(RelativeId=3392609, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=2999049, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3322974, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=513, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=2931095, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3338539, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3354830, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3026599, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3338538, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=2931096, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3392610, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3342740, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3392630, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3014318, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=2937394, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3278870, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3038018, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3322975, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3513546, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=2966661, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3338434, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3271401, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3051245, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3271606, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3026603, Attributes=7), ... GROUP_MEMBERSHIP(RelativeId=3018354, Attributes=7), ... ], ... ), ... ), ... UserFlags=32, ... LogonDomainId=NDRPointer( ... referent_id=131112, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[21, 397955417, 626881126, 188441444], ... max_count=4, ... Revision=1, ... SubAuthorityCount=4, ... ), ... ), ... UserAccountControl=16, ... SidCount=13, ... ExtraSids=NDRPointer( ... referent_id=131116, ... value=NDRConformantArray( ... max_count=13, ... value=[ ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131120, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 773533881, ... 1816936887, ... 355810188, ... 513, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=7, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131124, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3101812, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131128, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3291368, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131132, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3291341, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131136, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3322973, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131140, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3479105, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131144, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3271400, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131148, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3283393, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131152, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3338537, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131156, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3038991, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131160, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3037999, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131164, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3248111, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... KERB_SID_AND_ATTRIBUTES( ... Sid=NDRPointer( ... referent_id=131168, ... value=SID( ... IdentifierAuthority=RPC_SID_IDENTIFIER_AUTHORITY( ... Value=b"\x00\x00\x00\x00\x00\x05" ... ), ... SubAuthority=[ ... 21, ... 397955417, ... 626881126, ... 188441444, ... 3038983, ... ], ... max_count=5, ... Revision=1, ... SubAuthorityCount=5, ... ), ... ), ... Attributes=536870919, ... ), ... ], ... ), ... ), ... ResourceGroupDomainSid=None, ... ResourceGroupCount=0, ... ResourceGroupIds=None, ... ), ... ) ... / Padding(), ... PAC_CLIENT_INFO(ClientId=127906621700000000, NameLength=8, Name="lzhu"), ... PAC_SIGNATURE_DATA( ... SignatureType=4294967158, ... Signature=b"A\xed\xce\x9a4\x81]:\xef{\xc9\x88t\x80]%", ... RODCIdentifier=b"", ... ), ... PAC_SIGNATURE_DATA( ... SignatureType=4294967158, ... Signature=b"\xf7\xa54\xda\xb2\xc0)\x86\xef\xe0\xfb\xe5\x11\nO2", ... RODCIdentifier=b"", ... ), ... ], ... cBuffers=4, ... Version=0, ... ) >>> >>> assert raw(pkt) == data[22:] ###(020)=[passed] MSPAC - Dissect and rebuild UPN_DNS_INFO >>> from scapy.layers.msrpce.mspac import UPN_DNS_INFO >>> >>> data = b'4\x00\x18\x00\x18\x00P\x00\x03\x00\x00\x00\x1a\x00h\x00\x1c\x00\x88\x00\x00\x00\x00\x00A\x00d\x00m\x00i\x00n\x00i\x00s\x00t\x00r\x00a\x00t\x00o\x00r\x00@\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\x00\x00\x00\x00D\x00O\x00M\x00A\x00I\x00N\x00.\x00L\x00O\x00C\x00A\x00L\x00A\x00d\x00m\x00i\x00n\x00i\x00s\x00t\x00r\x00a\x00t\x00o\x00r\x00\x00\x00\x00\x00\x00\x00\x01\x05\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00\xfe\x00\xb0r\x02\n\xa6\xdd\xa9\xa4e\x02\xf4\x01\x00\x00\x00\x00\x00\x00' >>> >>> pkt = UPN_DNS_INFO(data) >>> >>> assert pkt.Upn == 'Administrator@domain.local' >>> assert pkt.DnsDomainName == 'DOMAIN.LOCAL' >>> assert pkt.SamName == 'Administrator' >>> assert pkt.Sid.summary() == 'S-1-5-21-1924137214-3718646274-40215721-500' >>> assert isinstance(pkt.payload, Raw) and pkt.load == b"\x00\x00\x00\x00" >>> >>> pkt.clear_cache() >>> assert bytes(pkt) == data ###### ## Build a CLAIMS_SET to test size_of ###### ###(021)=[passed] MSPAC - Construct a CLAIMS_SET object >>> from scapy.layers.msrpce.mspac import * >>> >>> claimSet = CLAIMS_SET( ... ClaimsArrays=[ ... CLAIMS_ARRAY( ... usClaimsSourceType=1, ... ClaimEntries=[ ... CLAIM_ENTRY( ... Id="ad://ext/AuthenticationSilo", ... Type=3, ... Values=NDRUnion( ... tag=3, ... value=CLAIM_ENTRY_sub2( ... StringValues=["T0-silo"], ... ), ... ), ... ) ... ], ... ) ... ], ... usReservedType=0, ... ulReservedFieldSize=0, ... ReservedField=None, ... ) ###(022)=[passed] MSPAC - Check that Pointers, Arrays, etc. were inferred >>> assert isinstance(claimSet.ClaimsArrays, NDRPointer) >>> assert isinstance(claimSet.ClaimsArrays.value, NDRConformantArray) >>> assert isinstance(claimSet.ClaimsArrays.value.value[0].ClaimEntries, NDRPointer) >>> assert isinstance(claimSet.ClaimsArrays.value.value[0].ClaimEntries.value, NDRConformantArray) >>> assert isinstance(claimSet.valueof("ClaimsArrays")[0].valueof("ClaimEntries")[0].Values, NDRUnion) >>> assert isinstance(claimSet.valueof("ClaimsArrays")[0].valueof("ClaimEntries")[0].Values.value.StringValues, NDRPointer) >>> assert isinstance(claimSet.valueof("ClaimsArrays")[0].valueof("ClaimEntries")[0].Values.value.StringValues.value, NDRConformantArray) >>> assert isinstance(claimSet.valueof("ClaimsArrays")[0].valueof("ClaimEntries")[0].Values.value.StringValues.value.value[0], NDRPointer) >>> assert isinstance(claimSet.valueof("ClaimsArrays")[0].valueof("ClaimEntries")[0].Values.value.StringValues.value.value[0].value, NDRConformantArray) >>> assert isinstance(claimSet.valueof("ClaimsArrays")[0].valueof("ClaimEntries")[0].Values.value.StringValues.value.value[0].value.value[0], NDRVaryingArray) >>> assert claimSet.valueof("ClaimsArrays")[0].valueof("ClaimEntries")[0].valueof("Values").valueof("StringValues")[0] == b'T0-silo' ###(023)=[passed] MSPAC - Build the packet >>> assert bytes(claimSet) == b'\x01\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\x00\x02\x00\x03\x00\x03\x00\x01\x00\x00\x00\x00\x00\x02\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00a\x00d\x00:\x00/\x00/\x00e\x00x\x00t\x00/\x00A\x00u\x00t\x00h\x00e\x00n\x00t\x00i\x00c\x00a\x00t\x00i\x00o\x00n\x00S\x00i\x00l\x00o\x00\x00\x00\x01\x00\x00\x00\x00\x00\x02\x00\x08\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00T\x000\x00-\x00s\x00i\x00l\x00o\x00\x00\x00' ###(024)=[passed] MSPAC - Dissect the packet >>> claimSet = CLAIMS_SET(bytes(claimSet), ndr64=False) >>> >>> assert claimSet.ClaimsArrays.value.value[0].ClaimEntries.value.value[0].Id.value.value[0].value == b'ad://ext/AuthenticationSilo' >>> assert claimSet.ClaimsArrays.value.value[0].ClaimEntries.value.value[0].Type == 3 >>> assert claimSet.ClaimsArrays.value.value[0].ClaimEntries.value.value[0].Values.value.ValueCount == 1 >>> assert claimSet.valueof("ClaimsArrays")[0].valueof("ClaimEntries")[0].valueof("Values").valueof("StringValues")[0] == b'T0-silo' ###### ## Ticketer++ tests ###### ###(025)=[passed] Ticketer++ - Load ticketer module >>> from scapy.modules.ticketer import * ###(026)=[passed] Ticketer++ - Write ccache to disk >>> from scapy.utils import get_temp_file >>> >>> CCACHE_DATA = bytes.fromhex("0504000c00010008ffffffff0000000000000001000000010000000c444f4d41494e2e4c4f43414c0000000d41646d696e6973747261746f7200000001000000010000000c444f4d41494e2e4c4f43414c0000000d41646d696e6973747261746f7200000002000000020000000c444f4d41494e2e4c4f43414c000000066b72627467740000000c444f4d41494e2e4c4f43414c0012000000208b4226a190866cbe345ae5e668823edd5359cb00bd479a6428bc8feb1ba55752633332fa633332fa6333bf9a633484770050e100000000000000000000000004486182044430820440a003020105a10e1b0c444f4d41494e2e4c4f43414ca221301fa003020102a11830161b066b72627467741b0c444f4d41494e2e4c4f43414ca382040430820400a003020112a103020102a28203f2048203ee662c2aefcca3f8c78de38e1af1d63b18de011d864d9bec12f3c11e20b0bbdc46e6f5c8311b331b1cc27b23193e90fa47ba7aa6a67fba5826a1f4754ea5050eeab2e07d07a3ec1029b2a11e058ce31e48f4de2bce017e9c2915ee40ffa0f7109597088286fa290fe6ca777465162c5757a67cc53a8e3204846a4ca9cff30c8073d1e9e735b5eb22717f9777c2f38fb13d204952db15e4f160e26535f596f3ce64f9a8d96011718d0405650d7f7c728f87dd2d0e220e4610347faa8a45099b63a351f5adcfccf669d9b6112e31881af869561294a21eb6e2b164b8ce6c6c7b0327ec6c71c23784b06c19030a3f81119f377cb6f0395b5477bffbc5c1a2264ec4af76f4b39a4e2f7030d48c8ebbcaf212036ea0a5abdd5da91fcdc3fb9700d5379f03fbc9fe3a47078dae30b05a418f46ee9ea25f520eb7e67b53d96f7f486e5878b22ea8f4215137a7dcf7f4b6f50463715d9d3c544f294420ed0f7426955fa0a527efce86264f7c29bdfc2cee2c3eb227eb4b7651eb8008e0eb269446a45488296b0427f82b959ad070146cd8a9aed9ef236815bd2149f3f86d73227584f294dc86cf4a77e4eeabf98f4f342dbfc4beb46d834b0c3103d8c5964cad4852eed365ca8e50937e21976122d5cde18c5ab6dd5528c3a680c0a219711766dd5b6a3c103ae65ad5f573a31543a0ebcefde1749062951030f63907cde092010c22c90763248c9f6cd03a6f0a7cb9a7b7441bc7de4c40c1d749373afee597a52c9dbe7533d7ba24a3a26df29474b93643eed97f6b8ffd13976869844841bdd364f2454d6e3ce1ae677ec01c592c25b50e120303240ddaac82dfa9d63b1c42c239b78a6c4ebba2b6458b924931c52b223b9c9cfd6cf0f083e6239e30747f1302de8bde94fe8756b5e0118f5ed61dccc3862ddbc93f103c3160ac15858cbe330420d6e07e2c9f242c2caf8f04d83f3cd71f404c1d56814c9e2aa787763abc295334299487f454e4b4eb5f0e7c3cf5e377374acf827c9fe255e1c7cdb13129ef07c731164ee4eed503f735829a8b7cc2e3718db23d85838fbf7a43861a1c8f890e4c33437b65749946b46f6cff1767158f5684b035f2ea086f7b564f6a57050714b4cad5165b72be6f7a6820b2e9f8936506147e64a77a2f9cf9c13fe4fd59b83191898101068a003e6f7f918006616204ff4b18a9bf495497ba0df0dfcbb89a5e643c60637667357fcf1d97b424240ea75fcf0d26bb159055107f80d1bc682c9057f22a3ef5fb0f50adb30ba975b25069d393bf7eb2522f230912ac1e64bba93c91aa760abb1209bb1313e38dddebcac325d27bef99d66045c09799b71020a44f64bbb59c405449304fd95b8d6bdc6d17e476cba188f30ad04bb6c91d91b028b0953986929a9fb42b21f73028c8ba1f416c70630000000000000001000000010000000c444f4d41494e2e4c4f43414c0000000d41646d696e6973747261746f7200000000000000030000000c582d4341434845434f4e463a000000156b7262355f6363616368655f636f6e665f646174610000000770615f74797065000000206b72627467742f444f4d41494e2e4c4f43414c40444f4d41494e2e4c4f43414c0000000000000000000000000000000000000000000000000000000000000000000000000000013200000000") >>> KRBTGT = bytes.fromhex("6df5a9a90cb076f4d232a123d9c24f46ae11590a5430710bc1881dca337989ce") >>> >>> TICKETER_TEMPFILE = get_temp_file() >>> >>> with open(TICKETER_TEMPFILE, "wb") as fd: ... fd.write(CCACHE_DATA) ... 1500 ###(027)=[passed] Ticketer++ - Create and load Ticketer object >>> t = Ticketer() >>> t.open_file(TICKETER_TEMPFILE) ###(028)=[passed] Ticketer++ - Get ticket 0, change it, resign it and set it back >>> from unittest import mock >>> >>> def fake_random(x): ... # wow, impressive entropy ... return b"0" * x ... >>> with mock.patch('scapy.libs.rfc3961.os.urandom', side_effect=fake_random): ... tkt = t.dec_ticket(0, hash=KRBTGT) ... assert tkt.renewTill.val == '20220928172927Z' ... tkt.renewTill.val = '20220930172927Z' ... t.update_ticket(0, tkt, resign=True, hash=KRBTGT, kdc_hash=KRBTGT) ... ###(029)=[passed] Ticketer++ - Call show() >>> with ContextManagerCaptureOutput() as cmco: ... t.show(utc=True) ... outp = cmco.get_output().strip() ... >>> print(outp) Tickets: 0. Administrator@DOMAIN.LOCAL -> krbtgt/DOMAIN.LOCAL@DOMAIN.LOCAL canonicalize+pre-authent+initial+renewable+proxiable+forwardable Start time End time Renew until Auth time 27/09/22 17:29:30 28/09/22 03:29:30 30/09/22 17:29:27 27/09/22 17:29:30 >>> >>> assert outp == """ ... Tickets: ... 0. Administrator@DOMAIN.LOCAL -> krbtgt/DOMAIN.LOCAL@DOMAIN.LOCAL ... canonicalize+pre-authent+initial+renewable+proxiable+forwardable ... Start time End time Renew until Auth time ... 27/09/22 17:29:30 28/09/22 03:29:30 30/09/22 17:29:27 27/09/22 17:29:30 ... """.strip() ###(030)=[passed] Ticketer++ - Save to disk >>> t.save() 1500 ###(031)=[passed] Ticketer++ - Read and check written ccache >>> EXPECTED_CCACHE_DATA = bytes.fromhex("0504000c00010008ffffffff0000000000000001000000010000000c444f4d41494e2e4c4f43414c0000000d41646d696e6973747261746f7200000001000000010000000c444f4d41494e2e4c4f43414c0000000d41646d696e6973747261746f7200000002000000020000000c444f4d41494e2e4c4f43414c000000066b72627467740000000c444f4d41494e2e4c4f43414c0012000000208b4226a190866cbe345ae5e668823edd5359cb00bd479a6428bc8feb1ba55752633332fa633332fa6333bf9a633727770050e100000000000000000000000004486182044430820440a003020105a10e1b0c444f4d41494e2e4c4f43414ca221301fa003020102a11830161b066b72627467741b0c444f4d41494e2e4c4f43414ca382040430820400a003020112a103020102a28203f2048203eed3d1adb3a09042173463eb0ef195beb666adbaa83193905697db7340daa9fc6cd3450280651effddc129b3761d49569f3c384e450db9ef094b4619d2036126a0b1b44c983e46664ee28cdb8fc33b52d14d2a8357f6c37b31bec5074ee6ee5ab74a896460c767411d0532c6cb69e0da698054ef8f8bf87fb9e8d2d289ec1b22d1ec602ce71c80b98a14aff448374054d4987c0bd13127914a0191d93c3440b5209c4f2190c80d21e064e6f71ab269ab9c0dbf6533e8e29068a3c686b6377d3c79c902818f12a400eabd8f8bb35bce837e9cb0a4413db223bf22e13bee81eb6a4170ae863fd7082db8dac81b70f96c7880c6d5f8350209aa090b75f6343635ba01e9fafdc7700ee84bd9ae0497517ce69b89e44b3933ea3b1a6c36bd38699eba195bb22f0e694b9e952fc187cf7ee5e02b05ec2397e76c217da3c328eeccf5d4ffbe77a765127fc2828e5c8edc1987cb7fbfcfecbb308f4858f711c52ada9c3622dd43d47c29b30630ecf51b9e88cefcf06cb7862922c36a81ae09ec9f62f406f6d4a269cec849a2fe872a16026dce242c775870d827450700c9defdd204342ea1e7d72c5b1c8d92b0318f298898b19a2c705722837c2ff569fc796d55b779950be0db9955d57d349c7d7688b81b9219e376098a2902e23cd01d7bf7734089ab08bc30a7fd2d138aea4454084e3e14d76119e2ef4da6fff3b5758c58efe2904491f6dd57a7eb777aa847783b6ef905c8c796889e6d7e89952a2cef7f99d09405a07b6897291d13eb3a0c4280601b4f4d5cbd00a0125fb87eeb522cd90a8b046163c076a61115e1affe3e362700d984747f1372c92beeb3e1ce4b97ceac032ac8988c536a9594f9032463750f78ca30161e4910d8ff3810d7d4da60d90fded2fcda92a4d6a7b776ba82370130807a30ab0b648f50537453de6c575cc6c98847ae1aa342c3b324005c3988e6cfb161b5b39153cdbd7a305c4cc0949e47197673cd72c29f41f383a7c2b241bd0e70d736f6e342b88128cc38f964588aa32b860dd788a43fb91d4d934401434d6d9e6c622e58a9d99e02331ca642cd9c435305ddbf949751b8c2617489a4cefe376920b7803d493e61d4fdc41f2f6fe50bf5919ede1295eaab25db71aa6e98bbc80a32d7acc24f9cc9b651cb72d22b17031a1d03fd9166c5f488924689aa4859094b42b72c4bf467a1fdb826289bde90035aff2322c68a34b350b0b3b2818c656701b359cbfdb7eb5665439a4deb2cc95bacc358a693f2d0e31975653665fdc468d627c6eee589bbc46bd019a70e394c90529abe646105623c43956c86bf366e4be1f3560b2e4ca01f1e25432618573a9f257890a435e899724eebd9fd271abefeae2f0a55f3abb4619b9ded206bf70ac3b77622d114309e49bb42d01e8c8678765ab4b80000000000000001000000010000000c444f4d41494e2e4c4f43414c0000000d41646d696e6973747261746f7200000000000000030000000c582d4341434845434f4e463a000000156b7262355f6363616368655f636f6e665f646174610000000770615f74797065000000206b72627467742f444f4d41494e2e4c4f43414c40444f4d41494e2e4c4f43414c0000000000000000000000000000000000000000000000000000000000000000000000000000013200000000") >>> >>> with open(TICKETER_TEMPFILE, "rb") as fd: ... RESULT = fd.read() ... >>> print(RESULT.hex()) 0504000c00010008ffffffff0000000000000001000000010000000c444f4d41494e2e4c4f43414c0000000d41646d696e6973747261746f7200000001000000010000000c444f4d41494e2e4c4f43414c0000000d41646d696e6973747261746f7200000002000000020000000c444f4d41494e2e4c4f43414c000000066b72627467740000000c444f4d41494e2e4c4f43414c0012000000208b4226a190866cbe345ae5e668823edd5359cb00bd479a6428bc8feb1ba55752633332fa633332fa6333bf9a633727770050e100000000000000000000000004486182044430820440a003020105a10e1b0c444f4d41494e2e4c4f43414ca221301fa003020102a11830161b066b72627467741b0c444f4d41494e2e4c4f43414ca382040430820400a003020112a103020102a28203f2048203eed3d1adb3a09042173463eb0ef195beb666adbaa83193905697db7340daa9fc6cd3450280651effddc129b3761d49569f3c384e450db9ef094b4619d2036126a0b1b44c983e46664ee28cdb8fc33b52d14d2a8357f6c37b31bec5074ee6ee5ab74a896460c767411d0532c6cb69e0da698054ef8f8bf87fb9e8d2d289ec1b22d1ec602ce71c80b98a14aff448374054d4987c0bd13127914a0191d93c3440b5209c4f2190c80d21e064e6f71ab269ab9c0dbf6533e8e29068a3c686b6377d3c79c902818f12a400eabd8f8bb35bce837e9cb0a4413db223bf22e13bee81eb6a4170ae863fd7082db8dac81b70f96c7880c6d5f8350209aa090b75f6343635ba01e9fafdc7700ee84bd9ae0497517ce69b89e44b3933ea3b1a6c36bd38699eba195bb22f0e694b9e952fc187cf7ee5e02b05ec2397e76c217da3c328eeccf5d4ffbe77a765127fc2828e5c8edc1987cb7fbfcfecbb308f4858f711c52ada9c3622dd43d47c29b30630ecf51b9e88cefcf06cb7862922c36a81ae09ec9f62f406f6d4a269cec849a2fe872a16026dce242c775870d827450700c9defdd204342ea1e7d72c5b1c8d92b0318f298898b19a2c705722837c2ff569fc796d55b779950be0db9955d57d349c7d7688b81b9219e376098a2902e23cd01d7bf7734089ab08bc30a7fd2d138aea4454084e3e14d76119e2ef4da6fff3b5758c58efe2904491f6dd57a7eb777aa847783b6ef905c8c796889e6d7e89952a2cef7f99d09405a07b6897291d13eb3a0c4280601b4f4d5cbd00a0125fb87eeb522cd90a8b046163c076a61115e1affe3e362700d984747f1372c92beeb3e1ce4b97ceac032ac8988c536a9594f9032463750f78ca30161e4910d8ff3810d7d4da60d90fded2fcda92a4d6a7b776ba82370130807a30ab0b648f50537453de6c575cc6c98847ae1aa342c3b324005c3988e6cfb161b5b39153cdbd7a305c4cc0949e47197673cd72c29f41f383a7c2b241bd0e70d736f6e342b88128cc38f964588aa32b860dd788a43fb91d4d934401434d6d9e6c622e58a9d99e02331ca642cd9c435305ddbf949751b8c2617489a4cefe376920b7803d493e61d4fdc41f2f6fe50bf5919ede1295eaab25db71aa6e98bbc80a32d7acc24f9cc9b651cb72d22b17031a1d03fd9166c5f488924689aa4859094b42b72c4bf467a1fdb826289bde90035aff2322c68a34b350b0b3b2818c656701b359cbfdb7eb5665439a4deb2cc95bacc358a693f2d0e31975653665fdc468d627c6eee589bbc46bd019a70e394c90529abe646105623c43956c86bf366e4be1f3560b2e4ca01f1e25432618573a9f257890a435e899724eebd9fd271abefeae2f0a55f3abb4619b9ded206bf70ac3b77622d114309e49bb42d01e8c8678765ab4b80000000000000001000000010000000c444f4d41494e2e4c4f43414c0000000d41646d696e6973747261746f7200000000000000030000000c582d4341434845434f4e463a000000156b7262355f6363616368655f636f6e665f646174610000000770615f74797065000000206b72627467742f444f4d41494e2e4c4f43414c40444f4d41494e2e4c4f43414c0000000000000000000000000000000000000000000000000000000000000000000000000000013200000000 >>> >>> assert RESULT == EXPECTED_CCACHE_DATA ###(032)=[passed] Ticketer++ - Import ticket >>> TKT = KRB_Ticket(bytes.fromhex("618204b3308204afa003020105a10e1b0c444f4d41494e2e4c4f43414ca221301fa003020102a11830161b066b72627467741b0c444f4d41494e2e4c4f43414ca38204733082046fa003020112a103020103a28204610482045dbd10c11e1def682dc3607c98db0806acf2809a1f8c73fda44f86c14bd039c4c95a41ed400ac4e558970c51316ffdf34bd695a636bcb1e5074419d083e918085ec56ff77af9f6a410faff3b9859a635184486c83521b5390ec724185057e3e62843a92d9ba500dd24d9ebeff0654fe459cf35d9607b11f7c35bf6ba4dd378fd5c99554650296abcc374c3ff2fcf807038848f351e9134f69726b5e92aec99e4aa99613c35609b0094b533811513e9ba48b9113f0f2b4dbcf9e05a6668c998c09f65ae48c8ea1b7fbc62b5cbbec7decc0a4832df93aec08c138a63621f8c584a8530a380b54b37fdb8dda6924e4260710cf8b66c71479dcb6916790c5c582b9953cab7085178e280d182a74f93fcd3bc83a0dc26284551a4d230a50a8b341de132fdf0f97bb7abdec48021e04c3deda89897c684d5603636bd66842ed4b2586f8e09fbb5e0228bcce3e5ffc82e5674f16a65a4f1b7b17b3854a5465734a5fec573c54526f27b9ea8a64646f01268b040d09f2acda82a37fb195cb24f8c1092919574999fd61d859aed2af5a9457a20a72e6188c0d813cb12713779f84f7bed298e2cd793b06e639d859b4fb3a5f746e2023bcf0627a8a87425899aa3a9b63f558965eccabc35330562b055426e2fc6808c456ee8f047d09a7021b6a4f2547cde6552224b294750efd492ea0745035f76a394d5b6e26442e5542b4d557722ee21b70c05567241ed97dffb31502d950c50462f478fccd8454ec38424688e87c4428c3763b369f1b51509ef36548dcf7a5c842475aa65bec10d6f86cecd90e4694f36d68052b55a2715c00e269c215071311482118ed0168fabb3053ad59dcdf42a42502685cdfcc679d2272dd12ab658ff8588b34cb48b3aef4a1961694ab2b31a812a683015ed343a8c21498997b0ded3767f73e069c9633845b582d6f1a987d6b09d31b330a3cbf2c430fb6f5d6fa27f83d9624b7bb8cebc248933b68dbe1b6b2822b96621159d9249ded893cbedcf1fc5ee77cb69695852170b24ea2f36aa898a24212b2edf84459a4381bd243797b9a3281d7e1b280f6add79dbb1cc5d887178d0813549a168a38be441bb387764098c4e7bed81f7973ee19e733767a4dd05212a18b12c838c674c18b0d6304a28be3de7928ffdd1449d297884c6a6a574b13a0d289425c1ebf37c5af56d04753fcc0c02fdcc98427fb9aa33510905ba2b6746a8b59742e4243f6fba814585b122794a54aecba3ea956a0c85fded2582cb4809ee7be471253f0256503636e81f35df38b177c3c071677e1dd9efa6b10c6a122ab0522f2b10e8b625355f5c1e7996c7055237182691ede31a5e602966f90c2a66bdf997872dbdc97155d723bc1fb187bd0f42cbcdedbe2c5717d13e27e2134ac6cd9d3a53cd215344a8278065da4eea7544860eda5fdb41f849ff7c1db775f7a0a62d2875b43b55bc091e8056666507dfcaded40a83211db7a5856d4c9b5e2ef862830cef8a4c36ce034e9a9e11f558f008cdbe4152081c30dae53b6de44e1703236490cfc87be9e96fa0679f87255069994a262d61d57be0382fe9e570")) >>> >>> t = Ticketer() >>> t.import_krb(TKT, hash=bytes.fromhex("dd4e16dbcfe19d82cb6fc9b593bb7449c1d8a46687dc20c295ed0e51cc4c3d0d")) >>> >>> tkt, _, upn, spn = t.export_krb(0) >>> hexdiff(tkt, TKT) Complexity is a bit high. hexdiff will take a few seconds. 0000 0000 61 82 04 B3 30 82 04 AF A0 03 02 01 05 A1 0E 1B a...0........... 0010 0010 0C 44 4F 4D 41 49 4E 2E 4C 4F 43 41 4C A2 21 30 .DOMAIN.LOCAL.!0 0020 0020 1F A0 03 02 01 02 A1 18 30 16 1B 06 6B 72 62 74 ........0...krbt 0030 0030 67 74 1B 0C 44 4F 4D 41 49 4E 2E 4C 4F 43 41 4C gt..DOMAIN.LOCAL 0040 0040 A3 82 04 73 30 82 04 6F A0 03 02 01 12 A1 03 02 ...s0..o........ 0050 0050 01 03 A2 82 04 61 04 82 04 5D BD 10 C1 1E 1D EF .....a...]...... 0060 0060 68 2D C3 60 7C 98 DB 08 06 AC F2 80 9A 1F 8C 73 h-.`|..........s 0070 0070 FD A4 4F 86 C1 4B D0 39 C4 C9 5A 41 ED 40 0A C4 ..O..K.9..ZA.@.. 0080 0080 E5 58 97 0C 51 31 6F FD F3 4B D6 95 A6 36 BC B1 .X..Q1o..K...6.. 0090 0090 E5 07 44 19 D0 83 E9 18 08 5E C5 6F F7 7A F9 F6 ..D......^.o.z.. 00a0 00a0 A4 10 FA FF 3B 98 59 A6 35 18 44 86 C8 35 21 B5 ....;.Y.5.D..5!. 00b0 00b0 39 0E C7 24 18 50 57 E3 E6 28 43 A9 2D 9B A5 00 9..$.PW..(C.-... 00c0 00c0 DD 24 D9 EB EF F0 65 4F E4 59 CF 35 D9 60 7B 11 .$....eO.Y.5.`{. 00d0 00d0 F7 C3 5B F6 BA 4D D3 78 FD 5C 99 55 46 50 29 6A ..[..M.x.\.UFP)j 00e0 00e0 BC C3 74 C3 FF 2F CF 80 70 38 84 8F 35 1E 91 34 ..t../..p8..5..4 00f0 00f0 F6 97 26 B5 E9 2A EC 99 E4 AA 99 61 3C 35 60 9B ..&..*.....a<5`. 0100 0100 00 94 B5 33 81 15 13 E9 BA 48 B9 11 3F 0F 2B 4D ...3.....H..?.+M 0110 0110 BC F9 E0 5A 66 68 C9 98 C0 9F 65 AE 48 C8 EA 1B ...Zfh....e.H... 0120 0120 7F BC 62 B5 CB BE C7 DE CC 0A 48 32 DF 93 AE C0 ..b.......H2.... 0130 0130 8C 13 8A 63 62 1F 8C 58 4A 85 30 A3 80 B5 4B 37 ...cb..XJ.0...K7 0140 0140 FD B8 DD A6 92 4E 42 60 71 0C F8 B6 6C 71 47 9D .....NB`q...lqG. 0150 0150 CB 69 16 79 0C 5C 58 2B 99 53 CA B7 08 51 78 E2 .i.y.\X+.S...Qx. 0160 0160 80 D1 82 A7 4F 93 FC D3 BC 83 A0 DC 26 28 45 51 ....O.......&(EQ 0170 0170 A4 D2 30 A5 0A 8B 34 1D E1 32 FD F0 F9 7B B7 AB ..0...4..2...{.. 0180 0180 DE C4 80 21 E0 4C 3D ED A8 98 97 C6 84 D5 60 36 ...!.L=.......`6 0190 0190 36 BD 66 84 2E D4 B2 58 6F 8E 09 FB B5 E0 22 8B 6.f....Xo.....". 01a0 01a0 CC E3 E5 FF C8 2E 56 74 F1 6A 65 A4 F1 B7 B1 7B ......Vt.je....{ 01b0 01b0 38 54 A5 46 57 34 A5 FE C5 73 C5 45 26 F2 7B 9E 8T.FW4...s.E&.{. 01c0 01c0 A8 A6 46 46 F0 12 68 B0 40 D0 9F 2A CD A8 2A 37 ..FF..h.@..*..*7 01d0 01d0 FB 19 5C B2 4F 8C 10 92 91 95 74 99 9F D6 1D 85 ..\.O.....t..... 01e0 01e0 9A ED 2A F5 A9 45 7A 20 A7 2E 61 88 C0 D8 13 CB ..*..Ez ..a..... 01f0 01f0 12 71 37 79 F8 4F 7B ED 29 8E 2C D7 93 B0 6E 63 .q7y.O{.).,...nc 0200 0200 9D 85 9B 4F B3 A5 F7 46 E2 02 3B CF 06 27 A8 A8 ...O...F..;..'.. 0210 0210 74 25 89 9A A3 A9 B6 3F 55 89 65 EC CA BC 35 33 t%.....?U.e...53 0220 0220 05 62 B0 55 42 6E 2F C6 80 8C 45 6E E8 F0 47 D0 .b.UBn/...En..G. 0230 0230 9A 70 21 B6 A4 F2 54 7C DE 65 52 22 4B 29 47 50 .p!...T|.eR"K)GP 0240 0240 EF D4 92 EA 07 45 03 5F 76 A3 94 D5 B6 E2 64 42 .....E._v.....dB 0250 0250 E5 54 2B 4D 55 77 22 EE 21 B7 0C 05 56 72 41 ED .T+MUw".!...VrA. 0260 0260 97 DF FB 31 50 2D 95 0C 50 46 2F 47 8F CC D8 45 ...1P-..PF/G...E 0270 0270 4E C3 84 24 68 8E 87 C4 42 8C 37 63 B3 69 F1 B5 N..$h...B.7c.i.. 0280 0280 15 09 EF 36 54 8D CF 7A 5C 84 24 75 AA 65 BE C1 ...6T..z\.$u.e.. 0290 0290 0D 6F 86 CE CD 90 E4 69 4F 36 D6 80 52 B5 5A 27 .o.....iO6..R.Z' 02a0 02a0 15 C0 0E 26 9C 21 50 71 31 14 82 11 8E D0 16 8F ...&.!Pq1....... 02b0 02b0 AB B3 05 3A D5 9D CD F4 2A 42 50 26 85 CD FC C6 ...:....*BP&.... 02c0 02c0 79 D2 27 2D D1 2A B6 58 FF 85 88 B3 4C B4 8B 3A y.'-.*.X....L..: 02d0 02d0 EF 4A 19 61 69 4A B2 B3 1A 81 2A 68 30 15 ED 34 .J.aiJ....*h0..4 02e0 02e0 3A 8C 21 49 89 97 B0 DE D3 76 7F 73 E0 69 C9 63 :.!I.....v.s.i.c 02f0 02f0 38 45 B5 82 D6 F1 A9 87 D6 B0 9D 31 B3 30 A3 CB 8E.........1.0.. 0300 0300 F2 C4 30 FB 6F 5D 6F A2 7F 83 D9 62 4B 7B B8 CE ..0.o]o....bK{.. 0310 0310 BC 24 89 33 B6 8D BE 1B 6B 28 22 B9 66 21 15 9D .$.3....k(".f!.. 0320 0320 92 49 DE D8 93 CB ED CF 1F C5 EE 77 CB 69 69 58 .I.........w.iiX 0330 0330 52 17 0B 24 EA 2F 36 AA 89 8A 24 21 2B 2E DF 84 R..$./6...$!+... 0340 0340 45 9A 43 81 BD 24 37 97 B9 A3 28 1D 7E 1B 28 0F E.C..$7...(.~.(. 0350 0350 6A DD 79 DB B1 CC 5D 88 71 78 D0 81 35 49 A1 68 j.y...].qx..5I.h 0360 0360 A3 8B E4 41 BB 38 77 64 09 8C 4E 7B ED 81 F7 97 ...A.8wd..N{.... 0370 0370 3E E1 9E 73 37 67 A4 DD 05 21 2A 18 B1 2C 83 8C >..s7g...!*..,.. 0380 0380 67 4C 18 B0 D6 30 4A 28 BE 3D E7 92 8F FD D1 44 gL...0J(.=.....D 0390 0390 9D 29 78 84 C6 A6 A5 74 B1 3A 0D 28 94 25 C1 EB .)x....t.:.(.%.. 03a0 03a0 F3 7C 5A F5 6D 04 75 3F CC 0C 02 FD CC 98 42 7F .|Z.m.u?......B. 03b0 03b0 B9 AA 33 51 09 05 BA 2B 67 46 A8 B5 97 42 E4 24 ..3Q...+gF...B.$ 03c0 03c0 3F 6F BA 81 45 85 B1 22 79 4A 54 AE CB A3 EA 95 ?o..E.."yJT..... 03d0 03d0 6A 0C 85 FD ED 25 82 CB 48 09 EE 7B E4 71 25 3F j....%..H..{.q%? 03e0 03e0 02 56 50 36 36 E8 1F 35 DF 38 B1 77 C3 C0 71 67 .VP66..5.8.w..qg 03f0 03f0 7E 1D D9 EF A6 B1 0C 6A 12 2A B0 52 2F 2B 10 E8 ~......j.*.R/+.. 0400 0400 B6 25 35 5F 5C 1E 79 96 C7 05 52 37 18 26 91 ED .%5_\.y...R7.&.. 0410 0410 E3 1A 5E 60 29 66 F9 0C 2A 66 BD F9 97 87 2D BD ..^`)f..*f....-. 0420 0420 C9 71 55 D7 23 BC 1F B1 87 BD 0F 42 CB CD ED BE .qU.#......B.... 0430 0430 2C 57 17 D1 3E 27 E2 13 4A C6 CD 9D 3A 53 CD 21 ,W..>'..J...:S.! 0440 0440 53 44 A8 27 80 65 DA 4E EA 75 44 86 0E DA 5F DB SD.'.e.N.uD..._. 0450 0450 41 F8 49 FF 7C 1D B7 75 F7 A0 A6 2D 28 75 B4 3B A.I.|..u...-(u.; 0460 0460 55 BC 09 1E 80 56 66 65 07 DF CA DE D4 0A 83 21 U....Vfe.......! 0470 0470 1D B7 A5 85 6D 4C 9B 5E 2E F8 62 83 0C EF 8A 4C ....mL.^..b....L 0480 0480 36 CE 03 4E 9A 9E 11 F5 58 F0 08 CD BE 41 52 08 6..N....X....AR. 0490 0490 1C 30 DA E5 3B 6D E4 4E 17 03 23 64 90 CF C8 7B .0..;m.N..#d...{ 04a0 04a0 E9 E9 6F A0 67 9F 87 25 50 69 99 4A 26 2D 61 D5 ..o.g..%Pi.J&-a. 04b0 04b0 7B E0 38 2F E9 E5 70 {.8/..p >>> assert bytes(tkt) == bytes(TKT) >>> assert upn == 'DC1$@DOMAIN.LOCAL' >>> assert spn == 'krbtgt/DOMAIN.LOCAL@DOMAIN.LOCAL' ###### ## Crypto tests ###### ###(033)=[passed] RFC3691 - Test vectors for KRB-FX-CF2 >>> from scapy.libs.rfc3961 import Key, EncryptionType, KRB_FX_CF2 >>> >>> def test_krb_fx_cf2(etype): ... k1 = Key.string_to_key(etype, b"key1", b"key1") ... k2 = Key.string_to_key(etype, b"key2", b"key2") ... return KRB_FX_CF2(k1, k2, b"a", b"b").key.hex() ... >>> assert test_krb_fx_cf2(EncryptionType.AES128_CTS_HMAC_SHA1_96) == "97df97e4b798b29eb31ed7280287a92a" >>> assert test_krb_fx_cf2(EncryptionType.AES256_CTS_HMAC_SHA1_96) == "4d6ca4e629785c1f01baf55e2e548566b9617ae3a96868c337cb93b5e72b1c7b" >>> assert test_krb_fx_cf2(EncryptionType.RC4_HMAC) == '24d7f6b6bae4e5c00d2082c5ebab3672' ###(034)=[passed] RFC3691 - Test vectors for _n_fold >>> from scapy.libs.rfc3961 import _n_fold >>> >>> >>> assert _n_fold(b"012345", 8).hex() == "be072631276b1955" >>> assert _n_fold(b"password", 7).hex() == "78a07b6caf85fa" >>> assert _n_fold(b"Rough Consensus, and Running Code", 8).hex() == "bb6ed30870b7f0e0" >>> assert _n_fold(b"password", 21).hex() == "59e4a8ca7c0385c3c37b3f6d2000247cb6e6bd5b3e" >>> assert _n_fold(b"MASSACHVSETTS INSTITVTE OF TECHNOLOGY", 24).hex() == "db3b0d8f0b061e603282b308a50841229ad798fab9540c1b" >>> assert _n_fold(b"Q", 21).hex() == "518a54a215a8452a518a54a215a8452a518a54a215" >>> assert _n_fold(b"ba", 21).hex() == "fb25d531ae8974499f52fd92ea9857c4ba24cf297e" ###(035)=[passed] RFC3691 - Test vectors for mit_des_string_to_key >>> from scapy.libs.rfc3961 import Key, EncryptionType >>> >>> def _mit_des_string_to_key(text, salt): ... k = Key.string_to_key(EncryptionType.DES_CBC_MD5, text, salt) ... return k.key.hex() ... >>> assert _mit_des_string_to_key(b"password", b"ATHENA.MIT.EDUraeburn") == "cbc22fae235298e3" >>> assert _mit_des_string_to_key(b"potatoe", b"WHITEHOUSE.GOVdanny") == "df3d32a74fd92a01" >>> assert _mit_des_string_to_key((u"\U0001d11e").encode(), b"EXAMPLE.COMpianist") == "4ffb26bab0cd9413" >>> assert _mit_des_string_to_key((u"\xdf").encode(), (u"ATHENA.MIT.EDUJuri\u0161i\u0107").encode()) == "62c81a5232b5e69d" >>> assert _mit_des_string_to_key(b"11119999", b"AAAAAAAA") == "984054d0f1a73e31" >>> assert _mit_des_string_to_key(b"NNNN6666", b"FFFFAAAA") == "c4bf6b25adf7a4f8" ###(036)=[passed] RFC3691 - Test vectors for DES3 >>> def _des3_string_to_key(text, salt): ... k = Key.string_to_key(EncryptionType.DES3_CBC_SHA1_KD, text, salt) ... return k.key.hex() ... >>> assert _des3_string_to_key(b"password", b"ATHENA.MIT.EDUraeburn") == "850bb51358548cd05e86768c313e3bfef7511937dcf72c3e" >>> assert _des3_string_to_key(b"potatoe", b"WHITEHOUSE.GOVdanny") == "dfcd233dd0a43204ea6dc437fb15e061b02979c1f74f377a" >>> assert _des3_string_to_key(b"penny", b"EXAMPLE.COMbuckaroo") == "6d2fcdf2d6fbbc3ddcadb5da5710a23489b0d3b69d5d9d4a" >>> assert _des3_string_to_key((u"\xdf").encode(), (u"ATHENA.MIT.EDUJuri\u0161i\u0107").encode()) == "16d5a40e1ce3bacb61b9dce00470324c831973a7b952feb0" >>> assert _des3_string_to_key((u"\U0001d11e").encode(), b"EXAMPLE.COMpianist") == "85763726585dbc1cce6ec43e1f751f07f1c4cbb098f40b19" ###(037)=[passed] RFC3692 - Test vectors for AES >>> from scapy.libs.rfc3961 import Key, EncryptionType >>> >>> >>> >>> k = Key.string_to_key(EncryptionType.AES128_CTS_HMAC_SHA1_96, b"password", b"ATHENA.MIT.EDUraeburn", struct.pack(">L", 1200)) >>> assert k.key.hex() == "4c01cd46d632d01e6dbe230a01ed642a" >>> >>> >>> k = Key.string_to_key(EncryptionType.AES256_CTS_HMAC_SHA1_96, b"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", b"pass phrase exceeds block size", struct.pack(">L", 1200)) >>> assert k.key.hex() == "d78c5c9cb872a8c9dad4697f0bb5b2d21496c82beb2caeda2112fceea057401b" ###(038)=[passed] RFC8009 - Test vectors for AES-CTS HMAC-SHA2 - Sample results for string-to-key conversion >>> from scapy.libs.rfc3961 import Key, EncryptionType >>> >>> >>> >>> k = Key.string_to_key(EncryptionType.AES128_CTS_HMAC_SHA256_128, b"password", b"\x10\xdf\x9d\xd7\x83\xe5\xbc\x8a\xce\xa1s\x0et5_aATHENA.MIT.EDUraeburn") >>> assert k.key.hex() == '089bca48b105ea6ea77ca5d2f39dc5e7' >>> >>> >>> k = Key.string_to_key(EncryptionType.AES256_CTS_HMAC_SHA384_192, b"password", b"\x10\xdf\x9d\xd7\x83\xe5\xbc\x8a\xce\xa1s\x0et5_aATHENA.MIT.EDUraeburn") >>> assert k.key.hex() == '45bd806dbf6a833a9cffc1c94589a222367a79bc21c413718906e9f578a78467' ###(039)=[passed] RFC8009 - Test vectors for AES-CTS HMAC-SHA2 - Sample results for key derivation >>> from scapy.libs.rfc3961 import _AES128CTS_SHA256_128 >>> >>> k = Key(EncryptionType.AES128_CTS_HMAC_SHA256_128, key=bytes.fromhex("3705D96080C17728A0E800EAB6E0D23C")) >>> >>> kc = _AES128CTS_SHA256_128.derive(k, struct.pack(">IB", 2, 0x99), 128) >>> assert kc.hex() == 'b31a018a48f54776f403e9a396325dc3' >>> >>> ke = _AES128CTS_SHA256_128.derive(k, struct.pack(">IB", 2, 0xAA), 128) >>> assert ke.hex() == '9b197dd1e8c5609d6e67c3e37c62c72e' >>> >>> ki = _AES128CTS_SHA256_128.derive(k, struct.pack(">IB", 2, 0x55), 128) >>> assert ki.hex() == '9fda0e56ab2d85e1569a688696c26a6c' >>> >>> >>> from scapy.libs.rfc3961 import _AES256CTS_SHA384_192 >>> >>> k = Key(EncryptionType.AES256_CTS_HMAC_SHA384_192, key=bytes.fromhex("6D404D37FAF79F9DF0D33568D320669800EB4836472EA8A026D16B7182460C52")) >>> >>> kc = _AES256CTS_SHA384_192.derive(k, struct.pack(">IB", 2, 0x99), 192) >>> assert kc.hex() == 'ef5718be86cc84963d8bbb5031e9f5c4ba41f28faf69e73d' >>> >>> ke = _AES256CTS_SHA384_192.derive(k, struct.pack(">IB", 2, 0xAA), 256) >>> assert ke.hex() == '56ab22bee63d82d7bc5227f6773f8ea7a5eb1c825160c38312980c442e5c7e49' >>> >>> ki = _AES256CTS_SHA384_192.derive(k, struct.pack(">IB", 2, 0x55), 192) >>> assert ki.hex() == '69b16514e3cd8e56b82010d5c73012b622c4d00ffc23ed1f' ###(040)=[passed] RFC8009 - Test vectors for AES-CTS HMAC-SHA2 - Sample encryptions and decryptions >>> k = Key(EncryptionType.AES128_CTS_HMAC_SHA256_128, key=bytes.fromhex("3705D96080C17728A0E800EAB6E0D23C")) >>> >>> >>> c = k.encrypt(2, b"", confounder=bytes.fromhex("7E5895EAF2672435BAD817F545A37148")) >>> assert c.hex() == "ef85fb890bb8472f4dab20394dca781dad877eda39d50c870c0d5a0a8e48c718" >>> assert k.decrypt(2, c) == b"" >>> >>> >>> c = k.encrypt(2, bytes.fromhex("000102030405"), confounder=bytes.fromhex("7BCA285E2FD4130FB55B1A5C83BC5B24")) >>> assert c.hex() == "84d7f30754ed987bab0bf3506beb09cfb55402cef7e6877ce99e247e52d16ed4421dfdf8976c" >>> assert k.decrypt(2, c).hex() == "000102030405".lower() >>> >>> >>> c = k.encrypt(2, bytes.fromhex("000102030405060708090A0B0C0D0E0F"), confounder=bytes.fromhex("56AB21713FF62C0A1457200F6FA9948F")) >>> assert c.hex() == "3517d640f50ddc8ad3628722b3569d2ae07493fa8263254080ea65c1008e8fc295fb4852e7d83e1e7c48c37eebe6b0d3" >>> assert k.decrypt(2, c).hex() == "000102030405060708090A0B0C0D0E0F".lower() >>> >>> >>> c = k.encrypt(2, bytes.fromhex("000102030405060708090A0B0C0D0E0F1011121314"), confounder=bytes.fromhex("A7A4E29A4728CE10664FB64E49AD3FAC")) >>> assert c.hex() == "720f73b18d9859cd6ccb4346115cd336c70f58edc0c4437c5573544c31c813bce1e6d072c186b39a413c2f92ca9b8334a287ffcbfc" >>> assert k.decrypt(2, c).hex() == "000102030405060708090A0B0C0D0E0F1011121314".lower() >>> >>> >>> k = Key(EncryptionType.AES256_CTS_HMAC_SHA384_192, key=bytes.fromhex("6D404D37FAF79F9DF0D33568D320669800EB4836472EA8A026D16B7182460C52")) >>> >>> >>> c = k.encrypt(2, b"", confounder=bytes.fromhex("F764E9FA15C276478B2C7D0C4E5F58E4")) >>> assert c.hex() == "41f53fa5bfe7026d91faf9be959195a058707273a96a40f0a01960621ac612748b9bbfbe7eb4ce3c" >>> assert k.decrypt(2, c) == b"" >>> >>> >>> c = k.encrypt(2, bytes.fromhex("000102030405"), confounder=bytes.fromhex("B80D3251C1F6471494256FFE712D0B9A")) >>> assert c.hex() == "4ed7b37c2bcac8f74f23c1cf07e62bc7b75fb3f637b9f559c7f664f69eab7b6092237526ea0d1f61cb20d69d10f2" >>> assert k.decrypt(2, c).hex() == "000102030405".lower() >>> >>> >>> c = k.encrypt(2, bytes.fromhex("000102030405060708090A0B0C0D0E0F"), confounder=bytes.fromhex("53BF8A0D105265D4E276428624CE5E63")) >>> assert c.hex() == "bc47ffec7998eb91e8115cf8d19dac4bbbe2e163e87dd37f49beca92027764f68cf51f14d798c2273f35df574d1f932e40c4ff255b36a266" >>> assert k.decrypt(2, c).hex() == "000102030405060708090A0B0C0D0E0F".lower() >>> >>> >>> c = k.encrypt(2, bytes.fromhex("000102030405060708090A0B0C0D0E0F1011121314"), confounder=bytes.fromhex("763E65367E864F02F55153C7E3B58AF1")) >>> assert c.hex() == "40013e2df58e8751957d2878bcd2d6fe101ccfd556cb1eae79db3c3ee86429f2b2a602ac86fef6ecb647d6295fae077a1feb517508d2c16b4192e01f62" >>> assert k.decrypt(2, c).hex() == "000102030405060708090A0B0C0D0E0F1011121314".lower() ###(041)=[passed] RFC8009 - Test vectors for AES-CTS HMAC-SHA2 - Sample checksums >>> k = Key(EncryptionType.AES128_CTS_HMAC_SHA256_128, key=bytes.fromhex("3705D96080C17728A0E800EAB6E0D23C")) >>> cksum = k.make_checksum(2, bytes.fromhex("000102030405060708090A0B0C0D0E0F1011121314")) >>> assert cksum.hex() == "d78367186643d67b411cba9139fc1dee" >>> >>> >>> k = Key(EncryptionType.AES256_CTS_HMAC_SHA384_192, key=bytes.fromhex("6D404D37FAF79F9DF0D33568D320669800EB4836472EA8A026D16B7182460C52")) >>> cksum = k.make_checksum(2, bytes.fromhex("000102030405060708090A0B0C0D0E0F1011121314")) >>> assert cksum.hex() == "45ee791567eefca37f4ac1e0222de80d43c3bfa06699672a" ###(042)=[passed] RFC8009 - Test vectors for AES-CTS HMAC-SHA2 - Sample pseudorandom function (PRF) invocations >>> k = Key(EncryptionType.AES128_CTS_HMAC_SHA256_128, key=bytes.fromhex("3705D96080C17728A0E800EAB6E0D23C")) >>> out = k.prf(b"test") >>> assert out.hex() == "9d188616f63852fe86915bb840b4a886ff3e6bb0f819b49b893393d393854295" >>> >>> >>> k = Key(EncryptionType.AES256_CTS_HMAC_SHA384_192, key=bytes.fromhex("6D404D37FAF79F9DF0D33568D320669800EB4836472EA8A026D16B7182460C52")) >>> out = k.prf(b"test") >>> assert out.hex() == "9801f69a368c2bf675e59521e177d9a07f67efe1cfde8d3c8d6f6a0256e3b17db3c1b62ad1b8553360d17367eb1514d2" ###(043)=[passed] Decrypt PA-ENC-TIMESTAMP >>> from scapy.libs.rfc3961 import Key, EncryptionType >>> >>> pkt = Ether(b"RT\x00iX\x13RT\x00!l+\x08\x00E\x00\x01]\xa7\x18@\x00\x80\x06\xdc\x83\xc0\xa8z\x9c\xc0\xa8z\x11\xc2\t\x00XT\xf6\xab#\x92\xc2[\xd6P\x18 \x14\xb6\xe0\x00\x00\x00\x00\x011j\x82\x01-0\x82\x01)\xa1\x03\x02\x01\x05\xa2\x03\x02\x01\n\xa3c0a0L\xa1\x03\x02\x01\x02\xa2E\x04C0A\xa0\x03\x02\x01\x12\xa2:\x048HHM\xec\xb0\x1c\x9bb\xa1\xca\xbf\xbc?-\x1e\xd8Z\xa5\xe0\x93\xba\x83X\xa8\xce\xa3MC\x93\xaf\x93\xbf!\x1e'O\xa5\x8e\x81Hx\xdb\x9f\rz(\xd9Ns'f\r\xb4\xf3pK0\x11\xa1\x04\x02\x02\x00\x80\xa2\t\x04\x070\x05\xa0\x03\x01\x01\xff\xa4\x81\xb70\x81\xb4\xa0\x07\x03\x05\x00@\x81\x00\x10\xa1\x120\x10\xa0\x03\x02\x01\x01\xa1\t0\x07\x1b\x05win1$\xa2\x0e\x1b\x0cDOMAIN.LOCAL\xa3!0\x1f\xa0\x03\x02\x01\x02\xa1\x180\x16\x1b\x06krbtgt\x1b\x0cDOMAIN.LOCAL\xa5\x11\x18\x0f20370913024805Z\xa6\x11\x18\x0f20370913024805Z\xa7\x06\x02\x04p\x1c\xc5\xd1\xa8\x150\x13\x02\x01\x12\x02\x01\x11\x02\x01\x17\x02\x01\x18\x02\x02\xffy\x02\x01\x03\xa9\x1d0\x1b0\x19\xa0\x03\x02\x01\x14\xa1\x12\x04\x10WIN1 ") >>> enc = pkt[Kerberos].root.padata[0].padataValue >>> k = Key(enc.etype.val, key=bytes.fromhex("7fada4e566ae4fb270e2800a23ae87127a819d42e69b5e22de0ddc63da80096d")) >>> ts = enc.decrypt(k) >>> >>> assert ts.patimestamp == "20220715171847Z" >>> ts.pausec == 0x9a4db True ###### ## [MS-KILE] test vectors ###### ###(044)=[passed] [MS-KILE] RC4 GSS_WrapEx (RFC4757) test vectors (sect 4.5) >>> from unittest import mock >>> from scapy.libs.rfc3961 import Key, EncryptionType >>> >>> ssp = KerberosSSP() >>> ctx = KerberosSSP.CONTEXT(IsAcceptor=False, req_flags=GSS_C_FLAGS.GSS_C_CONF_FLAG) >>> >>> ctx.KrbSessionKey = Key(EncryptionType.RC4_HMAC, key=bytes.fromhex("81a2cb90af7fc2d19554a150d8185359")) >>> ctx.SendSeqNum = 0x60cbacd3 >>> Confounder = bytes.fromhex("5256f3fb630cf12a") >>> >>> with mock.patch('scapy.layers.kerberos.os.urandom', side_effect=lambda x: Confounder): ... _msgs, sig = ssp.GSS_WrapEx( ... ctx, ... [ ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=bytes.fromhex("112233445566778899aabbccddeeff")), ... ], ... ) ... >>> assert isinstance(sig, KRB_GSSAPI_Token) >>> assert sig.innerToken.TOK_ID == b"\x02\x01" >>> assert sig.innerToken.root.SGN_ALG == 0x11 >>> assert sig.innerToken.root.SEAL_ALG == 0x10 >>> >>> assert bytes(sig) == b'`+\x06\t*\x86H\x86\xf7\x12\x01\x02\x02\x02\x01\x11\x00\x10\x00\xff\xff\xe2\x9e\x8b\xbccH\xe7@\xeb\xaaa\x92D\xa1V\xa1;\\\xf6^>> _msgs = ssp.GSS_UnwrapEx( ... ctx, ... _msgs, ... signature=sig, ... ) >>> >>> assert _msgs[0].data.hex() == "112233445566778899aabbccddeeff" ###### ## GSS-API KerberosSSP tests ###### ###(046)=[passed] Create randomness-mock context manager >>> from unittest import mock >>> from datetime import datetime >>> >>> def fake_urandom(x): ... # wow, impressive entropy ... return b"0" * x ... >>> def fake_randrange(a, b): ... return (a + b) // 2 ... >>> def fake_choice(x): ... return x[0] ... >>> date_mock = mock.MagicMock() >>> date_mock.now.side_effect = lambda tz=None: datetime(2024, 3, 5, 16, 52, 55, 424801, tz) >>> >>> _patches = [ ... # Patch all the random ... mock.patch('scapy.layers.kerberos.os.urandom', side_effect=fake_urandom), ... mock.patch('scapy.libs.rfc3961.os.urandom', side_effect=fake_urandom), ... mock.patch('scapy.volatile.random.randrange', side_effect=fake_randrange), ... mock.patch('scapy.volatile.random.choice', side_effect=fake_choice), ... # Patch date ... mock.patch('scapy.layers.kerberos.datetime', date_mock), ... ] >>> >>> class KrbRandomPatcher: ... def __enter__(self): ... for p in _patches: ... p.start() ... def __exit__(self, *args, **kwargs): ... for p in _patches: ... p.stop() ... ###(047)=[passed] Create client and server SPNEGOSSP[KerberosSSP] >>> from scapy.libs.rfc3961 import Key, EncryptionType >>> from scapy.layers.kerberos import KRB_Ticket, KRB_GSSAPI_Token, KRB_AP_REQ, KRB_AP_REP >>> from scapy.layers.spnego import SPNEGOSSP >>> >>> client = SPNEGOSSP([ ... KerberosSSP( ... UPN="User1@DOMAIN.LOCAL", ... SPN="cifs/dc1", ... ST=KRB_Ticket(bytes.fromhex("618204a13082049da003020105a10e1b0c444f4d41494e2e4c4f43414ca2163014a003020103a10d300b1b04636966731b03646331a382046c30820468a003020112a10302010da282045a04820456671f6131b38ee6e682d62cb937b8b79c589753182f8dbcb14a91b031052a3c20f7b4c89bf9a41fe9960d112acc73f6bd6527dfe70700a3d3c2e72b4ba6705dfc040fd56f9d7cd60b580ebecec2bfb240baac619690dbd9301ed98cac037cfdff8ff96ac98358969f3532f9c6adc076d136a0ef96ebddef293df879bb42adfbf7670434f340ad673e0303ae186e1a510d7f50dbfee9ebab323c715d6b27a67ffec60dba9f7475e5dbf88eee1fcc95b7d467ab2b4ecef893a92a25c80b8480ac8c12bc10741523a2738a3d7c3d2c438235111188968486cab2934b32cad1b6b4b2cbf343b25d41ad463c0513cf21cf9f77f072f4a49d8042947064e3375a1ae76c355fd48d5fc163cf7f865af91bcb788cffe2e9e1a30a7e3f91be8fb55b0a8b8c0b600ef3e0e88feaad4fbf4fffe76c9302ee2acfa3b64ca28cd006fd4af9c27d2eb45e47e582b87e632aa23475caeb0e3e9d777339f5cb94abc19ebd080ffc78181bf81ff227182de422937675546633bd6ab688258a94d132fb590f8152d3f19bd55a1f336fb7c382140987ac2389134d8033882f923d3d5324a3e9f5437bd70f095e6bb00ee68d8f21912b19b27924c61b4e3bfe68411f9f220de8dace00e767b662313706730d4dc8539b309fc75e6ca4cae470cdf12cc3cfb191486e3e5eb8c80723b2b0473b07e4ea4d385487dd303df2db8d31f8c90d53c4adcf39ad78cf6c85fbb87b4c4ee531a42c2133df2b0362132374df995420e4b2a6d1e19d7879d518652d5101a316962b27b3884cb67d07572f96b9668ca42cca7311a7152ac7c6d492009192fa4a707989e43b2a10f19e535e7cf8afdaf63ce9a2a85ce1bd17d81cfe76d2ce5759a7fdbeff6fb279b8620bc2c5183b24be831c7ee157114f2700da210b36edb7bda7d91a32f7940bef431c76571cd44499f779cc4ebe829fb34eeaa1e442240d5962bdbcbc16c962974b546e9cee380dda49f651acc5c58acae4ad06d57e4b91d8c5557365e8ddda7ee9550963d70d4f56b44fc5a26e29b36cb21d11221825b5a2217cb1f1454d34d94a855cb860f2fe43681e3d302e7e124273dd18b04fddf660b8858e1e78d022cc03f467f3cf1a6e5df53bb831794542b1d08e38d3bfb0bf2e5ba6f75a0f77d56bf2924b144fff3c87ec7a57bff345ee8a4496676d38c9453c38e64521db2de6d6452aa8f3da1675134e8d90cbb0d274ce6189563fd9a56e56a800661e787b083950623035ddeeb2fb84f6fb2507f2c157e74e81a81970e11475ce926e393a55b06b77c444dbd23688e8a77c7f30337874fef787a187fcafd73a5a4837c8e3e60712308597ff72ea2edae69c9402ad7ae81abb3e9100f0c87b99b2564246bd56af8e6d0ecf2928e5151218f7e627c565e15540666f4f7c0e937c2d0e84782fcb1b535e596f6c4e0aed7c1d350e169d045f2eaaa4bb2f94cd149576f835e5eecb4418677d0444e51fafcbed2afac50b1d320bc223d2623601aee6df6a363a24294bfb3b00f2668dfc404e9fa17fe936e6620756a6918f7de2de343f380fab83fde911124be508")), ... KEY=Key(EncryptionType.AES256_CTS_HMAC_SHA1_96, key=bytes.fromhex("4aad1c4c7b5bf02bfd061cfaebf0188d6c4f4642d569ca4ab536cb68adcb0e68")), ... ), ... ]) >>> server = SPNEGOSSP([ ... KerberosSSP( ... SPN="cifs/dc1", ... PASSWORD="Password1", ... KEY=Key(EncryptionType.AES256_CTS_HMAC_SHA1_96, key=bytes.fromhex("133614b285c1d76d4ec78d642e9c6f7451d7652cf6c5fe635af6e89050d42517")), ... ), ... ]) ###(048)=[passed] GSS_Init_sec_context (negTokenInit: KRB_AP_REQ) >>> with KrbRandomPatcher(): ... clicontext, tok, negResult = client.GSS_Init_sec_context( ... None, ... req_flags=( ... GSS_C_FLAGS.GSS_C_MUTUAL_FLAG | ... GSS_C_FLAGS.GSS_C_INTEG_FLAG | ... GSS_C_FLAGS.GSS_C_CONF_FLAG ... ) ... ) ... >>> assert negResult == 1 >>> assert isinstance(tok, GSSAPI_BLOB) >>> tok = GSSAPI_BLOB(bytes(tok)) >>> assert tok.MechType.val == '1.3.6.1.5.5.2' >>> assert isinstance(tok.innerToken.token, SPNEGO_negTokenInit) >>> assert len(tok.innerToken.token.mechTypes) == 2 >>> assert tok.innerToken.token.mechTypes[0].oid == '1.2.840.48018.1.2.2' >>> assert tok.innerToken.token.mechTypes[1].oid == '1.2.840.113554.1.2.2' >>> assert tok.innerToken.token.reqFlags is None >>> assert tok.innerToken.token.negHints is None >>> assert tok.innerToken.token.mechListMIC is None >>> assert tok.innerToken.token._mechListMIC is None >>> >>> krb = tok.innerToken.token.mechToken.value.root >>> assert isinstance(krb, KRB_GSSAPI_Token) >>> ap_req = krb.innerToken.root >>> assert isinstance(ap_req, KRB_AP_REQ) >>> assert ap_req.apOptions == "001" >>> assert ap_req.ticket == clicontext.ssp.ST >>> >>> bytes(tok) b'`\x82\x06@\x06\x06+\x06\x01\x05\x05\x02\xa0\x82\x0640\x82\x060\xa0\x180\x16\x06\t*\x86H\x82\xf7\x12\x01\x02\x02\x06\t*\x86H\x86\xf7\x12\x01\x02\x02\xa2\x82\x06\x12\x04\x82\x06\x0e`\x82\x06\n\x06\t*\x86H\x86\xf7\x12\x01\x02\x02\x01\x00n\x82\x05\xf90\x82\x05\xf5\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0e\xa2\x04\x03\x02\x05 \xa3\x82\x04\xa5a\x82\x04\xa10\x82\x04\x9d\xa0\x03\x02\x01\x05\xa1\x0e\x1b\x0cDOMAIN.LOCAL\xa2\x160\x14\xa0\x03\x02\x01\x03\xa1\r0\x0b\x1b\x04cifs\x1b\x03dc1\xa3\x82\x04l0\x82\x04h\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\r\xa2\x82\x04Z\x04\x82\x04Vg\x1fa1\xb3\x8e\xe6\xe6\x82\xd6,\xb97\xb8\xb7\x9cX\x97S\x18/\x8d\xbc\xb1J\x91\xb01\x05*< \xf7\xb4\xc8\x9b\xf9\xa4\x1f\xe9\x96\r\x11*\xccs\xf6\xbde\'\xdf\xe7\x07\x00\xa3\xd3\xc2\xe7+K\xa6p]\xfc\x04\x0f\xd5o\x9d|\xd6\x0bX\x0e\xbe\xce\xc2\xbf\xb2@\xba\xaca\x96\x90\xdb\xd90\x1e\xd9\x8c\xac\x03|\xfd\xff\x8f\xf9j\xc9\x83X\x96\x9f52\xf9\xc6\xad\xc0v\xd16\xa0\xef\x96\xeb\xdd\xef)=\xf8y\xbbB\xad\xfb\xf7g\x044\xf3@\xadg>\x03\x03\xae\x18n\x1aQ\r\x7fP\xdb\xfe\xe9\xeb\xab2\x9dws9\xf5\xcb\x94\xab\xc1\x9e\xbd\x08\x0f\xfcx\x18\x1b\xf8\x1f\xf2\'\x18-\xe4"\x93vuTf3\xbdj\xb6\x88%\x8a\x94\xd12\xfbY\x0f\x81R\xd3\xf1\x9b\xd5Z\x1f3o\xb7\xc3\x82\x14\t\x87\xac#\x89\x13M\x803\x88/\x92==S$\xa3\xe9\xf5C{\xd7\x0f\t^k\xb0\x0e\xe6\x8d\x8f!\x91+\x19\xb2y$\xc6\x1bN;\xfehA\x1f\x9f"\r\xe8\xda\xce\x00\xe7g\xb6b17\x06s\rM\xc8S\x9b0\x9f\xc7^l\xa4\xca\xe4p\xcd\xf1,\xc3\xcf\xb1\x91Hn>^\xb8\xc8\x07#\xb2\xb0G;\x07\xe4\xeaM8T\x87\xdd0=\xf2\xdb\x8d1\xf8\xc9\rS\xc4\xad\xcf9\xadx\xcfl\x85\xfb\xb8{LN\xe51\xa4,!3\xdf+\x03b\x13#t\xdf\x99T \xe4\xb2\xa6\xd1\xe1\x9dxy\xd5\x18e-Q\x01\xa3\x16\x96+\'\xb3\x88L\xb6}\x07W/\x96\xb9f\x8c\xa4,\xcas\x11\xa7\x15*\xc7\xc6\xd4\x92\x00\x91\x92\xfaJpy\x89\xe4;*\x10\xf1\x9eS^|\xf8\xaf\xda\xf6<\xe9\xa2\xa8\\\xe1\xbd\x17\xd8\x1c\xfev\xd2\xceWY\xa7\xfd\xbe\xffo\xb2y\xb8b\x0b\xc2\xc5\x18;$\xbe\x83\x1c~\xe1W\x11O\'\x00\xda!\x0b6\xed\xb7\xbd\xa7\xd9\x1a2\xf7\x94\x0b\xefC\x1cvW\x1c\xd4D\x99\xf7y\xccN\xbe\x82\x9f\xb3N\xea\xa1\xe4B$\rYb\xbd\xbc\xbc\x16\xc9b\x97KTn\x9c\xee8\r\xdaI\xf6Q\xac\xc5\xc5\x8a\xca\xe4\xad\x06\xd5~K\x91\xd8\xc5Use\xe8\xdd\xda~\xe9U\tc\xd7\rOV\xb4O\xc5\xa2n)\xb3l\xb2\x1d\x11"\x18%\xb5\xa2!|\xb1\xf1EM4\xd9J\x85\\\xb8`\xf2\xfeCh\x1e=0.~\x12Bs\xdd\x18\xb0O\xdd\xf6`\xb8\x85\x8e\x1ex\xd0"\xcc\x03\xf4g\xf3\xcf\x1an]\xf5;\xb81yEB\xb1\xd0\x8e8\xd3\xbf\xb0\xbf.[\xa6\xf7Z\x0fw\xd5k\xf2\x92K\x14O\xff<\x87\xeczW\xbf\xf3E\xee\x8aD\x96gm8\xc9E<8\xe6E!\xdb-\xe6\xd6E*\xa8\xf3\xda\x16u\x13N\x8d\x90\xcb\xb0\xd2t\xcea\x89V?\xd9\xa5nV\xa8\x00f\x1ex{\x089Pb05\xdd\xee\xb2\xfb\x84\xf6\xfb%\x07\xf2\xc1W\xe7N\x81\xa8\x19p\xe1\x14u\xce\x92n9:U\xb0kw\xc4D\xdb\xd26\x88\xe8\xa7|\x7f03xt\xfe\xf7\x87\xa1\x87\xfc\xaf\xd7:ZH7\xc8\xe3\xe6\x07\x120\x85\x97\xffr\xea.\xda\xe6\x9c\x94\x02\xadz\xe8\x1a\xbb>\x91\x00\xf0\xc8{\x99\xb2VBF\xbdV\xaf\x8em\x0e\xcf)(\xe5\x15\x12\x18\xf7\xe6\'\xc5e\xe1U@foO|\x0e\x93|-\x0e\x84x/\xcb\x1bS^YolN\n\xed|\x1d5\x0e\x16\x9d\x04_.\xaa\xa4\xbb/\x94\xcd\x14\x95v\xf85\xe5\xee\xcbD\x18g}\x04D\xe5\x1f\xaf\xcb\xed*\xfa\xc5\x0b\x1d2\x0b\xc2#\xd2b6\x01\xae\xe6\xdfj6:$)K\xfb;\x00\xf2f\x8d\xfc@N\x9f\xa1\x7f\xe96\xe6b\x07V\xa6\x91\x8f}\xe2\xde4?8\x0f\xab\x83\xfd\xe9\x11\x12K\xe5\x08\xa4\x82\x0180\x82\x014\xa0\x03\x02\x01\x12\xa2\x82\x01+\x04\x82\x01\'\\>\t\xe4\x1d8,a(\x7f\x1e\xd2\x8dHH\x9c\xef\x8d\x1fqW\xbf(\x97S+\rs_zM\xee\xa7\xc2\x1a\x8eh1\xa4\xcb\x06\xed\x8e\xe6\xc0\x9a\xf7\x93g5\xa5vp\x0e~G\xaf:\xbb<\xaa2\x0e\xf8+l \xc5\xdb\x17,\xa9\x99\xae\x80\r\x0f\xdd4\x92\xf1\xa3h\xc3)^*I\x92\x01\x9f\x06jW\x1a\xac=\xa4\xee\xfdo.\xc8\xd5\x9e\xeaNw\x9eu\xc3\x8b0\xc9_S\x1f\x19u\xbap\x1d\\\x88\x0eu\xbek\xa8}\n\xa0>\x85\xcc3\xed\x84\xadi\x0bB\x9ao\xd2lW\x7f+\x16\x1cxU\x99\x90\x92\xfd\x06\x11ij\xdc\xb5\xc6F\xc0P\xf6\\\xbe\x04I\x9aP\x11\xa5\xff=\xd7\x95\'\xaa\x0e\x1c\xbf\xc4O\xf4D\xc8\xb1Fv\x8f\xff\xde*\'\x17\xe1\xcf\x06\xeb\xd7s\xfc\xa4\x0c6\x87\x9f\xa7\x9b\xe6\xddmMb\xc3\xc8\xcfH\x1a\x1a`\x08\t\x83\x01\x01\x81R\x8d\xda\xd7\xebZ\x83\x8eO\x14\x8e\xf7\x1fc\xb0KcC\xba\xf3\x04+L\xe3\xc1\xf5\xadF\xda\xfa\xe6q\xe0\x90&\x93\xffd\x16>> assert bytes(tok) == b'`\x82\x06@\x06\x06+\x06\x01\x05\x05\x02\xa0\x82\x0640\x82\x060\xa0\x180\x16\x06\t*\x86H\x82\xf7\x12\x01\x02\x02\x06\t*\x86H\x86\xf7\x12\x01\x02\x02\xa2\x82\x06\x12\x04\x82\x06\x0e`\x82\x06\n\x06\t*\x86H\x86\xf7\x12\x01\x02\x02\x01\x00n\x82\x05\xf90\x82\x05\xf5\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0e\xa2\x04\x03\x02\x05 \xa3\x82\x04\xa5a\x82\x04\xa10\x82\x04\x9d\xa0\x03\x02\x01\x05\xa1\x0e\x1b\x0cDOMAIN.LOCAL\xa2\x160\x14\xa0\x03\x02\x01\x03\xa1\r0\x0b\x1b\x04cifs\x1b\x03dc1\xa3\x82\x04l0\x82\x04h\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\r\xa2\x82\x04Z\x04\x82\x04Vg\x1fa1\xb3\x8e\xe6\xe6\x82\xd6,\xb97\xb8\xb7\x9cX\x97S\x18/\x8d\xbc\xb1J\x91\xb01\x05*< \xf7\xb4\xc8\x9b\xf9\xa4\x1f\xe9\x96\r\x11*\xccs\xf6\xbde\'\xdf\xe7\x07\x00\xa3\xd3\xc2\xe7+K\xa6p]\xfc\x04\x0f\xd5o\x9d|\xd6\x0bX\x0e\xbe\xce\xc2\xbf\xb2@\xba\xaca\x96\x90\xdb\xd90\x1e\xd9\x8c\xac\x03|\xfd\xff\x8f\xf9j\xc9\x83X\x96\x9f52\xf9\xc6\xad\xc0v\xd16\xa0\xef\x96\xeb\xdd\xef)=\xf8y\xbbB\xad\xfb\xf7g\x044\xf3@\xadg>\x03\x03\xae\x18n\x1aQ\r\x7fP\xdb\xfe\xe9\xeb\xab2\x9dws9\xf5\xcb\x94\xab\xc1\x9e\xbd\x08\x0f\xfcx\x18\x1b\xf8\x1f\xf2\'\x18-\xe4"\x93vuTf3\xbdj\xb6\x88%\x8a\x94\xd12\xfbY\x0f\x81R\xd3\xf1\x9b\xd5Z\x1f3o\xb7\xc3\x82\x14\t\x87\xac#\x89\x13M\x803\x88/\x92==S$\xa3\xe9\xf5C{\xd7\x0f\t^k\xb0\x0e\xe6\x8d\x8f!\x91+\x19\xb2y$\xc6\x1bN;\xfehA\x1f\x9f"\r\xe8\xda\xce\x00\xe7g\xb6b17\x06s\rM\xc8S\x9b0\x9f\xc7^l\xa4\xca\xe4p\xcd\xf1,\xc3\xcf\xb1\x91Hn>^\xb8\xc8\x07#\xb2\xb0G;\x07\xe4\xeaM8T\x87\xdd0=\xf2\xdb\x8d1\xf8\xc9\rS\xc4\xad\xcf9\xadx\xcfl\x85\xfb\xb8{LN\xe51\xa4,!3\xdf+\x03b\x13#t\xdf\x99T \xe4\xb2\xa6\xd1\xe1\x9dxy\xd5\x18e-Q\x01\xa3\x16\x96+\'\xb3\x88L\xb6}\x07W/\x96\xb9f\x8c\xa4,\xcas\x11\xa7\x15*\xc7\xc6\xd4\x92\x00\x91\x92\xfaJpy\x89\xe4;*\x10\xf1\x9eS^|\xf8\xaf\xda\xf6<\xe9\xa2\xa8\\\xe1\xbd\x17\xd8\x1c\xfev\xd2\xceWY\xa7\xfd\xbe\xffo\xb2y\xb8b\x0b\xc2\xc5\x18;$\xbe\x83\x1c~\xe1W\x11O\'\x00\xda!\x0b6\xed\xb7\xbd\xa7\xd9\x1a2\xf7\x94\x0b\xefC\x1cvW\x1c\xd4D\x99\xf7y\xccN\xbe\x82\x9f\xb3N\xea\xa1\xe4B$\rYb\xbd\xbc\xbc\x16\xc9b\x97KTn\x9c\xee8\r\xdaI\xf6Q\xac\xc5\xc5\x8a\xca\xe4\xad\x06\xd5~K\x91\xd8\xc5Use\xe8\xdd\xda~\xe9U\tc\xd7\rOV\xb4O\xc5\xa2n)\xb3l\xb2\x1d\x11"\x18%\xb5\xa2!|\xb1\xf1EM4\xd9J\x85\\\xb8`\xf2\xfeCh\x1e=0.~\x12Bs\xdd\x18\xb0O\xdd\xf6`\xb8\x85\x8e\x1ex\xd0"\xcc\x03\xf4g\xf3\xcf\x1an]\xf5;\xb81yEB\xb1\xd0\x8e8\xd3\xbf\xb0\xbf.[\xa6\xf7Z\x0fw\xd5k\xf2\x92K\x14O\xff<\x87\xeczW\xbf\xf3E\xee\x8aD\x96gm8\xc9E<8\xe6E!\xdb-\xe6\xd6E*\xa8\xf3\xda\x16u\x13N\x8d\x90\xcb\xb0\xd2t\xcea\x89V?\xd9\xa5nV\xa8\x00f\x1ex{\x089Pb05\xdd\xee\xb2\xfb\x84\xf6\xfb%\x07\xf2\xc1W\xe7N\x81\xa8\x19p\xe1\x14u\xce\x92n9:U\xb0kw\xc4D\xdb\xd26\x88\xe8\xa7|\x7f03xt\xfe\xf7\x87\xa1\x87\xfc\xaf\xd7:ZH7\xc8\xe3\xe6\x07\x120\x85\x97\xffr\xea.\xda\xe6\x9c\x94\x02\xadz\xe8\x1a\xbb>\x91\x00\xf0\xc8{\x99\xb2VBF\xbdV\xaf\x8em\x0e\xcf)(\xe5\x15\x12\x18\xf7\xe6\'\xc5e\xe1U@foO|\x0e\x93|-\x0e\x84x/\xcb\x1bS^YolN\n\xed|\x1d5\x0e\x16\x9d\x04_.\xaa\xa4\xbb/\x94\xcd\x14\x95v\xf85\xe5\xee\xcbD\x18g}\x04D\xe5\x1f\xaf\xcb\xed*\xfa\xc5\x0b\x1d2\x0b\xc2#\xd2b6\x01\xae\xe6\xdfj6:$)K\xfb;\x00\xf2f\x8d\xfc@N\x9f\xa1\x7f\xe96\xe6b\x07V\xa6\x91\x8f}\xe2\xde4?8\x0f\xab\x83\xfd\xe9\x11\x12K\xe5\x08\xa4\x82\x0180\x82\x014\xa0\x03\x02\x01\x12\xa2\x82\x01+\x04\x82\x01\'\\>\t\xe4\x1d8,a(\x7f\x1e\xd2\x8dHH\x9c\xef\x8d\x1fqW\xbf(\x97S+\rs_zM\xee\xa7\xc2\x1a\x8eh1\xa4\xcb\x06\xed\x8e\xe6\xc0\x9a\xf7\x93g5\xa5vp\x0e~G\xaf:\xbb<\xaa2\x0e\xf8+l \xc5\xdb\x17,\xa9\x99\xae\x80\r\x0f\xdd4\x92\xf1\xa3h\xc3)^*I\x92\x01\x9f\x06jW\x1a\xac=\xa4\xee\xfdo.\xc8\xd5\x9e\xeaNw\x9eu\xc3\x8b0\xc9_S\x1f\x19u\xbap\x1d\\\x88\x0eu\xbek\xa8}\n\xa0>\x85\xcc3\xed\x84\xadi\x0bB\x9ao\xd2lW\x7f+\x16\x1cxU\x99\x90\x92\xfd\x06\x11ij\xdc\xb5\xc6F\xc0P\xf6\\\xbe\x04I\x9aP\x11\xa5\xff=\xd7\x95\'\xaa\x0e\x1c\xbf\xc4O\xf4D\xc8\xb1Fv\x8f\xff\xde*\'\x17\xe1\xcf\x06\xeb\xd7s\xfc\xa4\x0c6\x87\x9f\xa7\x9b\xe6\xddmMb\xc3\xc8\xcfH\x1a\x1a`\x08\t\x83\x01\x01\x81R\x8d\xda\xd7\xebZ\x83\x8eO\x14\x8e\xf7\x1fc\xb0KcC\xba\xf3\x04+L\xe3\xc1\xf5\xadF\xda\xfa\xe6q\xe0\x90&\x93\xffd\x16KRB_AP_REP) >>> with KrbRandomPatcher(): ... srvcontext, tok, negResult = server.GSS_Accept_sec_context(None, tok) ... >>> assert negResult == 0 >>> assert isinstance(tok, SPNEGO_negToken) >>> tok = SPNEGO_negToken(bytes(tok)) >>> assert isinstance(tok.token, SPNEGO_negTokenResp) >>> assert tok.token.negResult == 0 >>> assert tok.token.supportedMech.oid == '1.2.840.48018.1.2.2' >>> assert isinstance(tok.token.responseToken, SPNEGO_Token) >>> assert tok.token.mechListMIC is not None >>> >>> ap_rep = tok.token.responseToken.value.root >>> assert isinstance(ap_rep, KRB_AP_REP) >>> >>> apreppart = ap_rep.encPart.decrypt(clicontext.ssp.KEY) >>> assert apreppart.ctime == "20240305165255Z" >>> assert apreppart.subkey.keyvalue == b"0000000000000000" >>> assert apreppart.subkey.keytype == 17 >>> >>> bytes(tok) b'\xa1\x81\xa90\x81\xa6\xa0\x03\n\x01\x00\xa1\x0b\x06\t*\x86H\x82\xf7\x12\x01\x02\x02\xa2r\x04pon0l\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0f\xa2`0^\xa0\x03\x02\x01\x12\xa2W\x04UaS\xeck\xcc\xad~\xfa^\x8d\xca\xbb\xc5\xd2/\xfd\xd3\xc3\xd9\xadN`\xd2;\xd7{\xb7\xf4p.\xa9\x9a\xb1}D\xc6|_t\n\r"M\xcd\xe2\t\xf0Ri\xc7\xcf\xb5\xefr9\xf0`iS7N\x06qKP\x06\xde\xc4\x18\xd5_\xcb\x0ct\x03k\xbc\xb9\x1adT\x03\xc1\x8bM\xa3\x1e\x04\x1c\x04\x04\x05\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x17F\x8al\x01c\x00\xcf4\x12oI' >>> assert bytes(tok) == b'\xa1\x81\xa90\x81\xa6\xa0\x03\n\x01\x00\xa1\x0b\x06\t*\x86H\x82\xf7\x12\x01\x02\x02\xa2r\x04pon0l\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0f\xa2`0^\xa0\x03\x02\x01\x12\xa2W\x04UaS\xeck\xcc\xad~\xfa^\x8d\xca\xbb\xc5\xd2/\xfd\xd3\xc3\xd9\xadN`\xd2;\xd7{\xb7\xf4p.\xa9\x9a\xb1}D\xc6|_t\n\r"M\xcd\xe2\t\xf0Ri\xc7\xcf\xb5\xefr9\xf0`iS7N\x06qKP\x06\xde\xc4\x18\xd5_\xcb\x0ct\x03k\xbc\xb9\x1adT\x03\xc1\x8bM\xa3\x1e\x04\x1c\x04\x04\x05\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x17F\x8al\x01c\x00\xcf4\x12oI' ###(050)=[passed] GSS_Init_sec_context (SPNEGO_negToken: KRB_AP_REP->OK) >>> with KrbRandomPatcher(): ... clicontext, tok, negResult = client.GSS_Init_sec_context(clicontext, tok) ... >>> assert tok is None >>> assert negResult == 0 >>> assert clicontext.KrbSessionKey.key == srvcontext.KrbSessionKey.key >>> assert srvcontext.KrbSessionKey.key == b'0000000000000000' ###(051)=[passed] GSS_GetMICEx/GSS_VerifyMICEx: client sends a signed payload >>> data_header = b"header" # signed but not encrypted >>> data = b"testAAAAAAAAAABBBBBBBBBCCCCCCCCCDDDDDDDDDEEEEEEEEE" # encrypted >>> >>> sig = client.GSS_GetMICEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) >>> assert isinstance(sig, KRB_InnerToken) and sig.TOK_ID == b"\x04\x04" >>> assert sig.root.SND_SEQ == 0x7FFFFFFF//2 + 1 >>> assert bytes(sig) == b'\x04\x04\x04\xff\xff\xff\xff\xff\x00\x00\x00\x00@\x00\x00\x00\xfc\xc6\x86\xab\x85e\x18\xe8\x7f\xa81t' >>> server.GSS_VerifyMICEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data), ... ], ... sig ... ) ###(052)=[passed] GSS_GetMICEx/GSS_VerifyMICEx: server answers back >>> sig = server.GSS_GetMICEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) >>> assert isinstance(sig, KRB_InnerToken) and sig.TOK_ID == b"\x04\x04" >>> assert sig.root.SND_SEQ == 1 >>> assert bytes(sig) == b'\x04\x04\x05\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x01G\x81\x93\xb9\x92\xd0NvHH\xf6\x9c' >>> client.GSS_VerifyMICEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data), ... ], ... sig ... ) ###(053)=[passed] GSS_GetMICEx/GSS_VerifyMICEx: inject fault >>> sig = client.GSS_GetMICEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) >>> bad_data_header = data_header[:-3] + b"hey" >>> try: ... server.GSS_VerifyMICEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=bad_data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data), ... ], ... sig ... ) ... assert False, "No error was reported, but there should have been one" ... except ValueError: ... pass ... ###(054)=[passed] Create client and server KerberosSSP (raw) >>> client = KerberosSSP( ... UPN="User1@DOMAIN.LOCAL", ... SPN="cifs/dc1", ... ST=KRB_Ticket(bytes.fromhex("618204a13082049da003020105a10e1b0c444f4d41494e2e4c4f43414ca2163014a003020103a10d300b1b04636966731b03646331a382046c30820468a003020112a10302010da282045a04820456671f6131b38ee6e682d62cb937b8b79c589753182f8dbcb14a91b031052a3c20f7b4c89bf9a41fe9960d112acc73f6bd6527dfe70700a3d3c2e72b4ba6705dfc040fd56f9d7cd60b580ebecec2bfb240baac619690dbd9301ed98cac037cfdff8ff96ac98358969f3532f9c6adc076d136a0ef96ebddef293df879bb42adfbf7670434f340ad673e0303ae186e1a510d7f50dbfee9ebab323c715d6b27a67ffec60dba9f7475e5dbf88eee1fcc95b7d467ab2b4ecef893a92a25c80b8480ac8c12bc10741523a2738a3d7c3d2c438235111188968486cab2934b32cad1b6b4b2cbf343b25d41ad463c0513cf21cf9f77f072f4a49d8042947064e3375a1ae76c355fd48d5fc163cf7f865af91bcb788cffe2e9e1a30a7e3f91be8fb55b0a8b8c0b600ef3e0e88feaad4fbf4fffe76c9302ee2acfa3b64ca28cd006fd4af9c27d2eb45e47e582b87e632aa23475caeb0e3e9d777339f5cb94abc19ebd080ffc78181bf81ff227182de422937675546633bd6ab688258a94d132fb590f8152d3f19bd55a1f336fb7c382140987ac2389134d8033882f923d3d5324a3e9f5437bd70f095e6bb00ee68d8f21912b19b27924c61b4e3bfe68411f9f220de8dace00e767b662313706730d4dc8539b309fc75e6ca4cae470cdf12cc3cfb191486e3e5eb8c80723b2b0473b07e4ea4d385487dd303df2db8d31f8c90d53c4adcf39ad78cf6c85fbb87b4c4ee531a42c2133df2b0362132374df995420e4b2a6d1e19d7879d518652d5101a316962b27b3884cb67d07572f96b9668ca42cca7311a7152ac7c6d492009192fa4a707989e43b2a10f19e535e7cf8afdaf63ce9a2a85ce1bd17d81cfe76d2ce5759a7fdbeff6fb279b8620bc2c5183b24be831c7ee157114f2700da210b36edb7bda7d91a32f7940bef431c76571cd44499f779cc4ebe829fb34eeaa1e442240d5962bdbcbc16c962974b546e9cee380dda49f651acc5c58acae4ad06d57e4b91d8c5557365e8ddda7ee9550963d70d4f56b44fc5a26e29b36cb21d11221825b5a2217cb1f1454d34d94a855cb860f2fe43681e3d302e7e124273dd18b04fddf660b8858e1e78d022cc03f467f3cf1a6e5df53bb831794542b1d08e38d3bfb0bf2e5ba6f75a0f77d56bf2924b144fff3c87ec7a57bff345ee8a4496676d38c9453c38e64521db2de6d6452aa8f3da1675134e8d90cbb0d274ce6189563fd9a56e56a800661e787b083950623035ddeeb2fb84f6fb2507f2c157e74e81a81970e11475ce926e393a55b06b77c444dbd23688e8a77c7f30337874fef787a187fcafd73a5a4837c8e3e60712308597ff72ea2edae69c9402ad7ae81abb3e9100f0c87b99b2564246bd56af8e6d0ecf2928e5151218f7e627c565e15540666f4f7c0e937c2d0e84782fcb1b535e596f6c4e0aed7c1d350e169d045f2eaaa4bb2f94cd149576f835e5eecb4418677d0444e51fafcbed2afac50b1d320bc223d2623601aee6df6a363a24294bfb3b00f2668dfc404e9fa17fe936e6620756a6918f7de2de343f380fab83fde911124be508")), ... KEY=Key(EncryptionType.AES256_CTS_HMAC_SHA1_96, key=bytes.fromhex("4aad1c4c7b5bf02bfd061cfaebf0188d6c4f4642d569ca4ab536cb68adcb0e68")), ... ) >>> server = KerberosSSP( ... SPN="cifs/dc1", ... PASSWORD="Password1", ... KEY=Key(EncryptionType.AES256_CTS_HMAC_SHA1_96, key=bytes.fromhex("133614b285c1d76d4ec78d642e9c6f7451d7652cf6c5fe635af6e89050d42517")), ... ) ###(055)=[passed] GSS_Init_sec_context (KRB_AP_REQ) - DCE_STYLE >>> with KrbRandomPatcher(): ... clicontext, tok, negResult = client.GSS_Init_sec_context( ... None, ... req_flags=( ... GSS_C_FLAGS.GSS_C_DCE_STYLE | ... GSS_C_FLAGS.GSS_C_REPLAY_FLAG | ... GSS_C_FLAGS.GSS_C_SEQUENCE_FLAG | ... GSS_C_FLAGS.GSS_C_MUTUAL_FLAG | ... GSS_C_FLAGS.GSS_C_INTEG_FLAG ... ) ... ) ... >>> assert negResult == 1 >>> assert isinstance(tok, KRB_AP_REQ) >>> ap_req = KRB_AP_REQ(bytes(tok)) >>> assert isinstance(ap_req, KRB_AP_REQ) >>> assert ap_req.apOptions == "001" >>> assert ap_req.ticket == client.ST >>> >>> auth = ap_req.authenticator.decrypt(client.KEY) >>> assert auth.cksum.cksumtype == 0x8003 >>> assert auth.cksum.checksum.Flags == ( ... GSS_C_FLAGS.GSS_C_DCE_STYLE | ... GSS_C_FLAGS.GSS_C_REPLAY_FLAG | ... GSS_C_FLAGS.GSS_C_SEQUENCE_FLAG | ... GSS_C_FLAGS.GSS_C_MUTUAL_FLAG | ... GSS_C_FLAGS.GSS_C_INTEG_FLAG ... ) >>> assert auth.cksum.checksum.Exts[0].sprintf("%type%") == 'GSS_EXTS_CHANNEL_BINDING' >>> >>> bytes(tok) b'n\x82\x05\xf90\x82\x05\xf5\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0e\xa2\x04\x03\x02\x05 \xa3\x82\x04\xa5a\x82\x04\xa10\x82\x04\x9d\xa0\x03\x02\x01\x05\xa1\x0e\x1b\x0cDOMAIN.LOCAL\xa2\x160\x14\xa0\x03\x02\x01\x03\xa1\r0\x0b\x1b\x04cifs\x1b\x03dc1\xa3\x82\x04l0\x82\x04h\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\r\xa2\x82\x04Z\x04\x82\x04Vg\x1fa1\xb3\x8e\xe6\xe6\x82\xd6,\xb97\xb8\xb7\x9cX\x97S\x18/\x8d\xbc\xb1J\x91\xb01\x05*< \xf7\xb4\xc8\x9b\xf9\xa4\x1f\xe9\x96\r\x11*\xccs\xf6\xbde\'\xdf\xe7\x07\x00\xa3\xd3\xc2\xe7+K\xa6p]\xfc\x04\x0f\xd5o\x9d|\xd6\x0bX\x0e\xbe\xce\xc2\xbf\xb2@\xba\xaca\x96\x90\xdb\xd90\x1e\xd9\x8c\xac\x03|\xfd\xff\x8f\xf9j\xc9\x83X\x96\x9f52\xf9\xc6\xad\xc0v\xd16\xa0\xef\x96\xeb\xdd\xef)=\xf8y\xbbB\xad\xfb\xf7g\x044\xf3@\xadg>\x03\x03\xae\x18n\x1aQ\r\x7fP\xdb\xfe\xe9\xeb\xab2\x9dws9\xf5\xcb\x94\xab\xc1\x9e\xbd\x08\x0f\xfcx\x18\x1b\xf8\x1f\xf2\'\x18-\xe4"\x93vuTf3\xbdj\xb6\x88%\x8a\x94\xd12\xfbY\x0f\x81R\xd3\xf1\x9b\xd5Z\x1f3o\xb7\xc3\x82\x14\t\x87\xac#\x89\x13M\x803\x88/\x92==S$\xa3\xe9\xf5C{\xd7\x0f\t^k\xb0\x0e\xe6\x8d\x8f!\x91+\x19\xb2y$\xc6\x1bN;\xfehA\x1f\x9f"\r\xe8\xda\xce\x00\xe7g\xb6b17\x06s\rM\xc8S\x9b0\x9f\xc7^l\xa4\xca\xe4p\xcd\xf1,\xc3\xcf\xb1\x91Hn>^\xb8\xc8\x07#\xb2\xb0G;\x07\xe4\xeaM8T\x87\xdd0=\xf2\xdb\x8d1\xf8\xc9\rS\xc4\xad\xcf9\xadx\xcfl\x85\xfb\xb8{LN\xe51\xa4,!3\xdf+\x03b\x13#t\xdf\x99T \xe4\xb2\xa6\xd1\xe1\x9dxy\xd5\x18e-Q\x01\xa3\x16\x96+\'\xb3\x88L\xb6}\x07W/\x96\xb9f\x8c\xa4,\xcas\x11\xa7\x15*\xc7\xc6\xd4\x92\x00\x91\x92\xfaJpy\x89\xe4;*\x10\xf1\x9eS^|\xf8\xaf\xda\xf6<\xe9\xa2\xa8\\\xe1\xbd\x17\xd8\x1c\xfev\xd2\xceWY\xa7\xfd\xbe\xffo\xb2y\xb8b\x0b\xc2\xc5\x18;$\xbe\x83\x1c~\xe1W\x11O\'\x00\xda!\x0b6\xed\xb7\xbd\xa7\xd9\x1a2\xf7\x94\x0b\xefC\x1cvW\x1c\xd4D\x99\xf7y\xccN\xbe\x82\x9f\xb3N\xea\xa1\xe4B$\rYb\xbd\xbc\xbc\x16\xc9b\x97KTn\x9c\xee8\r\xdaI\xf6Q\xac\xc5\xc5\x8a\xca\xe4\xad\x06\xd5~K\x91\xd8\xc5Use\xe8\xdd\xda~\xe9U\tc\xd7\rOV\xb4O\xc5\xa2n)\xb3l\xb2\x1d\x11"\x18%\xb5\xa2!|\xb1\xf1EM4\xd9J\x85\\\xb8`\xf2\xfeCh\x1e=0.~\x12Bs\xdd\x18\xb0O\xdd\xf6`\xb8\x85\x8e\x1ex\xd0"\xcc\x03\xf4g\xf3\xcf\x1an]\xf5;\xb81yEB\xb1\xd0\x8e8\xd3\xbf\xb0\xbf.[\xa6\xf7Z\x0fw\xd5k\xf2\x92K\x14O\xff<\x87\xeczW\xbf\xf3E\xee\x8aD\x96gm8\xc9E<8\xe6E!\xdb-\xe6\xd6E*\xa8\xf3\xda\x16u\x13N\x8d\x90\xcb\xb0\xd2t\xcea\x89V?\xd9\xa5nV\xa8\x00f\x1ex{\x089Pb05\xdd\xee\xb2\xfb\x84\xf6\xfb%\x07\xf2\xc1W\xe7N\x81\xa8\x19p\xe1\x14u\xce\x92n9:U\xb0kw\xc4D\xdb\xd26\x88\xe8\xa7|\x7f03xt\xfe\xf7\x87\xa1\x87\xfc\xaf\xd7:ZH7\xc8\xe3\xe6\x07\x120\x85\x97\xffr\xea.\xda\xe6\x9c\x94\x02\xadz\xe8\x1a\xbb>\x91\x00\xf0\xc8{\x99\xb2VBF\xbdV\xaf\x8em\x0e\xcf)(\xe5\x15\x12\x18\xf7\xe6\'\xc5e\xe1U@foO|\x0e\x93|-\x0e\x84x/\xcb\x1bS^YolN\n\xed|\x1d5\x0e\x16\x9d\x04_.\xaa\xa4\xbb/\x94\xcd\x14\x95v\xf85\xe5\xee\xcbD\x18g}\x04D\xe5\x1f\xaf\xcb\xed*\xfa\xc5\x0b\x1d2\x0b\xc2#\xd2b6\x01\xae\xe6\xdfj6:$)K\xfb;\x00\xf2f\x8d\xfc@N\x9f\xa1\x7f\xe96\xe6b\x07V\xa6\x91\x8f}\xe2\xde4?8\x0f\xab\x83\xfd\xe9\x11\x12K\xe5\x08\xa4\x82\x0180\x82\x014\xa0\x03\x02\x01\x12\xa2\x82\x01+\x04\x82\x01\'\\>\t\xe4\x1d8,a(\x7f\x1e\xd2\x8dHH\x9c\xef\x8d\x1fqW\xbf(\x97S+\rs_zM\xee\xa7\xc2\x1a\x8eh1\xa4\xcb\x06\xed\x8e\xe6\xc0\x9a\xf7\x93g5\xa5vp\x0e~G\xaf:\xbb<\xaa2\x0e\xf8+l \xc5\xdb\x17,\xa9\x99\xae\x80\r\x0f\xdd4\x92\xf1\xa3h\xc3)^*I\x92\x01\x9f\x06jW\x1a\xac\x02r\x05\n`d\xd1\xda\xf5i\x9e\x04e\xa9\\,2\xf9\xa55\x16m\x92\x7fI\xe6\x81\x98\xe5V\xa1i\x17\xf0\x10\xf9\x16\x92\x81\x95mJ\xe3\xcc\x0f\x83gW\xca\xc5l\xc2~\x1fFmt~\x81\xd5%{\x87\xe1!\x15\xc4o\x163,\x8eg\xd4\xc5\xdc\xd7\x11at\x87v\x13j\xd0/\x07z/\xee\xd6\xd8b\x0b(\xae*\xd7\x87\xe3\xb7\x1b\xf8d\xd8\xbc\xadL7\x18a0o`\xa7\xd1Q\xe8\xf3\x9a\xf1\x95\xf2\xec\x06\xc0v\xba\x81\xc4\xbc7@8\x08\xd9\xa7{~\x8fz\xeeE\xdc\xc9\x81"\xb6b\x872=.\x19$KP\xcd\xfd\x85\x861@c\x05,\xa9\x98\xe9\x8e\x84A\x9f\n#&\xb2\xf4"\xa5O\x86\xc9\x93\xcb\x97\x0e\x18C\xf5\x00^\xe8De\x94|\xbaf' >>> assert bytes(tok) == b'n\x82\x05\xf90\x82\x05\xf5\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0e\xa2\x04\x03\x02\x05 \xa3\x82\x04\xa5a\x82\x04\xa10\x82\x04\x9d\xa0\x03\x02\x01\x05\xa1\x0e\x1b\x0cDOMAIN.LOCAL\xa2\x160\x14\xa0\x03\x02\x01\x03\xa1\r0\x0b\x1b\x04cifs\x1b\x03dc1\xa3\x82\x04l0\x82\x04h\xa0\x03\x02\x01\x12\xa1\x03\x02\x01\r\xa2\x82\x04Z\x04\x82\x04Vg\x1fa1\xb3\x8e\xe6\xe6\x82\xd6,\xb97\xb8\xb7\x9cX\x97S\x18/\x8d\xbc\xb1J\x91\xb01\x05*< \xf7\xb4\xc8\x9b\xf9\xa4\x1f\xe9\x96\r\x11*\xccs\xf6\xbde\'\xdf\xe7\x07\x00\xa3\xd3\xc2\xe7+K\xa6p]\xfc\x04\x0f\xd5o\x9d|\xd6\x0bX\x0e\xbe\xce\xc2\xbf\xb2@\xba\xaca\x96\x90\xdb\xd90\x1e\xd9\x8c\xac\x03|\xfd\xff\x8f\xf9j\xc9\x83X\x96\x9f52\xf9\xc6\xad\xc0v\xd16\xa0\xef\x96\xeb\xdd\xef)=\xf8y\xbbB\xad\xfb\xf7g\x044\xf3@\xadg>\x03\x03\xae\x18n\x1aQ\r\x7fP\xdb\xfe\xe9\xeb\xab2\x9dws9\xf5\xcb\x94\xab\xc1\x9e\xbd\x08\x0f\xfcx\x18\x1b\xf8\x1f\xf2\'\x18-\xe4"\x93vuTf3\xbdj\xb6\x88%\x8a\x94\xd12\xfbY\x0f\x81R\xd3\xf1\x9b\xd5Z\x1f3o\xb7\xc3\x82\x14\t\x87\xac#\x89\x13M\x803\x88/\x92==S$\xa3\xe9\xf5C{\xd7\x0f\t^k\xb0\x0e\xe6\x8d\x8f!\x91+\x19\xb2y$\xc6\x1bN;\xfehA\x1f\x9f"\r\xe8\xda\xce\x00\xe7g\xb6b17\x06s\rM\xc8S\x9b0\x9f\xc7^l\xa4\xca\xe4p\xcd\xf1,\xc3\xcf\xb1\x91Hn>^\xb8\xc8\x07#\xb2\xb0G;\x07\xe4\xeaM8T\x87\xdd0=\xf2\xdb\x8d1\xf8\xc9\rS\xc4\xad\xcf9\xadx\xcfl\x85\xfb\xb8{LN\xe51\xa4,!3\xdf+\x03b\x13#t\xdf\x99T \xe4\xb2\xa6\xd1\xe1\x9dxy\xd5\x18e-Q\x01\xa3\x16\x96+\'\xb3\x88L\xb6}\x07W/\x96\xb9f\x8c\xa4,\xcas\x11\xa7\x15*\xc7\xc6\xd4\x92\x00\x91\x92\xfaJpy\x89\xe4;*\x10\xf1\x9eS^|\xf8\xaf\xda\xf6<\xe9\xa2\xa8\\\xe1\xbd\x17\xd8\x1c\xfev\xd2\xceWY\xa7\xfd\xbe\xffo\xb2y\xb8b\x0b\xc2\xc5\x18;$\xbe\x83\x1c~\xe1W\x11O\'\x00\xda!\x0b6\xed\xb7\xbd\xa7\xd9\x1a2\xf7\x94\x0b\xefC\x1cvW\x1c\xd4D\x99\xf7y\xccN\xbe\x82\x9f\xb3N\xea\xa1\xe4B$\rYb\xbd\xbc\xbc\x16\xc9b\x97KTn\x9c\xee8\r\xdaI\xf6Q\xac\xc5\xc5\x8a\xca\xe4\xad\x06\xd5~K\x91\xd8\xc5Use\xe8\xdd\xda~\xe9U\tc\xd7\rOV\xb4O\xc5\xa2n)\xb3l\xb2\x1d\x11"\x18%\xb5\xa2!|\xb1\xf1EM4\xd9J\x85\\\xb8`\xf2\xfeCh\x1e=0.~\x12Bs\xdd\x18\xb0O\xdd\xf6`\xb8\x85\x8e\x1ex\xd0"\xcc\x03\xf4g\xf3\xcf\x1an]\xf5;\xb81yEB\xb1\xd0\x8e8\xd3\xbf\xb0\xbf.[\xa6\xf7Z\x0fw\xd5k\xf2\x92K\x14O\xff<\x87\xeczW\xbf\xf3E\xee\x8aD\x96gm8\xc9E<8\xe6E!\xdb-\xe6\xd6E*\xa8\xf3\xda\x16u\x13N\x8d\x90\xcb\xb0\xd2t\xcea\x89V?\xd9\xa5nV\xa8\x00f\x1ex{\x089Pb05\xdd\xee\xb2\xfb\x84\xf6\xfb%\x07\xf2\xc1W\xe7N\x81\xa8\x19p\xe1\x14u\xce\x92n9:U\xb0kw\xc4D\xdb\xd26\x88\xe8\xa7|\x7f03xt\xfe\xf7\x87\xa1\x87\xfc\xaf\xd7:ZH7\xc8\xe3\xe6\x07\x120\x85\x97\xffr\xea.\xda\xe6\x9c\x94\x02\xadz\xe8\x1a\xbb>\x91\x00\xf0\xc8{\x99\xb2VBF\xbdV\xaf\x8em\x0e\xcf)(\xe5\x15\x12\x18\xf7\xe6\'\xc5e\xe1U@foO|\x0e\x93|-\x0e\x84x/\xcb\x1bS^YolN\n\xed|\x1d5\x0e\x16\x9d\x04_.\xaa\xa4\xbb/\x94\xcd\x14\x95v\xf85\xe5\xee\xcbD\x18g}\x04D\xe5\x1f\xaf\xcb\xed*\xfa\xc5\x0b\x1d2\x0b\xc2#\xd2b6\x01\xae\xe6\xdfj6:$)K\xfb;\x00\xf2f\x8d\xfc@N\x9f\xa1\x7f\xe96\xe6b\x07V\xa6\x91\x8f}\xe2\xde4?8\x0f\xab\x83\xfd\xe9\x11\x12K\xe5\x08\xa4\x82\x0180\x82\x014\xa0\x03\x02\x01\x12\xa2\x82\x01+\x04\x82\x01\'\\>\t\xe4\x1d8,a(\x7f\x1e\xd2\x8dHH\x9c\xef\x8d\x1fqW\xbf(\x97S+\rs_zM\xee\xa7\xc2\x1a\x8eh1\xa4\xcb\x06\xed\x8e\xe6\xc0\x9a\xf7\x93g5\xa5vp\x0e~G\xaf:\xbb<\xaa2\x0e\xf8+l \xc5\xdb\x17,\xa9\x99\xae\x80\r\x0f\xdd4\x92\xf1\xa3h\xc3)^*I\x92\x01\x9f\x06jW\x1a\xac\x02r\x05\n`d\xd1\xda\xf5i\x9e\x04e\xa9\\,2\xf9\xa55\x16m\x92\x7fI\xe6\x81\x98\xe5V\xa1i\x17\xf0\x10\xf9\x16\x92\x81\x95mJ\xe3\xcc\x0f\x83gW\xca\xc5l\xc2~\x1fFmt~\x81\xd5%{\x87\xe1!\x15\xc4o\x163,\x8eg\xd4\xc5\xdc\xd7\x11at\x87v\x13j\xd0/\x07z/\xee\xd6\xd8b\x0b(\xae*\xd7\x87\xe3\xb7\x1b\xf8d\xd8\xbc\xadL7\x18a0o`\xa7\xd1Q\xe8\xf3\x9a\xf1\x95\xf2\xec\x06\xc0v\xba\x81\xc4\xbc7@8\x08\xd9\xa7{~\x8fz\xeeE\xdc\xc9\x81"\xb6b\x872=.\x19$KP\xcd\xfd\x85\x861@c\x05,\xa9\x98\xe9\x8e\x84A\x9f\n#&\xb2\xf4"\xa5O\x86\xc9\x93\xcb\x97\x0e\x18C\xf5\x00^\xe8De\x94|\xbaf' ###(056)=[passed] GSS_Accept_sec_context (KRB_AP_REQ->KRB_AP_REP) - DCE_STYLE >>> with KrbRandomPatcher(): ... srvcontext, tok, negResult = server.GSS_Accept_sec_context(None, tok) ... >>> assert negResult == 1 >>> assert isinstance(tok, KRB_AP_REP) >>> ap_rep = KRB_AP_REP(bytes(tok)) >>> >>> apreppart = ap_rep.encPart.decrypt(client.KEY) >>> assert apreppart.ctime == "20240305165255Z" >>> assert apreppart.subkey.keyvalue == b"0000000000000000" >>> assert apreppart.subkey.keytype == 17 >>> >>> bytes(tok) b'on0l\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0f\xa2`0^\xa0\x03\x02\x01\x12\xa2W\x04UaS\xeck\xcc\xad~\xfa^\x8d\xca\xbb\xc5\xd2/\xfd\xd3\xc3\xd9\xadN`\xd2;\xd7{\xb7\xf4p.\xa9\x9a\xb1}D\xc6|_t\n\r"M\xcd\xe2\t\xf0Ri\xc7\xcf\xb5\xefr9\xf0`iS7N\x06qKP\x06\xde\xc4\x18\xd5_\xcb\x0ct\x03k\xbc\xb9\x1adT\x03\xc1\x8bM' >>> assert bytes(tok) == b'on0l\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0f\xa2`0^\xa0\x03\x02\x01\x12\xa2W\x04UaS\xeck\xcc\xad~\xfa^\x8d\xca\xbb\xc5\xd2/\xfd\xd3\xc3\xd9\xadN`\xd2;\xd7{\xb7\xf4p.\xa9\x9a\xb1}D\xc6|_t\n\r"M\xcd\xe2\t\xf0Ri\xc7\xcf\xb5\xefr9\xf0`iS7N\x06qKP\x06\xde\xc4\x18\xd5_\xcb\x0ct\x03k\xbc\xb9\x1adT\x03\xc1\x8bM' ###(057)=[passed] GSS_Init_sec_context (SPNEGO_negToken: KRB_AP_REP->KRB_AP_REP) - DCE_STYLE >>> with KrbRandomPatcher(): ... clicontext, tok, negResult = client.GSS_Init_sec_context(clicontext, tok) ... >>> assert negResult == 0 >>> assert isinstance(tok, KRB_AP_REP) >>> ap_rep = KRB_AP_REP(bytes(tok)) >>> >>> apreppart = ap_rep.encPart.decrypt(client.KEY) >>> assert apreppart.ctime == "20240305165255Z" >>> >>> bytes(tok) b'oQ0O\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0f\xa2C0A\xa0\x03\x02\x01\x12\xa2:\x048aS\xeck\xcc\xad~\xfa^\x8d\xca\xbb\xc5\xd2/\xfd.e\xec\xef\xce\x91\x1d\x99\xd8\xcd2\x01\x0fA\xe4\xde\x12\xf4\xbc>\xe1\x98T\xc4\x82\xb5w\x1arZb\xdb\x9b-+\xf3\xfa\x0b\xdeD' >>> assert bytes(tok) == b'oQ0O\xa0\x03\x02\x01\x05\xa1\x03\x02\x01\x0f\xa2C0A\xa0\x03\x02\x01\x12\xa2:\x048aS\xeck\xcc\xad~\xfa^\x8d\xca\xbb\xc5\xd2/\xfd.e\xec\xef\xce\x91\x1d\x99\xd8\xcd2\x01\x0fA\xe4\xde\x12\xf4\xbc>\xe1\x98T\xc4\x82\xb5w\x1arZb\xdb\x9b-+\xf3\xfa\x0b\xdeD' ###(058)=[passed] GSS_Accept_sec_context (KRB_AP_REP->OK) - DCE_STYLE >>> with KrbRandomPatcher(): ... srvcontext, tok, negResult = server.GSS_Accept_sec_context(srvcontext, tok) ... >>> assert negResult == 0 >>> assert tok is None ###(059)=[passed] GSS_Wrap/GSS_Unwrap: client sends wrapped payload without confidentiality >>> data = b"testAAAAAAAAAABBBBBBBBBCCCCCCCCCDDDDDDDDDEEEEEEEEE" >>> >>> sig = client.GSS_Wrap( ... clicontext, ... data, ... conf_req_flag=False, ... ) >>> assert sig.TOK_ID == b"\x05\x04" >>> assert sig.root.Flags == 4 >>> assert sig.root.EC == 12 >>> assert sig.root.RRC == 12 >>> assert bytes(sig) == b'\x05\x04\x04\xff\x00\x0c\x00\x0c\x00\x00\x00\x00@\x00\x00\x00\x8f\x0c\xab\x90h\xc8\xdf1\x078\x03\x0ctestAAAAAAAAAABBBBBBBBBCCCCCCCCCDDDDDDDDDEEEEEEEEE' >>> >>> ddata = server.GSS_Unwrap( ... srvcontext, ... sig, ... ) >>> assert ddata == data ###(060)=[passed] GSS_Wrap/GSS_Unwrap: server answers back without confidentiality >>> data = b"testAAAAAAAAAABBBBBBBBBCCCCCCCCCDDDDDDDDDEEEEEEEEE" >>> >>> sig = server.GSS_Wrap( ... srvcontext, ... data, ... conf_req_flag=False, ... ) >>> assert sig.TOK_ID == b"\x05\x04" >>> assert sig.root.Flags == 5 >>> assert sig.root.EC == 12 >>> assert sig.root.RRC == 12 >>> bytes(sig) b"\x05\x04\x05\xff\x00\x0c\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00~\xd8\x08\x89K'\xa0\x01\xda\x7f\xff\xd3testAAAAAAAAAABBBBBBBBBCCCCCCCCCDDDDDDDDDEEEEEEEEE" >>> assert bytes(sig) == b"\x05\x04\x05\xff\x00\x0c\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00~\xd8\x08\x89K'\xa0\x01\xda\x7f\xff\xd3testAAAAAAAAAABBBBBBBBBCCCCCCCCCDDDDDDDDDEEEEEEEEE" >>> >>> ddata = client.GSS_Unwrap( ... clicontext, ... sig, ... ) >>> assert ddata == data ###(061)=[passed] GSS_WrapEx/GSS_UnwrapEx: client sends wrapped payload with confidentiality >>> from unittest import mock >>> from scapy.libs.rfc3961 import Key, EncryptionType >>> >>> >>> dcerpc_hdr = bytes.fromhex("0500000310000000fc004c00030000008c00000001000c00") >>> dcerpc_data = bytes.fromhex("000000001bc104a40f046e43bd2a4b2722092807010000000100000000000000e40400000904000000000000010000000600000001000000000002000000000001000000000000000000020000000000120000000000000000000000000000001200000000000000440043003d0063006f006e0074006f0073006f002c00440043003d0063006f006d00000000000000") >>> dcerpc_sectrailer = bytes.fromhex("0906040000000000") >>> Confounder = bytes.fromhex("aeb63f1db8e2cb61548867a0e4074e85") >>> k = Key(EncryptionType.AES256_CTS_HMAC_SHA1_96, key=bytes.fromhex("613f2dfabd35d17d86b00cf1001ce9458bf379c1d3921bbfdcd2de8782bec540")) >>> SeqNum = 0x60298ed4 >>> >>> >>> clicontext = KerberosSSP.CONTEXT(IsAcceptor=False) >>> srvcontext = KerberosSSP.CONTEXT(IsAcceptor=True) >>> >>> clicontext.KrbSessionKey = srvcontext.KrbSessionKey = k >>> clicontext.SendSeqNum = srvcontext.RecvSeqNum = SeqNum >>> clicontext.flags = srvcontext.flags = ( ... GSS_C_FLAGS.GSS_C_DCE_STYLE | ... GSS_C_FLAGS.GSS_C_REPLAY_FLAG | ... GSS_C_FLAGS.GSS_C_SEQUENCE_FLAG | ... GSS_C_FLAGS.GSS_C_MUTUAL_FLAG | ... GSS_C_FLAGS.GSS_C_INTEG_FLAG | ... GSS_C_FLAGS.GSS_C_CONF_FLAG ... ) >>> >>> client = server = KerberosSSP() >>> >>> >>> with mock.patch('scapy.layers.kerberos.os.urandom', side_effect=lambda x: Confounder): ... _msgs, sig = client.GSS_WrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=dcerpc_hdr), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=dcerpc_data), ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=dcerpc_sectrailer), ... ], ... ) ... >>> assert _msgs[0].data == dcerpc_hdr >>> assert _msgs[1].data == b'|\xdf\xf8\xe5lS#\xe9\x9c\x15\xb4\xad\x06\xa8\xb9\x01\xd2\x13\xe6qLL\xd1\x82:v\xf2\xb1B\xc9u \xc5\xc88\xce\x91\xed*\x9c+v,W\x97\xde\xaan\xb8\x80\x9bd\xedW\x1aot\xa1\xb8\xbdp\xc0\xee\xe5\xb0\xa4\xce\x15{OA\x08\xee#;w\tV\x0e3\x9el\x00\x8f\xbaM\x07[\x1f,&\x99\x92\x91tvh\xbf\xcf\xb6\xd1\xbaB\xe3\xc9\x943\xed\xf04\x92!\xbd`\x00\x05;\xfce18H\xcb\xd8\x1eTT\x18\xbe\xb4\xbc\x08X\x1b$\x96\x04\xc9\xc6\xf1$\xfc,\xc0' >>> assert _msgs[2].data == dcerpc_sectrailer >>> >>> assert sig.TOK_ID == b"\x05\x04" >>> assert sig.root.Flags == 6 >>> assert sig.root.Filler == 0xFF >>> assert sig.root.EC == 16 >>> assert sig.root.RRC == 28 >>> assert sig.root.SND_SEQ == SeqNum >>> assert bytes(sig) == b'\x05\x04\x06\xff\x00\x10\x00\x1c\x00\x00\x00\x00`)\x8e\xd4\xf8\xb9\x99JO\xdeA\x9c+t\xbb\xe9>\xf0G\xd5\x9d\x9b\xca:\x10\xee\x1f\xe93\xc1*/`H\x89\xf4\xab\xd7E!\xd5<*ou\x94\xa3\t\xf1\x7f\xaa\xe9\x95}\xaa\xb7\x9f\xd4F\xfe\x9bt\xa1\x00' >>> >>> decrypted = server.GSS_UnwrapEx( ... srvcontext, ... _msgs, ... sig, ... )[1].data >>> assert decrypted == dcerpc_data ###(062)=[passed] GSS_WrapEx/GSS_UnwrapEx: server answers back confidentiality >>> with KrbRandomPatcher(): ... _msgs, sig = server.GSS_WrapEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=dcerpc_hdr), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=dcerpc_data), ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=dcerpc_sectrailer), ... ], ... ) ... >>> assert _msgs[0].data == dcerpc_hdr >>> assert _msgs[1].data == b"\x9av\xf9 :e\x0f\xd8!\x1c\xc7\x076'a.NN\xcf\x0c\xec\x8c\x83\xb4\x9c'<%i\x17\xbe\xcc\x01 \x1d\x031\\Y\x92H\xe4\xd50W\x8e\xe0\xe85\xd8\xf5c[\x97Bl\x16\x12P\x03l\xdb\x99$\xef\x9a\x06\x85\x18\xcf\xc5\x91~\x88\xca\xb2D\xf8\xe5(+\xb30\r\xbf\xe8\xc7\x11\x18\xfa,&(\xc3l)c\x08%\xaf\x80\xe5u\xadw\x06\x15\xe8\xed\xfa\xb3\xe0\x1d\xb2\xdan\xcfb<\x01\x9d\xa6\xb4=W:Z\xb6\xbf\xe9\x1a\xc8g\x9d\x01\x87>> assert _msgs[2].data == dcerpc_sectrailer >>> >>> assert sig.TOK_ID == b"\x05\x04" >>> assert sig.root.Flags == 7 >>> assert sig.root.Filler == 0xFF >>> assert sig.root.EC == 16 >>> assert sig.root.RRC == 28 >>> assert sig.root.SND_SEQ == 0 >>> assert bytes(sig) == b'\x05\x04\x07\xff\x00\x10\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00>> >>> decrypted = client.GSS_UnwrapEx( ... clicontext, ... _msgs, ... sig, ... )[1].data >>> assert decrypted == dcerpc_data Layer 2 regression tests for Scapy ━ Run at 01:42:21 from [test/scapy/layers/l2.uts] by UTscapy in 0.10835862159729004 └ Passed=15 └ Failed=0 ###### ## Layer 2 Unit Tests ###### ###(001)=[passed] Test ARPingResult output >>> ar = ARPingResult([(None, Ether(src='70:ee:50:50:ee:70')/ARP(psrc='192.168.0.1'))]) >>> with ContextManagerCaptureOutput() as cmco: ... ar.show() ... result_ar = cmco.get_output() ... >>> assert "70:ee:50:50:ee:70 Netatmo 192.168.0.1" in result_ar ###(002)=[passed] arp_mitm - IP to IP >>> from scapy.plist import QueryAnswer >>> >>> srp_step = 0 >>> >>> def srp_spoof(x, *args, **kwargs): ... global srp_step ... assert x.dst == "ff:ff:ff:ff:ff:ff" ... if srp_step == 0: ... assert x.pdst == "192.168.0.1" ... ans = Ether(src="cc:cc:cc:cc:cc:cc", dst=x.src)/ARP(hwsrc="cc:cc:cc:cc:cc:cc", hwdst=x.hwsrc, psrc=x.pdst, pdst=x.psrc) ... elif srp_step == 1: ... assert x.pdst == "192.168.0.2" ... ans = Ether(src="bb:bb:bb:bb:bb:bb", dst=x.src)/ARP(hwsrc="bb:bb:bb:bb:bb:bb", hwdst=x.hwsrc, psrc=x.pdst, pdst=x.psrc) ... else: ... assert False ... srp_step += 1 ... return SndRcvList([QueryAnswer(x, ans)]), PacketList() ... >>> srploop_step = 0 >>> >>> def srploop_spoof(x, *args, **kwargs): ... assert len(x) == 2 ... assert x[0].dst == "cc:cc:cc:cc:cc:cc" ... assert x[0].src == x[0].hwsrc == "aa:aa:aa:aa:aa:aa" ... assert x[0].hwdst == "00:00:00:00:00:00" ... assert x[0].psrc == "192.168.0.2" ... assert x[0].pdst == "192.168.0.1" ... assert x[1].dst == "bb:bb:bb:bb:bb:bb" ... assert x[1].src == x[1].hwsrc == "aa:aa:aa:aa:aa:aa" ... assert x[1].hwdst == "00:00:00:00:00:00" ... assert x[1].psrc == "192.168.0.1" ... assert x[1].pdst == "192.168.0.2" ... >>> def sendp_spoof(x, *args, **kwargs): ... assert len(x) == 2 ... assert x[0].dst == "ff:ff:ff:ff:ff:ff" ... assert x[0].src == x[0].hwsrc == "bb:bb:bb:bb:bb:bb" ... assert x[0].hwdst == "00:00:00:00:00:00" ... assert x[0].psrc == "192.168.0.2" ... assert x[0].pdst == "192.168.0.1" ... assert x[1].dst == "ff:ff:ff:ff:ff:ff" ... assert x[1].src == x[1].hwsrc == "cc:cc:cc:cc:cc:cc" ... assert x[1].hwdst == "00:00:00:00:00:00" ... assert x[1].psrc == "192.168.0.1" ... assert x[1].pdst == "192.168.0.2" ... >>> from unittest import mock >>> with mock.patch('scapy.layers.l2.srp', side_effect=srp_spoof), \ ... mock.patch('scapy.layers.l2.srploop', side_effect=srploop_spoof), \ ... mock.patch('scapy.layers.l2.sendp', side_effect=sendp_spoof): ... arp_mitm( ... "192.168.0.1", ... "192.168.0.2", ... target_mac='aa:aa:aa:aa:aa:aa', ... ) ... MITM on eth0: ['cc:cc:cc:cc:cc:cc'] <--> aa:aa:aa:aa:aa:aa <--> ['bb:bb:bb:bb:bb:bb'] Restoring... ###(003)=[passed] arp_mitm - IP to range >>> from scapy.plist import QueryAnswer >>> >>> def srp_spoof(x, *args, **kwargs): ... assert x.dst == "ff:ff:ff:ff:ff:ff" ... assert x.pdst == Net("192.168.0.2/24") ... ans = Ether(src="cc:cc:cc:cc:cc:cc", dst=x.src)/ARP(hwsrc="cc:cc:cc:cc:cc:cc", hwdst=x.hwsrc, psrc=x.pdst, pdst=x.psrc) ... return SndRcvList([ ... QueryAnswer(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.0.2"), Ether(src="cc:cc:cc:cc:cc:cc", dst=x.src)/ARP(hwsrc="cc:cc:cc:cc:cc:cc", psrc="192.168.0.2", pdst="192.168.0.1")), ... QueryAnswer(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.0.9"), Ether(src="11:11:11:11:11:11", dst=x.src)/ARP(hwsrc="11:11:11:11:11:11", psrc="192.168.0.9", pdst="192.168.0.1")), ... QueryAnswer(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.0.17"), Ether(src="22:22:22:22:22:22", dst=x.src)/ARP(hwsrc="22:22:22:22:22:22", psrc="192.168.0.17", pdst="192.168.0.1")), ... ]), PacketList() ... >>> srploop_step = 0 >>> >>> def srploop_spoof(x, *args, **kwargs): ... assert len(x) == 12 ... assert [bytes(y) for y in x] == [ ... b'\xdd\xdd\xdd\xdd\xdd\xdd\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\x02\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x01', ... b'\xdd\xdd\xdd\xdd\xdd\xdd\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\t\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x01', ... b'\xdd\xdd\xdd\xdd\xdd\xdd\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\x11\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x01', ... b'\xee\xee\xee\xee\xee\xee\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\x02\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x01', ... b'\xee\xee\xee\xee\xee\xee\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\t\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x01', ... b'\xee\xee\xee\xee\xee\xee\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\x11\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x01', ... b'\xcc\xcc\xcc\xcc\xcc\xcc\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x02', ... b'\xcc\xcc\xcc\xcc\xcc\xcc\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x02', ... b'\x11\x11\x11\x11\x11\x11\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\t', ... b'\x11\x11\x11\x11\x11\x11\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\t', ... b'""""""\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x11', ... b'""""""\xaa\xaa\xaa\xaa\xaa\xaa\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\xaa\xaa\xaa\xaa\xaa\xaa\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x11' ... ] ... >>> def sendp_spoof(x, *args, **kwargs): ... pass ... >>> from unittest import mock >>> with mock.patch('scapy.layers.l2.srp', side_effect=srp_spoof), \ ... mock.patch('scapy.layers.l2.srploop', side_effect=srploop_spoof), \ ... mock.patch('scapy.layers.l2.sendp', side_effect=sendp_spoof): ... arp_mitm( ... "192.168.0.1", ... "192.168.0.2/24", ... mac1=["dd:dd:dd:dd:dd:dd", "ee:ee:ee:ee:ee:ee"], ... target_mac='aa:aa:aa:aa:aa:aa', ... ) ... MITM on eth0: ['dd:dd:dd:dd:dd:dd', 'ee:ee:ee:ee:ee:ee'] <--> aa:aa:aa:aa:aa:aa <--> ['cc:cc:cc:cc:cc:cc', '11:11:11:11:11:11', '22:22:22:22:22:22'] Restoring... ###### ## STP tests ###### ###(004)=[passed] STP - Basic Instantiation >>> assert raw(STP()) == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x14\x00\x02\x00\x0f\x00' ###(005)=[passed] STP - Basic Dissection >>> s = STP(b'\x00\x00\x00\x00\x00\x00\x00\x12\x13\x14\x15\x16\x17\x00\x00\x00\x00\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x01\x00\x14\x00\x05\x00\x0f\x00') >>> assert s.rootmac == "12:13:14:15:16:17" >>> assert s.bridgemac == "aa:aa:aa:aa:aa:aa" >>> assert s.hellotime == 5 ###### ## ARP ###### ###(006)=[passed] Simple Ether() / ARP() show >>> (Ether() / ARP()).show() ###[ Ethernet ]### dst = None src = 52:54:00:a3:0b:7c type = ARP ###[ ARP ]### hwtype = Ethernet (10Mb) ptype = IPv4 hwlen = None plen = None op = who-has hwsrc = 52:54:00:a3:0b:7c psrc = 192.168.122.109 hwdst = 00:00:00:00:00:00 pdst = 0.0.0.0 ###(007)=[passed] ARP for IPv4 >>> p = raw(ARP()) >>> assert p == raw(ARP(ptype=0x0800)) >>> p = ARP(p) >>> assert p.ptype == 0x0800 >>> assert valid_ip(p.pdst) >>> assert valid_ip(p.psrc) >>> assert isinstance(p.payload, NoPayload) ###(008)=[passed] ARP for IPv6 >>> p = ARP(raw(ARP(ptype=0x86dd))) >>> assert p.ptype == 0x86dd >>> assert valid_ip6(p.pdst) >>> assert valid_ip6(p.psrc) >>> assert isinstance(p.payload, NoPayload) ###(009)=[passed] Dummy ARP >>> p = ARP(raw(ARP(plen=2, hwlen=1, hwdst="x", hwsrc="y", pdst="aa", psrc="bb"))) >>> assert p.hwdst == b"x" >>> assert p.hwsrc == b"y" >>> assert p.pdst == b"aa" >>> assert p.psrc == b"bb" >>> assert isinstance(p.payload, NoPayload) >>> >>> p = ARP(raw(ARP(plen=1, hwlen=1))) >>> assert p.hwdst == p.hwsrc == p.pdst == p.psrc == b"\x00" >>> assert isinstance(p.payload, NoPayload) >>> >>> p = ARP(pdst='192.168.178.0/24') >>> assert "Net" in repr(p) ###### ## 802.1Q bridging tests ###### ###(010)=[passed] 802.1Q VLAN >>> p = Ether(raw(Ether() / Dot1Q(vlan=99) / b"Payload")) MAC address to reach destination not found. Using broadcast. >>> assert p[Dot1Q].vlan == 99 ###(011)=[passed] 802.1ad Q-in-Q >>> p = Ether(raw(Ether() / Dot1AD(vlan=88) / Dot1Q(vlan=99) / b"Payload")) MAC address to reach destination not found. Using broadcast. >>> assert p[Dot1AD].vlan == 88 >>> assert p[Dot1Q].vlan == 99 ###(012)=[passed] 802.1ah PBB mac-in-mac >>> p = Ether(raw(Ether() / Dot1AD(vlan=88) / Dot1AH(isid=123456) / Ether() / Dot1Q(vlan=99) / b"Payload")) more MAC address to reach destination not found. Using broadcast. >>> assert p[Dot1AD].vlan == 88 >>> assert p[Dot1AH].isid == 123456 >>> assert p[Dot1Q].vlan == 99 ###(013)=[passed] 802.1ah PBB mac-in-mac - answer >>> p = Ether(raw(Ether() / Dot1AD(vlan=88) / Dot1AH(isid=123456) / Ether() / Dot1Q(vlan=99) / b"Payload")) >>> q = Ether(raw(Ether() / Dot1AD(vlan=88) / Dot1AH(isid=123456) / Ether() / Dot1Q(vlan=99) / b"Response")) >>> r = Ether(raw(Ether() / Dot1AD(vlan=88) / Dot1AH(isid=123456) / Ether() / Dot1Q(vlan=90) / b"Payload")) >>> s = Ether(raw(Ether() / Dot1AD(vlan=88) / Dot1AH(isid=987654) / Ether() / Dot1Q(vlan=99) / b"Payload")) >>> >>> assert q.answers(p) >>> assert not r.answers(p) >>> assert not s.answers(p) ###### ## CookedLinux ###### ###(014)=[passed] CookedLinux - Basic Dissection >>> cl = CookedLinux(b'\x00\x00\x03\x04\x00\x06\x00\x00\x00\x00\x00\x00\x6f\x50\x08\x00') >>> assert cl.pkttype == 0 # unicast >>> assert cl.lladdrtype == 772 # loopback >>> assert cl.lladdrlen == 6 >>> assert cl.src == b'\x00\x00\x00\x00\x00\x00\x6f\x50' >>> assert cl.proto == 2048 ###(015)=[passed] CookedLinuxV2 - Basic Dissection >>> clv2 = CookedLinuxV2(b'\x08\x00\x00\x00\x00\x00\x00\x03\x00\x01\x00\x06\xaa\x1f\x9c\xc0\x5a\x7e\x00\x00') >>> assert clv2.proto == 2048 >>> assert clv2.ifindex == 3 >>> assert clv2.lladdrtype == 1 # ether >>> assert clv2.pkttype == 0 # unicast >>> assert clv2.lladdrlen == 6 >>> assert clv2.src == b'\xaa\x1f\x9c\xc0\x5a\x7e\x00\000' L2TP regression tests for Scapy ━ Run at 01:42:21 from [test/scapy/layers/l2tp.uts] by UTscapy in 0.005914449691772461 └ Passed=3 └ Failed=0 ###### ## L2TP tests ###### ###(000)=[passed] L2TP - build >>> s = raw(IP(src="127.0.0.1", dst="127.0.0.1")/UDP()/L2TP()) >>> s == b'E\x00\x00"\x00\x01\x00\x00@\x11|\xc8\x7f\x00\x00\x01\x7f\x00\x00\x01\x06\xa5\x06\xa5\x00\x0e\xf4\x83\x00\x02\x00\x00\x00\x00' True ###(001)=[passed] L2TP - build with computed length >>> assert bytes(L2TP(hdr="control+length", tunnel_id=1, session_id=2)) == b'\xc0\x02\x00\x0c\x00\x01\x00\x02\x00\x00\x00\x00' ###(002)=[passed] L2TP - dissection >>> p = IP(s) >>> L2TP in p and len(p[L2TP]) == 6 and p.tunnel_id == 0 and p.session_id == 0 and p[UDP].chksum == 0xf483 True LDAP TESTS ━ Run at 01:42:22 from [test/scapy/layers/ldap.uts] by UTscapy in 0.10690736770629883 └ Passed=15 └ Failed=0 ###### ## Basic LDAP tests ###### ###(000)=[passed] Load LDAP >>> from scapy.layers.ldap import * ###(001)=[passed] LDAP_UnbindRequest >>> pkt = Ether(b'RT\x00!l+RT\x00\x0cG\xab\x08\x00E\x00\x003\xb2\x8a@\x00\x80\x06\xd2F\xc0\xa8z\x06\xc0\xa8z\x9c\xc2\xfb\x01\x85\xa6\x89q"\xa1\x076\xdeP\x18\x03\xffG\xf0\x00\x000\x05\x02\x01\x07B\x00') >>> assert isinstance(pkt[LDAP].protocolOp, LDAP_UnbindRequest) >>> >>> pkt2 = Ether(raw(pkt)) >>> pkt2.clear_cache() >>> assert raw(pkt2) == pkt.original ###(002)=[passed] LDAP_BindRequest >>> from scapy.layers.ntlm import * >>> >>> pkt = Ether(b'RT\x00!l+RT\x00\x0cG\xab\x08\x00E\x00\x00x\xb2\x94@\x00\x80\x06\xd1\xf7\xc0\xa8z\x06\xc0\xa8z\x9c\xc2\xfc\x01\x85\x1d\x92\x85\xc3U/c\x9fP\x18 \x12U\x96\x00\x000B\x02\x01\x0c`=\x02\x01\x03\x04\x00\xa36\x04\nGSS-SPNEGO\x04(NTLMSSP\x00\x01\x00\x00\x00\xb7\x82\x08\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00aJ\x00\x00\x00\x0f') >>> assert isinstance(pkt[LDAP].protocolOp, LDAP_BindRequest) >>> assert isinstance(pkt[LDAP].protocolOp.authentication, LDAP_Authentication_SaslCredentials) >>> ntlm = pkt[LDAP].protocolOp.authentication.credentials >>> assert isinstance(ntlm, NTLM_NEGOTIATE) >>> >>> pkt = Ether(b'RT\x00!l+RT\x00\x0cG\xab\x08\x00E\x00\x01\xce\xb2\x95@\x00\x80\x06\xd0\xa0\xc0\xa8z\x06\xc0\xa8z\x9c\xc2\xfc\x01\x85\x1d\x92\x86\x13U/d9P\x18 \x11\x11\x93\x00\x000\x82\x01\x9c\x02\x01\r`\x82\x01\x95\x02\x01\x03\x04\x00\xa3\x82\x01\x8c\x04\nGSS-SPNEGO\x04\x82\x01|NTLMSSP\x00\x03\x00\x00\x00\x18\x00\x18\x00h\x00\x00\x00\xec\x00\xec\x00\x80\x00\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x08\x00\x08\x00X\x00\x00\x00\x08\x00\x08\x00`\x00\x00\x00\x10\x00\x10\x00l\x01\x00\x005\x82\x88\xe2\n\x00aJ\x00\x00\x00\x0f\xa0\xcd\xd2\xaa\xfdQc\xacs\\\xf6\xa3\x07\n\x05$t\x00o\x00t\x00o\x00W\x00I\x00N\x002\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf1\xd1\x8e\xd6w\x99\t\rdQ\x05\xa6iI\xd1\x19\x01\x01\x00\x00\x00\x00\x00\x00\xb8}\x868\xe1\xc5\xd7\x01?\x84\xe3V\xcf&/\xf0\x00\x00\x00\x00\x02\x00\x08\x00W\x00I\x00N\x001\x00\x01\x00\x08\x00W\x00I\x00N\x001\x00\x04\x00\x08\x00W\x00I\x00N\x001\x00\x03\x00\x08\x00W\x00I\x00N\x001\x00\x07\x00\x08\x00\xb8}\x868\xe1\xc5\xd7\x01\x06\x00\x04\x00\x02\x00\x00\x00\x08\x000\x000\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00 \x00\x00\x0b\xd3s!~\x13\x9a\xcc\xc77\xf4\xcc\x90b\xcc|\x8f\xd2\xe8\xb85cw\x89#\x0e\x8bd\xfcPYf\n\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00(\x00l\x00d\x00a\x00p\x00/\x001\x009\x002\x00.\x001\x006\x008\x00.\x001\x002\x002\x00.\x001\x005\x006\x00\x00\x00\x00\x00\x00\x00\x00\x00rD\x8c\x9d\x1b\xa6\xa9\x1a7\xd3\x96\x0f\xbe\xab\xecC') >>> assert isinstance(pkt[LDAP].protocolOp, LDAP_BindRequest) >>> assert isinstance(pkt[LDAP].protocolOp.authentication, LDAP_Authentication_SaslCredentials) >>> ntlm = pkt[LDAP].protocolOp.authentication.credentials >>> assert isinstance(ntlm, NTLM_AUTHENTICATE_V2) >>> assert ntlm.Payload[0] == ('UserName', 'toto') >>> assert ntlm.Payload[1] == ('Workstation', 'WIN2') >>> assert isinstance(ntlm.Payload[3][1], NTLMv2_RESPONSE) >>> assert ntlm.Payload[3][1].AvPairs[8].Value == 'ldap/192.168.122.156' >>> >>> pkt = LDAP_BindRequest(bind_name="user", authentication=LDAP_Authentication_simple("password")) >>> assert bytes(pkt) == b'`\x13\x02\x01\x03\x04\x04user\x80\x08password' >>> assert LDAP_BindRequest(b'`\x13\x02\x01\x03\x04\x04user\x80\x08password').authentication.val == b"password" ###(003)=[passed] LDAP_BindResponse >>> pkt = Ether(b'RT\x00\x0cG\xabRT\x00!l+\x08\x00E\x00\x00\xc2\x18\xec@\x00\x80\x06kV\xc0\xa8z\x9c\xc0\xa8z\x06\x01\x85\xc2\xfcU/c\x9f\x1d\x92\x86\x13P\x18 \x12\x00\xd1\x00\x000\x81\x90\x02\x01\x0ca\x81\x8a\n\x01\x0e\x04\x00\x04\x00\x87\x81\x80NTLMSSP\x00\x02\x00\x00\x00\x08\x00\x08\x008\x00\x00\x005\x82\x8a\xe2Kn3@\x98\xb7\xc11\x00\x00\x00\x00\x00\x00\x00\x00@\x00@\x00@\x00\x00\x00\n\x00aJ\x00\x00\x00\x0fW\x00I\x00N\x001\x00\x02\x00\x08\x00W\x00I\x00N\x001\x00\x01\x00\x08\x00W\x00I\x00N\x001\x00\x04\x00\x08\x00W\x00I\x00N\x001\x00\x03\x00\x08\x00W\x00I\x00N\x001\x00\x07\x00\x08\x00\xb8}\x868\xe1\xc5\xd7\x01\x00\x00\x00\x00') >>> assert isinstance(pkt[LDAP].protocolOp, LDAP_BindResponse) >>> ntlm = NTLM_Header(pkt[LDAP].protocolOp.serverSaslCreds.val) >>> assert isinstance(ntlm, NTLM_CHALLENGE) >>> assert ntlm.Payload[0] == ('TargetName', 'WIN1') >>> assert ntlm.Payload[1][1][0].Value == "WIN1" >>> >>> pkt = Ether(b'RT\x00\x0cG\xabRT\x00!l+\x08\x00E\x00\x00\x96\x18\xed@\x00\x80\x06k\x81\xc0\xa8z\x9c\xc0\xa8z\x06\x01\x85\xc2\xfcU/d9\x1d\x92\x87\xb9P\x18 \x11\x01\xdc\x00\x000d\x02\x01\ra_\n\x011\x04\x00\x04X8009030C: LdapErr: DSID-0C09058A, comment: AcceptSecurityContext error, data 52e, v4a63\x00') >>> assert isinstance(pkt[LDAP].protocolOp, LDAP_BindResponse) >>> assert pkt[LDAP].protocolOp.diagnosticMessage.val == b'8009030C: LdapErr: DSID-0C09058A, comment: AcceptSecurityContext error, data 52e, v4a63\x00' ###(004)=[passed] LDAP_SearchRequest >>> pkt = Ether(b'RT\x00!l+RT\x00\x0cG\xab\x08\x00E\x00\x00[\xb2\x8e@\x00\x80\x06\xd2\x1a\xc0\xa8z\x06\xc0\xa8z\x9c\xc2\xfc\x01\x85\x1d\x92\x84VU/V:P\x18 \x14Q<\x00\x000%\x02\x01\x08c \x04\x00\n\x01\x00\n\x01\x00\x02\x01\x00\x02\x01d\x01\x01\x00\x87\x0bobjectClass0\x00') >>> assert isinstance(pkt[LDAP].protocolOp, LDAP_SearchRequest) >>> assert pkt[LDAP].protocolOp.baseObject == b"" >>> assert pkt[LDAP].protocolOp.timeLimit == 0x64 >>> assert pkt[LDAP].protocolOp.filter.filter.present == b"objectClass" >>> >>> pkt2 = Ether(raw(pkt)) >>> pkt2.clear_cache() >>> assert raw(pkt2) == pkt.original ###(005)=[passed] LDAP_SearchResponse >>> pkt = LDAP(b'0\x82\nr\x02\x01\x08d\x82\nk\x04\x000\x82\ne0\x1a\x04\x13forestFunctionality1\x03\x04\x0120$\x04\x1ddomainControllerFunctionality1\x03\x04\x0170E\x04\x17supportedSASLMechanisms1*\x04\x06GSSAPI\x04\nGSS-SPNEGO\x04\x08EXTERNAL\x04\nDIGEST-MD50\x1e\x04\x14supportedLDAPVersion1\x06\x04\x013\x04\x0120\x82\x01\x98\x04\x15supportedLDAPPolicies1\x82\x01}\x04\x0eMaxPoolThreads\x04\x19MaxPercentDirSyncRequests\x04\x0fMaxDatagramRecv\x04\x10MaxReceiveBuffer\x04\x0fInitRecvTimeout\x04\x0eMaxConnections\x04\x0fMaxConnIdleTime\x04\x0bMaxPageSize\x04\x16MaxBatchReturnMessages\x04\x10MaxQueryDuration\x04\x12MaxDirSyncDuration\x04\x10MaxTempTableSize\x04\x10MaxResultSetSize\x04\rMinResultSets\x04\x14MaxResultSetsPerConn\x04\x16MaxNotificationPerConn\x04\x0bMaxValRange\x04\x15MaxValRangeTransitive\x04\x11ThreadMemoryLimit\x04\x18SystemMemoryLimitPercent0\x82\x03\xf2\x04\x10supportedControl1\x82\x03\xdc\x04\x161.2.840.113556.1.4.319\x04\x161.2.840.113556.1.4.801\x04\x161.2.840.113556.1.4.473\x04\x161.2.840.113556.1.4.528\x04\x161.2.840.113556.1.4.417\x04\x161.2.840.113556.1.4.619\x04\x161.2.840.113556.1.4.841\x04\x161.2.840.113556.1.4.529\x04\x161.2.840.113556.1.4.805\x04\x161.2.840.113556.1.4.521\x04\x161.2.840.113556.1.4.970\x04\x171.2.840.113556.1.4.1338\x04\x161.2.840.113556.1.4.474\x04\x171.2.840.113556.1.4.1339\x04\x171.2.840.113556.1.4.1340\x04\x171.2.840.113556.1.4.1413\x04\x172.16.840.1.113730.3.4.9\x04\x182.16.840.1.113730.3.4.10\x04\x171.2.840.113556.1.4.1504\x04\x171.2.840.113556.1.4.1852\x04\x161.2.840.113556.1.4.802\x04\x171.2.840.113556.1.4.1907\x04\x171.2.840.113556.1.4.1948\x04\x171.2.840.113556.1.4.1974\x04\x171.2.840.113556.1.4.1341\x04\x171.2.840.113556.1.4.2026\x04\x171.2.840.113556.1.4.2064\x04\x171.2.840.113556.1.4.2065\x04\x171.2.840.113556.1.4.2066\x04\x171.2.840.113556.1.4.2090\x04\x171.2.840.113556.1.4.2205\x04\x171.2.840.113556.1.4.2204\x04\x171.2.840.113556.1.4.2206\x04\x171.2.840.113556.1.4.2211\x04\x171.2.840.113556.1.4.2239\x04\x171.2.840.113556.1.4.2255\x04\x171.2.840.113556.1.4.2256\x04\x171.2.840.113556.1.4.2309\x04\x171.2.840.113556.1.4.2330\x04\x171.2.840.113556.1.4.23540\x81\xc9\x04\x15supportedCapabilities1\x81\xaf\x04\x171.2.840.113556.1.4.1851\x04\x171.2.840.113556.1.4.1670\x04\x171.2.840.113556.1.4.1791\x04\x171.2.840.113556.1.4.1935\x04\x171.2.840.113556.1.4.2080\x04\x171.2.840.113556.1.4.2237\x04\x171.2.840.113556.1.4.18800h\x04\x11subschemaSubentry1S\x04QCN=Aggregate,CN=Schema,CN=Configuration,CN={7FA71C80-F7BA-4B58-9219-6C6B09E8D0A1}0\x81\x88\x04\nserverName1z\x04xCN=WIN1$ADWIN1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,CN={7FA71C80-F7BA-4B58-9219-6C6B09E8D0A1}0]\x04\x13schemaNamingContext1F\x04DCN=Schema,CN=Configuration,CN={7FA71C80-F7BA-4B58-9219-6C6B09E8D0A1}0\x81\x95\x04\x0enamingContexts1\x81\x82\x04:CN=Configuration,CN={7FA71C80-F7BA-4B58-9219-6C6B09E8D0A1}\x04DCN=Schema,CN=Configuration,CN={7FA71C80-F7BA-4B58-9219-6C6B09E8D0A1}0\x18\x04\x0eisSynchronized1\x06\x04\x04TRUE0\x1e\x04\x13highestCommittedUSN1\x07\x04\x05123490\x81\x9e\x04\rdsServiceName1\x81\x8c\x04\x81\x89CN=NTDS Settings,CN=WIN1$ADWIN1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,CN={7FA71C80-F7BA-4B58-9219-6C6B09E8D0A1}0\x15\x04\x0bdnsHostName1\x06\x04\x04WIN10"\x04\x0bcurrentTime1\x13\x04\x1120211020183502.0Z0Z\x04\x1aconfigurationNamingContext1<\x04:CN=Configuration,CN={7FA71C80-F7BA-4B58-9219-6C6B09E8D0A1}0\x0c\x02\x01\x08e\x07\n\x01\x00\x04\x00\x04\x00') >>> assert pkt.getlayer(LDAP, 2) >>> assert isinstance(pkt.protocolOp, LDAP_SearchResponseEntry) >>> assert isinstance(pkt.getlayer(LDAP, 2).protocolOp, LDAP_SearchResponseResultDone) >>> >>> assert len(pkt.protocolOp.attributes) == 17 >>> assert [x.type.val for x in pkt.protocolOp.attributes] == [ ... b'forestFunctionality', ... b'domainControllerFunctionality', ... b'supportedSASLMechanisms', ... b'supportedLDAPVersion', ... b'supportedLDAPPolicies', ... b'supportedControl', ... b'supportedCapabilities', ... b'subschemaSubentry', ... b'serverName', ... b'schemaNamingContext', ... b'namingContexts', ... b'isSynchronized', ... b'highestCommittedUSN', ... b'dsServiceName', ... b'dnsHostName', ... b'currentTime', ... b'configurationNamingContext' ... ] >>> assert pkt.protocolOp.attributes[13].values[0].value == b'CN=NTDS Settings,CN=WIN1$ADWIN1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,CN={7FA71C80-F7BA-4B58-9219-6C6B09E8D0A1}' >>> >>> assert pkt.getlayer(LDAP, 2).protocolOp.resultCode == 0 >>> >>> pkt2 = Ether(raw(pkt)) >>> pkt2.clear_cache() >>> assert raw(pkt2) == pkt.original ###### ## CLDAP tests ###### ###(006)=[passed] Basic CLDAP dissection & build test >>> pkt = Ether(b'RT\x00\xbc\xe0=RT\x00y\xb1F\x08\x00E\x00\x00\xa5\x01\x1a\x00\x00\x80\x11\xc3H\xc0\xa8z\x91\xc0\xa8z\x03\xf1!\x01\x85\x00\x91o&0\x84\x00\x00\x00\x83\x02\x01\x01c\x84\x00\x00\x00z\x04\x00\n\x01\x00\n\x01\x00\x02\x01\x00\x02\x01\x00\x01\x01\x00\xa0\x84\x00\x00\x00S\xa3\x84\x00\x00\x00"\x04\tDnsDomain\x04\x15s4.howto.abartlet.net\xa3\x84\x00\x00\x00\x12\x04\x04Host\x04\nWINDOWS7-3\xa3\x84\x00\x00\x00\r\x04\x05NtVer\x04\x04\x16\x00\x00\x000\x84\x00\x00\x00\n\x04\x08Netlogon') >>> assert pkt.protocolOp.filter.filter.vals[2].filter.attributeType == b"NtVer" >>> assert pkt.protocolOp.attributes[0].type == b"Netlogon" >>> >>> assert raw(pkt[CLDAP]) == b'0k\x02\x01\x01cf\x04\x00\n\x01\x00\n\x01\x00\x02\x01\x00\x02\x01\x00\x01\x01\x00\xa0G\xa3"\x04\tDnsDomain\x04\x15s4.howto.abartlet.net\xa3\x12\x04\x04Host\x04\nWINDOWS7-3\xa3\r\x04\x05NtVer\x04\x04\x16\x00\x00\x000\n\x04\x08Netlogon' ###(007)=[passed] More advanced CLDAP dissection & build test >>> pkt = Ether(b'RT\x00y\xb1FRT\x00\xbc\xe0=\x08\x00E\x00\x00\xb3\x00\x00@\x00@\x11\xc4T\xc0\xa8z\x03\xc0\xa8z\x91\x01\x85\xf1!\x00\x9fv\x960\x81\x86\x02\x01\x01d\x81\x80\x04\x000|0z\x04\x08netlogon1n\x04l\x17\x00\x00\x00\xbd\x11\x00\x00t\x97x\x1f\x05;\xd7B\x8b\xb2\x8c\xf3\xd9z\x7fj\x02s4\x05howto\x08abartlet\x03net\x00\xc0\x18\x04obed\xc0\x18\x08S4-HOWTO\x00\x04OBED\x00\x00\x17Default-First-Site-Name\x00\xc0I\x05\x00\x00\x00\xff\xff\xff\xff0\x0c\x02\x01\x01e\x07\n\x01\x00\x04\x00\x04\x00') >>> assert pkt.getlayer(CLDAP, 2) >>> assert isinstance(pkt.protocolOp[0].attributes[0].values[0], LDAP_AttributeValue) >>> assert pkt.getlayer(CLDAP, 2).protocolOp.resultCode == 0x0 >>> >>> pkt2 = Ether(raw(pkt)) >>> pkt2.clear_cache() >>> assert raw(pkt2) == pkt.original ###### ## Microsoft LDAP tests ###### ###(008)=[passed] Test dissection of Microsoft LDAP >>> pkt = LDAP(b'0\x84\x00\x00\x00-\x02\x01\x01c\x84\x00\x00\x00$\x04\x00\n\x01\x00\n\x01\x00\x02\x01\x00\x02\x01d\x01\x01\x00\x87\x0bobjectClass0\x84\x00\x00\x00\x00') >>> assert pkt.protocolOp.filter.filter.present.val == b'objectClass' >>> assert pkt.Controls is None ###(009)=[passed] Test re-build of Microsoft LDAP >>> pkt = LDAP(protocolOp=LDAP_SearchRequest(filter=LDAP_Filter(filter=LDAP_FilterPresent(present=ASN1_STRING(b'objectClass'))), baseObject=ASN1_STRING(b''), scope=ASN1_ENUMERATED(0), derefAliases=ASN1_ENUMERATED(0), sizeLimit=ASN1_INTEGER(0), timeLimit=ASN1_INTEGER(100), attrsOnly=ASN1_BOOLEAN(0)), messageID=ASN1_INTEGER(1), Controls=None) >>> >>> conf.ASN1_default_long_size = 4 >>> assert bytes(pkt) == b'0\x84\x00\x00\x00-\x02\x01\x01c\x84\x00\x00\x00$\x04\x00\n\x01\x00\n\x01\x00\x02\x01\x00\x02\x01d\x01\x01\x00\x87\x0bobjectClass0\x84\x00\x00\x00\x00' >>> >>> conf.ASN1_default_long_size = 0 >>> assert bytes(pkt) == b'0%\x02\x01\x01c \x04\x00\n\x01\x00\n\x01\x00\x02\x01\x00\x02\x01d\x01\x01\x00\x87\x0bobjectClass0\x00' ###(010)=[passed] Craft new Microsoft LDAP Search Request with Controls >>> conf.ASN1_default_long_size = 4 >>> >>> pkt = LDAP( ... protocolOp=LDAP_SearchRequest( ... filter=LDAP_Filter(filter=LDAP_FilterPresent(present=ASN1_STRING(b'objectClass'))), ... attributes=[ ... LDAP_SearchRequestAttribute(type=ASN1_STRING(b'rootDomainNamingContext')), ... LDAP_SearchRequestAttribute(type=ASN1_STRING(b'defaultNamingContext')), ... LDAP_SearchRequestAttribute(type=ASN1_STRING(b'configurationNamingContext')) ... ], ... baseObject=ASN1_STRING(b''), ... scope=ASN1_ENUMERATED(0), ... derefAliases=ASN1_ENUMERATED(0), ... sizeLimit=ASN1_INTEGER(1), ... timeLimit=ASN1_INTEGER(100), ... attrsOnly=ASN1_BOOLEAN(0) ... ), ... messageID=ASN1_INTEGER(2), ... Controls=[ ... LDAP_Control(controlType=ASN1_STRING(b'1.2.840.113556.1.4.529'), criticality=None, controlValue=ASN1_STRING(b'')) ... ] ... ) >>> >>> assert bytes(pkt) == b'0\x84\x00\x00\x00\x9e\x02\x01\x02c\x84\x00\x00\x00o\x04\x00\n\x01\x00\n\x01\x00\x02\x01\x01\x02\x01d\x01\x01\x00\x87\x0bobjectClass0\x84\x00\x00\x00K\x04\x17rootDomainNamingContext\x04\x14defaultNamingContext\x04\x1aconfigurationNamingContext\xa0\x84\x00\x00\x00 0\x84\x00\x00\x00\x1a\x04\x161.2.840.113556.1.4.529\x04\x00' >>> >>> conf.ASN1_default_long_size = 0 ###### ## NETLOGON_SAM_LOGON tests ###### ###(011)=[passed] Dissect NETLOGON_SAM_LOGON_RESPONSE_EX - V1+V5EX+V5EXWITH_IP >>> pkt = NETLOGON(b'\x17\x00\x00\x00\xfd\xf3\x03\x00\x8c#\xf1G^\xe5\xfeL\x89\xe8x\t7\xb1\xcd;\x06domain\x05local\x00\xc0\x18\x03DC1\xc0\x18\x06DOMAIN\x00\x03DC1\x00\x00\x17Default-First-Site-Name\x00\xc0<\x10\x02\x00\x00\x00\xc0\xa8\x00d\x00\x00\x00\x00\x00\x00\x00\x00\r\x00\x00\x00\xff\xff\xff\xff') >>> >>> assert pkt.NtVersion.V5EX_WITH_IP and pkt.NtVersion == 13 >>> assert pkt.DnsForestName == b"domain.local." >>> assert pkt.DnsDomainName == b"domain.local." >>> assert pkt.DnsHostName == b"DC1.domain.local." >>> assert pkt.DcSiteName == b"Default-First-Site-Name." >>> assert pkt.ClientSiteName == b"Default-First-Site-Name." >>> assert pkt.DcSockAddrSize == 0x10 >>> assert pkt.DcSockAddr.sin_addr == "192.168.0.100" >>> assert pkt.Flags == 0x3f3fd ###(012)=[passed] Dissect NETLOGON_SAM_LOGON_RESPONSE_EX - V1+V5EX >>> pkt = NETLOGON(b'\x17\x00\x00\x00\xfd\xf3\x03\x00\x8c#\xf1G^\xe5\xfeL\x89\xe8x\t7\xb1\xcd;\x06domain\x05local\x00\xc0\x18\x03DC1\xc0\x18\x06DOMAIN\x00\x03DC1\x00\x00\x17Default-First-Site-Name\x00\xc0<\x05\x00\x00\x00\xff\xff\xff\xff') >>> >>> assert pkt.NtVersion == 5 >>> assert pkt.DnsForestName == b"domain.local." >>> assert pkt.DnsDomainName == b"domain.local." >>> assert pkt.DnsHostName == b"DC1.domain.local." >>> assert pkt.DcSiteName == b"Default-First-Site-Name." >>> assert pkt.ClientSiteName == b"Default-First-Site-Name." >>> assert pkt.Flags == 0x3f3fd ###(013)=[passed] Dissect NETLOGON_SAM_LOGON_RESPONSE - V1+V5 >>> import uuid >>> >>> pkt = NETLOGON(b'\x13\x00\\\x00\\\x00D\x00C\x001\x00\x00\x00\x00\x00D\x00O\x00M\x00A\x00I\x00N\x00\x00\x00\x8c#\xf1G^\xe5\xfeL\x89\xe8x\t7\xb1\xcd;\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06domain\x05local\x00\xc0>\x03DC1\xc0>d\x00\xa8\xc0}\xf3\x03\x00\x03\x00\x00\x00\xff\xff\xff\xff') >>> >>> assert pkt.NtVersion == 3 >>> assert pkt.NullGuid == uuid.UUID('00000000-0000-0000-0000-000000000000') >>> assert pkt.DnsForestName == b"domain.local." >>> assert pkt.DnsDomainName == b"domain.local." >>> assert pkt.DnsHostName == b"DC1.domain.local." >>> assert pkt.Flags == 0x3f37d ###(014)=[passed] Dissect NETLOGON_SAM_LOGON_RESPONSE_NT40 - V1 >>> pkt = NETLOGON(b'\x13\x00\\\x00\\\x00D\x00C\x001\x00\x00\x00\x00\x00D\x00O\x00M\x00A\x00I\x00N\x00\x00\x00\x01\x00\x00\x00\xff\xff\xff\xff') >>> >>> assert pkt.NtVersion == 1 >>> assert pkt.UnicodeLogonServer == r"\\DC1" >>> assert pkt.UnicodeDomainName == "DOMAIN" Tests that need a local instance of OpenLDAP to run ━ Run at 01:42:22 from [test/scapy/layers/ldapopenldap.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 LLMNR regression tests for Scapy ━ Run at 01:42:22 from [test/scapy/layers/llmnr.uts] by UTscapy in 0.019893646240234375 └ Passed=6 └ Failed=0 ###### ## LLMNR protocol ###### ###(000)=[passed] Simple packet dissection >>> pkt = Ether(b'\x11\x11\x11\x11\x11\x11\x99\x99\x99\x99\x99\x99\x08\x00E\x00\x00(\x00\x01\x00\x00@\x11:\xa4\xc0\xa8\x00w\x7f\x00\x00\x01\x14\xeb\x14\xeb\x00\x14\x95\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert pkt.sport == 5355 >>> assert pkt.dport == 5355 >>> assert pkt[LLMNRQuery].opcode == 0 ###(001)=[passed] Dissection with the "T"entative bit set and the "TrunCation" bit unset >>> r = LLMNRResponse(b'\x87\xdf\x81\x00\x00\x01\x00\x01\x00\x00\x00\x00\x01C\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\x1e\x00\x04\xc0\xa8-\x15') >>> assert r.tc == 0 and r.t == 1 ###(002)=[passed] Packet build / dissection >>> pkt = UDP(raw(UDP()/LLMNRResponse())) No IP underlayer to compute checksum. Leaving null. >>> assert LLMNRResponse in pkt >>> assert pkt.qr == 1 >>> assert pkt.c == 0 >>> assert pkt.tc == 0 >>> assert pkt.t == 0 >>> assert pkt.z == 0 >>> assert pkt.rcode == 0 >>> assert pkt.qdcount == 0 >>> assert pkt.arcount == 0 >>> assert pkt.nscount == 0 >>> assert pkt.ancount == 0 ###(003)=[passed] Answers - building >>> a = UDP()/LLMNRResponse(id=12) >>> b = UDP()/LLMNRQuery(id=12) >>> assert a.answers(b) >>> assert not b.answers(a) >>> assert b.hashret() == b'\x00\x0c' ###(004)=[passed] Answers - dissecting >>> a = Ether(b'\xd0P\x99V\xdd\xf9\x14\x0cv\x8f\xfe(\x08\x00E\x00\x00(\x00\x01\x00\x00@\x11:\xa4\x7f\x00\x00\x01\xc0\xa8\x00w\x14\xeb\x14\xeb\x00\x14\x95\xcf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> b = Ether(b'\x14\x0cv\x8f\xfe(\xd0P\x99V\xdd\xf9\x08\x00E\x00\x00(\x00\x01\x00\x00@\x11:\xa4\xc0\xa8\x00w\x7f\x00\x00\x01\x14\xeb\x14\xeb\x00\x14\x15\xcf\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert b.answers(a) >>> assert not a.answers(b) ###(005)=[passed] Summary >>> q = LLMNRQuery(b'\xd5\xd5\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07example\x00\x00\x01\x00\x01') >>> assert q.mysummary()[0] == r"LLMNRQuery who has 'example.'" >>> >>> q = LLMNRQuery(b'Yy\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x01\xff\x00\x00\x01\x00\x01') >>> assert q.mysummary()[0] == r"LLMNRQuery who has '\xff.'" >>> >>> with no_debug_dissector(): ... q = LLMNRQuery(b'@@\x00\x1b\xed7\x96J\x00\x00\x00\x01\x00\x00') ... assert q.mysummary()[0] == r"LLMNRQuery [malformed]" ... >>> r = LLMNRResponse(b'e\xcc\x80\x00\x00\x01\x00\x01\x00\x00\x00\x00\x07example\x00\x00\x01\x00\x01\x07example\x00\x00\x01\x00\x01\x00\x00\x00\x1e\x00\x04\xc0\x00\x02\x01') >>> assert r.mysummary()[0] == r"LLMNRResponse 'example.' is at '192.0.2.1'" >>> >>> r = LLMNRResponse(b'\n\xe6\x80\x00\x00\x01\x00\x01\x00\x00\x00\x00\x01\xff\x00\x00\x1c\x00\x01\xc0\x0c\x00\x1c\x00\x01\x00\x00\x00\x1e\x00\x10\xfe\x80\x00\x00\x00\x00\x00\x00xu\x17\xff\xfe\xbc\xac\xcb') >>> assert r.mysummary()[0] == r"LLMNRResponse '\xff.' is at 'fe80::7875:17ff:febc:accb'" >>> >>> with no_debug_dissector(): ... r = LLMNRResponse(b'\xd3<\x80\x00\x00\x01\x00\x01\x00\x00\x00\x00\x04H\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\x01\x00\x00\x00\x1e\x00\x04\xc0\xa88\x04') ... assert r.mysummary()[0] == r"LLMNRResponse [malformed]" ... LLTD regression tests for Scapy ━ Run at 01:42:22 from [test/scapy/layers/lltd.uts] by UTscapy in 0.06968975067138672 └ Passed=5 └ Failed=0 ###### ## LLTD protocol ###### ###(000)=[passed] Simple packet dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x86\x14\xf0\xc7[.\x88\xd9\x01\x00\x00\x01\xff\xff\xff\xff\xff\xff\x86\x14\xf0\xc7[.\x00\x00\xfe\xe9[\xa9\xaf\xc1\x0bS[\xa9\xaf\xc1\x0bS\x01\x06}[G\x8f\xec.\x02\x04p\x00\x00\x00\x03\x04\x00\x00\x00\x06\x07\x04\xac\x19\x88\xe4\t\x02\x00l\n\x08\x00\x00\x00\x00\x00\x0fB@\x0c\x04\x00\x08=`\x0e\x00\x0f\x0eT\x00E\x00S\x00T\x00-\x00A\x00P\x00\x12\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x04\x00\x00\x00\x00\x15\x01\x02\x18\x00\x19\x02\x04\x00\x1a\x00\x00') >>> assert pkt.dst == pkt.real_dst >>> assert pkt.src == pkt.real_src >>> assert pkt.current_mapper_address == pkt.apparent_mapper_address >>> assert pkt.mac == '7d:5b:47:8f:ec:2e' >>> assert pkt.hostname == "TEST-AP" >>> assert isinstance(pkt[LLTDAttributeEOP].payload, NoPayload) ###(001)=[passed] Packet build / dissection >>> pkt = Ether(raw(Ether(dst=ETHER_BROADCAST, src=RandMAC()) / LLTD(tos=0, function=0))) >>> assert LLTD in pkt >>> assert pkt.dst == pkt.real_dst >>> assert pkt.src == pkt.real_src >>> assert pkt.tos == 0 >>> assert pkt.function == 0 >>> assert pkt.hashret()[2:] == b'\x00\x00' ###(002)=[passed] Attribute build / dissection >>> assert isinstance(LLTDAttribute(), LLTDAttribute) >>> assert isinstance(LLTDAttribute(raw(LLTDAttribute())), LLTDAttribute) >>> assert all(isinstance(LLTDAttribute(type=i), LLTDAttribute) for i in range(256)) >>> assert all(isinstance(LLTDAttribute(raw(LLTDAttribute(type=i))), LLTDAttribute) for i in range(256)) ###(003)=[passed] Large TLV >>> m1, m2, seq = RandMAC()._fix(), RandMAC()._fix(), 123 >>> preqbase = Ether(src=m1, dst=m2) / LLTD() / \ ... LLTDQueryLargeTlv(type="Detailed Icon Image") >>> prespbase = Ether(src=m2, dst=m1) / LLTD() / \ ... LLTDQueryLargeTlvResp() >>> plist = [] >>> pkt = preqbase.copy() >>> pkt.seq = seq >>> plist.append(Ether(raw(pkt))) >>> pkt = prespbase.copy() >>> pkt.seq = seq >>> pkt.flags = "M" >>> pkt.value = "abcd" >>> plist.append(Ether(raw(pkt))) >>> pkt = preqbase.copy() >>> pkt.seq = seq + 1 >>> pkt.offset = 4 >>> plist.append(Ether(raw(pkt))) >>> pkt = prespbase.copy() >>> pkt.seq = seq + 1 >>> pkt.value = "efg" >>> plist.append(Ether(raw(pkt))) >>> builder = LargeTlvBuilder() >>> builder.parse(plist) >>> data = builder.get_data() >>> assert len(data) == 1 >>> key, value = data.popitem() >>> assert key.endswith(' [Detailed Icon Image]') >>> assert value == 'abcdefg' ###(004)=[passed] Summary >>> assert LLTDAttributeMachineName(b'\x0f\x04{\x00\n\x00').mysummary()[0] == r"Hostname: '{\n'" MGCP regression tests for Scapy ━ Run at 01:42:22 from [test/scapy/layers/mgcp.uts] by UTscapy in 0.0027348995208740234 └ Passed=2 └ Failed=0 ###### ## MGCP tests ###### ###(000)=[passed] MGCP - build >>> s = raw(IP(src="127.0.0.1")/UDP()/MGCP(endpoint="scapy@secdev.org", transaction_id="04523")) >>> s == b'E\x00\x00I\x00\x01\x00\x00@\x11|\xa1\x7f\x00\x00\x01\x7f\x00\x00\x01\n\xa7\n\xa7\x005\xf8\xaeAUEP 04523 scapy@secdev.org MGCP 1.0 NCS 1.0\n' True ###(001)=[passed] MGCP - dissect >>> pkt = Ether(b'\x1b\x81\xb8\xa8J5\xe3\xebn\x90q\xb8\x08\x00E\x00\x00E\x00\x01\x00\x00@\x11\xf7\xde\xc0\xa8\x00\xff\xc0\xa8\x00y\n\xa7\n\xa7\x001\x05\xb5AUEP 155 god@heaven.com MGCP 1.0 NCS 1.0\n') >>> assert pkt[MGCP].endpoint == b'god@heaven.com' Mobile IP regression tests for Scapy ━ Run at 01:42:22 from [test/scapy/layers/mobileip.uts] by UTscapy in 0.008135318756103516 └ Passed=2 └ Failed=0 ###### ## MobileIP tests ###### ###(000)=[passed] MobileIP - build >>> s = raw(IP(src="127.0.0.1")/UDP()/MobileIP()/MobileIPRRP(homeaddr='156.133.50.141', haaddr='95.83.86.216')) >>> s == b'E\x00\x000\x00\x01\x00\x00@\x11|\xba\x7f\x00\x00\x01\x7f\x00\x00\x01\x01\xb2\x01\xb2\x00\x1cu]\x03\x00\x00\xb4\x9c\x852\x8d_SV\xd8\x00\x00\x00\x00\x00\x00\x00\x00' True ###(001)=[passed] MobileIP - dissect >>> pkt = IP(s) >>> assert pkt[MobileIP][MobileIPRRP].haaddr == '95.83.86.216' MS-DRSR tests ━ Run at 01:42:22 from [test/scapy/layers/msdrsr.uts] by UTscapy in 0.08761000633239746 └ Passed=5 └ Failed=0 ###### ## Dissect DRSR Crack_Names exchange ###### ###(000)=[passed] [EXCH] - Load MSDRSR exchange and decrypt (SPNEGOSSP/NTLMSSP) >>> load_layer("msrpce") >>> bind_layers(TCP, DceRpc5, sport=49685) # the DCE/RPC port >>> bind_layers(TCP, DceRpc5, dport=49685) >>> >>> conf.dcerpc_session_enable = True >>> conf.winssps_passive = [ ... SPNEGOSSP( ... [ ... NTLMSSP( ... IDENTITIES={ ... "Administrator": MD4le("Password123!"), ... }, ... ) ... ] ... ) ... ] >>> pkts = sniff(offline=scapy_path('test/pcaps/dcerpc_msdrsr_cracknames.pcapng.gz'), session=TCPSession) >>> conf.dcerpc_session_enable = False ###(001)=[passed] [EXCH] - Check IDL_DRSBind_Request >>> from scapy.layers.msrpce.msdrsr import DRS_EXTENSIONS_INT >>> >>> bindreq = pkts[7] >>> assert IDL_DRSBind_Request in bindreq >>> ext = DRS_EXTENSIONS_INT(bindreq[IDL_DRSBind_Request].valueof("pextClient").rgb) >>> assert ext.Pid == 1234 >>> assert ext.dwReplEpoch == 1729468809 ###(002)=[passed] [EXCH] - Check IDL_DRSBind_Response >>> import uuid >>> >>> bindresp = pkts[8] >>> assert IDL_DRSBind_Response in bindresp >>> assert bindresp[IDL_DRSBind_Response].phDrs.uuid == b'\xf4$I\xf5\xde\x0c\xfcO\x8b\xfa\xb0Y\x87\xf4\x11i' >>> ext = DRS_EXTENSIONS_INT(bindresp[IDL_DRSBind_Response].valueof("ppextServer").rgb) >>> assert ext.dwFlags.GETCHGREQ_V10 >>> assert ext.dwFlags == 0x3fffff7f >>> assert ext.Pid == 696 >>> assert ext.ConfigObjGuid == uuid.UUID('14ea64e0-3470-48e6-9ace-77012d8d474f') ###(003)=[passed] [EXCH] - Check IDL_DRSCrackNames_Request >>> cnreq = pkts[9] >>> assert IDL_DRSCrackNames_Request in cnreq >>> >>> crackreq = cnreq[IDL_DRSCrackNames_Request].valueof("pmsgIn") >>> assert crackreq.formatOffered == 11 >>> assert crackreq.formatDesired == 0xfffffff2 >>> >>> assert crackreq.valueof("rpNames") == [ ... b'S-1-5-21-1924137214-3718646274-40215721-522', ... b'S-1-5-21-1924137214-3718646274-40215721-498', ... b'S-1-5-21-1924137214-3718646274-40215721-516', ... b'S-1-5-21-1924137214-3718646274-40215721-526', ... b'S-1-5-21-1924137214-3718646274-40215721-527', ... b'S-1-5-21-1924137214-3718646274-40215721-512', ... b'S-1-5-21-1924137214-3718646274-40215721-519', ... b'S-1-5-21-1924137214-3718646274-40215721-513', ... ] ###(004)=[passed] [EXCH] - Check IDL_DRSCrackNames_Response >>> cnresp = pkts[10] >>> assert IDL_DRSCrackNames_Response in cnresp >>> >>> crackresp = cnresp[IDL_DRSCrackNames_Response].valueof("pmsgOut") >>> assert [x.valueof("pName") for x in crackresp.valueof("pResult").valueof("rItems")] == [ ... b'Cloneable Domain Controllers@DOMAIN', ... b'Enterprise Read-only Domain Controllers@DOMAIN', ... b'Domain Controllers@DOMAIN', ... b'Key Admins@DOMAIN', ... b'Enterprise Key Admins@DOMAIN', ... b'Domain Admins@DOMAIN', ... b'Enterprise Admins@DOMAIN', ... b'Domain Users@DOMAIN', ... ] MS-NRPC tests ━ Run at 01:42:22 from [test/scapy/layers/msnrpc.uts] by UTscapy in 0.13129353523254395 └ Passed=32 └ Failed=0 ###### ## [MS-NRPC] test vectors ###### ###(000)=[passed] [MS-NRPC] test vectors - sect 4.2 >>> from scapy.layers.tls.crypto.hash import Hash_MD4 >>> from scapy.layers.msrpce.msnrpc import ComputeSessionKeyStrongKey >>> >>> ClearSharedSecret = bytes.fromhex("2e002f002c006e004c003e004f004c005a003600730074005e0058004b0065004d0025002e0049002d00740045006000570056006a0043005b00300036003f005d003a00510076005f0054006e0055006f003a003a00420077002c0067006000760023004a004d0036004d007100530050007500550028006e00710034003e0079006a005b0064005c002b005600700052005f00790078007500630021006700300054003600350076007a005700410042005f004200220069003c003c0053002b00340027005e003a0021002c003b002500470073002d00280022003a0020006d003e00210043004c0066006e004e00") >>> >>> SharedSecret = Hash_MD4().digest(ClearSharedSecret) >>> assert SharedSecret.hex() == "31a590170a351fd51148b2a10af2c305" >>> >>> >>> ClientChallenge = bytes.fromhex("3a0390a46d0c3d4f") >>> >>> ServerChallenge = bytes.fromhex("0c4c13d16041c860") >>> >>> assert ComputeSessionKeyStrongKey(SharedSecret, ClientChallenge, ServerChallenge).hex() == "eefe8f40007a2eeb6843d0d30a5be2e3" ###(001)=[passed] [MS-NRPC] test vectors - sect 4.3 >>> from unittest import mock >>> from scapy.layers.msrpce.msnrpc import NetlogonSSP >>> >>> SessionKey = bytes.fromhex("0cb6948805f797bf2a82807973b89537") >>> Confounder = bytes.fromhex("717f5076c5902bcd") >>> ClearTextMessage = bytes.fromhex("3000000000000000000000000000000030000000000000005c005c00570049004e002d00450055003400550047003800370048003200490056002e00320033003000360066006500760032002e006e00740074006500730074002e006d006900630072006f0073006f00660074002e0063006f006d0000000000020000000000100000000000000000000000000000001000000000000000570049004e002d004400310049005400420046004d003400410038005500000085bb1511fd09786d3b61b06400000000000000000000000001000000000000000000000000000000") >>> FullNetlogonSignatureHeader = bytes.fromhex("13001a00ffff0000b37c1f0ec86468f086761f2f86f4f4c1632d1f547d2cf6ff") >>> EncryptedMessage = bytes.fromhex("c930c9a079d95c78bea6a3150908c11f4b68e41219bcb91680ead287da211eec66bc27df2bc9a0f4ecf25c88624e493c59cdec6bc7b08bed84b97c33138ae3c8377cb327f3ea6076da91c5d23dbf1b2f4066a455332716b7b64f2ec9a944702d20a85035de3b231a5216b7a6c9102bd17c7d6ab1b379445eb5a5276e360d3bcef93b5359d36b0006b0c10bc2fec73777816a383a4614494b7b18bc34cd5447681eb48f8132a0a08a50d752826cff068c76959d49767557e503d509fa3c18b0860a22a7e2bae50e812c5d71c31f9f1dfd143333b3043f6bf906e5d91207f1d988") >>> >>> >>> client = NetlogonSSP(SessionKey=SessionKey, computername="DC1", domainname="DOMAIN", AES=True) >>> clicontext, tok, negResult = client.GSS_Init_sec_context(None) >>> >>> with mock.patch('scapy.layers.msrpce.msnrpc.os.urandom', side_effect=lambda x: Confounder): ... _msgs, sig = client.GSS_WrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=ClearTextMessage), ... ] ... ) ... >>> assert _msgs[0].data == EncryptedMessage >>> assert bytes(sig)[:len(FullNetlogonSignatureHeader)] == FullNetlogonSignatureHeader ###(002)=[passed] [MS-NRPC] test vectors - sect 4.3.1 >>> from unittest import mock >>> from scapy.layers.msrpce.msnrpc import NetlogonSSP >>> >>> RpcPDUHeader = bytes.fromhex("0500000310000000380138000c000000d400000001001500") >>> RpcSecTrailer = bytes.fromhex("44060c0003000000") >>> FullNetlogonSignatureHeader = bytes.fromhex("13001a00ffff00005d69950dfde45ae9f092ae5c3c55aacd632d1f547d2cf6ff") >>> >>> >>> client = NetlogonSSP(SessionKey=SessionKey, computername="DC1", domainname="DOMAIN", AES=True) >>> clicontext, tok, negResult = client.GSS_Init_sec_context(None) >>> >>> with mock.patch('scapy.layers.msrpce.msnrpc.os.urandom', side_effect=lambda x: Confounder): ... _msgs, sig = client.GSS_WrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=RpcPDUHeader), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=ClearTextMessage), ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=RpcSecTrailer), ... ] ... ) ... >>> assert _msgs[0].data == RpcPDUHeader >>> assert _msgs[1].data == EncryptedMessage >>> assert _msgs[2].data == RpcSecTrailer >>> assert bytes(sig)[:len(FullNetlogonSignatureHeader)] == FullNetlogonSignatureHeader ###### ## Dissect and Build full NRPC exchange ###### ###(003)=[passed] [EXCH] - Load MSRPCE and bind >>> load_layer("msrpce") >>> bind_layers(TCP, DceRpc, sport=40564) # the DCE/RPC port >>> bind_layers(TCP, DceRpc, dport=40564) ###(004)=[passed] [EXCH] - Parse NRPC exchange (pcap) >>> pkts = sniff(offline=scapy_path('test/pcaps/dcerpc_msnrpc.pcapng.gz'), session=DceRpcSession) ###(005)=[passed] [EXCH] - Check ept_map_Request >>> from scapy.layers.msrpce.ept import * >>> >>> epm_req = pkts[2][DceRpc5].payload.payload >>> assert isinstance(epm_req, ept_map_Request) >>> assert epm_req.max_towers == 4 >>> assert epm_req.map_tower.value.max_count == 75 >>> assert epm_req.map_tower.value.tower_length == 75 >>> >>> twr = protocol_tower_t(epm_req.map_tower.value.tower_octet_string) >>> assert twr.count == 5 >>> assert twr.floors[0].sprintf("%uuid%") == 'logon' ###(006)=[passed] [EXCH] - Re-build ept_map_Request from scratch >>> pkt = ept_map_Request( ... entry_handle=NDRContextHandle(attributes=0, uuid=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), ... obj=NDRPointer( ... referent_id=1, ... value=UUID(Data1=0, Data2=0, Data3=0, Data4=b'\x00\x00\x00\x00\x00\x00\x00\x00') ... ), ... map_tower=NDRPointer( ... referent_id=2, ... value=twr_p_t(tower_octet_string=b'\x05\x00\x13\x00\rxV4\x124\x12\xcd\xab\xef\x00\x01#Eg\xcf\xfb\x01\x00\x02\x00\x00\x00\x13\x00\r\x04]\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00+\x10H`\x02\x00\x02\x00\x00\x00\x01\x00\x0b\x02\x00\x00\x00\x01\x00\x07\x02\x00\x00\x87\x01\x00\t\x04\x00\x00\x00\x00\x00') ... ), ... max_towers=4 ... ) >>> >>> output = bytearray(bytes(pkt)) >>> assert bytes(output) == bytes(epm_req) ###(007)=[passed] [EXCH] - Check ept_map_Response >>> epm_resp = pkts[3][DceRpc5].payload.payload >>> >>> assert epm_resp.entry_handle.attributes == 0 >>> assert epm_resp.entry_handle.uuid == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> assert epm_resp.ITowers.max_count == 4 >>> assert epm_resp.ITowers.value[0].value[0].value.max_count == 75 >>> assert epm_resp.valueof("ITowers")[0].max_count == 75 >>> assert epm_resp.ITowers.value[0].value[0].value.tower_length == 75 >>> assert epm_resp.valueof("ITowers")[0].tower_length == 75 >>> >>> twr = protocol_tower_t(epm_resp.ITowers.value[0].value[0].value.tower_octet_string) >>> assert twr.floors[0].sprintf("%uuid%") == 'logon' >>> assert twr.floors[1].sprintf("%uuid%") == 'NDR 2.0' >>> assert twr.floors[1].rhs == 0 >>> assert twr.floors[2].protocol_identifier == 11 >>> assert twr.floors[3].sprintf("%protocol_identifier%") == "NCACN_IP_TCP" >>> assert twr.floors[3].rhs == 49676 >>> assert twr.floors[4].sprintf("%protocol_identifier%") == "IP" >>> assert twr.floors[4].rhs == "192.168.122.17" ###(008)=[passed] [EXCH] - Re-build ept_map_Response from scratch >>> pkt = ept_map_Response( ... entry_handle=NDRContextHandle(attributes=0), ... ITowers=[ ... twr_p_t(tower_octet_string=b'\x05\x00\x13\x00\rxV4\x124\x12\xcd\xab\xef\x00\x01#Eg\xcf\xfb\x01\x00\x02\x00\x00\x00\x13\x00\r\x04]\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00+\x10H`\x02\x00\x02\x00\x00\x00\x01\x00\x0b\x02\x00\x00\x00\x01\x00\x07\x02\x00\xc2\x0c\x01\x00\t\x04\x00\xc0\xa8z\x11'), ... twr_p_t(tower_octet_string=b'\x05\x00\x13\x00\rxV4\x124\x12\xcd\xab\xef\x00\x01#Eg\xcf\xfb\x01\x00\x02\x00\x00\x00\x13\x00\r\x04]\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00+\x10H`\x02\x00\x02\x00\x00\x00\x01\x00\x0b\x02\x00\x00\x00\x01\x00\x07\x02\x00\xc2\x03\x01\x00\t\x04\x00\xc0\xa8z\x11') ... ], ... ) >>> >>> pkt.ITowers.value[0].value[0].referent_id = 0x3 >>> pkt.ITowers.value[0].value[1].referent_id = 0x4 >>> pkt.ITowers.max_count = 4 >>> assert bytes(pkt) == bytes(epm_resp) ###(009)=[passed] [EXCH] - Check NetrServerReqChallenge_Request >>> chall_req = pkts[6][NetrServerReqChallenge_Request] >>> assert chall_req.valueof("ComputerName") == b"WIN1" >>> assert chall_req.PrimaryName is None >>> assert chall_req.ClientChallenge.data == b"12345678" ###(010)=[passed] [EXCH] - Re-build NetrServerReqChallenge_Request from scratch >>> pkt = NetrServerReqChallenge_Request( ... ComputerName=b'WIN1', ... ClientChallenge=PNETLOGON_CREDENTIAL(data=b'12345678'), ... PrimaryName=None, ... ) >>> >>> assert bytes(pkt) == bytes(chall_req) ###(011)=[passed] [EXCH] - Check NetrServerReqChallenge_Response >>> chall_resp = pkts[7][NetrServerReqChallenge_Response] >>> assert chall_resp.ServerChallenge.data == b'Zq/\xc4D\xfeRI' >>> assert chall_resp.status == 0 ###(012)=[passed] [EXCH] - Re-build NetrServerReqChallenge_Response from scratch >>> pkt = NetrServerReqChallenge_Response( ... ServerChallenge=PNETLOGON_CREDENTIAL(data=b'Zq/\xc4D\xfeRI') ... ) >>> >>> assert bytes(pkt) == bytes(chall_resp) ###(013)=[passed] [EXCH] - Check NetrServerAuthenticate3_Request >>> auth_req = pkts[8][NetrServerAuthenticate3_Request] >>> assert auth_req.PrimaryName is None >>> assert auth_req.valueof("AccountName") == b"WIN1$" >>> assert auth_req.sprintf("%SecureChannelType%") == "WorkstationSecureChannel" >>> assert auth_req.valueof("ComputerName") == b"WIN1" >>> assert auth_req.ClientCredential.data == b'd:\xb3p\xc6\x9e\xf40' >>> assert auth_req.NegotiateFlags == 1611661311 ###(014)=[passed] [EXCH] - Re-build NetrServerAuthenticate3_Request from scratch >>> pkt = NetrServerAuthenticate3_Request( ... AccountName=b'WIN1$', ... ComputerName=b'WIN1', ... ClientCredential=PNETLOGON_CREDENTIAL(data=b'd:\xb3p\xc6\x9e\xf40'), ... PrimaryName=None, ... SecureChannelType="WorkstationSecureChannel", ... NegotiateFlags=1611661311, ... ) >>> >>> output = bytearray(bytes(pkt)) >>> assert bytes(output) == bytes(auth_req) ###(015)=[passed] [EXCH] - Check NetrServerAuthenticate3_Response >>> auth_resp = pkts[9][NetrServerAuthenticate3_Response] >>> assert auth_resp.ServerCredential.data == b'1h\x8d\xb8\xf4zH\xaf' >>> assert auth_resp.NegotiateFlags == 1611661311 >>> assert auth_resp.AccountRid == 1105 >>> assert auth_resp.status == 0 ###(016)=[passed] [EXCH] - Re-build NetrServerAuthenticate3_Response from scratch >>> pkt = NetrServerAuthenticate3_Response( ... ServerCredential=PNETLOGON_CREDENTIAL(data=b'1h\x8d\xb8\xf4zH\xaf'), ... NegotiateFlags=1611661311, ... AccountRid=1105, ... status=0 ... ) >>> >>> assert bytes(pkt) == bytes(auth_resp) ###### ## GSS-API NetlogonSSP tests ###### ###(017)=[passed] [NetlogonSSP] - Create randomness-mock context manager >>> from unittest import mock >>> >>> def fake_urandom(x): ... # wow, impressive entropy ... return b"0" * x ... >>> _patches = [ ... # Patch all the random ... mock.patch('scapy.layers.msrpce.msnrpc.os.urandom', side_effect=fake_urandom), ... ] >>> >>> class NetlogonRandomPatcher: ... def __enter__(self): ... for p in _patches: ... p.start() ... def __exit__(self, *args, **kwargs): ... for p in _patches: ... p.stop() ... ###(018)=[passed] [NetlogonSSP] - RC4 - Create client and server NetlogonSSP >>> from scapy.layers.msrpce.msnrpc import NetlogonSSP, NL_AUTH_MESSAGE >>> >>> client = NetlogonSSP(SessionKey=b"\x00\x00\x00\x00\x00\x00\x00\x00", computername="DC1", domainname="DOMAIN", AES=False) >>> server = NetlogonSSP(SessionKey=b"\x00\x00\x00\x00\x00\x00\x00\x00", computername="DC1", domainname="DOMAIN", AES=False) ###(019)=[passed] [NetlogonSSP] - RC4 - GSS_Init_sec_context (NL_AUTH_MESSAGE) >>> clicontext, tok, negResult = client.GSS_Init_sec_context(None) >>> >>> assert negResult == 1 >>> assert isinstance(tok, NL_AUTH_MESSAGE) >>> assert tok.MessageType == 0 >>> assert tok.Flags == 3 >>> >>> bytes(tok) b'\x00\x00\x00\x00\x03\x00\x00\x00DOMAIN\x00DC1\x00' >>> assert bytes(tok) == b'\x00\x00\x00\x00\x03\x00\x00\x00DOMAIN\x00DC1\x00' ###(020)=[passed] [NetlogonSSP] - RC4 - GSS_Accept_sec_context (NL_AUTH_MESSAGE->NL_AUTH_MESSAGE) >>> srvcontext, tok, negResult = server.GSS_Accept_sec_context(None, tok) >>> >>> assert negResult == 0 >>> assert tok.MessageType == 1 >>> >>> bytes(tok) b'\x01\x00\x00\x00\x00\x00\x00\x00' >>> assert bytes(tok) == b'\x01\x00\x00\x00\x00\x00\x00\x00' ###(021)=[passed] [NetlogonSSP] - RC4 - GSS_Init_sec_context (NL_AUTH_MESSAGE->OK) >>> clicontext, tok, negResult = client.GSS_Init_sec_context(clicontext, tok) >>> >>> assert negResult == 0 >>> assert tok is None ###(022)=[passed] [NetlogonSSP] - RC4 - GSS_WrapEx/GSS_UnwrapEx: client sends a encrypted payload >>> data_header = b"header" # signed but not encrypted >>> data = b"testAAAAAAAAAABBBBBBBBBCCCCCCCCCDDDDDDDDDEEEEEEEEE" # encrypted >>> >>> with NetlogonRandomPatcher(): ... _msgs, sig = client.GSS_WrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) ... >>> encrypted = _msgs[1].data >>> assert bytes(encrypted) == b'~\x82\xda\x9e>t?QA\xe7\x06B\x87\x01\x03\x97\xea\xd2\xe9\xc4\xbfM$\x95VKxivff\x93\x9a\xe8\rbe#\xe6W\xb4\x82A\xd8\xa7\xf7]\xf3\xb0\x88' >>> assert bytes(sig) == b'w\x00z\x00\xff\xff\x00\x00\x9f\xcb\xb6s\x8c\x8c\x0c*\xa9E\xa4\xd1\x85\xee.\xa2:\xd7\x99\xdaO\x05N ' >>> >>> decrypted = server.GSS_UnwrapEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=encrypted), ... ], ... sig ... )[1].data >>> assert decrypted == data ###(023)=[passed] [NetlogonSSP] - RC4 - GSS_WrapEx/GSS_UnwrapEx: server answers back >>> with NetlogonRandomPatcher(): ... _msgs, sig = server.GSS_WrapEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) ... >>> re_encrypted = _msgs[1].data >>> assert bytes(re_encrypted) == b'\x9b\xc7c\x81\xfbF(\x19\xb6>\x08i\x7f\x18~H\xd6m~\x11K\x83\xb6\x15\x9a\xceP\xa1K\x8d\x83\xbb\xa7\x0fR*J\x89-\xec!\xde\xffs)\xd8F\x9c@^' >>> assert bytes(sig) == b'w\x00z\x00\xff\xff\x00\x00\x9f\xcb\xb6r\x0c\x8c\x0c*\xa9E\xa4\xd1\x85\xee.\xa2\xdf\x92 \xc5\x8a7Yh' >>> >>> decrypted = client.GSS_UnwrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=re_encrypted), ... ], ... sig ... )[1].data >>> assert decrypted == data ###(024)=[passed] [NetlogonSSP] - RC4 - GSS_WrapEx/GSS_UnwrapEx: inject fault >>> _msgs, sig = client.GSS_WrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) >>> encrypted = _msgs[1].data >>> assert encrypted != data >>> bad_data_header = data_header[:-3] + b"hey" >>> try: ... server.GSS_UnwrapEx(srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=bad_data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=encrypted), ... ], ... sig ... ) ... assert False, "No error was reported, but there should have been one" ... except ValueError: ... pass ... ###(025)=[passed] [NetlogonSSP] - AES - Create client and server NetlogonSSP >>> from scapy.layers.msrpce.msnrpc import NetlogonSSP, NL_AUTH_MESSAGE >>> >>> client = NetlogonSSP(SessionKey=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", computername="DC1", domainname="DOMAIN", AES=True) >>> server = NetlogonSSP(SessionKey=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", computername="DC1", domainname="DOMAIN", AES=True) ###(026)=[passed] [NetlogonSSP] - AES - GSS_Init_sec_context (NL_AUTH_MESSAGE) >>> clicontext, tok, negResult = client.GSS_Init_sec_context(None) >>> >>> assert negResult == 1 >>> assert isinstance(tok, NL_AUTH_MESSAGE) >>> assert tok.MessageType == 0 >>> assert tok.Flags == 3 >>> >>> bytes(tok) b'\x00\x00\x00\x00\x03\x00\x00\x00DOMAIN\x00DC1\x00' >>> assert bytes(tok) == b'\x00\x00\x00\x00\x03\x00\x00\x00DOMAIN\x00DC1\x00' ###(027)=[passed] [NetlogonSSP] - AES - GSS_Accept_sec_context (NL_AUTH_MESSAGE->NL_AUTH_MESSAGE) >>> srvcontext, tok, negResult = server.GSS_Accept_sec_context(None, tok) >>> >>> assert negResult == 0 >>> assert tok.MessageType == 1 >>> >>> bytes(tok) b'\x01\x00\x00\x00\x00\x00\x00\x00' >>> assert bytes(tok) == b'\x01\x00\x00\x00\x00\x00\x00\x00' ###(028)=[passed] [NetlogonSSP] - AES - GSS_Init_sec_context (NL_AUTH_MESSAGE->OK) >>> clicontext, tok, negResult = client.GSS_Init_sec_context(clicontext, tok) >>> >>> assert negResult == 0 >>> assert tok is None ###(029)=[passed] [NetlogonSSP] - AES - GSS_WrapEx/GSS_UnwrapEx: client sends a encrypted payload >>> data_header = b"header" # signed but not encrypted >>> data = b"testAAAAAAAAAABBBBBBBBBCCCCCCCCCDDDDDDDDDEEEEEEEEE" # encrypted >>> >>> with NetlogonRandomPatcher(): ... _msgs, sig = client.GSS_WrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) ... >>> encrypted = _msgs[1].data >>> assert bytes(encrypted) == b'\xbf\x1aP\xb4\xb54\xe4^\x1a\xfe\xf3\x1f(\xfa[\xc4\x06\xdb_\x1a9\x90>> assert bytes(sig) == b'\x13\x00\x1a\x00\xff\xff\x00\x00.\n\x8e\xce\xd2\x14\x06W\x978\xe2\xad\x8c\xdd\x8ef\xeba\xa5\x15\xb2\xc2\xce?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> decrypted = server.GSS_UnwrapEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=encrypted), ... ], ... sig ... )[1].data >>> assert decrypted == data ###(030)=[passed] [NetlogonSSP] - AES - GSS_WrapEx/GSS_UnwrapEx: server answers back >>> with NetlogonRandomPatcher(): ... _msgs, sig = server.GSS_WrapEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) ... >>> re_encrypted = _msgs[1].data >>> assert bytes(re_encrypted) == b'\xf9\xb1g\xaf\xb8\x87\x1f\xd5\xe0\x12).\x8dW\xf1\x0cG\x16\xf5\xb4:\xde\x91\xd5\x03\x8a#\xa6\xe1j[*U\xfc\xdb\xfa\x02\xcd\x85\x82O\x11\x908\xbd\xf3q\xd6>P' >>> assert bytes(sig) == b'\x13\x00\x1a\x00\xff\xff\x00\x00.\n\x8e\xcf\xbek \x84\x978\xe2\xad\x8c\xdd\x8efS\x9b\xf3DG\xf4[\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> decrypted = client.GSS_UnwrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=re_encrypted), ... ], ... sig ... )[1].data >>> assert decrypted == data ###(031)=[passed] [NetlogonSSP] - AES - GSS_WrapEx/GSS_UnwrapEx: inject fault >>> _msgs, sig = client.GSS_WrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) >>> encrypted = _msgs[1].data >>> assert encrypted != data >>> bad_data_header = data_header[:-3] + b"hey" >>> try: ... server.GSS_UnwrapEx(srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=bad_data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=encrypted), ... ], ... sig ... ) ... assert False, "No error was reported, but there should have been one" ... except ValueError: ... pass ... NETBIOS regression tests for Scapy ━ Run at 01:42:22 from [test/scapy/layers/netbios.uts] by UTscapy in 0.030393362045288086 └ Passed=8 └ Failed=0 ###### ## Netbios tests ###### ###(000)=[passed] NBNSQueryRequest - build & dissect >>> z = NBNSHeader()/NBNSQueryRequest(SUFFIX="file server service", QUESTION_NAME='TEST1', QUESTION_TYPE='NB') >>> >>> assert raw(z) == b'\x00\x00\x01\x10\x00\x01\x00\x00\x00\x00\x00\x00 FEEFFDFEDBCACACACACACACACACACACA\x00\x00 \x00\x01' >>> >>> pkt = IP(dst='192.168.0.255')/UDP(sport=137, dport='netbios_ns')/z >>> pkt = IP(raw(pkt)) >>> assert pkt.QUESTION_NAME == b'TEST1' >>> assert pkt[NBNSQueryRequest].mysummary() == r"NBNSQueryRequest who has '\\TEST1'" >>> >>> assert NBNSQueryRequest in NBNSHeader(raw(z)) >>> >>> z = NBNSQueryRequest(b' PPCACACACACACACACACACACACACACAAA\x00\x00 \x00\x01') >>> assert z.mysummary() == r"NBNSQueryRequest who has '\\\xff'" ###(001)=[passed] NBNSQueryResponse - build & dissect >>> z = NBNSHeader()/NBNSQueryResponse(RR_NAME="FRED", ADDR_ENTRY=[NBNS_ADD_ENTRY(NB_ADDRESS="192.168.0.13")]) >>> >>> assert raw(z) == b'\x00\x00\x85\x00\x00\x00\x00\x01\x00\x00\x00\x00 EGFCEFEECACACACACACACACACACACAAA\x00\x00 \x00\x01\x00\x04\x93\xe0\x00\x06\x00\x00\xc0\xa8\x00\r' >>> pkt = NBNSHeader(raw(z)) >>> assert NBNSQueryResponse in pkt >>> assert pkt.ADDR_ENTRY[0].NB_ADDRESS == "192.168.0.13" >>> assert pkt[NBNSQueryResponse].mysummary() == r"NBNSQueryResponse '\\FRED' is at 192.168.0.13" >>> >>> z = NBNSQueryResponse(b' PPFCEFEECACACACACACACACACACACAAA\x00\x00 \x00\x01\x00\x04\x93\xe0\x00\x06\x00\x00\xc0\xa8\x00\r') >>> assert z.mysummary() == r"NBNSQueryResponse '\\\xffRED' is at 192.168.0.13" >>> >>> z = NBNSHeader(b'/S\x85\x80\x00\x00\x00\x01\x00\x00\x00\x00 FAEPFEEBFEEPCACACACACACACACACAAA\x00\x00 \x00\x01\x00\x03\xf4\x80\x00\x06\x00\x00\xc0\xa8\x01A') >>> assert z.RR_NAME == b'POTATO' >>> assert z.ADDR_ENTRY[0].G == 0 >>> assert z.ADDR_ENTRY[0].NB_ADDRESS == "192.168.1.65" ###(002)=[passed] NBNSQueryResponse answers NBNSQueryRequest >>> req = IP(ihl=5, len=78, proto=17, chksum=8562, src='172.19.0.7', dst='172.19.0.255')/UDP(sport=137, dport=137, len=58, chksum=62101)/NBNSHeader(NM_FLAGS=17, QDCOUNT=1)/NBNSQueryRequest(QUESTION_NAME=b'Loremipsumdolor', SUFFIX=17217) >>> resp = IP(b'E\x00\x00Zn\xab@\x00@\x11s\xb5\xac\x13\x00\x05\xac\x13\x00\x07\x00\x89\x00\x89\x00FX\x8a\x00\x00\x85\x00\x00\x00\x00\x01\x00\x00\x00\x00 EMGPHCGFGNGJHAHDHFGNGEGPGMGPHCCA\x00\x00 \x00\x01\x00\x00\x00\xa5\x00\x06\x00\x00\xac\x13\x00\x05') >>> >>> try: ... conf.checkIPaddr = True ... assert not resp.answers(req) ... conf.checkIPaddr = False ... assert resp.answers(req) ... finally: ... conf.checkIPaddr = True ... ###(003)=[passed] NBNSQueryResponse answers long NBNSQueryRequest >>> req = IP(ihl=5, len=78, proto=17, chksum=8562, src='172.19.0.7', dst='172.19.0.255')/UDP(sport=137, dport=137, len=58, chksum=62101)/NBNSHeader(NM_FLAGS=17, QDCOUNT=1)/NBNSQueryRequest(QUESTION_NAME=b'Loremipsumdolorsitamet', SUFFIX=17217) >>> resp = IP(b'E\x00\x00Zn\xab@\x00@\x11s\xb5\xac\x13\x00\x05\xac\x13\x00\x07\x00\x89\x00\x89\x00FX\x8a\x00\x00\x85\x00\x00\x00\x00\x01\x00\x00\x00\x00 EMGPHCGFGNGJHAHDHFGNGEGPGMGPHCCA\x00\x00 \x00\x01\x00\x00\x00\xa5\x00\x06\x00\x00\xac\x13\x00\x05') >>> >>> try: ... conf.checkIPaddr = True ... assert not resp.answers(req) ... conf.checkIPaddr = False ... assert resp.answers(req) ... finally: ... conf.checkIPaddr = True ... ###(004)=[passed] NBNSNodeStatusResponse - build & dissect >>> z = NBNSHeader()/NBNSNodeStatusResponse(NODE_NAME=[NBNSNodeStatusResponseService(NETBIOS_NAME="WINDOWS")], MAC_ADDRESS="aa:aa:aa:aa:aa:aa") >>> assert raw(z) == b'\x00\x00\x84\x00\x00\x00\x00\x01\x00\x00\x00\x00 HHGJGOGEGPHHHDCACACACACACACACAAA\x00\x00!\x00\x01\x00\x00\x00\x00\x00S\x01WINDOWS\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> pkt = NBNSHeader(raw(z)) >>> assert pkt.NODE_NAME[0].NETBIOS_NAME == b'WINDOWS\x00\x00\x00\x00\x00\x00\x00\x00' >>> assert NBNSNodeStatusResponse in pkt ###(005)=[passed] NBNSNodeStatusRequest - build and answers >>> pkt = UDP()/NBNSHeader()/NBNSNodeStatusRequest() >>> assert raw(pkt.payload) == b'\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x00\x00 CKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x00\x00!\x00\x01' >>> assert pkt[NBNSNodeStatusRequest].mysummary() == "NBNSNodeStatusRequest who has '\\\\*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'" >>> >>> resp = UDP(b'\x00\x89\x00\x89\x00\xc9v>\x00\x00\x84\x00\x00\x00\x00\x01\x00\x00\x00\x00 CKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x00\x00!\x00\x01\x00\x00\x00\x00\x00\x89\x05DOMAIN \x00\x84\x00SRV1 \x00\x04\x00DOMAIN \x1c\x84\x00SRV1 \x04\x00DOMAIN \x1b\x04\x00RT\x00iX\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert [x.NETBIOS_NAME.strip() for x in resp.NODE_NAME] == [b'DOMAIN', b'SRV1', b'DOMAIN', b'SRV1', b'DOMAIN'] >>> assert resp.answers(pkt) >>> >>> z = NBNSNodeStatusRequest(b' PPCACACACACACACACACACACACACACAAA\x00\x00!\x00\x01') >>> assert z.mysummary() == r"NBNSNodeStatusRequest who has '\\\xff'" ###(006)=[passed] NBNSWackResponse - build & dissect >>> z = NBNSHeader()/NBNSWackResponse(RR_NAME="SARAH") >>> assert raw(z) == b'\x00\x00\xbc\x00\x00\x00\x00\x01\x00\x00\x00\x00 FDEBFCEBEICACACACACACACACACACAAA\x00\x00 \x00\x01\x00\x00\x00\x02\x00\x02)\x10' >>> pkt = NBNSHeader(raw(z)) >>> assert pkt[NBNSWackResponse].RR_NAME == b'SARAH' ###(007)=[passed] NBTSession >>> z = raw(TCP()/NBTSession()) No IP underlayer to compute checksum. Leaving null. >>> assert z == b'\x00\x8b\x00\x8b\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> assert NBTSession in TCP(z) NetFlow regression tests for Scapy ━ Run at 01:42:22 from [test/scapy/layers/netflow.uts] by UTscapy in 0.180769681930542 └ Passed=15 └ Failed=0 ###### ## Netflow v5 ###### ###(000)=[passed] NetflowHeaderV5 - basic building >>> raw(NetflowHeader()/NetflowHeaderV5()) == b'\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True >>> >>> raw(NetflowHeaderV5(engineID=42)) == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\x00\x00' True >>> >>> raw(NetflowRecordV5(dst="192.168.0.1")) == b'\x7f\x00\x00\x01\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00' True >>> >>> raw(NetflowHeader()/NetflowHeaderV5(count=1)/NetflowRecordV5(dst="192.168.0.1")) == b'\x00\x05\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00' True >>> >>> raw(NetflowHeader()/NetflowHeaderV5()/NetflowRecordV5(dst="192.168.0.1")/NetflowRecordV5(dst="172.16.0.1")) == b'\x00\x05\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\xac\x10\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(001)=[passed] NetflowHeaderV5 - UDP bindings >>> s = raw(IP(src="127.0.0.1")/UDP()/NetflowHeader()/NetflowHeaderV5()) >>> assert s == b'E\x00\x004\x00\x01\x00\x00@\x11|\xb6\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x07\x08\x07\x00 \xf1\x98\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> pkt = IP(s) >>> assert NetflowHeaderV5 in pkt ###(002)=[passed] NetflowHeaderV5 - basic dissection >>> nf5 = NetflowHeader(b'\x00\x05\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> nf5.version == 5 and nf5[NetflowHeaderV5].count == 2 and isinstance(nf5[NetflowRecordV5].payload, NetflowRecordV5) True ###### ## Netflow v9 ###### ###(003)=[passed] NetflowV9 - advanced dissection >>> import os >>> filename = scapy_path("/test/pcaps/netflowv9.pcap") >>> a = rdpcap(filename) >>> a = netflowv9_defragment(a) 8 {} 12 {} 5 {} 4 {'enum': } 7 {} 11 {} 32 {} 16 {} 17 {} 18 {} 22 {'use_msec': True} 21 {'use_msec': True} 15 {} 9 {} 13 {} 6 {} 60 {} 5 {} 36 {} 37 {} 34 {} 35 {} >>> >>> nfv9_fl = a[0] >>> assert NetflowFlowsetV9 in nfv9_fl >>> assert len(nfv9_fl.templates[0].template_fields) == 21 >>> assert nfv9_fl.templates[0].template_fields[1].fieldType == 12 >>> >>> nfv9_ds = a[3] >>> assert NetflowDataflowsetV9 in nfv9_ds >>> assert len(nfv9_ds[NetflowDataflowsetV9].records) == 24 >>> assert nfv9_ds[NetflowDataflowsetV9].records[21].IP_PROTOCOL_VERSION == 4 >>> assert nfv9_ds.records[21].IPV4_SRC_ADDR == '20.0.0.248' >>> assert nfv9_ds.records[21].IPV4_DST_ADDR == '30.0.0.248' >>> >>> nfv9_options_fl = a[1] >>> assert NetflowOptionsFlowsetV9 in nfv9_options_fl >>> assert isinstance(nfv9_options_fl[NetflowOptionsFlowsetV9].scopes[0], NetflowOptionsFlowsetScopeV9) >>> assert isinstance(nfv9_options_fl[NetflowOptionsFlowsetV9].options[0], NetflowOptionsFlowsetOptionV9) >>> assert nfv9_options_fl[NetflowOptionsFlowsetV9].options[0].optionFieldType == 36 >>> >>> nfv9_options_ds = a[4] >>> assert NetflowDataflowsetV9 in nfv9_options_ds >>> assert isinstance(nfv9_options_ds.records[0], NetflowOptionsRecordScopeV9) >>> assert nfv9_options_ds.records[0].IN_BYTES == b'\x01\x00\x00\x00' >>> assert nfv9_options_ds.records[1].SAMPLING_INTERVAL == 12 >>> assert nfv9_options_ds.records[1].SAMPLING_ALGORITHM == 0x2 ###(004)=[passed] NetflowV9 - Multiple FlowSets in one packet >>> nfv9_multiple_flowsets = NetflowHeader(b'\x00\t\x00\x03\x00\x00K [F\x17\x97\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00H\x04\x00\x00\x10\x00\x08\x00\x04\x00\x0c\x00\x04\x00\x15\x00\x04\x00\x16\x00\x04\x00\x01\x00\x08\x00\x02\x00\x08\x00\n\x00\x04\x00\x0e\x00\x04\x00\x07\x00\x02\x00\x0b\x00\x02\x00\x04\x00\x01\x00\x06\x00\x01\x00<\x00\x01\x00\x05\x00\x01\x00 \x00\x02\x00:\x00\x02\x00\x00\x00L\x08\x00\x00\x11\x00\x1b\x00\x10\x00\x1c\x00\x10\x00\x1f\x00\x04\x00\x15\x00\x04\x00\x16\x00\x04\x00\x01\x00\x08\x00\x02\x00\x08\x00\n\x00\x04\x00\x0e\x00\x04\x00\x07\x00\x02\x00\x0b\x00\x02\x00\x04\x00\x01\x00\x06\x00\x01\x00<\x00\x01\x00\x05\x00\x01\x00 \x00\x02\x00:\x00\x02\x04\x00\x008\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x10\xac\x00\x00\x10\x83\x00\x00\x00\x00\x00\x00\x0b\xb8\x00\x00\x00\x00\x00\x00\x002\x00\x00\x00\x00\x00\x00\x00\x01\x005\x005\x11\x00\x04\x00\x00\x00\x00e') >>> assert nfv9_multiple_flowsets.haslayer(NetflowFlowsetV9) >>> assert nfv9_multiple_flowsets.haslayer(NetflowDataflowsetV9) >>> nfv9_defrag = netflowv9_defragment(list(nfv9_multiple_flowsets)) 8 {} 12 {} 21 {'use_msec': True} 22 {'use_msec': True} 7 {} 11 {} 4 {'enum': } 6 {} 60 {} 5 {} 32 {} 58 {} 27 {} 28 {} 31 {} 21 {'use_msec': True} 22 {'use_msec': True} 7 {} 11 {} 4 {'enum': } 6 {} 60 {} 5 {} 32 {} 58 {} >>> flowset1 = nfv9_defrag[0].getlayer(NetflowFlowsetV9, 1) >>> assert flowset1.templates[0].template_fields[0].fieldType == 8 >>> assert flowset1.templates[0].template_fields[0].fieldLength == 4 >>> assert flowset1.templates[0].template_fields[5].fieldType == 2 >>> assert flowset1.templates[0].template_fields[5].fieldLength == 8 >>> flowset2 = nfv9_defrag[0].getlayer(NetflowFlowsetV9, 2) >>> assert flowset2.templates[0].template_fields[0].fieldType == 27 >>> assert flowset2.templates[0].template_fields[0].fieldLength == 16 >>> assert flowset2.templates[0].template_fields[5].fieldType == 1 >>> assert flowset2.templates[0].template_fields[5].fieldLength == 8 >>> assert nfv9_defrag[0].getlayer(NetflowFlowsetV9, 2) >>> assert nfv9_defrag[0].records[0].IP_PROTOCOL_VERSION == 4 >>> assert nfv9_defrag[0].records[0].PROTOCOL == 17 >>> assert nfv9_defrag[0].records[0].IPV4_SRC_ADDR == "127.0.0.1" ###(005)=[passed] NetflowV9 - build and dissection >>> header = Ether()/IP()/UDP() >>> netflow_header = NetflowHeader()/NetflowHeaderV9(unixSecs=0) >>> >>> flowset = NetflowFlowsetV9( ... templates=[NetflowTemplateV9( ... template_fields=[ ... NetflowTemplateFieldV9(fieldType=1, fieldLength=1), # IN_BYTES ... NetflowTemplateFieldV9(fieldType=2, fieldLength=4), # IN_PKTS ... NetflowTemplateFieldV9(fieldType=4), # PROTOCOL ... NetflowTemplateFieldV9(fieldType=8), # IPV4_SRC_ADDR ... NetflowTemplateFieldV9(fieldType=12), # IPV4_DST_ADDR ... ], ... templateID=256, ... fieldCount=5) ... ], ... flowSetID=0 ... ) >>> recordClass = GetNetflowRecordV9(flowset) 4 {'enum': } 8 {} 12 {} >>> dataFS = NetflowDataflowsetV9( ... templateID=256, ... records=[ # Some random data. ... recordClass( ... IN_BYTES=b"\x12", ... IN_PKTS=b"\0\0\0\0", ... PROTOCOL=6, ... IPV4_SRC_ADDR="192.168.0.10", ... IPV4_DST_ADDR="192.168.0.11" ... ), ... ], ... ) >>> >>> pkt = netflow_header / flowset / dataFS >>> assert raw(pkt) == b'\x00\t\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x05\x00\x01\x00\x01\x00\x02\x00\x04\x00\x04\x00\x01\x00\x08\x00\x04\x00\x0c\x00\x04\x01\x00\x00\x14\x12\x00\x00\x00\x00\x06\xc0\xa8\x00\n\xc0\xa8\x00\x0b\x00\x00' >>> >>> pkt = header / netflow_header / flowset / dataFS >>> pkt = netflowv9_defragment(Ether(raw(pkt)))[0] 4 {'enum': } 8 {} 12 {} >>> >>> assert NetflowDataflowsetV9 in pkt >>> assert len(pkt[NetflowDataflowsetV9].records) == 1 >>> assert pkt[NetflowDataflowsetV9].records[0].IPV4_DST_ADDR == "192.168.0.11" ###(006)=[passed] NetflowV9 - advanced build >>> atm_time = 1547927349.328283 >>> >>> header = Ether(src="00:00:00:00:00:00", dst="aa:aa:aa:aa:aa:aa")/IP(dst="127.0.0.1", src="127.0.0.1")/UDP()/NetflowHeader()/NetflowHeaderV9(unixSecs=atm_time) >>> flowset = NetflowFlowsetV9(templates=[NetflowTemplateV9(template_fields=[NetflowTemplateFieldV9(fieldType=8, fieldLength=4),NetflowTemplateFieldV9(fieldType=12, fieldLength=4),NetflowTemplateFieldV9(fieldType=5, fieldLength=1),NetflowTemplateFieldV9(fieldType=4, fieldLength=1),NetflowTemplateFieldV9(fieldType=7, fieldLength=2),NetflowTemplateFieldV9(fieldType=11, fieldLength=2),NetflowTemplateFieldV9(fieldType=32, fieldLength=2),NetflowTemplateFieldV9(fieldType=10, fieldLength=4),NetflowTemplateFieldV9(fieldType=16, fieldLength=4),NetflowTemplateFieldV9(fieldType=17, fieldLength=4),NetflowTemplateFieldV9(fieldType=18, fieldLength=4),NetflowTemplateFieldV9(fieldType=14, fieldLength=4),NetflowTemplateFieldV9(fieldType=1, fieldLength=4),NetflowTemplateFieldV9(fieldType=2, fieldLength=4),NetflowTemplateFieldV9(fieldType=22, fieldLength=4),NetflowTemplateFieldV9(fieldType=21, fieldLength=4),NetflowTemplateFieldV9(fieldType=15, fieldLength=4),NetflowTemplateFieldV9(fieldType=9, fieldLength=1),NetflowTemplateFieldV9(fieldType=13, fieldLength=1),NetflowTemplateFieldV9(fieldType=6, fieldLength=1),NetflowTemplateFieldV9(fieldType=60, fieldLength=1)], templateID=424, fieldCount=21)], flowSetID=0, length=92) >>> dataflowset = NetflowDataflowsetV9(records=[NetflowRecordV9(fieldValue=b'\x14\x00\x00\xfd\x1e\x00\x00\xfd\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x03 \x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x02\xfb\x00\x15a|\x00\x00\x07\x0f$\x95x\xed$\x99\x91<\ndg\x01 \x00\x04')], templateID=424) >>> >>> pkt = netflowv9_defragment(list(header/flowset/dataflowset))[0] 8 {} 12 {} 5 {} 4 {'enum': } 7 {} 11 {} 32 {} 16 {} 17 {} 18 {} 22 {'use_msec': True} 21 {'use_msec': True} 15 {} 9 {} 13 {} 6 {} 60 {} >>> assert pkt.records[0].IPV4_NEXT_HOP == "10.100.103.1" >>> assert pkt.records[0].OUTPUT_SNMP == b'\x00\x00\x02\xfb' >>> >>> assert raw(pkt) == b'\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00\xcc\x00\x01\x00\x00@\x11|\x1e\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x07\x08\x07\x00\xb8\x86\xe7\x00\t\x00\x02\x00\x00\x00\x00\\C\x7f5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\x01\xa8\x00\x15\x00\x08\x00\x04\x00\x0c\x00\x04\x00\x05\x00\x01\x00\x04\x00\x01\x00\x07\x00\x02\x00\x0b\x00\x02\x00 \x00\x02\x00\n\x00\x04\x00\x10\x00\x04\x00\x11\x00\x04\x00\x12\x00\x04\x00\x0e\x00\x04\x00\x01\x00\x04\x00\x02\x00\x04\x00\x16\x00\x04\x00\x15\x00\x04\x00\x0f\x00\x04\x00\t\x00\x01\x00\r\x00\x01\x00\x06\x00\x01\x00<\x00\x01\x01\xa8\x00@\x14\x00\x00\xfd\x1e\x00\x00\xfd\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x03 \x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x02\xfb\x00\x15a|\x00\x00\x07\x0f$\x95x\xed$\x99\x91<\ndg\x01 \x00\x04' ###(007)=[passed] NetflowV9 - padding #GH2257 >>> dat = hex_bytes("fb200807007840a10009000277efe9c450c843f900362202000000000001001801000004000800010000002a00040029000400000101004477ef819077ef81900000003c00000001009300930ac900640ac9033b060009ee0b3500000ac9033b131302000000000000260bdc69aa6480996649a000000000") >>> pkt = UDP(dat) >>> assert pkt[NetflowOptionsFlowsetV9].pad == b"\x00\x00" >>> pkt[NetflowOptionsFlowsetV9].pad = None >>> assert raw(pkt) == dat ###(008)=[passed] NetflowV9 - Options Template build >>> option_templateFlowSet_256 = NetflowOptionsFlowsetV9( ... templateID = 256, ... option_scope_length = 4*1, ... option_field_length = 4*3, ... scopes = [ ... NetflowOptionsFlowsetScopeV9(scopeFieldType=1, scopeFieldlength= 4), ... ], ... options = [ ... NetflowOptionsFlowsetOptionV9(optionFieldType= 10, optionFieldlength= 4), ... NetflowOptionsFlowsetOptionV9(optionFieldType= 82, optionFieldlength= 32), ... NetflowOptionsFlowsetOptionV9(optionFieldType= 83, optionFieldlength= 240) ... ]) >>> assert raw(option_templateFlowSet_256) == b'\x00\x01\x00\x1c\x01\x00\x00\x04\x00\x0c\x00\x01\x00\x04\x00\n\x00\x04\x00R\x00 \x00S\x00\xf0\x00\x00' ###(009)=[passed] NetflowV9 - Advanced build, multiple flowsets and multiple records by flowset >>> template_flowset = NetflowFlowsetV9( ... templates=[ NetflowTemplateV9( ... template_fields=[ ... NetflowTemplateFieldV9(fieldType="IN_BYTES", fieldLength=1), ... NetflowTemplateFieldV9(fieldType="IN_PKTS", fieldLength=4), ... NetflowTemplateFieldV9(fieldType="PROTOCOL"), ... NetflowTemplateFieldV9(fieldType="IPV4_SRC_ADDR"), ... NetflowTemplateFieldV9(fieldType="IPV4_DST_ADDR"), ... ], ... templateID=256, ... fieldCount=5), ... NetflowTemplateV9( ... template_fields=[ ... NetflowTemplateFieldV9(fieldType="IN_BYTES", fieldLength=1), ... NetflowTemplateFieldV9(fieldType="IN_PKTS", fieldLength=4), ... NetflowTemplateFieldV9(fieldType="PROTOCOL"), ... NetflowTemplateFieldV9(fieldType="IPV6_SRC_ADDR"), ... NetflowTemplateFieldV9(fieldType="IPV6_DST_ADDR"), ... ], ... templateID=257, ... fieldCount=5) ... ], ... flowSetID=0 ... ) >>> >>> Record256 = GetNetflowRecordV9(template_flowset, templateID = 256) 4 {'enum': } 8 {} 12 {} 4 {'enum': } 27 {} 28 {} >>> Record257 = GetNetflowRecordV9(template_flowset, templateID = 257) 4 {'enum': } 8 {} 12 {} 4 {'enum': } 27 {} 28 {} >>> >>> dataFlowset_1 = NetflowDataflowsetV9( ... templateID=256, ... records=[ ... Record256( ... IN_BYTES=b"\x12", ... IN_PKTS=b"\0\0\0\0", ... PROTOCOL=1, ... IPV4_SRC_ADDR="192.168.0.10", ... IPV4_DST_ADDR="192.168.0.11" ... ), ... Record256( ... IN_BYTES=b"\x0c", ... IN_PKTS=b"\1\1\1\1", ... PROTOCOL=2, ... IPV4_SRC_ADDR="172.0.0.10", ... IPV4_DST_ADDR="172.0.0.11" ... ), ... Record256( ... IN_BYTES=b"\x0c", ... IN_PKTS=b"\1\1\1\1", ... PROTOCOL=3, ... IPV4_SRC_ADDR="172.0.0.10", ... IPV4_DST_ADDR="172.0.0.11" ... ), ... Record256( ... IN_BYTES=b"\x0c", ... IN_PKTS=b"\1\1\1\1", ... PROTOCOL=4, ... IPV4_SRC_ADDR="172.0.0.10", ... IPV4_DST_ADDR="172.0.0.11" ... ), ... Record256( ... IN_BYTES=b"\x0c", ... IN_PKTS=b"\1\1\1\1", ... PROTOCOL=5, ... IPV4_SRC_ADDR="172.0.0.10", ... IPV4_DST_ADDR="172.0.0.11" ... ) ... ], ... ) >>> >>> dataFlowset_2 = NetflowDataflowsetV9( ... templateID=257, ... records=[ ... Record257( ... IN_BYTES=b"\x12", ... IN_PKTS=b"\0\0\0\0", ... PROTOCOL=1, ... IPV6_SRC_ADDR="2001:db8:3333:4444:5555:6666:7777:8888", ... IPV6_DST_ADDR="2001:db8::" ... ), ... Record257( ... IN_BYTES=b"\x0c", ... IN_PKTS=b"\1\1\1\1", ... PROTOCOL=2, ... IPV6_SRC_ADDR="2001:db8:3333:4444:CCCC:DDDD:EEEE:FFFF", ... IPV6_DST_ADDR="2001:db8::" ... ) ... ], ... ) >>> >>> opttmpl258_flowSet = NetflowOptionsFlowsetV9( ... templateID = 258, ... option_scope_length = 4*1, ... option_field_length = 4*2, ... scopes = [ ... NetflowOptionsFlowsetScopeV9(scopeFieldType= 1, scopeFieldlength= 4), ... ], ... options = [ ... NetflowOptionsFlowsetOptionV9(optionFieldType= 34, optionFieldlength= 4), ... NetflowOptionsFlowsetOptionV9(optionFieldType= 35, optionFieldlength= 1) ... ]) >>> >>> class Record_258(NetflowRecordV9): ... name = "Option interface-table" ... fields_desc = [ ... IntField("System", 0), ... IntField("SAMPLING_INTERVAL", 4), ... XByteField("SAMPLING_ALGORITHM", 1) ... ] ... match_subclass = True ... >>> >>> optiondataFlowset = NetflowDataflowsetV9( ... templateID=258, ... records=[ ... Record_258( ... System=424242, ... SAMPLING_INTERVAL=100, ... SAMPLING_ALGORITHM=0x01 ... ), ... Record_258( ... System=242424, ... SAMPLING_INTERVAL=1000, ... SAMPLING_ALGORITHM=0x02 ... ) ... ], ... ) >>> >>> netflow_header = NetflowHeader()/NetflowHeaderV9(unixSecs=1547927349.328283) >>> pkt = netflow_header / template_flowset / opttmpl258_flowSet / dataFlowset_1 / dataFlowset_2 / optiondataFlowset >>> >>> assert raw(pkt) == b'\x00\t\x00\x0c\x00\x00\x00\x00\\C\x7f5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004\x01\x00\x00\x05\x00\x01\x00\x01\x00\x02\x00\x04\x00\x04\x00\x01\x00\x08\x00\x04\x00\x0c\x00\x04\x01\x01\x00\x05\x00\x01\x00\x01\x00\x02\x00\x04\x00\x04\x00\x01\x00\x1b\x00\x10\x00\x1c\x00\x10\x00\x01\x00\x18\x01\x02\x00\x04\x00\x08\x00\x01\x00\x04\x00"\x00\x04\x00#\x00\x01\x00\x00\x01\x00\x00L\x12\x00\x00\x00\x00\x01\xc0\xa8\x00\n\xc0\xa8\x00\x0b\x0c\x01\x01\x01\x01\x02\xac\x00\x00\n\xac\x00\x00\x0b\x0c\x01\x01\x01\x01\x03\xac\x00\x00\n\xac\x00\x00\x0b\x0c\x01\x01\x01\x01\x04\xac\x00\x00\n\xac\x00\x00\x0b\x0c\x01\x01\x01\x01\x05\xac\x00\x00\n\xac\x00\x00\x0b\x00\x00\x01\x01\x00P\x12\x00\x00\x00\x00\x01 \x01\r\xb833DDUUffww\x88\x88 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x01\x01\x01\x02 \x01\r\xb833DD\xcc\xcc\xdd\xdd\xee\xee\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x18\x00\x06y2\x00\x00\x00d\x01\x00\x03\xb2\xf8\x00\x00\x03\xe8\x02\x00\x00' ###(010)=[passed] NetflowV9 - Advanced dissection, complete example >>> pkt = NetflowHeader(b'\x00\t\x00\x0c\x00\x00\x00\x00\\C\x7f5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004\x01\x00\x00\x05\x00\x01\x00\x01\x00\x02\x00\x04\x00\x04\x00\x01\x00\x08\x00\x04\x00\x0c\x00\x04\x01\x01\x00\x05\x00\x01\x00\x01\x00\x02\x00\x04\x00\x04\x00\x01\x00\x1b\x00\x10\x00\x1c\x00\x10\x00\x01\x00\x18\x01\x02\x00\x04\x00\x08\x00\x01\x00\x04\x00"\x00\x04\x00#\x00\x01\x00\x00\x01\x00\x00L\x12\x00\x00\x00\x00\x01\xc0\xa8\x00\n\xc0\xa8\x00\x0b\x0c\x01\x01\x01\x01\x02\xac\x00\x00\n\xac\x00\x00\x0b\x0c\x01\x01\x01\x01\x03\xac\x00\x00\n\xac\x00\x00\x0b\x0c\x01\x01\x01\x01\x04\xac\x00\x00\n\xac\x00\x00\x0b\x0c\x01\x01\x01\x01\x05\xac\x00\x00\n\xac\x00\x00\x0b\x00\x00\x01\x01\x00P\x12\x00\x00\x00\x00\x01 \x01\r\xb833DDUUffww\x88\x88 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\x01\x01\x01\x02 \x01\r\xb833DD\xcc\xcc\xdd\xdd\xee\xee\xff\xff \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00\x18\x00\x06y2\x00\x00\x00d\x01\x00\x03\xb2\xf8\x00\x00\x03\xe8\x02\x00\x00') >>> >>> nf_header = pkt.getlayer(NetflowHeader) >>> assert nf_header.version == 9 >>> nfv9_header = pkt.getlayer(NetflowHeaderV9) >>> assert nf_header.count == 12 >>> >>> flowset_1 = pkt.getlayer(NetflowFlowsetV9, 1) >>> assert len(flowset_1.templates) == 2 >>> assert flowset_1.templates[0].templateID == 256 >>> assert flowset_1.templates[1].templateID == 257 >>> assert flowset_1.templates[1].fieldCount == 5 >>> assert flowset_1.templates[1].template_fields[1].fieldLength == 4 >>> >>> flowset_2 = pkt.getlayer(NetflowOptionsFlowsetV9, 1) >>> assert flowset_2.templateID == 258 >>> assert len(flowset_2.scopes) == 1 >>> assert len(flowset_2.options) == 2 >>> assert flowset_2.pad == b'\x00\x00' >>> >>> flowset_3 = pkt.getlayer(NetflowDataflowsetV9, 1) >>> assert flowset_3.templateID == 256 >>> assert flowset_3.length == 76 >>> >>> flowset_4 = pkt.getlayer(NetflowDataflowsetV9, 2) >>> assert flowset_4.templateID == 257 >>> >>> flowset_5 = pkt.getlayer(NetflowDataflowsetV9, 3) >>> assert flowset_5.templateID == 258 ###### ## Netflow v10 (aka IPFix) ###### ###(011)=[passed] IPFix dissection >>> import os >>> filename = scapy_path("/test/pcaps/ipfix.pcap") >>> a = sniff(offline=filename, session=NetflowSession) 8 {} 12 {} 5 {} 4 {'enum': } 7 {} 11 {} 32 {} 16 {} 17 {} 18 {} 22 {'use_msec': True} 21 {'use_msec': True} 15 {} 9 {} 13 {} 6 {} 60 {} 152 {'use_msec': True, 'length': 8} 153 {'use_msec': True, 'length': 8} >>> >>> pkt1 = a[0] >>> assert NetflowHeaderV10 in pkt1 >>> assert len(pkt1[NetflowFlowsetV9].templates) == 1 >>> assert len(pkt1[NetflowFlowsetV9].templates[0].template_fields) == 23 >>> flds = pkt1[NetflowFlowsetV9].templates[0].template_fields >>> assert (flds[0].fieldType == 8 and flds[0].fieldLength == 4) >>> assert (flds[4].fieldType == 7 and flds[4].fieldLength == 2) >>> >>> pkt2 = a[2] >>> assert NetflowHeaderV10 in pkt2 >>> assert len(pkt2.records) == 1 >>> assert pkt2.records[0].IPV4_SRC_ADDR == "70.1.115.1" >>> assert pkt2.records[0].flowStartMilliseconds == 1480449931519 >>> >>> pkt3 = a[1] >>> assert NetflowOptionsFlowset10 in pkt3 >>> assert pkt3.scope_field_count == 1 >>> assert pkt3.field_count == 3 >>> assert len(pkt3[NetflowOptionsFlowset10].scopes) == 1 >>> assert len(pkt3[NetflowOptionsFlowset10].options) == 2 >>> assert pkt3.scopes[0].scopeFieldType == 5 >>> assert pkt3.scopes[0].scopeFieldlength == 2 >>> assert pkt3[NetflowOptionsFlowset10].options[0].optionFieldType == 36 >>> >>> s=b'\x01\x07\x00\x12\x01\n\x00\x04\x84\x0c\x00\x02\x00\x00\x00\t\x01\n\x00&\x00\x0b\x00\x02\x00\x07\x00\x02\x00\x04\x00\x01\x00\x0c\x00\x04\x00\x08\x00\x04\x00\xea\x00\x02\x01\n\x00\x01\x84\x10\x00\x06\x00\x00\x00\t\x84\x0e\x00\x06\x00\x00\x00\t\x84\x0f\x00\x06\x00\x00\x00\t\x00\x01\x00\x04\x00\x02\x00\x04\x00\xf3\x00\x02\x00\x06\x00\x01\x01\n\x00#' >>> pkt4 = NetflowTemplateV9(s) >>> assert len(pkt4.template_fields) == pkt4.fieldCount >>> assert sum([template.fieldLength for template in pkt4.template_fields]) == 124 ###(012)=[passed] NetflowV10/IPFIX - dissection without padding (GH3101) >>> s=b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00f\x00\x01\x00\x00@\x11|\x84\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x07\x08\x07\x00R\xee\xa2\x00\n\x00H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x01\x01\x00\x04\x00\x02\x00\x04\x00\x04\x00\x01\x00\x08\x00\x04\x00\x0c\x00\x04\x01\x01\x00\x11\x00\x00\x00\x00\x06\xc0\xa8\x00\n\xc0\xa8\x00\x0b\x01\x01\x00\x11\x00\x00\x00\x00\x06\xc0\xa8\x00\n\xc0\xa8\x00\x0b' >>> pkt = netflowv9_defragment(Ether(s))[0] 4 {'enum': } 8 {} 12 {} >>> >>> for i in range(1,3): ... assert pkt.getlayer(NetflowDataflowsetV9, i).templateID == 257 ... assert pkt.getlayer(NetflowDataflowsetV9, i).records[0].IN_PKTS == b'\x00\x00\x00\x00' ... assert pkt.getlayer(NetflowDataflowsetV9, i).records[0].PROTOCOL == 6 ... assert pkt.getlayer(NetflowDataflowsetV9, i).records[0].IPV4_SRC_ADDR == "192.168.0.10" ... assert pkt.getlayer(NetflowDataflowsetV9, i).records[0].IPV4_DST_ADDR == "192.168.0.11" ... >>> assert not pkt.getlayer(NetflowDataflowsetV9, 2).payload ###(013)=[passed] NetflowV10/IPFIX - build >>> netflow_header = NetflowHeader()/NetflowHeaderV10() >>> >>> flowset = NetflowFlowsetV9( ... templates=[NetflowTemplateV9( ... template_fields=[ ... NetflowTemplateFieldV9(fieldType=1, fieldLength=1), # IN_BYTES ... NetflowTemplateFieldV9(fieldType=2, fieldLength=4), # IN_PKTS ... NetflowTemplateFieldV9(fieldType=4), # PROTOCOL ... NetflowTemplateFieldV9(fieldType=8), # IPV4_SRC_ADDR ... NetflowTemplateFieldV9(fieldType=12), # IPV4_DST_ADDR ... ], ... templateID=256, ... fieldCount=5) ... ], ... flowSetID=0 ... ) >>> recordClass = GetNetflowRecordV9(flowset) 4 {'enum': } 8 {} 12 {} >>> dataFS = NetflowDataflowsetV9( ... templateID=256, ... records=[ # Some random data. ... recordClass( ... IN_BYTES=b"\x12", ... IN_PKTS=b"\0\0\0\0", ... PROTOCOL=6, ... IPV4_SRC_ADDR="192.168.0.10", ... IPV4_DST_ADDR="192.168.0.11" ... ), ... ], ... ) >>> >>> pkt = netflow_header / flowset / dataFS >>> assert raw(pkt) == b'\x00\n\x00>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x01\x00\x00\x05\x00\x01\x00\x01\x00\x02\x00\x04\x00\x04\x00\x01\x00\x08\x00\x04\x00\x0c\x00\x04\x01\x00\x00\x14\x12\x00\x00\x00\x00\x06\xc0\xa8\x00\n\xc0\xa8\x00\x0b\x00\x00' ###(014)=[passed] NetflowSession - dissect packet NetflowV9 packets on-the-flow >>> import os >>> filename = scapy_path("/test/pcaps/netflowv9.pcap") >>> >>> dissected_packets = [] >>> def callback(pkt): ... dissected_packets.append(pkt) ... >>> sniff(offline=filename, session=NetflowSession, prn=callback) 8 {} 12 {} 5 {} 4 {'enum': } 7 {} 11 {} 32 {} 16 {} 17 {} 18 {} 22 {'use_msec': True} 21 {'use_msec': True} 15 {} 9 {} 13 {} 6 {} 60 {} 5 {} 36 {} 37 {} 34 {} 35 {} >>> records = dissected_packets[3][NetflowDataflowsetV9].records >>> assert len(records) == 24 >>> assert records[0].IPV4_SRC_ADDR == '20.0.1.174' >>> assert records[0].IPV4_NEXT_HOP == '10.100.103.1' >>> >>> dscp_flowset = NetflowFlowsetV9( ... templates=[ ... NetflowTemplateV9( ... template_fields=[ ... NetflowTemplateFieldV9(fieldType=195), ... ], ... templateID=273, ... ) ... ], ... flowSetID=2, ... ) >>> >>> recordClass = GetNetflowRecordV9(dscp_flowset, templateID=273) 195 {} >>> >>> dscp_dataset = NetflowDataflowsetV9( ... templateID=273, ... records=[ ... recordClass( ... IP_DSCP=42, ... ), ... ], ... ) >>> >>> assert(raw(dscp_dataset) == b'\x01\x11\x00\x08\x2a\x00\x00\x00') NTLM tests ━ Run at 01:42:22 from [test/scapy/layers/ntlm.uts] by UTscapy in 0.13190531730651855 └ Passed=26 └ Failed=0 ###### ## [MS-NLMP] tests ###### ###(000)=[passed] [MS-NLMP] 4.2.1 - Common Values >>> User = "User" >>> UserDom = "Domain" >>> Passwd = "Password" >>> ServerName = "Server" >>> WorkstationName = "COMPUTER" >>> RandomSessionKey = b"UUUUUUUUUUUUUUUU" >>> Time = 0 >>> ClientChallenge = b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa' >>> ServerChallenge = b'\x01\x23\x45\x67\x89\xab\xcd\xef' ###(001)=[passed] [MS-NLMP] 4.2.4 >>> NegotiateFlags = 0xe28a8233 >>> AVPairs1 = "Server" >>> AVPairs2 = "Domain" ###(002)=[passed] [MS-NLMP] 4.2.4.1.1 NTOWFv2() >>> ResponseKeyNT = NTOWFv2(Passwd, User, UserDom) >>> assert ResponseKeyNT == b'\x0c\x86\x8a@;\xfdz\x93\xa3\x00\x1e\xf2.\xf0.?' ###(003)=[passed] Build NTLMv2_RESPONSE >>> ntlm_response = NTLMv2_RESPONSE( ... TimeStamp=Time, ... ChallengeFromClient=ClientChallenge, ... AvPairs=[ ... AV_PAIR(AvId="MsvAvNbDomainName", Value=AVPairs2), ... AV_PAIR(AvId="MsvAvNbComputerName", Value=AVPairs1), ... AV_PAIR(AvId="MsvAvEOL"), # Windows does this (samba does not) ... AV_PAIR(AvId="MsvAvEOL"), ... ] ... ) ###(004)=[passed] [MS-NLMP] 4.2.4.2.2 NTLMv2 Response >>> ntlm_response.NTProofStr = ntlm_response.computeNTProofStr( ... ResponseKeyNT, ... ServerChallenge, ... ) >>> assert ntlm_response.NTProofStr == b'h\xcd\n\xb8Q\xe5\x1c\x96\xaa\xbc\x92{\xeb\xefj\x1c' ###(005)=[passed] [MS-NLMP] 4.2.4.1.2 Session Base Key >>> ExportedSessionKey = SessionBaseKey = NTLMv2_ComputeSessionBaseKey( ... ResponseKeyNT, ... ntlm_response.NTProofStr, ... ) >>> assert SessionBaseKey == b'\x8d\xe4\x0c\xca\xdb\xc1J\x82\xf1\\\xb0\xad\r\xe9\\\xa3' ###(006)=[passed] [MS-NLMP] 4.2.4.2.3 Encrypted Session Key >>> EncryptedRandomSessionKey = RC4K(SessionBaseKey, RandomSessionKey) >>> assert EncryptedRandomSessionKey == b'\xc5\xda\xd2TO\xc9y\x90\x94\xce\x1c\xe9\x0b\xc9\xd0>' ###(007)=[passed] [MS-NLMP] 4.2.4.3 Messages >>> ntlm_nego = NTLM_NEGOTIATE( ... NegotiateFlags=NegotiateFlags, ... ProductMajorVersion=5, ... ProductMinorVersion=1, ... ProductBuild=2600, ... ) >>> ntlm_nego.DomainName = UserDom >>> ntlm_nego.WorkstationName = WorkstationName >>> >>> >>> ntlm_auth = NTLM_Header(b'NTLMSSP\x00\x03\x00\x00\x00\x18\x00\x18\x00l\x00\x00\x00T\x00T\x00\x84\x00\x00\x00\x0c\x00\x0c\x00H\x00\x00\x00\x08\x00\x08\x00T\x00\x00\x00\x10\x00\x10\x00\\\x00\x00\x00\x10\x00\x10\x00\xd8\x00\x00\x005\x82\x88\xe2\x05\x01(\n\x00\x00\x00\x0fD\x00o\x00m\x00a\x00i\x00n\x00U\x00s\x00e\x00r\x00C\x00O\x00M\x00P\x00U\x00T\x00E\x00R\x00\x86\xc3P\x97\xac\x9c\xec\x10%TvJW\xcc\xcc\x19\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaah\xcd\n\xb8Q\xe5\x1c\x96\xaa\xbc\x92{\xeb\xefj\x1c\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x02\x00\x0c\x00D\x00o\x00m\x00a\x00i\x00n\x00\x01\x00\x0c\x00S\x00e\x00r\x00v\x00e\x00r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xda\xd2TO\xc9y\x90\x94\xce\x1c\xe9\x0b\xc9\xd0>') >>> >>> assert ntlm_auth.MIC is None ###(008)=[passed] [MS-NLMP] 4.2.4.4 GSS_WrapEx >>> SeqNum = 0 >>> Plaintext = b'P\x00l\x00a\x00i\x00n\x00t\x00e\x00x\x00t\x00' >>> >>> SealKey = SEALKEY(ntlm_nego.NegotiateFlags, RandomSessionKey, "Client") >>> assert SealKey == b'Y\xf6\x00\x97<\xc4\x96\n%H\n|\x19nLX' >>> >>> SignKey = SIGNKEY(ntlm_nego.NegotiateFlags, RandomSessionKey, "Client") >>> assert SignKey == b'G\x88\xdc\x86\x1bG\x82\xf3]C\xfd\x98\xfe\x1a-9' >>> >>> ssp = NTLMSSP() >>> ctx = NTLMSSP.CONTEXT(IsAcceptor=False) >>> ctx.SendSeqNum = SeqNum >>> ctx.SendSignKey = SignKey >>> ctx.SendSealKey = SealKey >>> ctx.SendSealHandle = RC4Init(SealKey) >>> >>> _msgs, sig = ssp.GSS_WrapEx(ctx, [ ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=Plaintext), ... ]) >>> s = _msgs[0].data >>> >>> assert s == b'T\xe5\x01e\xbf\x196\xdc\x99` \xc1\x81\x1b\x0f\x06\xfb_' >>> assert sig.Checksum == b'\x7f\xb3\x8e\xc5\xc5]Iv' >>> >>> assert bytes(sig) == b'\x01\x00\x00\x00\x7f\xb3\x8e\xc5\xc5]Iv\x00\x00\x00\x00' ###### ## GSS-API SPNEGO: SPNEGOSSP tests ###### ###(009)=[passed] Create randomness-mock context manager >>> from unittest import mock >>> >>> def fake_urandom(x): ... # wow, impressive entropy ... return b"0" * x ... >>> _patches = [ ... # Patch all the random ... mock.patch('scapy.layers.ntlm.os.urandom', side_effect=fake_urandom), ... ] >>> >>> class NTLMRandomPatcher: ... def __enter__(self): ... for p in _patches: ... p.start() ... def __exit__(self, *args, **kwargs): ... for p in _patches: ... p.stop() ... ###(010)=[passed] Create client and server SPNEGOSSPs >>> from scapy.layers.ntlm import NTLM_NEGOTIATE >>> from scapy.layers.spnego import SPNEGO_negTokenInit, SPNEGO_negTokenResp, SPNEGO_Token, SPNEGO_negToken, SPNEGO_MechListMIC, SPNEGOSSP >>> >>> client = SPNEGOSSP([ ... NTLMSSP( ... UPN="User1", ... PASSWORD="Password1", ... ), ... ]) >>> server = SPNEGOSSP([ ... NTLMSSP( ... IDENTITIES={ ... "User1": MD4le("Password1"), ... }, ... NTLM_VALUES={ ... "NetbiosDomainName": "DOMAIN", ... "NetbiosComputerName": "WIN10", ... "DnsDomainName": "domain.local", ... "DnsComputerName": "WIN10.domain.local", ... "DnsTreeName": "domain.local", ... }, ... ) ... ]) ###(011)=[passed] GSS_Init_sec_context (negTokenInit: NTLM_NEGOTIATE) >>> clicontext, tok, negResult = client.GSS_Init_sec_context( ... None, ... req_flags=( ... GSS_C_FLAGS.GSS_C_MUTUAL_FLAG | ... GSS_C_FLAGS.GSS_C_INTEG_FLAG | ... GSS_C_FLAGS.GSS_C_CONF_FLAG ... ) ... ) >>> assert negResult == 1 >>> assert isinstance(tok, GSSAPI_BLOB) >>> tok = GSSAPI_BLOB(bytes(tok)) >>> assert tok.MechType.val == '1.3.6.1.5.5.2' >>> assert isinstance(tok.innerToken.token, SPNEGO_negTokenInit) >>> assert len(tok.innerToken.token.mechTypes) == 1 >>> assert tok.innerToken.token.mechTypes[0].oid == '1.3.6.1.4.1.311.2.2.10' >>> assert tok.innerToken.token.reqFlags is None >>> assert tok.innerToken.token.negHints is None >>> assert tok.innerToken.token.mechListMIC is None >>> assert tok.innerToken.token._mechListMIC is None >>> >>> ntlm_nego = tok.innerToken.token.mechToken.value >>> assert isinstance(ntlm_nego, NTLM_NEGOTIATE) >>> assert ntlm_nego.Payload == [] >>> assert ntlm_nego.MessageType == 1 >>> assert ntlm_nego.NegotiateFlags.NEGOTIATE_UNICODE and ntlm_nego.NegotiateFlags.NEGOTIATE_SIGN and ntlm_nego.NegotiateFlags.NEGOTIATE_KEY_EXCH >>> assert ntlm_nego.NegotiateFlags == 0xe2898235 >>> assert ntlm_nego.ProductMajorVersion == 10 >>> assert ntlm_nego.ProductMinorVersion == 0 >>> assert ntlm_nego.ProductBuild == 19041 >>> assert bytes(ntlm_nego) == b'NTLMSSP\x00\x01\x00\x00\x005\x82\x89\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00aJ\x00\x00\x00\x0f' ###(012)=[passed] GSS_Accept_sec_context (SPNEGO_negTokenResp: NTLM_NEGOTIATE->NTLM_CHALLENGE) >>> with NTLMRandomPatcher(): ... srvcontext, tok, negResult = server.GSS_Accept_sec_context(None, tok) ... >>> assert negResult == 1 >>> assert isinstance(tok, SPNEGO_negToken) >>> tok = SPNEGO_negToken(bytes(tok)) >>> assert isinstance(tok.token, SPNEGO_negTokenResp) >>> assert tok.token.negResult == 1 >>> assert tok.token.supportedMech.oid == '1.3.6.1.4.1.311.2.2.10' >>> assert isinstance(tok.token.responseToken, SPNEGO_Token) >>> assert tok.token.mechListMIC is None >>> >>> ntlm_chall = tok.token.responseToken.value >>> assert isinstance(ntlm_chall, NTLM_CHALLENGE) >>> assert ntlm_chall.NegotiateFlags == 0xe2898235 >>> assert ntlm_chall.getAv(2).Value == "DOMAIN" >>> assert ntlm_chall.getAv(1).Value == "WIN10" >>> assert ntlm_chall.getAv(4).Value == "domain.local" >>> assert ntlm_chall.getAv(3).Value == "WIN10.domain.local" >>> assert ntlm_chall.getAv(5).Value == "domain.local" >>> assert ntlm_chall.getAv(0) ###(013)=[passed] GSS_Init_sec_context (SPNEGO_negToken: NTLM_CHALLENGE->NTLM_AUTHENTICATE) >>> with NTLMRandomPatcher(): ... clicontext, tok, negResult = client.GSS_Init_sec_context(clicontext, tok) ... >>> assert isinstance(tok, SPNEGO_negToken) >>> tok = SPNEGO_negToken(bytes(tok)) >>> assert isinstance(tok.token, SPNEGO_negTokenResp) >>> assert tok.token.negResult is None >>> assert tok.token.supportedMech is None >>> assert isinstance(tok.token.mechListMIC, SPNEGO_MechListMIC) >>> sig = NTLMSSP_MESSAGE_SIGNATURE(tok.token.mechListMIC.value.val) >>> assert sig.Version == 1 >>> assert sig.SeqNum == 0 >>> assert isinstance(tok.token.responseToken, SPNEGO_Token) >>> >>> ntlm_auth = NTLM_Header(tok.token.responseToken.value.val) >>> assert isinstance(ntlm_auth, NTLM_AUTHENTICATE_V2) >>> assert ntlm_auth.NegotiateFlags == 0xe2898235 >>> assert ntlm_auth.UserName == "User1" >>> assert ntlm_auth.DomainName == "DOMAIN" >>> assert ntlm_auth.Workstation == "WIN10" >>> assert ntlm_chall.TargetInfo[:6] == ntlm_auth.NtChallengeResponse.AvPairs[:6] >>> assert ntlm_auth.NtChallengeResponse.TimeStamp == ntlm_chall.getAv(7).Value >>> assert ntlm_auth.NtChallengeResponse.getAv(6).Value == 2 >>> assert ntlm_auth.NtChallengeResponse.getAv(9).Value == "host/WIN10" ###(014)=[passed] GSS_Accept_sec_context (SPNEGO_negToken: NTLM_AUTHENTICATE->OK) >>> srvcontext, tok, negResult = server.GSS_Accept_sec_context(srvcontext, tok) >>> assert negResult == 0 # success :p >>> assert isinstance(tok, SPNEGO_negToken) >>> assert isinstance(tok.token, SPNEGO_negTokenResp) >>> assert tok.token.negResult == 0 >>> assert tok.token.supportedMech is None >>> assert tok.token.responseToken is None >>> assert isinstance(tok.token.mechListMIC, SPNEGO_MechListMIC) >>> sig = NTLMSSP_MESSAGE_SIGNATURE(tok.token.mechListMIC.value.val) >>> assert sig.Version == 1 >>> assert sig.SeqNum == 0 >>> >>> assert srvcontext.SessionKey == clicontext.SessionKey >>> assert clicontext.SessionKey == b"0000000000000000" ###(015)=[passed] GSS_WrapEx/GSS_UnwrapEx: client sends a encrypted payload >>> data_header = b"header" # signed but not encrypted >>> data = b"testAAAAAAAAAABBBBBBBBBCCCCCCCCCDDDDDDDDDEEEEEEEEE" # encrypted >>> >>> with NTLMRandomPatcher(): ... _msgs, sig = client.GSS_WrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) ... >>> encrypted = _msgs[1].data >>> assert bytes(encrypted) == b'\x9c_\xe9\xf2D\xc3\xe9^\xcd\x939\xff\xac\xa8\x16Y7\xcb \x80mS\xee.3\x85\x90\xfe\xb1_l\xcc\xcc\x7fl\x1ae,\x8b\xb3\x1cK\xd7zT\x1b\xd4W9Z' >>> assert sig.Checksum == b'\x91\xca\x9d\x0c\x15\x1e\xc5"' >>> >>> decrypted = server.GSS_UnwrapEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=encrypted), ... ], ... sig ... )[1].data >>> assert decrypted == data ###(016)=[passed] GSS_WrapEx/GSS_UnwrapEx: server answers back >>> with NTLMRandomPatcher(): ... _msgs, sig = server.GSS_WrapEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) ... >>> re_encrypted = _msgs[1].data >>> assert bytes(re_encrypted) == b'\x8f@s\x9c\xa5[\xd4\xee\xb6\x9b,\x96\xe6\x94\x8e\x8d\x1565\x81\xd0E\xe9WI\xd0\\\x80\x9fD\x1f\xee\xfb\xe5\xc6s\x0c+\t\xba,\xf1\xa2Zj\xd6\x0e\xe4C\x02' >>> assert sig.Checksum == b'\x11l/\xeaO\xb8\x08z' >>> >>> decrypted = client.GSS_UnwrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=re_encrypted), ... ], ... sig ... )[1].data >>> assert decrypted == data ###(017)=[passed] GSS_WrapEx/GSS_UnwrapEx: client continues with seqnum 2 >>> with NTLMRandomPatcher(): ... _msgs, sig = client.GSS_WrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) ... >>> encrypted = _msgs[1].data >>> assert bytes(encrypted) == b'\x96\xc2\xa8>\xa8\xc0\xb8\xc6\xb6\x8a\xe3\xc2\x84\x8a\xd4e\xeb?"s\xf9\x1drfC\xb9\xbe\xe8\x1e9\xfe\xa1\xa8^\xbe\x0e\x98\xb3]\xa0\x906\xf6`\xdfn\x88d_L' >>> assert sig.Checksum == b'\xc5t\xfa\xba\x1c\x9d-\xa1' >>> >>> assert sig.SeqNum == 2 >>> decrypted = server.GSS_UnwrapEx( ... srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=encrypted), ... ], ... sig ... )[1].data >>> assert decrypted == data ###(018)=[passed] GSS_WrapEx/GSS_UnwrapEx: inject fault >>> _msgs, sig = client.GSS_WrapEx( ... clicontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=data) ... ] ... ) >>> encrypted = _msgs[1].data >>> assert encrypted != data >>> bad_data_header = data_header[:-3] + b"hey" >>> try: ... server.GSS_UnwrapEx(srvcontext, ... [ ... SSP.WRAP_MSG(conf_req_flag=False, sign=True, data=bad_data_header), ... SSP.WRAP_MSG(conf_req_flag=True, sign=True, data=encrypted), ... ], ... sig ... ) ... assert False, "No error was reported, but there should have been one" ... except ValueError: ... pass ... ###### ## GSSAPI - Verify real exchange ###### ###(019)=[passed] Real exchange - Parse token 0 from server >>> from scapy.layers.gssapi import GSSAPI_BLOB >>> >>> tok0 = GSSAPI_BLOB( ... b"\x60\x76\x06\x06\x2b\x06\x01\x05\x05\x02\xa0\x6c\x30\x6a\xa0\x3c" \ ... b"\x30\x3a\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x1e\x06\x09" \ ... b"\x2a\x86\x48\x82\xf7\x12\x01\x02\x02\x06\x09\x2a\x86\x48\x86\xf7" \ ... b"\x12\x01\x02\x02\x06\x0a\x2a\x86\x48\x86\xf7\x12\x01\x02\x02\x03" \ ... b"\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa3\x2a\x30\x28" \ ... b"\xa0\x26\x1b\x24\x6e\x6f\x74\x5f\x64\x65\x66\x69\x6e\x65\x64\x5f" \ ... b"\x69\x6e\x5f\x52\x46\x43\x34\x31\x37\x38\x40\x70\x6c\x65\x61\x73" \ ... b"\x65\x5f\x69\x67\x6e\x6f\x72\x65") ###(020)=[passed] Real exchange - Create server SPNEGOSSP >>> from scapy.layers.ntlm import NTLM_NEGOTIATE, MD4le >>> from scapy.layers.spnego import SPNEGOSSP >>> >>> server = SPNEGOSSP( ... [ ... NTLMSSP( ... IDENTITIES={ ... "User1": MD4le("Password1!"), ... }, ... ), ... ], ... force_supported_mechtypes=tok0.innerToken.token.mechTypes ... ) ###(021)=[passed] Real exchange - Parse token 1 from client >>> tok1 = GSSAPI_BLOB( ... b"\x60\x48\x06\x06\x2b\x06\x01\x05\x05\x02\xa0\x3e\x30\x3c\xa0\x0e" \ ... b"\x30\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x2a" \ ... b"\x04\x28\x4e\x54\x4c\x4d\x53\x53\x50\x00\x01\x00\x00\x00\x97\x82" \ ... b"\x08\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\x00\x00\x0a\x00\x61\x4a\x00\x00\x00\x0f") >>> >>> srvcontext, _, negResult = server.GSS_Accept_sec_context(None, tok1) >>> assert negResult == 1 ###(022)=[passed] Real exchange - Inject token 2 from server >>> tok2 = GSSAPI_BLOB( ... b"\xa1\x81\xca\x30\x81\xc7\xa0\x03\x0a\x01\x01\xa1\x0c\x06\x0a\x2b" \ ... b"\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x81\xb1\x04\x81\xae\x4e" \ ... b"\x54\x4c\x4d\x53\x53\x50\x00\x02\x00\x00\x00\x0c\x00\x0c\x00\x38" \ ... b"\x00\x00\x00\x15\x82\x89\xe2\xdd\x92\xcd\x56\xcf\x74\xc6\x03\x00" \ ... b"\x00\x00\x00\x00\x00\x00\x00\x6a\x00\x6a\x00\x44\x00\x00\x00\x0a" \ ... b"\x00\x63\x45\x00\x00\x00\x0f\x44\x00\x4f\x00\x4d\x00\x41\x00\x49" \ ... b"\x00\x4e\x00\x02\x00\x0c\x00\x44\x00\x4f\x00\x4d\x00\x41\x00\x49" \ ... b"\x00\x4e\x00\x01\x00\x06\x00\x44\x00\x43\x00\x31\x00\x04\x00\x18" \ ... b"\x00\x64\x00\x6f\x00\x6d\x00\x61\x00\x69\x00\x6e\x00\x2e\x00\x6c" \ ... b"\x00\x6f\x00\x63\x00\x61\x00\x6c\x00\x03\x00\x20\x00\x44\x00\x43" \ ... b"\x00\x31\x00\x2e\x00\x64\x00\x6f\x00\x6d\x00\x61\x00\x69\x00\x6e" \ ... b"\x00\x2e\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x6c\x00\x07\x00\x08" \ ... b"\x00\x02\xea\x8e\xe8\xd2\x8d\xd9\x01\x00\x00\x00\x00") >>> >>> tok2.token.responseToken.value.show() ###[ NTLM Challenge ]### Signature = b'NTLMSSP' MessageType= CHALLENGE_MESSAGE TargetNameLen= 12 TargetNameMaxLen= 12 TargetNameBufferOffset= 56 NegotiateFlags= NEGOTIATE_UNICODE+REQUEST_TARGET+NEGOTIATE_SIGN+NEGOTIATE_NTLM+NEGOTIATE_ALWAYS_SIGN+TARGET_TYPE_DOMAIN+NEGOTIATE_EXTENDED_SESSIONSECURITY+NEGOTIATE_TARGET_INFO+NEGOTIATE_VERSION+NEGOTIATE_128+NEGOTIATE_KEY_EXCH+NEGOTIATE_56 ServerChallenge= dd92cd56cf74c603 Reserved = 0000000000000000 TargetInfoLen= 106 TargetInfoMaxLen= 106 TargetInfoBufferOffset= 68 ProductMajorVersion= 10 ProductMinorVersion= 0 ProductBuild= 17763 res_ver = 0 NTLMRevisionCurrent= v15 Payload = TargetName= DOMAIN \TargetInfo\ |###[ NTLM AV Pair ]### | AvId = MsvAvNbDomainName | AvLen = 12 | Value = DOMAIN |###[ NTLM AV Pair ]### | AvId = MsvAvNbComputerName | AvLen = 6 | Value = DC1 |###[ NTLM AV Pair ]### | AvId = MsvAvDnsDomainName | AvLen = 24 | Value = domain.local |###[ NTLM AV Pair ]### | AvId = MsvAvDnsComputerName | AvLen = 32 | Value = DC1.domain.local |###[ NTLM AV Pair ]### | AvId = MsvAvTimestamp | AvLen = 8 | Value = Wed, 24 May 2023 00:01:36 (1684886496) |###[ NTLM AV Pair ]### | AvId = MsvAvEOL | AvLen = 0 | Value = >>> >>> srvcontext.sub_context.chall_tok = tok2.token.responseToken.value ###(023)=[passed] Real exchange - Parse token 3 from client >>> tok3 = GSSAPI_BLOB( ... b"\xa1\x82\x01\xd7\x30\x82\x01\xd3\xa0\x03\x0a\x01\x01\xa2\x82\x01" \ ... b"\xb6\x04\x82\x01\xb2\x4e\x54\x4c\x4d\x53\x53\x50\x00\x03\x00\x00" \ ... b"\x00\x18\x00\x18\x00\x78\x00\x00\x00\x12\x01\x12\x01\x90\x00\x00" \ ... b"\x00\x0c\x00\x0c\x00\x58\x00\x00\x00\x0a\x00\x0a\x00\x64\x00\x00" \ ... b"\x00\x0a\x00\x0a\x00\x6e\x00\x00\x00\x10\x00\x10\x00\xa2\x01\x00" \ ... b"\x00\x15\x82\x88\xe2\x0a\x00\x61\x4a\x00\x00\x00\x0f\x6c\xf5\x94" \ ... b"\xd3\x4b\x59\x37\x72\x4a\x63\xe0\xb8\xf1\x2e\xf7\x39\x44\x00\x4f" \ ... b"\x00\x4d\x00\x41\x00\x49\x00\x4e\x00\x55\x00\x73\x00\x65\x00\x72" \ ... b"\x00\x31\x00\x57\x00\x49\x00\x4e\x00\x31\x00\x30\x00\x00\x00\x00" \ ... b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\x00\x00\x00\x00\x00\xd7\x44\x98\xd1\xdf\xdf\xd0\x5f\xaf\x33\xbe" \ ... b"\x69\x12\xdf\x7f\x6d\x01\x01\x00\x00\x00\x00\x00\x00\x02\xea\x8e" \ ... b"\xe8\xd2\x8d\xd9\x01\x24\x0a\x3b\xc1\x49\x92\xcc\x1e\x00\x00\x00" \ ... b"\x00\x02\x00\x0c\x00\x44\x00\x4f\x00\x4d\x00\x41\x00\x49\x00\x4e" \ ... b"\x00\x01\x00\x06\x00\x44\x00\x43\x00\x31\x00\x04\x00\x18\x00\x64" \ ... b"\x00\x6f\x00\x6d\x00\x61\x00\x69\x00\x6e\x00\x2e\x00\x6c\x00\x6f" \ ... b"\x00\x63\x00\x61\x00\x6c\x00\x03\x00\x20\x00\x44\x00\x43\x00\x31" \ ... b"\x00\x2e\x00\x64\x00\x6f\x00\x6d\x00\x61\x00\x69\x00\x6e\x00\x2e" \ ... b"\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x6c\x00\x07\x00\x08\x00\x02" \ ... b"\xea\x8e\xe8\xd2\x8d\xd9\x01\x06\x00\x04\x00\x02\x00\x00\x00\x08" \ ... b"\x00\x30\x00\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\x20\x00\x00\xc5\xb6\xc9\x62\xcc\x25\x74\x2d\xc9\x64\xc0\xcb\x01" \ ... b"\xe8\xae\x03\x12\x56\xa9\xfa\x84\xcb\x37\xcd\xa6\xae\x6e\x5b\xe2" \ ... b"\x16\x52\xbb\x0a\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\x00\x00\x00\x00\x00\x00\x00\x09\x00\x24\x00\x63\x00\x69\x00\x66" \ ... b"\x00\x73\x00\x2f\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36" \ ... b"\x00\x38\x00\x2e\x00\x30\x00\x2e\x00\x31\x00\x30\x00\x30\x00\x00" \ ... b"\x00\x00\x00\x00\x00\x00\x00\x2a\xdf\x42\x60\xc7\x4b\xac\x30\xa0" \ ... b"\x47\xdc\xcd\xb5\x5e\x13\x62\xa3\x12\x04\x10\x01\x00\x00\x00\x0f" \ ... b"\x96\x54\xbb\x55\xd0\x6c\xcb\x00\x00\x00\x00") >>> >>> srvcontext, tok, negResult = server.GSS_Accept_sec_context(srvcontext, tok3) >>> assert negResult == 0 ###(024)=[passed] Real exchange - Check mechListMIC against token 4 from server >>> tok4 = GSSAPI_BLOB( ... b"\xa1\x1b\x30\x19\xa0\x03\x0a\x01\x00\xa3\x12\x04\x10\x01\x00\x00" \ ... b"\x00\xe3\x39\x61\x56\xbc\x42\x23\xdc\x00\x00\x00\x00") >>> >>> tok.show() ###[ SPNEGO_negToken ]### \token \ |###[ SPNEGO_negTokenResp ]### | negResult = 0 | supportedMech= None | responseToken= None | \mechListMIC\ | |###[ SPNEGO_MechListMIC ]### | | value = >>> tok4.show() ###[ SPNEGO_negToken ]### \token \ |###[ SPNEGO_negTokenResp ]### | negResult = 'accept-completed' 0x0 | supportedMech= None | responseToken= None | \mechListMIC\ | |###[ SPNEGO_MechListMIC ]### | | value = >>> assert tok.token.mechListMIC == tok4.token.mechListMIC ###(025)=[passed] MISC - Dissect legacy formed NTLM messages >>> data = b'NTLMSSP\x00\x01\x00\x00\x00\x05\x02\x88\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> pkt = NTLM_Header(data) >>> assert pkt.WorkstationNameLen == 0 >>> assert pkt.ProductMajorVersion is None >>> >>> pkt.clear_cache() >>> assert bytes(pkt) == data >>> >>> >>> >>> data = b'NTLMSSP\x00\x03\x00\x00\x00\x18\x00\x18\x00d\x00\x00\x00\xb6\x00\xb6\x00|\x00\x00\x00\x08\x00\x08\x00@\x00\x00\x00\x10\x00\x10\x00H\x00\x00\x00\x0c\x00\x0c\x00X\x00\x00\x00\x00\x00\x00\x002\x01\x00\x005\x82\x89\x00C\x00O\x00U\x00S\x00B\x00A\x00N\x00A\x00N\x00A\x00N\x00A\x00G\x00O\x00U\x00R\x00D\x00E\x00\x91\xe9\xa2\xd8\xefE\xcd!2\xe8r\xae\x17*\xbfq\xbe8\x0b4\x90\x98\x12\x00s\x9e\x9e\xdc\nj(q\x1f\x84\xf8\xd3\x90e\xa7\xb3\x01\x01\x00\x00\x00\x00\x00\x00\x80\x8ax\xeeXc\xda\x01\xbe8\x0b4\x90\x98\x12W\x00\x00\x00\x00\x01\x00\x06\x00S\x00R\x00V\x00\x02\x00\x0c\x00D\x00O\x00M\x00A\x00I\x00N\x00\x03\x00 \x00s\x00r\x00v\x00.\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\x04\x00\x18\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\x05\x00\x18\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\x07\x00\x08\x00\x90\xa8;}Qc\xda\x01\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> pkt = NTLM_Header(data) >>> assert pkt.Workstation == "GOURDE" >>> assert pkt.DomainName == "COUS" >>> assert pkt.UserName == "BANANANA" >>> >>> pkt.clear_cache() >>> assert bytes(pkt) == data NTP regression tests for Scapy ━ Run at 01:42:22 from [test/scapy/layers/ntp.uts] by UTscapy in 0.17897939682006836 └ Passed=74 └ Failed=0 ###### ## Basic tests ###### ###(000)=[passed] specific haslayer and getlayer implementations for NTP >>> pkt = IP() / UDP() / NTPHeader() >>> assert NTP in pkt >>> assert pkt.haslayer(NTP) >>> assert isinstance(pkt[NTP], NTPHeader) >>> assert isinstance(pkt.getlayer(NTP), NTPHeader) ###### ## NTP module tests ###### ###(001)=[passed] NTP - Layers (1) >>> p = NTPHeader() >>> assert NTPHeader in p >>> assert not NTPControl in p >>> assert not NTPPrivate in p >>> assert NTP in p >>> assert p.mysummary() == "NTP v4, client" >>> ls(p) leap : BitEnumField = 0 ('0') version : BitField (3 bits) = 4 ('4') mode : BitEnumField = 3 ('3') stratum : BitField (8 bits) = 2 ('2') poll : SignedByteField = 10 ('10') precision : SignedByteField = 0 ('0') delay : FixedPointField (32 bits) = Decimal('0') ('0') dispersion : FixedPointField (32 bits) = Decimal('0') ('0') id : IPField (Cond) = '127.0.0.1' ("'127.0.0.1'") ref_id : StrFixedLenEnumField (Cond) = None ("b''") ref : TimeStampField (64 bits) = Decimal('0') ('0') orig : TimeStampField (64 bits) = None ('None') recv : TimeStampField (64 bits) = Decimal('0') ('0') sent : TimeStampField (64 bits) = None ('None') >>> >>> p = NTPControl() >>> assert not NTPHeader in p >>> assert NTPControl in p >>> assert not NTPPrivate in p >>> assert NTP in p >>> assert p.mysummary() == "NTP v2, NTP control message" >>> ls(p) zeros : BitField (2 bits) = 0 ('0') version : BitField (3 bits) = 2 ('2') mode : BitEnumField = 6 ('6') response : BitField (1 bit) = 0 ('0') err : BitField (1 bit) = 0 ('0') more : BitField (1 bit) = 0 ('0') op_code : BitEnumField = 0 ('0') sequence : ShortField = 0 ('0') status_word : NTPControlStatusField (Cond) = None ("b''") status : ShortField (Cond) = 0 ('0') association_id : ShortField = 0 ('0') offset : ShortField = 0 ('0') count : ShortField = None ('None') data : MayEnd = b'' ("b''") authenticator : PacketField = b'' ("b''") >>> >>> p = NTPPrivate() >>> assert not NTPHeader in p >>> assert not NTPControl in p >>> assert NTPPrivate in p >>> assert NTP in p >>> assert p.mysummary() == "NTP v2, reserved for private use" >>> ls(p) response : BitField (1 bit) = 0 ('0') more : BitField (1 bit) = 0 ('0') version : BitField (3 bits) = 2 ('2') mode : BitEnumField = 7 ('7') auth : BitField (1 bit) = 0 ('0') seq : BitField (7 bits) = 0 ('0') implementation : ByteEnumField = 0 ('0') request_code : ByteEnumField = 0 ('0') err : BitEnumField = 0 ('0') nb_items : BitField (12 bits) = 0 ('0') mbz : BitField (4 bits) = 0 ('0') data_item_size : BitField (12 bits) = 0 ('0') req_data : NTPPrivateReqPacketListField (Cond) = [] ('[]') data : NTPPrivateRespPacketListField (Cond) = None ('[]') authenticator : PacketField (Cond) = None ("b''") ###(002)=[passed] NTP - Layers (2) >>> p = NTPHeader() >>> assert type(p[NTP]) == NTPHeader >>> p = NTPControl() >>> assert type(p[NTP]) == NTPControl >>> p = NTPPrivate() >>> assert type(p[NTP]) == NTPPrivate ###(003)=[passed] NTP - sessions (1) >>> p = IP()/TCP()/NTP() >>> l = PacketList(p) >>> s = l.sessions() # Crashed on commit: e42ecdc54556c4852ca06b1a6da6c1ccbf3f522e >>> assert len(s) == 1 ###(004)=[passed] NTP - sessions (2) >>> p = IP()/UDP()/NTP() >>> l = PacketList(p) >>> s = l.sessions() # Crashed on commit: e42ecdc54556c4852ca06b1a6da6c1ccbf3f522e >>> assert len(s) == 1 ###### ## NTPHeader tests ###### ###(005)=[passed] NTPHeader - Basic checks >>> len(raw(NTP())) == 48 True ###(006)=[passed] NTPHeader - Dissection >>> s = b"!\x0b\x06\xea\x00\x00\x00\x00\x00\x00\xf2\xc1\x7f\x7f\x01\x00\xdb9\xe8\xa21\x02\xe6\xbc\xdb9\xe8\x81\x02U8\xef\xdb9\xe8\x80\xdcl+\x06\xdb9\xe8\xa91\xcbI\xbf\x00\x00\x00\x01\xady\xf3\xa1\xe5\xfc\xd02\xd2j\x1e'\xc3\xc1\xb6\x0e" >>> p = NTP(s) >>> assert isinstance(p, NTPHeader) >>> assert p[NTPAuthenticator].key_id == 1 >>> assert bytes_hex(p[NTPAuthenticator].dgst) == b'ad79f3a1e5fcd032d26a1e27c3c1b60e' ###(007)=[passed] NTPHeader - High precision >>> pkt = NTP(b'#\x02\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xe3\xaaz\xf7\xb4\x07\xaa\xea\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x0f+\xe2X>\xb8\x00') >>> assert NTP(raw(NTP(orig=pkt.orig))).orig == pkt.orig >>> assert str(pkt.orig) == '3819600631.703241999' ###(008)=[passed] NTPHeader - KoD >>> s = b'\xe4\x00\x06\xe8\x00\x00\x00\x00\x00\x00\x02\xcaINIT\x00\x00\x00\x00\x00\x00\x00\x00\xdb@\xe3\x9eH\xa3pj\xdb@\xe3\x9eH\xf0\xc3\\\xdb@\xe3\x9eH\xfaL\xac\x00\x00\x00\x01B\x86)\xc1Q4\x8bW8\xe7Q\xda\xd0Z\xbc\xb8' >>> p = NTP(s) >>> assert isinstance(p, NTPHeader) >>> assert p.leap == 3 >>> assert p.version == 4 >>> assert p.mode == 4 >>> assert p.stratum == 0 >>> assert p.ref_id == b'INIT' ###(009)=[passed] NTPHeader - Extension dissection test >>> s = b'#\x02\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xdbM\xdf\x19e\x87\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdbM\xdf\x19e\x89\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPHeader) >>> assert p.leap == 0 >>> assert p.version == 4 >>> assert p.mode == 3 >>> assert p.stratum == 2 ###(010)=[passed] NTPAuthenticator >>> s = hex_bytes("000c2962f268d094666d23750800450000640db640004011a519c0a80364c0a80305a51e007b0050731a2300072000000000000000000000000000000000000000000000000000000000000000000000000052c7bc1dda64b97d0000000bcdc3825dbf6b7ad02886ff45aa8b2eaf7ac78bc1") >>> p = Ether(s) >>> assert NTPAuthenticator in p and p[NTPAuthenticator].key_id == 3452142173 ###### ## NTP Control (mode 6) tests ###### ###(011)=[passed] NTP Control (mode 6) - CTL_OP_READSTAT (1) - request >>> s = b'\x16\x01\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 0 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 1 >>> assert p.sequence == 12 >>> assert p.status == 0 >>> assert p.association_id == 0 >>> assert p.offset == 0 >>> assert p.count == 0 >>> assert p.data is None ###(012)=[passed] NTP Control (mode 6) - CTL_OP_READSTAT (2) - response >>> s = b'\x16\x81\x00\x0c\x06d\x00\x00\x00\x00\x00\x04\xe5\xfc\xf6$' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 1 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 1 >>> assert p.sequence == 12 >>> assert isinstance(p.status_word, NTPSystemStatusPacket) >>> assert p.status_word.leap_indicator == 0 >>> assert p.status_word.clock_source == 6 >>> assert p.status_word.system_event_counter == 6 >>> assert p.status_word.system_event_code == 4 >>> assert p.association_id == 0 >>> assert p.offset == 0 >>> assert p.count == 4 >>> assert isinstance(p.data, NTPPeerStatusDataPacket) >>> assert p.data.association_id == 58876 >>> assert isinstance(p.data.peer_status, NTPPeerStatusPacket) >>> assert p.data.peer_status.configured == 1 >>> assert p.data.peer_status.auth_enabled == 1 >>> assert p.data.peer_status.authentic == 1 >>> assert p.data.peer_status.reachability == 1 >>> assert p.data.peer_status.reserved == 0 >>> assert p.data.peer_status.peer_sel == 6 >>> assert p.data.peer_status.peer_event_counter == 2 >>> assert p.data.peer_status.peer_event_code == 4 ###(013)=[passed] NTP Control (mode 6) - CTL_OP_READVAR (1) - request >>> s = b'\x16\x02\x00\x12\x00\x00\xfc\x8f\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 0 >>> assert p.op_code == 2 >>> assert p.sequence == 18 >>> assert p.status == 0 >>> assert p.association_id == 64655 >>> assert p.data is None ###(014)=[passed] NTP Control (mode 6) - CTL_OP_READVAR (2) - response (1st packet) >>> s = b'\xd6\xa2\x00\x12\xc0\x11\xfc\x8f\x00\x00\x01\xd4srcadr=192.168.122.1, srcport=123, dstadr=192.168.122.100, dstport=123,\r\nleap=3, stratum=16, precision=-24, rootdelay=0.000, rootdisp=0.000,\r\nrefid=INIT, reftime=0x00000000.00000000, rec=0x00000000.00000000,\r\nreach=0x0, unreach=5, hmode=1, pmode=0, hpoll=6, ppoll=10, headway=62,\r\nflash=0x1200, keyid=1, offset=0.000, delay=0.000, dispersion=15937.500,\r\njitter=0.000, xleave=0.240,\r\nfiltdelay= 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00,\r\nfiltoffset= 0.00 0.00 0.00 0.00 ' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 1 >>> assert p.err == 0 >>> assert p.more == 1 >>> assert p.op_code == 2 >>> assert p.sequence == 18 >>> assert isinstance(p.status_word, NTPPeerStatusPacket) >>> assert p.status_word.configured == 1 >>> assert p.status_word.auth_enabled == 1 >>> assert p.status_word.authentic == 0 >>> assert p.status_word.reachability == 0 >>> assert p.status_word.peer_sel == 0 >>> assert p.status_word.peer_event_counter == 1 >>> assert p.status_word.peer_event_code == 1 >>> assert p.association_id == 64655 >>> assert p.offset == 0 >>> assert p.count == 468 >>> assert p.data.load == b'srcadr=192.168.122.1, srcport=123, dstadr=192.168.122.100, dstport=123,\r\nleap=3, stratum=16, precision=-24, rootdelay=0.000, rootdisp=0.000,\r\nrefid=INIT, reftime=0x00000000.00000000, rec=0x00000000.00000000,\r\nreach=0x0, unreach=5, hmode=1, pmode=0, hpoll=6, ppoll=10, headway=62,\r\nflash=0x1200, keyid=1, offset=0.000, delay=0.000, dispersion=15937.500,\r\njitter=0.000, xleave=0.240,\r\nfiltdelay= 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00,\r\nfiltoffset= 0.00 0.00 0.00 0.00 ' ###(015)=[passed] NTP Control (mode 6) - CTL_OP_READVAR (3) - response (2nd packet) >>> s = b'\xd6\x82\x00\x12\xc0\x11\xfc\x8f\x01\xd4\x00i0.00 0.00 0.00 0.00,\r\nfiltdisp= 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00\r\n\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 1 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 2 >>> assert p.sequence == 18 >>> assert isinstance(p.status_word, NTPPeerStatusPacket) >>> assert p.association_id == 64655 >>> assert p.offset == 468 >>> assert p.count == 105 >>> assert p.data.load == b'0.00 0.00 0.00 0.00,\r\nfiltdisp= 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00 16000.00\r\n\x00\x00\x00' ###(016)=[passed] NTP Control (mode 6) - CTL_OP_READVAR (4) - request >>> s = b'\x16\x02\x00\x13\x00\x00s\xb5\x00\x00\x00\x0btest1,test2\x00\x00\x00\x00\x01=\xc2;\xc7\xed\xb9US9\xd6\x89\x08\xc8\xaf\xa6\x12' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 0 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 2 >>> assert len(p.data.load) == 12 >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'3dc23bc7edb9555339d68908c8afa612' ###(017)=[passed] NTP Control (mode 6) - CTL_OP_READVAR (5) - response >>> s = b'\xd6\xc2\x00\x13\x05\x00s\xb5\x00\x00\x00\x00\x00\x00\x00\x01\x97(\x02I\xdb\xa0s8\xedr(`\xdbJX\n' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 1 >>> assert p.err == 1 >>> assert p.more == 0 >>> assert p.op_code == 2 >>> assert not p.data >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'97280249dba07338ed722860db4a580a' ###(018)=[passed] NTP Control (mode 6) - CTL_OP_WRITEVAR (1) - request >>> s = b'\x16\x03\x00\x11\x00\x00\x00\x00\x00\x00\x00\x0btest1,test2\x00\x00\x00\x00\x01\xaf\xf1\x0c\xb4\xc9\x94m\xfcM\x90\tJ\xa1p\x94J' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 0 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 3 >>> assert len(p.data.load) == 12 >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'aff10cb4c9946dfc4d90094aa170944a' ###(019)=[passed] NTP Control (mode 6) - CTL_OP_WRITEVAR (2) - response >>> s = b'\xd6\xc3\x00\x11\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x80z\x80\xfb\xaf\xc4pg\x98S\xa8\xe5xe\x81\x1c' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 1 >>> assert p.err == 1 >>> assert p.more == 0 >>> assert p.op_code == 3 >>> assert hasattr(p, 'status_word') >>> assert isinstance(p.status_word, NTPErrorStatusPacket) >>> assert p.status_word.error_code == 5 >>> assert not p.data >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'807a80fbafc470679853a8e57865811c' ###(020)=[passed] NTP Control (mode 6) - CTL_OP_CONFIGURE (1) - request >>> s = b'\x16\x08\x00\x16\x00\x00\x00\x00\x00\x00\x00\x0ccontrolkey 1\x00\x00\x00\x01\xea\xa7\xac\xa8\x1bj\x9c\xdbX\xe1S\r6\xfb\xef\xa4' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 0 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 8 >>> assert p.count == 12 >>> assert p.data.load == b'controlkey 1' >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'eaa7aca81b6a9cdb58e1530d36fbefa4' ###(021)=[passed] NTP Control (mode 6) - CTL_OP_CONFIGURE (2) - response >>> s = b'\xd6\x88\x00\x16\x00\x00\x00\x00\x00\x00\x00\x12Config Succeeded\r\n\x00\x00\x00\x00\x00\x01\xbf\xa6\xd8_\xf9m\x1e2l)<\xac\xee\xc2\xa59' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 1 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 8 >>> assert p.count == 18 >>> assert p.data.load == b'Config Succeeded\r\n\x00\x00' >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'bfa6d85ff96d1e326c293caceec2a539' ###(022)=[passed] NTP Control (mode 6) - CTL_OP_SAVECONFIG (1) - request >>> s = b'\x16\t\x00\x1d\x00\x00\x00\x00\x00\x00\x00\x0fntp.test.2.conf\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc9\xfb\x8a\xbe<`_\xfa6\xd2\x18\xc3\xb7d\x89#' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 0 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 9 >>> assert p.count == 15 >>> assert p.data.load == b'ntp.test.2.conf\x00' >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'c9fb8abe3c605ffa36d218c3b7648923' ###(023)=[passed] NTP Control (mode 6) - CTL_OP_SAVECONFIG (2) - response >>> s = b"\xd6\x89\x00\x1d\x00\x00\x00\x00\x00\x00\x00*Configuration saved to 'ntp.test.2.conf'\r\n\x00\x00\x00\x00\x00\x012\xc2\xbaY\xc53\xfe(\xf5P\xe5\xa0\x86\x02\x95\xd9" >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 1 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 9 >>> assert p.count == 42 >>> assert p.data.load == b"Configuration saved to 'ntp.test.2.conf'\r\n\x00\x00" >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'32c2ba59c533fe28f550e5a0860295d9' ###(024)=[passed] NTP Control (mode 6) - CTL_OP_REQ_NONCE (1) - request >>> s = b'\x16\x0c\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 0 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 12 >>> assert p.data is None >>> assert not p.authenticator ###(025)=[passed] NTP Control (mode 6) - CTL_OP_REQ_NONCE (2) - response >>> s = b'\xd6\x8c\x00\x07\x00\x00\x00\x00\x00\x00\x00 nonce=db4186a2e1d9022472e24bc9\r\n' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 1 >>> assert p.err == 0 >>> assert p.more == 0 >>> assert p.op_code == 12 >>> assert p.data.load == b'nonce=db4186a2e1d9022472e24bc9\r\n' >>> assert not p.authenticator ###(026)=[passed] NTP Control (mode 6) - CTL_OP_READ_MRU (1) - request >>> s = b'\x16\n\x00\x08\x00\x00\x00\x00\x00\x00\x00(nonce=db4186a2e1d9022472e24bc9, frags=32' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 0 >>> assert p.err == 0 >>> assert p.op_code == 10 >>> assert p.count == 40 >>> assert p.data.load == b'nonce=db4186a2e1d9022472e24bc9, frags=32' >>> assert not p.authenticator ###(027)=[passed] NTP Control (mode 6) - CTL_OP_READ_MRU (2) - response >>> s = b'\xd6\x8a\x00\x08\x00\x00\x00\x00\x00\x00\x00\xe9nonce=db4186a2e2073198b93c6419, addr.0=192.168.122.100:123,\r\nfirst.0=0xdb418673.323e1a89, last.0=0xdb418673.323e1a89, ct.0=1,\r\nmv.0=36, rs.0=0x0, WWQ.0=18446744073709509383, now=0xdb4186a2.e20ff8f4,\r\nlast.newest=0xdb418673.323e1a89\r\n\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPControl) >>> assert p.version == 2 >>> assert p.mode == 6 >>> assert p.response == 1 >>> assert p.err == 0 >>> assert p.op_code == 10 >>> assert p.count == 233 >>> assert p.data.load == b'nonce=db4186a2e2073198b93c6419, addr.0=192.168.122.100:123,\r\nfirst.0=0xdb418673.323e1a89, last.0=0xdb418673.323e1a89, ct.0=1,\r\nmv.0=36, rs.0=0x0, WWQ.0=18446744073709509383, now=0xdb4186a2.e20ff8f4,\r\nlast.newest=0xdb418673.323e1a89\r\n\x00\x00\x00' >>> assert not p.authenticator ###### ## NTP Private (mode 7) tests ###### ###(028)=[passed] NTP Private (mode 7) - error - Dissection >>> s = b'\x97\x00\x03\x1d@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 29 >>> assert p.err == 4 >>> assert p.nb_items == 0 >>> assert p.data_item_size == 0 ###(029)=[passed] NTP Private (mode 7) - REQ_PEER_LIST (1) - request >>> s = b'\x17\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 0 >>> assert p.nb_items == 0 >>> assert p.data_item_size == 0 ###(030)=[passed] NTP Private (mode 7) - REQ_PEER_LIST (2) - response >>> s = b'\x97\x00\x03\x00\x00\x01\x00 \x7f\x7f\x01\x00\x00{\x03\x83\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 0 >>> assert p.nb_items == 1 >>> assert p.data_item_size == 32 >>> assert type(p.data[0]) == NTPInfoPeerList >>> assert p.data[0].addr == "127.127.1.0" >>> assert p.data[0].port == 123 ###(031)=[passed] NTP Private (mode 7) - REQ_PEER_INFO (1) - request >>> s = b'\x17\x00\x03\x02\x00\x01\x00 \xc0\xa8zf\x00{\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 2 >>> assert p.nb_items == 1 >>> assert p.data_item_size == 32 >>> assert isinstance(p.req_data[0], NTPInfoPeerList) >>> assert p.req_data[0].addr == "192.168.122.102" >>> assert p.req_data[0].port == 123 ###(032)=[passed] NTP Private (mode 7) - REQ_PEER_INFO (2) - response >>> s = b'\x97\x00\x03\x02\x00\x01\x01\x18\xc0\xa8zf\xc0\xa8ze\x00{\x01\x03\x01\x00\x10\x06\n\xea\x04\x00\x00\xaf"\x00"\x16\x04\xb3\x01\x00\x00\x00\x00\x00\x00\x00INIT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x82\x9d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb<\x8d\xc5\xde\x7fB\x89\xdb<\x8d\xc5\xde\x7fB\x89\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 2 >>> assert isinstance(p.data[0], NTPInfoPeer) >>> repr(p.data[0]) '\x1b[0m<\x1b[0m\x1b[31m\x1b[1mNTPInfoPeer\x1b[0m \x1b[34mdstaddr\x1b[0m\x1b[0m=\x1b[0m\x1b[35m192.168.122.102\x1b[0m \x1b[34msrcaddr\x1b[0m\x1b[0m=\x1b[0m\x1b[35m192.168.122.101\x1b[0m \x1b[34msrcport\x1b[0m\x1b[0m=\x1b[0m\x1b[35m123\x1b[0m \x1b[34mflags\x1b[0m\x1b[0m=\x1b[0m\x1b[35mINFO_FLAG_CONFIG\x1b[0m \x1b[34mleap\x1b[0m\x1b[0m=\x1b[0m\x1b[35m3\x1b[0m \x1b[34mhmode\x1b[0m\x1b[0m=\x1b[0m\x1b[35msymmetric active\x1b[0m \x1b[34mpmode\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mstratum\x1b[0m\x1b[0m=\x1b[0m\x1b[35m16\x1b[0m \x1b[34mppoll\x1b[0m\x1b[0m=\x1b[0m\x1b[35m6\x1b[0m \x1b[34mhpoll\x1b[0m\x1b[0m=\x1b[0m\x1b[35m10\x1b[0m \x1b[34mprecision\x1b[0m\x1b[0m=\x1b[0m\x1b[35m-22\x1b[0m \x1b[34mversion\x1b[0m\x1b[0m=\x1b[0m\x1b[35m4\x1b[0m \x1b[34munused8\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mreach\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34munreach\x1b[0m\x1b[0m=\x1b[0m\x1b[35m175\x1b[0m \x1b[34mflash\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0x22\x1b[0m \x1b[34mttl\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mflash2\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0x1622\x1b[0m \x1b[34massocid\x1b[0m\x1b[0m=\x1b[0m\x1b[35m1203\x1b[0m \x1b[34mkeyid\x1b[0m\x1b[0m=\x1b[0m\x1b[35m1\x1b[0m \x1b[34mpkeyid\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mrefid\x1b[0m\x1b[0m=\x1b[0m\x1b[35m73.78.73.84\x1b[0m \x1b[34mtimer\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mrootdelay\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mrootdispersion\x1b[0m\x1b[0m=\x1b[0m\x1b[35m1.5102\x1b[0m \x1b[34mreftime\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34morg\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mrec\x1b[0m\x1b[0m=\x1b[0m\x1b[35mFri, 22 Jul 2016 12:19:17 +0000\x1b[0m \x1b[34mxmt\x1b[0m\x1b[0m=\x1b[0m\x1b[35mFri, 22 Jul 2016 12:19:17 +0000\x1b[0m \x1b[34mfiltdelay\x1b[0m\x1b[0m=\x1b[0m\x1b[35m[0, 0, 0, 0, 0, 0, 0, 0]\x1b[0m \x1b[34mfiltoffset\x1b[0m\x1b[0m=\x1b[0m\x1b[35m[0, 0, 0, 0, 0, 0, 0, 0]\x1b[0m \x1b[34morder\x1b[0m\x1b[0m=\x1b[0m\x1b[35m[0, 1, 2, 3, 4, 5, 6, 7]\x1b[0m \x1b[34mdelay\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mdispersion\x1b[0m\x1b[0m=\x1b[0m\x1b[35m3.9922\x1b[0m \x1b[34moffset\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mselectdisp\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34munused1\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34munused2\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34munused3\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34munused4\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34munused5\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34munused6\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34munused7\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mestbdelay\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mv6_flag\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34munused9\x1b[0m\x1b[0m=\x1b[0m\x1b[35m0\x1b[0m \x1b[34mdstaddr6\x1b[0m\x1b[0m=\x1b[0m\x1b[35m::\x1b[0m \x1b[34msrcaddr6\x1b[0m\x1b[0m=\x1b[0m\x1b[35m::\x1b[0m \x1b[0m|\x1b[0m\x1b[0m>\x1b[0m' >>> assert p.data[0].dstaddr == "192.168.122.102" >>> assert p.data[0].srcaddr == "192.168.122.101" >>> assert p.data[0].srcport == 123 >>> assert p.data[0].associd == 1203 >>> assert p.data[0].keyid == 1 ###(033)=[passed] NTP Private (mode 7) - REQ_PEER_LIST_SUM (1) - request >>> s = b'\x17\x00\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 1 ###(034)=[passed] NTP Private (mode 7) - REQ_PEER_LIST_SUM (2) - response (1st packet) >>> s = b'\xd7\x00\x03\x01\x00\x06\x00H\n\x00\x02\x0f\xc0\x00\x02\x01\x00{\x10\x06\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\x0f\xc0\x00\x02\x02\x00{\x10\x06\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x01\x02\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\x0f\xc0\xa8d\x01\x00{\x10\x07\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth0\xc0\xa8zg\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\x0f\xc0\xa8d\x02\x00{\x10\x07\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x02\xc0\xa8zh\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\n\x00\x02\x0f\xc0\xa8d\r\x00{\x10\x07\n\x00\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8zk\x00{\x01\x01\xc0\xa8ze\xc0\xa8zf\x00{\x0b\x06\x07\xf4\x83\x01\x00\x00\x07\x89\x00\x00\x00\x007\xb1\x00h\x00\x00o?\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8zm\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 1 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 1 >>> assert (isinstance(x, NTPInfoPeerSummary) for x in p.data) >>> assert p.data[0].srcaddr == "192.0.2.1" ###(035)=[passed] NTP Private (mode 7) - REQ_PEER_LIST_SUM (3) - response (2nd packet) >>> s = b'\xd7\x01\x03\x01\x00\x06\x00H\xc0\xa8ze\xc0\xa8zg\x00{\x10\x08\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zg\x00{\x10\x08\n\x00\x11\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x01\x02\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zh\x00{\x10\x08\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth0\xc0\xa8zg\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zi\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x02\xc0\xa8zh\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xc0\xa8ze\xc0\xa8zj\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8zk\x00{\x01\x01\xc0\xa8ze\xc0\xa8zk\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8zm\x00{\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 1 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 1 >>> assert (isinstance(x, NTPInfoPeerSummary) for x in p.data) >>> assert p.data[0].srcaddr == "192.168.122.103" ###(036)=[passed] NTP Private (mode 7) - REQ_PEER_LIST_SUM (3) - response (3rd packet) >>> s = b'\x97\x02\x03\x01\x00\x02\x00H\xc0\xa8ze\xc0\xa8zl\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8ze\xc0\xa8zm\x00{\x10\x07\n\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xfd\xff\x00\x00\x00\x00\x00\x00\x01\x02\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 1 >>> assert (isinstance(x, NTPInfoPeerSummary) for x in p.data) >>> assert p.data[0].srcaddr == "192.168.122.108" ###(037)=[passed] NTP Private (mode 7) - REQ_PEER_STATS (1) - request >>> s = b'\x17\x00\x03\x03\x00\x01\x00 \xc0\xa8ze\x00{\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 3 >>> assert isinstance(p.req_data[0], NTPInfoPeerList) ###(038)=[passed] NTP Private (mode 7) - REQ_PEER_STATS (2) - response >>> s = b'\x97\x00\x03\x03\x00\x01\x00x\xc0\xa8zf\xc0\xa8ze\x00{\x00\x01\x01\x00\x10\x06\x00\x00\x00)\x00\x00\x00\x1e\x00\x02\xda|\x00\x00\x00\xbc\x00\x00\x00\x00\x00\x00\x0b\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\nJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x07\x00\x00\x00\x00\xde\x7fB\x89\x00<\x8d\xc5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 3 >>> assert (isinstance(x, NTPInfoPeerStats) for x in p.data) ###(039)=[passed] NTP Private (mode 7) - REQ_SYS_INFO (1) - request >>> s = b'\x17\x00\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 4 ###(040)=[passed] NTP Private (mode 7) - REQ_SYS_INFO (2) - response >>> s = b'\x97\x00\x03\x04\x00\x01\x00P\x7f\x7f\x01\x00\x03\x00\x0b\xf0\x00\x00\x00\x00\x00\x00\x03\x06\x7f\x7f\x01\x00\xdb<\xca\xf3\xa1\x92\xe1\xf7\x06\x00\x00\x00\xce\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x07\x00\x00\x00\x00\xde\x7fB\x89\x00<\x8d\xc5' >>> p = NTP(s) >>> >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 4 >>> assert isinstance(p.data[0], NTPInfoSys) >>> assert p.data[0].peer == "127.127.1.0" >>> assert p.data[0].peer_mode == 3 >>> assert p.data[0].leap == 0 >>> assert p.data[0].stratum == 11 >>> assert p.data[0].precision == -16 >>> assert p.data[0].refid == "127.127.1.0" ###(041)=[passed] NTP Private (mode 7) - REQ_SYS_STATS (1) - request >>> s = b'\x17\x00\x03\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 5 ###(042)=[passed] NTP Private (mode 7) - REQ_SYS_STATS (2) - response >>> s = b'\x97\x00\x03\x05\x00\x01\x00,\x00\x02\xe2;\x00\x02\xe2;\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b%\x00\x00\x00\x00\x00\x00\x0b=\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 5 >>> assert isinstance(p.data[0], NTPInfoSysStats) >>> assert p.data[0].timeup == 188987 >>> assert p.data[0].received == 2877 ###(043)=[passed] NTP Private (mode 7) - REQ_IO_STATS (1) - request >>> s = b'\x17\x00\x03\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 6 ###(044)=[passed] NTP Private (mode 7) - REQ_IO_STATS (2) - response >>> s = b'\x97\x00\x03\x06\x00\x01\x00(\x00\x00\x03\x04\x00\n\x00\t\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00J\x00\x00\x00\xd9\x00\x00\x00\x00\x00\x00\x00J\x00\x00\x00J' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 6 >>> assert p.data[0].timereset == 772 >>> assert p.data[0].sent == 217 ###(045)=[passed] NTP Private (mode 7) - REQ_MEM_STATS (1) - request >>> s = b'\x17\x00\x03\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 7 ###(046)=[passed] NTP Private (mode 7) - REQ_MEM_STATS (2) - response >>> s = b'\x97\x00\x03\x07\x00\x01\x00\x94\x00\x00\n\xee\x00\x0f\x00\r\x00\x00\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 7 >>> assert p.data[0].timereset == 2798 >>> assert p.data[0].totalpeermem == 15 >>> assert p.data[0].freepeermem == 13 >>> assert p.data[0].findpeer_calls == 60 >>> assert p.data[0].hashcount[25] == 1 and p.data[0].hashcount[89] == 1 ###(047)=[passed] NTP Private (mode 7) - REQ_LOOP_INFO (1) - request >>> s = b'\x17\x00\x03\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 8 ###(048)=[passed] NTP Private (mode 7) - REQ_LOOP_INFO (2) - response >>> s = b'\x97\x00\x03\x08\x00\x01\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x04' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 8 >>> assert p.data[0].last_offset == 0.0 >>> assert p.data[0].watchdog_timer == 4 ###(049)=[passed] NTP Private (mode 7) - REQ_TIMER_STATS (1) - request >>> s = b'\x17\x00\x03\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 9 ###(050)=[passed] NTP Private (mode 7) - REQ_TIMER_STATS (2) - response >>> s = b'\x97\x00\x03\t\x00\x01\x00\x10\x00\x00\x01h\x00\x00\x01h\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 9 >>> assert p.data[0].timereset == 360 >>> assert p.data[0].alarms == 360 ###(051)=[passed] NTP Private (mode 7) - REQ_CONFIG (1) - request >>> s = b'\x17\x80\x03\n\x00\x01\x00\xa8\xc0\xa8zm\x01\x03\x06\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xec\x93\xb1\xa8\xa0a\x00\x00\x00\x01Z\xba\xfe\x01\x1cr\x05d\xa1\x14\xb1)\xe9vD\x8d' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 10 >>> assert p.nb_items == 1 >>> assert p.data_item_size == 168 >>> assert hasattr(p, 'req_data') >>> assert isinstance(p.req_data[0], NTPConfPeer) >>> assert p.req_data[0].peeraddr == "192.168.122.109" >>> assert p.req_data[0].hmode == 1 >>> assert p.req_data[0].version == 3 >>> assert p.req_data[0].minpoll == 6 >>> assert p.req_data[0].maxpoll == 10 >>> assert hasattr(p, 'authenticator') >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'5abafe011c720564a114b129e976448d' ###(052)=[passed] NTP Private (mode 7) - REQ_CONFIG (2) - response >>> s = b'\x97\x00\x03\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 10 >>> assert p.err == 0 >>> assert p.nb_items == 0 >>> assert p.data_item_size == 0 ###(053)=[passed] NTP Private (mode 7) - REQ_UNCONFIG (1) - request >>> s = b'\x17\x80\x03\x0b\x00\x01\x00\x18\xc0\xa8zk\x00\x00\x00\x00X\x88P\xb1\xff\x7f\x00\x008\x88P\xb1\xff\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xf0\x1bq\xc8\xe5\xa6\x00\x00\x00\x01\x1dM;\xfeZ~]Z\xe3Ea\x92\x9aE\xd8%' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 11 >>> assert p.nb_items == 1 >>> assert p.data_item_size == 24 >>> assert hasattr(p, 'req_data') >>> assert isinstance(p.req_data[0], NTPConfUnpeer) >>> assert p.req_data[0].peeraddr == "192.168.122.107" >>> assert p.req_data[0].v6_flag == 0 >>> assert hasattr(p, 'authenticator') >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'1d4d3bfe5a7e5d5ae34561929a45d825' ###(054)=[passed] NTP Private (mode 7) - REQ_UNCONFIG (2) - response >>> s = b'\x97\x00\x03\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 11 >>> assert p.err == 0 >>> assert p.nb_items == 0 >>> assert p.data_item_size == 0 ###(055)=[passed] NTP Private (mode 7) - REQ_RESADDFLAGS (1) - request >>> s = b'\x17\x80\x03\x11\x00\x01\x000\xc0\xa8zi\xff\xff\xff\xff\x04\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xf0V\xa9"\xe6_\x00\x00\x00\x01>=\xb70Tp\xee\xae\xe1\xad4b\xef\xe3\x80\xc8' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 17 >>> assert p.nb_items == 1 >>> assert p.data_item_size == 48 >>> assert hasattr(p, 'req_data') >>> assert isinstance(p.req_data[0], NTPConfRestrict) >>> assert p.req_data[0].addr == "192.168.122.105" >>> assert p.req_data[0].mask == "255.255.255.255" >>> assert hasattr(p, 'authenticator') >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'3e3db7305470eeaee1ad3462efe380c8' ###(056)=[passed] NTP Private (mode 7) - REQ_RESSUBFLAGS (1) - request >>> s = b'\x17\x80\x03\x12\x00\x01\x000\xc0\xa8zi\xff\xff\xff\xff\x00\x10\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xf0F\xe0C\xa9@\x00\x00\x00\x01>e\r\xdf\xdb\x1e1h\xd0\xca)L\x07k\x90\n' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 18 >>> assert p.nb_items == 1 >>> assert p.data_item_size == 48 >>> assert hasattr(p, 'req_data') >>> assert isinstance(p.req_data[0], NTPConfRestrict) >>> assert p.req_data[0].addr == "192.168.122.105" >>> assert p.req_data[0].mask == "255.255.255.255" >>> assert hasattr(p, 'authenticator') >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'3e650ddfdb1e3168d0ca294c076b900a' ###(057)=[passed] NTP Private (mode 7) - REQ_RESET_PEER (1) - request >>> s = b"\x17\x80\x03\x16\x00\x01\x00\x18\xc0\xa8zf\x00\x00\x00\x00X\x88P\xb1\xff\x7f\x00\x008\x88P\xb1\xff\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xef!\x99\x88\xa3\xf1\x00\x00\x00\x01\xb1\xff\xe8\xefB=\xa9\x96\xdc\xe3\x13'\xb3\xfc\xc2\xf5" >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 22 >>> assert p.nb_items == 1 >>> assert p.data_item_size == 24 >>> assert hasattr(p, 'req_data') >>> assert isinstance(p.req_data[0], NTPConfUnpeer) >>> assert p.req_data[0].peeraddr == "192.168.122.102" >>> assert p.req_data[0].v6_flag == 0 ###(058)=[passed] NTP Private (mode 7) - REQ_AUTHINFO (1) - response >>> s = b'\x97\x00\x03\x1c\x00\x01\x00$\x00\x00\x01\xdd\x00\x00\x00\x02\x00\x00\x00\n\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00/\x00\x00\x00\x00\x00\x00\x00\x01' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 28 >>> assert p.err == 0 >>> assert p.nb_items == 1 >>> assert p.data_item_size == 36 >>> assert hasattr(p, 'data') >>> assert isinstance(p.data[0], NTPInfoAuth) >>> assert p.data[0].timereset == 477 >>> assert p.data[0].numkeys == 2 >>> assert p.data[0].numfreekeys == 10 >>> assert p.data[0].keylookups == 96 >>> assert p.data[0].keynotfound == 0 >>> assert p.data[0].encryptions == 9 >>> assert p.data[0].decryptions == 47 >>> assert p.data[0].expired == 0 >>> assert p.data[0].keyuncached == 1 ###(059)=[passed] NTP Private (mode 7) - REQ_ADD_TRAP (1) - request >>> s = b'\x17\x80\x03\x1e\x00\x01\x000\x00\x00\x00\x00\xc0\x00\x02\x03H\x0f\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xedB\xdd\xda\x7f\x97\x00\x00\x00\x01b$\xb8IM.\xa61\xd0\x85I\x8f\xa7\'\x89\x92' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 1 >>> assert p.request_code == 30 >>> assert p.err == 0 >>> assert p.nb_items == 1 >>> assert hasattr(p, 'req_data') >>> assert isinstance(p.req_data[0], NTPConfTrap) >>> assert p.req_data[0].trap_address == '192.0.2.3' >>> assert hasattr(p, 'authenticator') >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'6224b8494d2ea631d085498fa7278992' ###(060)=[passed] NTP Private (mode 7) - REQ_ADD_TRAP (2) - response >>> s = b'\x97\x00\x03\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 30 >>> assert p.err == 0 >>> assert p.nb_items == 0 >>> assert p.data_item_size == 0 ###(061)=[passed] NTP Private (mode 7) - REQ_CLR_TRAP (1) - request >>> s = b'\x17\x80\x03\x1f\x00\x01\x000\x00\x00\x00\x00\xc0\x00\x02\x03H\x0f\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xedb\xb3\x18\x1c\x00\x00\x00\x00\x01\xa5_V\x9e\xb8qD\x92\x1b\x1c>Z\xad]*\x89' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 1 >>> assert p.request_code == 31 >>> assert p.err == 0 >>> assert p.nb_items == 1 >>> assert hasattr(p, 'req_data') >>> assert isinstance(p.req_data[0], NTPConfTrap) >>> assert p.req_data[0].trap_address == '192.0.2.3' >>> assert hasattr(p, 'authenticator') >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'a55f569eb87144921b1c3e5aad5d2a89' ###(062)=[passed] NTP Private (mode 7) - REQ_CLR_TRAP (2) - response >>> s = b'\x97\x00\x03\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 31 >>> assert p.err == 0 >>> assert p.nb_items == 0 >>> assert p.data_item_size == 0 ###(063)=[passed] NTP Private (mode 7) - REQ_GET_CTLSTATS - response >>> s = b'\x97\x00\x03"\x00\x01\x00<\x00\x00\x00\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 34 >>> assert p.nb_items == 1 >>> assert p.data_item_size == 60 >>> assert type(p.data[0]) == NTPInfoControl >>> assert p.data[0].ctltimereset == 237 ###(064)=[passed] NTP Private (mode 7) - REQ_GET_KERNEL (1) - request >>> s = b'\x17\x00\x03&\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 38 >>> assert p.nb_items == 0 >>> assert p.data_item_size == 0 ###(065)=[passed] NTP Private (mode 7) - REQ_GET_KERNEL (2) - response >>> s = b'\x97\x00\x03&\x00\x01\x00<\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf4$\x00\x00\xf4$\x00 A\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 38 >>> assert p.nb_items == 1 >>> assert p.data_item_size == 60 >>> assert isinstance(p.data[0], NTPInfoKernel) >>> assert p.data[0].maxerror == 16000000 >>> assert p.data[0].esterror == 16000000 >>> assert p.data[0].status == 8257 >>> assert p.data[0].constant == 3 >>> assert p.data[0].precision == 1 >>> assert p.data[0].tolerance == 32768000 ###(066)=[passed] NTP Private (mode 7) - REQ_MON_GETLIST_1 (1) - request >>> s = b'\x17\x00\x03*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 42 >>> assert p.nb_items == 0 >>> assert p.data_item_size == 0 ###(067)=[passed] NTP Private (mode 7) - REQ_MON_GETLIST_1 (2) - response >>> s = b'\xd7\x00\x03*\x00\x06\x00H\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\x94mw\xe9\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\x13\xb6\xa9J\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xbb]\x81\xea\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xfc\xbf\xd5a\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xbe\x10x\xa8\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x00\x00;\x00\x00\x01\xd0\x00\x00\x00\x01\xde[ng\xc0\xa8zg\x00\x00\x00\x01\x00{\x03\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 1 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.request_code == 42 >>> assert p.nb_items == 6 >>> assert p.data_item_size == 72 ###(068)=[passed] NTP Private (mode 7) - REQ_IF_STATS (1) - request >>> s = b'\x17\x80\x03,\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xeb\xdd\x8cH\xefe\x00\x00\x00\x01\x8b\xfb\x90u\xa8ad\xe8\x87\xca\xbf\x96\xd2\x9d\xddI' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 1 >>> assert p.request_code == 44 >>> assert p.nb_items == 0 >>> assert p.data_item_size == 0 >>> assert hasattr(p, 'authenticator') >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'8bfb9075a86164e887cabf96d29ddd49' ###(069)=[passed] NTP Private (mode 7) - REQ_IF_STATS (2) - response >>> s = b"\xd7\x00\x03,\x00\x03\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x01lo\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\n\x00'\xff\xfe\xe3\x81r\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\n\x00'\xff\xfe\xa0\x1d\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x03\x00\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\x00\x00\n\x00\x01\x00\x00\x00\x00" >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 1 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 44 >>> assert p.err == 0 >>> assert p.nb_items == 3 >>> assert p.data_item_size == 136 >>> assert isinstance(p.data[0], NTPInfoIfStatsIPv6) >>> assert p.data[0].unaddr == "::1" >>> assert p.data[0].unmask == "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" >>> assert p.data[0].ifname.startswith(b"lo") ###(070)=[passed] NTP Private (mode 7) - REQ_IF_STATS (3) - response >>> s = b'\xd7\x01\x03,\x00\x03\x00\x88\xc0\xa8ze\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8z\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x02\x00\x02\x00\x01\x00\x00\x00\x00\n\x00\x02\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00lo\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 1 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 44 >>> assert p.err == 0 >>> assert p.nb_items == 3 >>> assert p.data_item_size == 136 >>> assert isinstance(p.data[0], NTPInfoIfStatsIPv4) >>> assert p.data[0].unaddr == "192.168.122.101" >>> assert p.data[0].unmask == "255.255.255.0" >>> assert p.data[0].ifname.startswith(b"eth1") ###(071)=[passed] NTP Private (mode 7) - REQ_IF_RELOAD (1) - request >>> s = b'\x17\x80\x03-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xdb9\xed\xa3\xdc\x7f\xc6\x11\x00\x00\x00\x01\xfb>\x96*\xe7O\xf7\x8feh\xd4\x07L\xc0\x08\xcb' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 0 >>> assert p.more == 0 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 1 >>> assert p.request_code == 45 >>> assert p.nb_items == 0 >>> assert p.data_item_size == 0 >>> assert hasattr(p, 'authenticator') >>> assert p.authenticator.key_id == 1 >>> assert bytes_hex(p.authenticator.dgst) == b'fb3e962ae74ff78f6568d4074cc008cb' ###(072)=[passed] NTP Private (mode 7) - REQ_IF_RELOAD (2) - response >>> s = b'\xd7\x00\x03-\x00\x03\x00\x88\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00lo\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\n\x00\x02\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x02\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x05\x00\x02\x00\x01\x00\x00\x00\x00\xc0\xa8ze\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8z\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00eth1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00=\x00\x00\x00}\x00\x00\x00\x00\x00\x00\x01\xf4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\t\x00\x02\x00\x01\x00\x00\x00\x00' >>> p = NTP(s) >>> assert isinstance(p, NTPPrivate) >>> assert p.response == 1 >>> assert p.more == 1 >>> assert p.version == 2 >>> assert p.mode == 7 >>> assert p.auth == 0 >>> assert p.request_code == 45 >>> assert p.err == 0 >>> assert p.nb_items == 3 >>> assert p.data_item_size == 136 >>> assert isinstance(p.data[0], NTPInfoIfStatsIPv4) >>> assert p.data[0].unaddr == "127.0.0.1" >>> assert p.data[0].unmask == "255.0.0.0" >>> assert p.data[0].ifname.startswith(b"lo") ###### ## RawVal tests ###### ###(073)=[passed] Build an NTP packet using RawVal >>> from decimal import Decimal >>> >>> precision = b"\xec" # -20 >>> dispersion = b"\x00\x00\xf2\xce" # 0.948455810546875 >>> time_stamp = b"\xe6}gt\x00\x00\x00\x00" # Sat, 16 Jul 2022 16:36:04 +0000 >>> >>> pkt_1 = NTP( ... precision=RawVal(precision), ... dispersion=RawVal(dispersion), ... orig=RawVal(time_stamp), ... sent=RawVal(time_stamp), ... ) >>> >>> pkt_1.recv = RawVal(time_stamp) >>> >>> assert (isinstance(pkt_1.precision, RawVal)), type(pkt_1.precision) >>> assert (isinstance(pkt_1.dispersion, RawVal)), type(pkt_1.dispersion) >>> assert (isinstance(pkt_1.orig, RawVal)), type(pkt_1.orig) >>> assert (isinstance(pkt_1.sent, RawVal)), type(pkt_1.sent) >>> assert (isinstance(pkt_1.recv, RawVal)), type(pkt_1.recv) >>> >>> assert pkt_1.precision.val == precision, pkt_1.precision.val >>> assert pkt_1.dispersion.val == dispersion, pkt_1.dispersion.val >>> assert pkt_1.orig.val == time_stamp, pkt_1.orig.val >>> assert pkt_1.sent.val == time_stamp, pkt_1.sent.val >>> assert pkt_1.recv.val == time_stamp, pkt_1.recv.val >>> >>> time_stamp_hex = 0x00000000e67d6774 >>> pkt_2 = NTP( ... precision=-20, ... dispersion=Decimal('0.948455810546875'), ... orig=time_stamp_hex, ... sent=time_stamp_hex, ... recv=time_stamp_hex ... ) >>> >>> raw_pkt = (b"#\x02\n\xec\x00\x00\x00\x00\x00\x00\xf2\xce\x7f\x00\x00\x01\x00" ... b"\x00\x00\x00\x00\x00\x00\x00\xe6}gt\x00\x00\x00\x00\xe6}gt\x00" ... b"\x00\x00\x00\xe6}gt\x00\x00\x00\x00") >>> >>> assert raw(pkt_1) == raw(pkt_2) == raw_pkt Regression tests for the PFLog layer ━ Run at 01:42:22 from [test/scapy/layers/pflog.uts] by UTscapy in 0.025370359420776367 └ Passed=9 └ Failed=0 ###### ## Multiple operations of PFLog packets dissections ###### ###(000)=[passed] Load module >>> load_layer("pflog") >>> from io import BytesIO ###(001)=[passed] Dissect PFLog packet of a IP()/TCP() dropped packet >>> pcap_pflog_tcp = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00u\x00\x00\x00\x89*\xce_}\xcf\x07\x00\xa4\x00\x00\x00\xa4\x00\x00\x00d\x02\x01\x00vio0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x86\x01\x00\x00\x00\x00\x00\x84S\x01\x00\x01\x00\x02\x00\n\xc8\xc8\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xc8\xc8\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\xbd\x00\x17E\x00\x00@c\xae@\x00@\x06/\xe1\n\xc8\xc8\xfe\n\xc8\xc8\x9a\xa3\xbd\x00\x17\xc8\xc9\xd9\xf2\x00\x00\x00\x00\xb0\x02@\x00.l\x00\x00\x02\x04\x05\xb4\x01\x01\x04\x02\x01\x03\x03\x06\x01\x01\x08\n\x86\xb8S\x1c\x00\x00\x00\x00') >>> pflog_tcp_packets = rdpcap(pcap_pflog_tcp) >>> assert pflog_tcp_packets[0][PFLog].hdrlen == 100 >>> assert pflog_tcp_packets[0][PFLog].addrfamily == 2 # IPv4 >>> assert pflog_tcp_packets[0][PFLog].action == 1 # drop >>> assert pflog_tcp_packets[0][PFLog].saddr == '10.200.200.254' >>> assert pflog_tcp_packets[0][PFLog].daddr == '10.200.200.154' >>> assert pflog_tcp_packets[0][IP].proto == 6 >>> assert pflog_tcp_packets[0][IP].src == '10.200.200.254' >>> assert pflog_tcp_packets[0][IP].dst == '10.200.200.154' >>> assert pflog_tcp_packets[0][TCP].dport == 23 ###(002)=[passed] Dissect PFLog packet of a IP()/UDP() dropped packet >>> pcap_pflog_udp = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00u\x00\x00\x00O*\xce_?\x1d\x05\x00\x82\x00\x00\x00\x82\x00\x00\x00d\x02\x01\x00vio0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x86\x01\x00\x00\x00\x00\x00{\xdb\x00\x00\x01\x00\x02\x00\n\xc8\xc8\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xc8\xc8\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9\x0b\x00\x17E\x00\x00\x1e\xdd\x1c\x00\x00@\x11\xf6\x89\n\xc8\xc8\xfe\n\xc8\xc8\x9a\xa9\x0b\x00\x17\x00\nN\x84') >>> pflog_udp_packets = rdpcap(pcap_pflog_udp) >>> assert pflog_udp_packets[0][PFLog].hdrlen == 100 >>> assert pflog_udp_packets[0][PFLog].addrfamily == 2 # IPv4 >>> assert pflog_udp_packets[0][PFLog].action == 1 # drop >>> assert pflog_udp_packets[0][PFLog].saddr == '10.200.200.254' >>> assert pflog_udp_packets[0][PFLog].daddr == '10.200.200.154' >>> assert pflog_udp_packets[0][IP].proto == 17 >>> assert pflog_udp_packets[0][IP].src == '10.200.200.254' >>> assert pflog_udp_packets[0][IP].dst == '10.200.200.154' >>> assert pflog_udp_packets[0][UDP].dport == 23 ###(003)=[passed] Dissect PFLog packet of a IP()/ICMP() echo-request dropped packet >>> pcap_pflog_icmp = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00u\x00\x00\x00\x8d*\xce_\x16[\x0c\x00\xb8\x00\x00\x00\xb8\x00\x00\x00d\x02\x01\x00vio0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x86\x01\x00\x00\x00\x00\x00\x84S\x01\x00\x01\x00\x02\x00\n\xc8\xc8\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xc8\xc8\x9a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16K\x00\x08E\x00\x00T.\x88\x00\x00\xff\x01\xe5\xf7\n\xc8\xc8\xfe\n\xc8\xc8\x9a\x08\x00\xabD\x16K\x00\x00') >>> pflog_icmp_packets = rdpcap(pcap_pflog_icmp) >>> assert pflog_icmp_packets[0][PFLog].hdrlen == 100 >>> assert pflog_icmp_packets[0][PFLog].addrfamily == 2 # IPv4 >>> assert pflog_icmp_packets[0][PFLog].action == 1 # drop >>> assert pflog_icmp_packets[0][PFLog].saddr == '10.200.200.254' >>> assert pflog_icmp_packets[0][PFLog].daddr == '10.200.200.154' >>> assert pflog_icmp_packets[0][IP].proto == 1 >>> assert pflog_icmp_packets[0][IP].src == '10.200.200.254' >>> assert pflog_icmp_packets[0][IP].dst == '10.200.200.154' >>> assert pflog_icmp_packets[0][ICMP].type == 8 and pflog_icmp_packets[0][ICMP].code == 0 ###(004)=[passed] Dissect PFLog packet of a IPv6()/TCP() dropped packet >>> pcap_pflog_tcp_ipv6_drop = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00u\x00\x00\x00\x9dA\xce_\x98P\x08\x00\xb8\x00\x00\x00\xb8\x00\x00\x00d\x18\x01\x00vlan3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x86\x01\x00\x00\x00\x00\x00\xd9\x08\x00\x00\x01\x00\x18\x00\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x04\xe9\x00\x17`\n\xb8\x13\x00,\x06@\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x04\xe9\x00\x17\xd6\xc3:\xd6\x00\x00\x00\x00\xb0\x02@\x00\xf7\xeb\x00\x00\x02\x04\x05\xa0\x01\x01\x04\x02\x01\x03\x03\x06\x01\x01\x08\nS\xd6,P\x00\x00\x00\x00') >>> pflog_tcp_ipv6_drop_packets = rdpcap(pcap_pflog_tcp_ipv6_drop) >>> assert pflog_tcp_ipv6_drop_packets[0][PFLog].hdrlen == 100 >>> assert pflog_tcp_ipv6_drop_packets[0][PFLog].addrfamily == 24 # IPv6 >>> assert pflog_tcp_ipv6_drop_packets[0][PFLog].action == 1 >>> assert pflog_tcp_ipv6_drop_packets[0][PFLog].saddr == '1111:1111:1111::1' >>> assert pflog_tcp_ipv6_drop_packets[0][PFLog].daddr == '1111:1111:1111::fc' >>> assert pflog_tcp_ipv6_drop_packets[0][IPv6].nh == 6 >>> assert pflog_tcp_ipv6_drop_packets[0][IPv6].src == '1111:1111:1111::1' >>> assert pflog_tcp_ipv6_drop_packets[0][IPv6].dst == '1111:1111:1111::fc' >>> assert pflog_tcp_ipv6_drop_packets[0][TCP].dport == 23 ###(005)=[passed] Dissect PFLog packet of a IPv6()/TCP() passed packet >>> pcap_pflog_tcp_ipv6_pass = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00u\x00\x00\x00$B\xce_\x8e\xc1\x01\x00\xb8\x00\x00\x00\xb8\x00\x00\x00d\x18\x00\x00vlan3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x86\x01\x00\x00\x00\x00\x00\xa4\x85\x00\x00\x01\x00\x18\x00\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfczw\x00\x16`\x02\x82\x85\x00,\x06@\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfczw\x00\x16\xa3\x9d\x059\x00\x00\x00\x00\xb0\x02@\x00\xd9\xf1\x00\x00\x02\x04\x05\xa0\x01\x01\x04\x02\x01\x03\x03\x06\x01\x01\x08\nu[\x1b\xfb\x00\x00\x00\x00') >>> pflog_tcp_ipv6_pass_packets = rdpcap(pcap_pflog_tcp_ipv6_pass) >>> assert pflog_tcp_ipv6_pass_packets[0][PFLog].hdrlen == 100 >>> assert pflog_tcp_ipv6_pass_packets[0][PFLog].addrfamily == 24 # IPv6 >>> assert pflog_tcp_ipv6_pass_packets[0][PFLog].action == 0 >>> assert pflog_tcp_ipv6_pass_packets[0][PFLog].saddr == '1111:1111:1111::1' >>> assert pflog_tcp_ipv6_pass_packets[0][PFLog].daddr == '1111:1111:1111::fc' >>> assert pflog_tcp_ipv6_pass_packets[0][IPv6].nh == 6 >>> assert pflog_tcp_ipv6_pass_packets[0][IPv6].src == '1111:1111:1111::1' >>> assert pflog_tcp_ipv6_pass_packets[0][IPv6].dst == '1111:1111:1111::fc' >>> assert pflog_tcp_ipv6_pass_packets[0][TCP].dport == 22 ###(006)=[passed] Dissect PFLog packet of a IPv6()/UDP() dropped packet >>> pcap_pflog_udp_ipv6_drop = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00u\x00\x00\x00\xccA\xce_\xf8\x10\x03\x00\x95\x00\x00\x00\x95\x00\x00\x00d\x18\x01\x00vlan3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x86\x01\x00\x00\x00\x00\x00\xd9\x08\x00\x00\x01\x00\x18\x00\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc[U\x00\x16`\x0f\x1b\x84\x00\t\x11@\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc[U\x00\x16\x00\t\xe4\xeeX') >>> pflog_udp_ipv6_drop_packets = rdpcap(pcap_pflog_udp_ipv6_drop) >>> assert pflog_udp_ipv6_drop_packets[0][PFLog].hdrlen == 100 >>> assert pflog_udp_ipv6_drop_packets[0][PFLog].addrfamily == 24 # IPv6 >>> assert pflog_udp_ipv6_drop_packets[0][PFLog].action == 1 >>> assert pflog_udp_ipv6_drop_packets[0][PFLog].saddr == '1111:1111:1111::1' >>> assert pflog_udp_ipv6_drop_packets[0][PFLog].daddr == '1111:1111:1111::fc' >>> assert pflog_udp_ipv6_drop_packets[0][IPv6].nh == 17 >>> assert pflog_udp_ipv6_drop_packets[0][IPv6].src == '1111:1111:1111::1' >>> assert pflog_udp_ipv6_drop_packets[0][IPv6].dst == '1111:1111:1111::fc' >>> assert pflog_udp_ipv6_drop_packets[0][UDP].dport == 22 ###(007)=[passed] Dissect PFLog packet of a IPv6()/ICMP6() dropped packet >>> pcap_pflog_icmp6_drop = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00u\x00\x00\x005A\xce_\xa5\x06\x05\x00\xac\x00\x00\x00\xac\x00\x00\x00d\x18\x01\x00vlan3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x86\x01\x00\x00\x00\x00\x00\x89\xa0\x00\x00\x01\x00\x18\x00\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x00\x00\xfc\x11\xed\x00\x87`\x00\x00\x00\x00 :\xff\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x00\x00\xfc\x87\x00\xf0\xf2\x00\x00\x00\x00\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x01\x01RT\x00]\xcd\x9b') >>> pflog_icmp6_drop_packets = rdpcap(pcap_pflog_icmp6_drop) >>> assert pflog_icmp6_drop_packets[0][PFLog].hdrlen == 100 >>> assert pflog_icmp6_drop_packets[0][PFLog].addrfamily == 24 # IPv6 >>> assert pflog_icmp6_drop_packets[0][PFLog].action == 1 >>> assert pflog_icmp6_drop_packets[0][PFLog].saddr == '1111:1111:1111::1' >>> assert pflog_icmp6_drop_packets[0][PFLog].daddr == 'ff02::1:ff00:fc' >>> assert pflog_icmp6_drop_packets[0][IPv6].nh == 58 >>> assert pflog_icmp6_drop_packets[0][IPv6].src == '1111:1111:1111::1' >>> assert pflog_icmp6_drop_packets[0][IPv6].dst == 'ff02::1:ff00:fc' >>> assert pflog_icmp6_drop_packets[0][ICMPv6ND_NS].type == 135 and pflog_icmp6_drop_packets[0][ICMPv6ND_NS].code == 0 >>> assert pflog_icmp6_drop_packets[0][ICMPv6ND_NS].tgt == '1111:1111:1111::fc' ###(008)=[passed] Dissect PFLog packet of a IPv6()/ICMP6() passed packet >>> pcap_pflog_icmp6_pass = BytesIO(b'\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00u\x00\x00\x00 B\xce_\xf4\x05\x05\x00\xac\x00\x00\x00\xac\x00\x00\x00d\x18\x00\x00vlan3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\xff\xff\xff\xff\xff\xff\xff\xff\xa0\x86\x01\x00\x00\x00\x00\x00\xa4\x85\x00\x00\x01\x00\x18\x00\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x11\xed\x00\x87`\x00\x00\x00\x00 :\xff\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x87\x00\xbb\xc4\x00\x00\x00\x00\x11\x11\x11\x11\x11\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfc\x01\x01RT\x00]\xcd\x9b') >>> pflog_icmp6_pass_packets = rdpcap(pcap_pflog_icmp6_pass) >>> assert pflog_icmp6_pass_packets[0][PFLog].hdrlen == 100 >>> assert pflog_icmp6_pass_packets[0][PFLog].addrfamily == 24 # IPv6 >>> assert pflog_icmp6_pass_packets[0][PFLog].action == 0 >>> assert pflog_icmp6_pass_packets[0][PFLog].saddr == '1111:1111:1111::1' >>> assert pflog_icmp6_pass_packets[0][PFLog].daddr == '1111:1111:1111::fc' >>> assert pflog_icmp6_pass_packets[0][IPv6].nh == 58 >>> assert pflog_icmp6_pass_packets[0][IPv6].src == '1111:1111:1111::1' >>> assert pflog_icmp6_pass_packets[0][IPv6].dst == '1111:1111:1111::fc' >>> assert pflog_icmp6_pass_packets[0][ICMPv6ND_NS].type == 135 and pflog_icmp6_pass_packets[0][ICMPv6ND_NS].code == 0 >>> assert pflog_icmp6_pass_packets[0][ICMPv6ND_NS].tgt == '1111:1111:1111::fc' Scapy PPP layer tests ━ Run at 01:42:22 from [test/scapy/layers/ppp.uts] by UTscapy in 0.03373861312866211 └ Passed=8 └ Failed=0 ###### ## PPP tests ###### ###(000)=[passed] PPPoE >>> p=Ether(b'\xff\xff\xff\xff\xff\xff\x08\x00\x27\xf3<5\x88c\x11\x09\x00\x00\x00\x0c\x01\x01\x00\x00\x01\x03\x00\x04\x01\x02\x03\x04\x00\x00\x00\x00') >>> p , ] |>>> >>> assert p[Ether].type==0x8863 >>> assert PPPoED in p >>> assert p[PPPoED].version==1 >>> assert p[PPPoED].type==1 >>> assert p[PPPoED].code==0x09 >>> assert PPPoED_Tags in p >>> q=p[PPPoED_Tags] >>> assert q.tag_list is not None >>> r=q.tag_list >>> assert len(r) == 2 >>> assert r[0].tag_type==0x0101 >>> assert r[1].tag_type==0x0103 >>> assert r[1].tag_len==4 >>> assert r[1].tag_value==b'\x01\x02\x03\x04' >>> >>> assert Padding in p and len(p[Padding]) == 4 ###(001)=[passed] PPPoE with tags (appended) >>> eth = Ether(dst="ff:ff:ff:ff:ff:ff", src="12:12:12:12:12:12", type=0x8863) >>> pppoed = PPPoED(version=1, type=1, code=0x9, sessionid=0, len=8) >>> server_name = PPPoETag(tag_type=0x0101, tag_len=0) >>> end_of_list = PPPoETag(tag_type=0, tag_len=0) >>> >>> original = eth / pppoed / server_name / end_of_list >>> dissected = Ether(original.build()) >>> assert PPPoED_Tags in dissected >>> assert dissected[PPPoED_Tags].tag_list[0].tag_type == 0x0101 >>> assert dissected[PPPoED_Tags].tag_list[1].tag_type == 0 ###(002)=[passed] PPPoE with padding >>> p = CookedLinux(b'\x00\x00\x00\x01\x00\x06\x00\x1d\xaa\x00\x00\x00\x00\x00\x88c\x11\xa7\x08\x81\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8e\xf3\x9d\xf1\xc5C\xbe\xde') >>> assert p.summary() == 'CookedLinux / PPPoE Active Discovery Terminate (PADT) / Padding' >>> assert p[PPPoED].len == 0 >>> assert len(p[Padding].load) == 44 ###(003)=[passed] PPP/HDLC >>> p = HDLC()/PPP()/PPP_IPCP() >>> p >> >>> s = raw(p) >>> s b'\xff\x03\x80!\x01\x00\x00\x04' >>> assert s == b'\xff\x03\x80!\x01\x00\x00\x04' >>> p = PPP(s) >>> p >> >>> assert HDLC in p >>> assert p[HDLC].control==3 >>> assert p[PPP].proto==0x8021 >>> q = PPP(s[2:]) >>> q > >>> assert HDLC not in q >>> assert q[PPP].proto==0x8021 ###(004)=[passed] PPP IPCP >>> p = PPP(b'\x80!\x01\x01\x00\x10\x03\x06\xc0\xa8\x01\x01\x02\x06\x00-\x0f\x01') >>> p , ] |>> >>> assert p[PPP_IPCP].code == 1 >>> assert p[PPP_IPCP_Option_IPAddress].data=="192.168.1.1" >>> assert p[PPP_IPCP_Option].data == b'\x00-\x0f\x01' >>> p=PPP()/PPP_IPCP(options=[PPP_IPCP_Option_DNS1(data="1.2.3.4"),PPP_IPCP_Option_DNS2(data="5.6.7.8"),PPP_IPCP_Option_NBNS2(data="9.10.11.12")]) >>> r = raw(p) >>> r b'\x80!\x01\x00\x00\x16\x81\x06\x01\x02\x03\x04\x83\x06\x05\x06\x07\x08\x84\x06\t\n\x0b\x0c' >>> assert r == b'\x80!\x01\x00\x00\x16\x81\x06\x01\x02\x03\x04\x83\x06\x05\x06\x07\x08\x84\x06\t\n\x0b\x0c' >>> q = PPP(r) >>> q , , ] |>> >>> assert raw(p) == raw(q) >>> assert PPP(raw(q))==q >>> p = PPP()/PPP_IPCP(options=[PPP_IPCP_Option_DNS1(data="1.2.3.4"),PPP_IPCP_Option_DNS2(data="5.6.7.8"),PPP_IPCP_Option(type=123,data="ABCDEFG"),PPP_IPCP_Option_NBNS2(data="9.10.11.12")]) >>> p , , , ] |>> >>> r = raw(p) >>> r b'\x80!\x01\x00\x00\x1f\x81\x06\x01\x02\x03\x04\x83\x06\x05\x06\x07\x08{\tABCDEFG\x84\x06\t\n\x0b\x0c' >>> assert r == b'\x80!\x01\x00\x00\x1f\x81\x06\x01\x02\x03\x04\x83\x06\x05\x06\x07\x08{\tABCDEFG\x84\x06\t\n\x0b\x0c' >>> q = PPP(r) >>> q , , , ] |>> >>> assert q[PPP_IPCP_Option].type == 123 >>> assert q[PPP_IPCP_Option].data == b"ABCDEFG" >>> assert q[PPP_IPCP_Option_NBNS2].data == '9.10.11.12' ###(005)=[passed] PPP ECP >>> p = PPP()/PPP_ECP(options=[PPP_ECP_Option_OUI(oui=0x58595a)]) >>> p ] |>> >>> r = raw(p) >>> r b'\x80S\x01\x00\x00\n\x00\x06XYZ\x00' >>> assert r == b'\x80S\x01\x00\x00\n\x00\x06XYZ\x00' >>> q = PPP(r) >>> q ] |>> >>> assert raw(p) == raw(q) >>> p = PPP()/PPP_ECP(options=[PPP_ECP_Option_OUI(oui=0x58595a),PPP_ECP_Option(type=1,data="ABCDEFG")]) >>> p , ] |>> >>> r = raw(p) >>> r b'\x80S\x01\x00\x00\x13\x00\x06XYZ\x00\x01\tABCDEFG' >>> assert r == b'\x80S\x01\x00\x00\x13\x00\x06XYZ\x00\x01\tABCDEFG' >>> q = PPP(r) >>> q , ] |>> >>> assert raw(p) == raw(q) >>> assert q[PPP_ECP_Option].data == b"ABCDEFG" ###(006)=[passed] PPP IP check that default protocol length is 2 bytes >>> p = PPP()/IP() >>> p > >>> r = raw(p) >>> r b'\x00!E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01' >>> assert r.startswith(b'\x00\x21') >>> assert len(r) == 22 ###(007)=[passed] PPP check parsing with only one byte for protocol >>> assert len(raw(PPP(proto=b'\x21') / IP())) == 21 >>> >>> p = PPP(b'!E\x00\x00<\x00\x00@\x008\x06\xa5\xce\x85wP)\xc0\xa8Va\x01\xbbd\x8a\xe2}r\xb8O\x95\xb5\x84\xa0\x12q \xc8\x08\x00\x00\x02\x04\x02\x18\x04\x02\x08\nQ\xdf\xd6\xb0\x00\x07LH\x01\x03\x03\x07Ao') >>> assert IP in p >>> assert TCP in p >>> >>> assert PPP(b"\x00\x21" + raw(IP())) == PPP(b"\x21" + raw(IP())) PPTP Related regression tests ━ Run at 01:42:23 from [test/scapy/layers/pptp.uts] by UTscapy in 0.11283302307128906 └ Passed=36 └ Failed=0 ###### ## GRE Tests ###### ###(000)=[passed] Test IP/GRE v0 decoding >>> data = hex_bytes('45c00064000f0000ff2f1647c0a80c01c0a8170300000800') >>> pkt = IP(data) >>> assert GRE in pkt >>> gre = pkt[GRE] >>> assert gre.chksum_present == 0 >>> assert gre.routing_present == 0 >>> assert gre.key_present == 0 >>> assert gre.seqnum_present == 0 >>> assert gre.strict_route_source == 0 >>> assert gre.recursion_control == 0 >>> assert gre.flags == 0 >>> assert gre.version == 0 >>> assert gre.proto == 0x800 ###(001)=[passed] Test IP/GRE v1 decoding with PPP LCP >>> data = hex_bytes('4500003c18324000402f0e5a0a0000020a0000063001880b001c9bf500000000ff03'\ ... 'c021010100180206000000000304c2270506fbb8831007020802') >>> pkt = IP(data) >>> assert GRE_PPTP in pkt >>> gre_pptp = pkt[GRE_PPTP] >>> assert gre_pptp.chksum_present == 0 >>> assert gre_pptp.routing_present == 0 >>> assert gre_pptp.key_present == 1 >>> assert gre_pptp.seqnum_present == 1 >>> assert gre_pptp.strict_route_source == 0 >>> assert gre_pptp.recursion_control == 0 >>> assert gre_pptp.acknum_present == 0 >>> assert gre_pptp.flags == 0 >>> assert gre_pptp.version == 1 >>> assert gre_pptp.proto == 0x880b >>> assert gre_pptp.payload_len == 28 >>> assert gre_pptp.call_id == 39925 >>> assert gre_pptp.sequence_number == 0x0 >>> >>> assert HDLC in pkt >>> assert PPP in pkt >>> assert PPP_LCP_Configure in pkt ###(002)=[passed] Test IP/GRE v1 encoding/decoding with PPP LCP Echo >>> pkt = IP(src='192.168.0.1', dst='192.168.0.2') /\ ... GRE_PPTP(seqnum_present=1, acknum_present=1, sequence_number=47, ack_number=42) /\ ... HDLC() / PPP() / PPP_LCP_Echo(id=42, magic_number=4242, data='abcdef') >>> pkt_data = raw(pkt) >>> pkt_data_ref = hex_bytes('4500003600010000402ff944c0a80001c0a800023081880b001200000000002f000000'\ ... '2aff03c021092a000e00001092616263646566') >>> assert (pkt_data == pkt_data_ref) >>> pkt_decoded = IP(pkt_data_ref) >>> assert IP in pkt >>> assert GRE_PPTP in pkt >>> assert HDLC in pkt >>> assert PPP in pkt >>> assert PPP_LCP_Echo in pkt >>> >>> assert pkt[IP].proto == 47 >>> assert pkt[GRE_PPTP].chksum_present == 0 >>> assert pkt[GRE_PPTP].routing_present == 0 >>> assert pkt[GRE_PPTP].key_present == 1 >>> assert pkt[GRE_PPTP].seqnum_present == 1 >>> assert pkt[GRE_PPTP].acknum_present == 1 >>> assert pkt[GRE_PPTP].sequence_number == 47 >>> assert pkt[GRE_PPTP].ack_number == 42 >>> assert pkt[PPP].proto == 0xc021 >>> assert pkt[PPP_LCP_Echo].code == 9 >>> assert pkt[PPP_LCP_Echo].id == 42 >>> assert pkt[PPP_LCP_Echo].magic_number == 4242 >>> assert pkt[PPP_LCP_Echo].data == b'abcdef' ###### ## PPP LCP Tests ###### ###(003)=[passed] Test LCP Echo Request / Reply >>> lcp_echo_request_data = hex_bytes('c021090700080000002a') >>> lcp_echo_reply_data = raw(PPP()/PPP_LCP_Echo(code=10, id=7, magic_number=77, data='defgh')) >>> >>> lcp_echo_request_pkt = PPP(lcp_echo_request_data) >>> lcp_echo_reply_pkt = PPP(lcp_echo_reply_data) >>> >>> assert lcp_echo_reply_pkt.answers(lcp_echo_request_pkt) >>> assert not lcp_echo_request_pkt.answers(lcp_echo_reply_pkt) >>> >>> lcp_echo_non_reply_data = raw(PPP()/PPP_LCP_Echo(code=10, id=3, magic_number=77)) >>> lcp_echo_non_reply_pkt = PPP(lcp_echo_non_reply_data) >>> >>> assert not lcp_echo_non_reply_pkt.answers(lcp_echo_request_pkt) >>> >>> lcp_echo_non_reply_data = raw(PPP()/PPP_LCP_Echo(id=7, magic_number=42)) >>> lcp_echo_non_reply_pkt = PPP(lcp_echo_non_reply_data) >>> >>> assert not lcp_echo_non_reply_pkt.answers(lcp_echo_request_pkt) ###(004)=[passed] Test LCP Configure Request >>> conf_req = PPP() / PPP_LCP_Configure(id=42, options=[PPP_LCP_Magic_Number_Option(magic_number=4242)]) >>> conf_req_ref_data = hex_bytes('c021012a000a050600001092') >>> >>> assert raw(conf_req) == conf_req_ref_data >>> >>> conf_req_pkt = PPP(conf_req_ref_data) >>> >>> assert PPP_LCP_Configure in conf_req_pkt >>> assert conf_req_pkt[PPP_LCP_Configure].code == 1 >>> assert conf_req_pkt[PPP_LCP_Configure].id == 42 >>> assert len(conf_req_pkt[PPP_LCP_Configure].options) == 1 >>> assert isinstance(conf_req_pkt[PPP_LCP_Configure].options[0], PPP_LCP_Magic_Number_Option) >>> assert conf_req_pkt[PPP_LCP_Configure].options[0].magic_number == 4242 ###(005)=[passed] Test LCP Configure Ack >>> conf_ack = PPP() / PPP_LCP_Configure(code='Configure-Ack', id=42, ... options=[PPP_LCP_Magic_Number_Option(magic_number=4242)]) >>> conf_ack_ref_data = hex_bytes('c021022a000a050600001092') >>> >>> assert (raw(conf_ack) == conf_ack_ref_data) >>> >>> conf_ack_pkt = PPP(conf_ack_ref_data) >>> >>> assert PPP_LCP_Configure in conf_ack_pkt >>> assert conf_ack_pkt[PPP_LCP_Configure].code == 2 >>> assert conf_ack_pkt[PPP_LCP_Configure].id == 42 >>> assert len(conf_ack_pkt[PPP_LCP_Configure].options) == 1 >>> assert isinstance(conf_ack_pkt[PPP_LCP_Configure].options[0], PPP_LCP_Magic_Number_Option) >>> assert conf_ack_pkt[PPP_LCP_Configure].options[0].magic_number == 4242 >>> >>> conf_req_pkt = PPP(hex_bytes('c021012a000a050600001092')) >>> >>> assert conf_ack_pkt.answers(conf_req_pkt) >>> assert not conf_req_pkt.answers(conf_ack_pkt) ###(006)=[passed] Test LCP Configure Nak >>> conf_nak = PPP() / PPP_LCP_Configure(code='Configure-Nak', id=42, ... options=[PPP_LCP_MRU_Option(), PPP_LCP_ACCM_Option(accm=0xffff0000)]) >>> conf_nak_ref_data = hex_bytes('c021032a000e010405dc0206ffff0000') >>> >>> assert raw(conf_nak) == conf_nak_ref_data >>> >>> conf_nak_pkt = PPP(conf_nak_ref_data) >>> >>> assert PPP_LCP_Configure in conf_nak_pkt >>> assert conf_nak_pkt[PPP_LCP_Configure].code == 3 >>> assert conf_nak_pkt[PPP_LCP_Configure].id == 42 >>> assert len(conf_nak_pkt[PPP_LCP_Configure].options) == 2 >>> assert isinstance(conf_nak_pkt[PPP_LCP_Configure].options[0], PPP_LCP_MRU_Option) >>> assert conf_nak_pkt[PPP_LCP_Configure].options[0].max_recv_unit == 1500 >>> assert isinstance(conf_nak_pkt[PPP_LCP_Configure].options[1], PPP_LCP_ACCM_Option) >>> assert conf_nak_pkt[PPP_LCP_Configure].options[1].accm == 0xffff0000 >>> >>> conf_req_pkt = PPP(hex_bytes('c021012a000e010405dc0206ffff0000')) >>> >>> assert conf_nak_pkt.answers(conf_req_pkt) >>> assert not conf_req_pkt.answers(conf_nak_pkt) ###(007)=[passed] Test LCP Configure Reject >>> conf_reject = PPP() / PPP_LCP_Configure(code='Configure-Reject', id=42, ... options=[PPP_LCP_Callback_Option(operation='Location identifier', ... message='test')]) >>> conf_reject_ref_data = hex_bytes('c021042a000b0d070274657374') >>> >>> assert raw(conf_reject) == conf_reject_ref_data >>> >>> conf_reject_pkt = PPP(conf_reject_ref_data) >>> >>> assert PPP_LCP_Configure in conf_reject_pkt >>> assert conf_reject_pkt[PPP_LCP_Configure].code == 4 >>> assert conf_reject_pkt[PPP_LCP_Configure].id == 42 >>> assert len(conf_reject_pkt[PPP_LCP_Configure].options) == 1 >>> assert isinstance(conf_reject_pkt[PPP_LCP_Configure].options[0], PPP_LCP_Callback_Option) >>> assert conf_reject_pkt[PPP_LCP_Configure].options[0].operation == 2 >>> assert conf_reject_pkt[PPP_LCP_Configure].options[0].message == b'test' >>> >>> conf_req_pkt = PPP(hex_bytes('c021012a000b0d070274657374')) >>> >>> assert conf_reject_pkt.answers(conf_req_pkt) >>> assert not conf_req_pkt.answers(conf_reject_pkt) ###(008)=[passed] Test LCP Configure options >>> conf_req = PPP() / PPP_LCP_Configure(id=42, options=[PPP_LCP_MRU_Option(max_recv_unit=5000), ... PPP_LCP_ACCM_Option(accm=0xf0f0f0f0), ... PPP_LCP_Auth_Protocol_Option(), ... PPP_LCP_Quality_Protocol_Option(data='test'), ... PPP_LCP_Magic_Number_Option(magic_number=4242), ... PPP_LCP_Callback_Option(operation='Distinguished name',message='test')]) >>> conf_req_ref_data = hex_bytes('c021012a0027010413880206f0f0f0f00304c0230408c025746573740506000010920d070474657374') >>> >>> assert raw(conf_req) == conf_req_ref_data >>> >>> conf_req_pkt = PPP(conf_req_ref_data) >>> >>> assert PPP_LCP_Configure in conf_req_pkt >>> options = conf_req_pkt[PPP_LCP_Configure].options >>> assert len(options) == 6 >>> assert isinstance(options[0], PPP_LCP_MRU_Option) >>> assert options[0].max_recv_unit == 5000 >>> assert isinstance(options[1], PPP_LCP_ACCM_Option) >>> assert options[1].accm == 0xf0f0f0f0 >>> assert isinstance(options[2], PPP_LCP_Auth_Protocol_Option) >>> assert options[2].auth_protocol == 0xc023 >>> assert isinstance(options[3], PPP_LCP_Quality_Protocol_Option) >>> assert options[3].quality_protocol == 0xc025 >>> assert options[3].data == b'test' >>> assert isinstance(options[4], PPP_LCP_Magic_Number_Option) >>> assert options[4].magic_number == 4242 >>> assert isinstance(options[5], PPP_LCP_Callback_Option) >>> assert options[5].operation == 4 >>> assert options[5].message == b'test' ###(009)=[passed] Test LCP Auth option >>> pap = PPP_LCP_Auth_Protocol_Option() >>> pap_ref_data = hex_bytes('0304c023') >>> >>> assert raw(pap) == pap_ref_data >>> >>> pap_pkt = PPP_LCP_Option(pap_ref_data) >>> assert isinstance(pap_pkt, PPP_LCP_Auth_Protocol_Option) >>> assert pap_pkt.auth_protocol == 0xc023 >>> >>> chap_sha1 = PPP_LCP_Auth_Protocol_Option(auth_protocol='Challenge-response authentication protocol', algorithm="SHA1") >>> chap_sha1_ref_data = hex_bytes('0305c22306') >>> >>> assert raw(chap_sha1) == chap_sha1_ref_data >>> >>> chap_sha1_pkt = PPP_LCP_Option(chap_sha1_ref_data) >>> assert isinstance(chap_sha1_pkt, PPP_LCP_Auth_Protocol_Option) >>> assert chap_sha1_pkt.auth_protocol == 0xc223 >>> assert chap_sha1_pkt.algorithm == 6 >>> >>> eap = PPP_LCP_Auth_Protocol_Option(auth_protocol='PPP Extensible authentication protocol', data='test') >>> eap_ref_data = hex_bytes('0308c22774657374') >>> >>> assert raw(eap) == eap_ref_data >>> >>> eap_pkt = PPP_LCP_Option(eap_ref_data) >>> assert isinstance(eap_pkt, PPP_LCP_Auth_Protocol_Option) >>> assert eap_pkt.auth_protocol == 0xc227 >>> assert eap_pkt.data == b'test' ###(010)=[passed] Test LCP Code-Reject >>> code_reject = PPP() / PPP_LCP_Code_Reject(id=42, rejected_packet=PPP_LCP(code=42, id=7, data='unknown_data')) >>> code_reject_ref_data = hex_bytes('c021072a00142a070010756e6b6e6f776e5f64617461') >>> >>> assert raw(code_reject) == code_reject_ref_data >>> >>> code_reject_pkt = PPP(code_reject_ref_data) >>> assert PPP_LCP_Code_Reject in code_reject_pkt >>> assert code_reject_pkt[PPP_LCP_Code_Reject].id == 42 >>> assert isinstance(code_reject_pkt[PPP_LCP_Code_Reject].rejected_packet, PPP_LCP) >>> assert code_reject[PPP_LCP_Code_Reject].rejected_packet.code == 42 >>> assert code_reject[PPP_LCP_Code_Reject].rejected_packet.id == 7 >>> assert code_reject[PPP_LCP_Code_Reject].rejected_packet.data == b'unknown_data' ###(011)=[passed] Test LCP Protocol-Reject >>> protocol_reject = PPP() / PPP_LCP_Protocol_Reject(id=42, rejected_protocol=0x8039, ... rejected_information=Packet(hex_bytes('0305c22306'))) >>> protocol_reject_ref_data = hex_bytes('c021082a000b80390305c22306') >>> >>> assert raw(protocol_reject) == protocol_reject_ref_data >>> >>> protocol_reject_pkt = PPP(protocol_reject_ref_data) >>> assert PPP_LCP_Protocol_Reject in protocol_reject_pkt >>> assert protocol_reject_pkt[PPP_LCP_Protocol_Reject].id == 42 >>> assert protocol_reject_pkt[PPP_LCP_Protocol_Reject].rejected_protocol == 0x8039 >>> assert len(protocol_reject_pkt[PPP_LCP_Protocol_Reject].rejected_information) == 5 ###(012)=[passed] Test LCP Discard Request >>> discard_request = PPP() / PPP_LCP_Discard_Request(id=7, magic_number=4242, data='test') >>> discard_request_ref_data = hex_bytes('c0210b07000c0000109274657374') >>> >>> assert raw(discard_request) == discard_request_ref_data >>> >>> discard_request_pkt = PPP(discard_request_ref_data) >>> assert PPP_LCP_Discard_Request in discard_request_pkt >>> assert discard_request_pkt[PPP_LCP_Discard_Request].id == 7 >>> assert discard_request_pkt[PPP_LCP_Discard_Request].magic_number == 4242 >>> assert discard_request_pkt[PPP_LCP_Discard_Request].data == b'test' ###(013)=[passed] Test LCP Terminate-Request/Terminate-Ack >>> terminate_request = PPP() / PPP_LCP_Terminate(id=7, data='test') >>> terminate_request_ref_data = hex_bytes('c0210507000874657374') >>> >>> assert raw(terminate_request) == terminate_request_ref_data >>> >>> terminate_request_pkt = PPP(terminate_request_ref_data) >>> assert PPP_LCP_Terminate in terminate_request_pkt >>> assert terminate_request_pkt[PPP_LCP_Terminate].code == 5 >>> assert terminate_request_pkt[PPP_LCP_Terminate].id == 7 >>> assert terminate_request_pkt[PPP_LCP_Terminate].data == b'test' >>> >>> terminate_ack = PPP() / PPP_LCP_Terminate(code='Terminate-Ack', id=7) >>> terminate_ack_ref_data = hex_bytes('c02106070004') >>> >>> assert raw(terminate_ack) == terminate_ack_ref_data >>> >>> terminate_ack_pkt = PPP(terminate_ack_ref_data) >>> assert PPP_LCP_Terminate in terminate_ack_pkt >>> assert terminate_ack_pkt[PPP_LCP_Terminate].code == 6 >>> assert terminate_ack_pkt[PPP_LCP_Terminate].id == 7 >>> >>> assert terminate_ack_pkt.answers(terminate_request_pkt) >>> assert not terminate_request_pkt.answers(terminate_ack_pkt) ###### ## PPP PAP Tests ###### ###(014)=[passed] Test PPP PAP Request >>> pap_request = PPP() / PPP_PAP_Request(id=42, username='administrator', password='secret_password') >>> pap_request_ref_data = hex_bytes('c023012a00220d61646d696e6973747261746f720f7365637265745f70617373776f7264') >>> >>> assert raw(pap_request) == pap_request_ref_data >>> >>> pap_request_pkt = PPP(pap_request_ref_data) >>> assert PPP_PAP_Request in pap_request_pkt >>> assert pap_request_pkt[PPP_PAP_Request].code == 1 >>> assert pap_request_pkt[PPP_PAP_Request].id == 42 >>> assert pap_request_pkt[PPP_PAP_Request].username == b'administrator' >>> assert pap_request_pkt[PPP_PAP_Request].password == b'secret_password' >>> assert pap_request_pkt[PPP_PAP_Request].summary() in ['PAP-Request username=\'administrator\' password=\'secret_password\'', ... 'PAP-Request username=b\'administrator\' password=b\'secret_password\''] ###(015)=[passed] Test PPP PAP Authenticate-Ack >>> pap_response = PPP() / PPP_PAP(code='Authenticate-Ack', id=42) >>> pap_response_ref_data = hex_bytes('c023022a000500') >>> >>> assert raw(pap_response) == pap_response_ref_data >>> >>> pap_response_pkt = PPP(pap_response_ref_data) >>> assert PPP_PAP_Response in pap_response_pkt >>> assert pap_response_pkt[PPP_PAP_Response].code == 2 >>> assert pap_response_pkt[PPP_PAP_Response].id == 42 >>> assert pap_response_pkt[PPP_PAP_Response].msg_len == 0 >>> assert pap_response_pkt[PPP_PAP_Response].message == b'' >>> assert pap_response_pkt[PPP_PAP_Response].summary() == 'PAP-Ack' >>> >>> pap_request_pkt = PPP(hex_bytes('c023012a00220d61646d696e6973747261746f720f7365637265745f70617373776f7264')) >>> assert pap_response_pkt.answers(pap_request_pkt) >>> assert not pap_request_pkt.answers(pap_response_pkt) ###(016)=[passed] Test PPP PAP Authenticate-Nak >>> pap_response = PPP() / PPP_PAP(code=3, id=42, message='Bad password') >>> pap_response_ref_data = hex_bytes('c023032a00110c4261642070617373776f7264') >>> >>> assert raw(pap_response) == pap_response_ref_data >>> >>> pap_response_pkt = PPP(pap_response_ref_data) >>> assert PPP_PAP_Response in pap_response_pkt >>> assert pap_response_pkt[PPP_PAP_Response].code == 3 >>> assert pap_response_pkt[PPP_PAP_Response].id == 42 >>> assert pap_response_pkt[PPP_PAP_Response].msg_len == len('Bad password') >>> assert pap_response_pkt[PPP_PAP_Response].message == b'Bad password' >>> assert pap_response_pkt[PPP_PAP_Response].summary() in ['PAP-Nak msg=\'Bad password\'', 'PAP-Nak msg=b\'Bad password\''] >>> >>> pap_request_pkt = PPP(hex_bytes('c023012a00220d61646d696e6973747261746f720f7365637265745f70617373776f7264')) >>> assert pap_response_pkt.answers(pap_request_pkt) >>> assert not pap_request_pkt.answers(pap_response_pkt) ###### ## PPP CHAP Tests ###### ###(017)=[passed] Test PPP CHAP Challenge >>> chap_challenge = PPP() / PPP_CHAP(code=1, id=47, value=b'B' * 7, ... optional_name='server') >>> chap_challenge_ref_data = hex_bytes('c223012f00120742424242424242736572766572') >>> >>> assert raw(chap_challenge) == chap_challenge_ref_data >>> >>> chap_challenge_pkt = PPP(chap_challenge_ref_data) >>> assert PPP_CHAP_ChallengeResponse in chap_challenge_pkt >>> assert chap_challenge_pkt[PPP_CHAP_ChallengeResponse].code == 1 >>> assert chap_challenge_pkt[PPP_CHAP_ChallengeResponse].id == 47 >>> assert chap_challenge_pkt[PPP_CHAP_ChallengeResponse].value_size == 7 >>> assert chap_challenge_pkt[PPP_CHAP_ChallengeResponse].value == b'B' * 7 >>> assert chap_challenge_pkt[PPP_CHAP_ChallengeResponse].optional_name == b'server' >>> assert chap_challenge_pkt[PPP_CHAP_ChallengeResponse].summary() in ['CHAP challenge=0x42424242424242 optional_name=\'server\'', ... 'CHAP challenge=0x42424242424242 optional_name=b\'server\''] ###(018)=[passed] Test PPP CHAP Response >>> chap_response = PPP() / PPP_CHAP(code='Response', id=47, value=b'\x00' * 16, optional_name='client') >>> chap_response_ref_data = hex_bytes('c223022f001b1000000000000000000000000000000000636c69656e74') >>> >>> assert raw(chap_response) == chap_response_ref_data >>> >>> chap_response_pkt = PPP(chap_response_ref_data) >>> assert PPP_CHAP_ChallengeResponse in chap_response_pkt >>> assert chap_response_pkt[PPP_CHAP_ChallengeResponse].code == 2 >>> assert chap_response_pkt[PPP_CHAP_ChallengeResponse].id == 47 >>> assert chap_response_pkt[PPP_CHAP_ChallengeResponse].value_size == 16 >>> assert chap_response_pkt[PPP_CHAP_ChallengeResponse].value == b'\x00' * 16 >>> assert chap_response_pkt[PPP_CHAP_ChallengeResponse].optional_name == b'client' >>> assert chap_response_pkt[PPP_CHAP_ChallengeResponse].summary() in ['CHAP response=0x00000000000000000000000000000000 optional_name=\'client\'', ... 'CHAP response=0x00000000000000000000000000000000 optional_name=b\'client\''] >>> >>> chap_request = PPP(hex_bytes('c223012f00120742424242424242736572766572')) >>> >>> assert chap_response.answers(chap_challenge) >>> assert not chap_challenge.answers(chap_response) ###(019)=[passed] Test PPP CHAP Success >>> chap_success = PPP() / PPP_CHAP(code='Success', id=47) >>> chap_success_ref_data = hex_bytes('c223032f0004') >>> >>> assert raw(chap_success) == chap_success_ref_data >>> >>> chap_success_pkt = PPP(chap_success_ref_data) >>> assert PPP_CHAP in chap_success_pkt >>> assert chap_success_pkt[PPP_CHAP].code == 3 >>> assert chap_success_pkt[PPP_CHAP].id == 47 >>> assert chap_success_pkt[PPP_CHAP].data == b'' >>> assert chap_success_pkt[PPP_CHAP].summary() in ['CHAP Success message=\'\'', 'CHAP Success message=b\'\''] >>> >>> chap_response_pkt = PPP(hex_bytes('c223022f001b1000000000000000000000000000000000636c69656e74')) >>> >>> assert chap_success_pkt.answers(chap_response_pkt) >>> assert not chap_response_pkt.answers(chap_success_pkt) ###(020)=[passed] Test PPP CHAP Failure >>> chap_failure = PPP() / PPP_CHAP(code='Failure', id=47, data='Go away') >>> chap_failure_ref_data = hex_bytes('c223042f000b476f2061776179') >>> >>> assert raw(chap_failure) == chap_failure_ref_data >>> >>> chap_failure_pkt = PPP(chap_failure_ref_data) >>> assert PPP_CHAP in chap_failure_pkt >>> assert chap_failure_pkt[PPP_CHAP].code == 4 >>> assert chap_failure_pkt[PPP_CHAP].id == 47 >>> assert chap_failure_pkt[PPP_CHAP].data == b'Go away' >>> assert chap_failure_pkt[PPP_CHAP].summary() in ['CHAP Failure message=\'Go away\'', 'CHAP Failure message=b\'Go away\''] >>> >>> chap_response_pkt = PPP(hex_bytes('c223022f001b1000000000000000000000000000000000636c69656e74')) >>> >>> assert chap_failure_pkt.answers(chap_response_pkt) >>> assert not chap_failure_pkt.answers(chap_success_pkt) ###### ## PPTP Tests ###### ###(021)=[passed] Test PPTP Start-Control-Connection-Request >>> start_control_connection = PPTPStartControlConnectionRequest(framing_capabilities='Asynchronous Framing supported', ... bearer_capabilities='Digital access supported', ... maximum_channels=42, ... firmware_revision=47, ... host_name='test host name', ... vendor_string='test vendor string') >>> start_control_connection_ref_data = hex_bytes('009c00011a2b3c4d00010000010000000000000100000002002a00'\ ... '2f7465737420686f7374206e616d65000000000000000000000000'\ ... '000000000000000000000000000000000000000000000000000000'\ ... '0000000000000000000000746573742076656e646f722073747269'\ ... '6e6700000000000000000000000000000000000000000000000000'\ ... '000000000000000000000000000000000000000000') >>> >>> assert raw(start_control_connection) == start_control_connection_ref_data >>> >>> start_control_connection_pkt = PPTP(start_control_connection_ref_data) >>> >>> assert isinstance(start_control_connection_pkt, PPTPStartControlConnectionRequest) >>> assert start_control_connection_pkt.magic_cookie == 0x1a2b3c4d >>> assert start_control_connection_pkt.protocol_version == 0x0100 >>> assert start_control_connection_pkt.framing_capabilities == 1 >>> assert start_control_connection_pkt.bearer_capabilities == 2 >>> assert start_control_connection_pkt.maximum_channels == 42 >>> assert start_control_connection_pkt.firmware_revision == 47 >>> assert start_control_connection_pkt.host_name == b'test host name' + b'\0' * (64-len('test host name')) >>> assert start_control_connection_pkt.vendor_string == b'test vendor string' + b'\0' * (64-len('test vendor string')) ###(022)=[passed] Test PPTP Start-Control-Connection-Reply >>> start_control_connection_reply = PPTPStartControlConnectionReply(result_code='General error', ... error_code='Not-Connected', ... framing_capabilities='Synchronous Framing supported', ... bearer_capabilities='Analog access supported', ... vendor_string='vendor') >>> start_control_connection_reply_ref_data = hex_bytes('009c00011a2b3c4d00020000010002010000000200000001ffff0'\ ... '1006c696e75780000000000000000000000000000000000000000'\ ... '00000000000000000000000000000000000000000000000000000'\ ... '000000000000000000000000076656e646f720000000000000000'\ ... '00000000000000000000000000000000000000000000000000000'\ ... '00000000000000000000000000000000000000000000000') >>> >>> assert raw(start_control_connection_reply) == start_control_connection_reply_ref_data >>> >>> start_control_connection_reply_pkt = PPTP(start_control_connection_reply_ref_data) >>> >>> assert isinstance(start_control_connection_reply_pkt, PPTPStartControlConnectionReply) >>> assert start_control_connection_reply_pkt.magic_cookie == 0x1a2b3c4d >>> assert start_control_connection_reply_pkt.protocol_version == 0x0100 >>> assert start_control_connection_reply_pkt.result_code == 2 >>> assert start_control_connection_reply_pkt.error_code == 1 >>> assert start_control_connection_reply_pkt.framing_capabilities == 2 >>> assert start_control_connection_reply_pkt.bearer_capabilities == 1 >>> assert start_control_connection_reply_pkt.host_name == b'linux' + b'\0' * (64-len('linux')) >>> assert start_control_connection_reply_pkt.vendor_string == b'vendor' + b'\0' * (64-len('vendor')) >>> >>> start_control_connection_request = PPTPStartControlConnectionRequest() >>> >>> assert start_control_connection_reply_pkt.answers(start_control_connection_request) >>> assert not start_control_connection_request.answers(start_control_connection_reply_pkt) ###(023)=[passed] Test PPTP Stop-Control-Connection-Request >>> stop_control_connection = PPTPStopControlConnectionRequest(reason='Stop-Local-Shutdown') >>> stop_control_connection_ref_data = hex_bytes('001000011a2b3c4d0003000003000000') >>> >>> assert raw(stop_control_connection) == stop_control_connection_ref_data >>> >>> stop_control_connection_pkt = PPTP(stop_control_connection_ref_data) >>> >>> assert isinstance(stop_control_connection_pkt, PPTPStopControlConnectionRequest) >>> assert stop_control_connection_pkt.magic_cookie == 0x1a2b3c4d >>> assert stop_control_connection_pkt.reason == 3 ###(024)=[passed] Test PPTP Stop-Control-Connection-Reply >>> stop_control_connection_reply = PPTPStopControlConnectionReply(result_code='General error',error_code='PAC-Error') >>> stop_control_connection_reply_ref_data = hex_bytes('001000011a2b3c4d0004000002060000') >>> >>> assert raw(stop_control_connection_reply) == stop_control_connection_reply_ref_data >>> >>> stop_control_connection_reply_pkt = PPTP(stop_control_connection_reply_ref_data) >>> >>> assert isinstance(stop_control_connection_reply_pkt, PPTPStopControlConnectionReply) >>> assert stop_control_connection_reply_pkt.magic_cookie == 0x1a2b3c4d >>> assert stop_control_connection_reply_pkt.result_code == 2 >>> assert stop_control_connection_reply_pkt.error_code == 6 >>> >>> stop_control_connection_request = PPTPStopControlConnectionRequest() >>> >>> assert stop_control_connection_reply_pkt.answers(stop_control_connection_request) >>> assert not stop_control_connection_request.answers(stop_control_connection_reply_pkt) ###(025)=[passed] Test PPTP Echo-Request >>> echo_request = PPTPEchoRequest(identifier=42) >>> echo_request_ref_data = hex_bytes('001000011a2b3c4d000500000000002a') >>> >>> assert raw(echo_request) == echo_request_ref_data >>> >>> echo_request_pkt = PPTP(echo_request_ref_data) >>> >>> assert isinstance(echo_request_pkt, PPTPEchoRequest) >>> assert echo_request_pkt.magic_cookie == 0x1a2b3c4d >>> assert echo_request_pkt.identifier == 42 ###(026)=[passed] Test PPTP Echo-Reply >>> echo_reply = PPTPEchoReply(identifier=42, result_code='OK') >>> echo_reply_ref_data = hex_bytes('001400011a2b3c4d000600000000002a01000000') >>> >>> assert raw(echo_reply) == echo_reply_ref_data >>> >>> echo_reply_pkt = PPTP(echo_reply_ref_data) >>> >>> assert isinstance(echo_reply_pkt, PPTPEchoReply) >>> assert echo_reply_pkt.magic_cookie == 0x1a2b3c4d >>> assert echo_reply_pkt.identifier == 42 >>> assert echo_reply_pkt.result_code == 1 >>> assert echo_reply_pkt.error_code == 0 >>> >>> echo_request = PPTPEchoRequest(identifier=42) >>> >>> assert echo_reply_pkt.answers(echo_request) >>> assert not echo_request.answers(echo_reply) >>> >>> echo_request_incorrect = PPTPEchoRequest(identifier=47) >>> >>> assert not echo_reply_pkt.answers(echo_request_incorrect) >>> assert not echo_request_incorrect.answers(echo_reply_pkt) ###(027)=[passed] Test PPTP Outgoing-Call-Request >>> outgoing_call = PPTPOutgoingCallRequest(call_id=4242, call_serial_number=47, ... minimum_bps=1000, maximum_bps=10000, ... bearer_type='Digital channel', ... pkt_window_size=16, pkt_proc_delay=1, ... phone_number_len=9, phone_number='123456789', ... subaddress='test') >>> outgoing_call_ref_data = hex_bytes('00a800011a2b3c4d000700001092002f000003e8000027100000000200'\ ... '0000030010000100090000313233343536373839000000000000000000'\ ... '0000000000000000000000000000000000000000000000000000000000'\ ... '0000000000000000000000000000000000746573740000000000000000'\ ... '0000000000000000000000000000000000000000000000000000000000'\ ... '0000000000000000000000000000000000000000000000') >>> >>> assert raw(outgoing_call) == outgoing_call_ref_data >>> >>> outgoing_call_pkt = PPTP(outgoing_call_ref_data) >>> >>> assert isinstance(outgoing_call_pkt, PPTPOutgoingCallRequest) >>> assert outgoing_call_pkt.magic_cookie == 0x1a2b3c4d >>> assert outgoing_call_pkt.call_id == 4242 >>> assert outgoing_call_pkt.call_serial_number == 47 >>> assert outgoing_call_pkt.minimum_bps == 1000 >>> assert outgoing_call_pkt.maximum_bps == 10000 >>> assert outgoing_call_pkt.bearer_type == 2 >>> assert outgoing_call_pkt.framing_type == 3 >>> assert outgoing_call_pkt.pkt_window_size == 16 >>> assert outgoing_call_pkt.pkt_proc_delay == 1 >>> assert outgoing_call_pkt.phone_number_len == 9 >>> assert outgoing_call_pkt.phone_number == b'123456789' + b'\0' * (64-len('123456789')) >>> assert outgoing_call_pkt.subaddress == b'test' + b'\0' * (64-len('test')) ###(028)=[passed] Test PPTP Outgoing-Call-Reply >>> outgoing_call_reply = PPTPOutgoingCallReply(call_id=4243, peer_call_id=4242, ... result_code='Busy', error_code='No-Resource', ... cause_code=42, connect_speed=5000, ... pkt_window_size=32, pkt_proc_delay=3, ... channel_id=42) >>> outgoing_call_reply_ref_data = hex_bytes('002000011a2b3c4d00080000109310920404002a00001388002000030000002a') >>> >>> assert raw(outgoing_call_reply) == outgoing_call_reply_ref_data >>> >>> outgoing_call_reply_pkt = PPTP(outgoing_call_reply_ref_data) >>> >>> assert isinstance(outgoing_call_reply_pkt, PPTPOutgoingCallReply) >>> assert outgoing_call_reply_pkt.magic_cookie == 0x1a2b3c4d >>> assert outgoing_call_reply_pkt.call_id == 4243 >>> assert outgoing_call_reply_pkt.peer_call_id == 4242 >>> assert outgoing_call_reply_pkt.result_code == 4 >>> assert outgoing_call_reply_pkt.error_code == 4 >>> assert outgoing_call_reply_pkt.cause_code == 42 >>> assert outgoing_call_reply_pkt.connect_speed == 5000 >>> assert outgoing_call_reply_pkt.pkt_window_size == 32 >>> assert outgoing_call_reply_pkt.pkt_proc_delay == 3 >>> assert outgoing_call_reply_pkt.channel_id == 42 >>> >>> outgoing_call_request = PPTPOutgoingCallRequest(call_id=4242) >>> >>> assert outgoing_call_reply_pkt.answers(outgoing_call_request) >>> assert not outgoing_call_request.answers(outgoing_call_reply_pkt) >>> >>> outgoing_call_request_incorrect = PPTPOutgoingCallRequest(call_id=5656) >>> >>> assert not outgoing_call_reply_pkt.answers(outgoing_call_request_incorrect) >>> assert not outgoing_call_request_incorrect.answers(outgoing_call_reply_pkt) ###(029)=[passed] Test PPTP Incoming-Call-Request >>> incoming_call = PPTPIncomingCallRequest(call_id=4242, call_serial_number=47, bearer_type='Digital channel', ... channel_id=12, dialed_number_len=9, dialing_number_len=10, ... dialed_number='123456789', dialing_number='0123456789', ... subaddress='test') >>> incoming_call_ref_data = hex_bytes('00dc00011a2b3c4d000900001092002f000000020000000c0009000a313233343536373839'\ ... '00000000000000000000000000000000000000000000000000000000000000000000000000'\ ... '00000000000000000000000000000000000030313233343536373839000000000000000000'\ ... '00000000000000000000000000000000000000000000000000000000000000000000000000'\ ... '00000000000000007465737400000000000000000000000000000000000000000000000000'\ ... '0000000000000000000000000000000000000000000000000000000000000000000000') >>> >>> assert raw(incoming_call) == incoming_call_ref_data >>> >>> incoming_call_pkt = PPTP(incoming_call_ref_data) >>> >>> assert isinstance(incoming_call_pkt, PPTPIncomingCallRequest) >>> assert incoming_call_pkt.magic_cookie == 0x1a2b3c4d >>> assert incoming_call_pkt.call_id == 4242 >>> assert incoming_call_pkt.call_serial_number == 47 >>> assert incoming_call_pkt.bearer_type == 2 >>> assert incoming_call_pkt.channel_id == 12 >>> assert incoming_call_pkt.dialed_number_len == 9 >>> assert incoming_call_pkt.dialing_number_len == 10 >>> assert incoming_call_pkt.dialed_number == b'123456789' + b'\0' * (64-len('123456789')) >>> assert incoming_call_pkt.dialing_number == b'0123456789' + b'\0' * (64-len('0123456879')) >>> assert incoming_call_pkt.subaddress == b'test' + b'\0' * (64-len('test')) ###(030)=[passed] Test PPTP Incoming-Call-Reply >>> incoming_call_reply = PPTPIncomingCallReply(call_id=4243, peer_call_id=4242, result_code='Connected', ... error_code='None', pkt_window_size=16, pkt_transmit_delay=42) >>> incoming_call_reply_ref_data = hex_bytes('009400011a2b3c4d000a00001093109201000010002a0000') >>> >>> assert raw(incoming_call_reply) == incoming_call_reply_ref_data >>> >>> incoming_call_reply_pkt = PPTP(incoming_call_reply_ref_data) >>> assert isinstance(incoming_call_reply_pkt, PPTPIncomingCallReply) >>> assert incoming_call_reply_pkt.magic_cookie == 0x1a2b3c4d >>> assert incoming_call_reply_pkt.call_id == 4243 >>> assert incoming_call_reply_pkt.peer_call_id == 4242 >>> assert incoming_call_reply_pkt.result_code == 1 >>> assert incoming_call_reply_pkt.error_code == 0 >>> assert incoming_call_reply_pkt.pkt_window_size == 16 >>> assert incoming_call_reply_pkt.pkt_transmit_delay == 42 >>> >>> incoming_call_req = PPTPIncomingCallRequest(call_id=4242) >>> >>> assert incoming_call_reply_pkt.answers(incoming_call_req) >>> assert not incoming_call_req.answers(incoming_call_reply) >>> >>> incoming_call_req_incorrect = PPTPIncomingCallRequest(call_id=4343) >>> assert not incoming_call_reply_pkt.answers(incoming_call_req_incorrect) >>> assert not incoming_call_req_incorrect.answers(incoming_call_reply_pkt) ###(031)=[passed] Test PPTP Incoming-Call-Connected >>> incoming_call_connected = PPTPIncomingCallConnected(peer_call_id=4242, connect_speed=47474747, ... pkt_window_size=16, pkt_transmit_delay=7, ... framing_type='Any type of framing') >>> incoming_call_connected_ref_data = hex_bytes('001c00011a2b3c4d000b00001092000002d4683b0010000700000003') >>> >>> assert raw(incoming_call_connected) == incoming_call_connected_ref_data >>> >>> incoming_call_connected_pkt = PPTP(incoming_call_connected_ref_data) >>> assert isinstance(incoming_call_connected_pkt, PPTPIncomingCallConnected) >>> assert incoming_call_connected_pkt.magic_cookie == 0x1a2b3c4d >>> assert incoming_call_connected_pkt.peer_call_id == 4242 >>> assert incoming_call_connected_pkt.connect_speed == 47474747 >>> assert incoming_call_connected_pkt.pkt_window_size == 16 >>> assert incoming_call_connected_pkt.pkt_transmit_delay == 7 >>> assert incoming_call_connected_pkt.framing_type == 3 >>> >>> incoming_call_reply = PPTPIncomingCallReply(call_id=4242) >>> >>> assert incoming_call_connected_pkt.answers(incoming_call_reply) >>> assert not incoming_call_reply.answers(incoming_call_connected_pkt) >>> >>> incoming_call_reply_incorrect = PPTPIncomingCallReply(call_id=4243) >>> >>> assert not incoming_call_connected_pkt.answers(incoming_call_reply_incorrect) >>> assert not incoming_call_reply_incorrect.answers(incoming_call_connected_pkt) ###(032)=[passed] Test PPTP Call-Clear-Request >>> call_clear_request = PPTPCallClearRequest(call_id=4242) >>> call_clear_request_ref_data = hex_bytes('001000011a2b3c4d000c000010920000') >>> >>> assert raw(call_clear_request) == call_clear_request_ref_data >>> >>> call_clear_request_pkt = PPTP(call_clear_request_ref_data) >>> >>> assert isinstance(call_clear_request_pkt, PPTPCallClearRequest) >>> assert call_clear_request_pkt.magic_cookie == 0x1a2b3c4d >>> assert call_clear_request_pkt.call_id == 4242 ###(033)=[passed] Test PPTP Call-Disconnect-Notify >>> call_disconnect_notify = PPTPCallDisconnectNotify(call_id=4242, result_code='Admin Shutdown', error_code='None', ... cause_code=47, call_statistic='some description') >>> call_disconnect_notify_ref_data = hex_bytes('009400011a2b3c4d000d000010920300002f0000736f6d65206465736372697074696'\ ... 'f6e000000000000000000000000000000000000000000000000000000000000000000'\ ... '000000000000000000000000000000000000000000000000000000000000000000000'\ ... '000000000000000000000000000000000000000000000000000000000000000000000'\ ... '00000000000000000000') >>> >>> assert raw(call_disconnect_notify) == call_disconnect_notify_ref_data >>> >>> call_disconnect_notify_pkt = PPTP(call_disconnect_notify_ref_data) >>> >>> assert isinstance(call_disconnect_notify_pkt, PPTPCallDisconnectNotify) >>> assert call_disconnect_notify_pkt.magic_cookie == 0x1a2b3c4d >>> assert call_disconnect_notify_pkt.call_id == 4242 >>> assert call_disconnect_notify_pkt.result_code == 3 >>> assert call_disconnect_notify_pkt.error_code == 0 >>> assert call_disconnect_notify_pkt.cause_code == 47 >>> assert call_disconnect_notify_pkt.call_statistic == b'some description' + b'\0' * (128-len('some description')) ###(034)=[passed] Test PPTP WAN-Error-Notify >>> wan_error_notify = PPTPWANErrorNotify(peer_call_id=4242, crc_errors=1, framing_errors=2, ... hardware_overruns=3, buffer_overruns=4, time_out_errors=5, ... alignment_errors=6) >>> wan_error_notify_ref_data = hex_bytes('002800011a2b3c4d000e000010920000000000010000000200000003000000040000000500000006') >>> >>> assert raw(wan_error_notify) == wan_error_notify_ref_data >>> >>> wan_error_notify_pkt = PPTP(wan_error_notify_ref_data) >>> >>> assert isinstance(wan_error_notify_pkt, PPTPWANErrorNotify) >>> assert wan_error_notify_pkt.magic_cookie == 0x1a2b3c4d >>> assert wan_error_notify_pkt.peer_call_id == 4242 >>> assert wan_error_notify_pkt.crc_errors == 1 >>> assert wan_error_notify_pkt.framing_errors == 2 >>> assert wan_error_notify_pkt.hardware_overruns == 3 >>> assert wan_error_notify_pkt.buffer_overruns == 4 ###(035)=[passed] Test PPTP Set-Link-Info >>> set_link_info = PPTPSetLinkInfo(peer_call_id=4242, send_accm=0x0f0f0f0f, receive_accm=0xf0f0f0f0) >>> set_link_info_ref_data = hex_bytes('001800011a2b3c4d000f0000109200000f0f0f0ff0f0f0f0') >>> >>> assert raw(set_link_info) == set_link_info_ref_data >>> >>> set_link_info_pkt = PPTP(set_link_info_ref_data) >>> >>> assert isinstance(set_link_info_pkt, PPTPSetLinkInfo) >>> assert set_link_info_pkt.magic_cookie == 0x1a2b3c4d >>> assert set_link_info_pkt.peer_call_id == 4242 >>> assert set_link_info_pkt.send_accm == 0x0f0f0f0f >>> assert set_link_info_pkt.receive_accm == 0xf0f0f0f0 Scapy Radius layer tests ━ Run at 01:42:23 from [test/scapy/layers/radius.uts] by UTscapy in 0.05936026573181152 └ Passed=15 └ Failed=0 ###### ## RADIUS tests ###### ###(000)=[passed] IP/UDP/RADIUS - Build >>> s = raw(IP()/UDP(sport=1812)/Radius(authenticator="scapy")/RadiusAttribute(value="scapy")) >>> s == b'E\x00\x007\x00\x01\x00\x00@\x11|\xb3\x7f\x00\x00\x01\x7f\x00\x00\x01\x07\x14\x07\x14\x00#U\xb3\x01\x00\x00\x1bscapy\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x07scapy' True ###(001)=[passed] IP/UDP/RADIUS - Dissection >>> p = IP(s) >>> Radius in p and len(p[Radius].attributes) == 1 and p[Radius].attributes[0].value == b"scapy" True ###(002)=[passed] RADIUS - Access-Request - Dissection (1) >>> s = b'\x01\xae\x01\x17>k\xd4\xc4\x19V\x0b*1\x99\xc8D\xea\xc2\x94Z\x01\x06leap\x06\x06\x00\x00\x00\x02\x1a\x1b\x00\x00\x00\t\x01\x15service-type=Framed\x0c\x06\x00\x00#\xee\x1e\x13AC-7E-8A-4E-E2-92\x1f\x1300-26-73-9E-0F-D3O\x0b\x02\x01\x00\t\x01leapP\x12U\xbc\x12\xcdM\x00\xf8\xdb4\xf1\x18r\xca_\x8c\xf6f\x02\x1a1\x00\x00\x00\t\x01+audit-session-id=0AC8090E0000001A0354CA00\x1a\x14\x00\x00\x00\t\x01\x0emethod=dot1x\x08\x06\xc0\xa8\n\xb9\x04\x06\xc0\xa8\n\x80\x1a\x1d\x00\x00\x00\t\x02\x17GigabitEthernet1/0/18W\x17GigabitEthernet1/0/18=\x06\x00\x00\x00\x0f\x05\x06\x00\x00\xc3\xc6' >>> radius_packet = Radius(s) >>> assert radius_packet.id == 174 >>> assert radius_packet.len == 279 >>> assert radius_packet.authenticator == b'>k\xd4\xc4\x19V\x0b*1\x99\xc8D\xea\xc2\x94Z' >>> assert len(radius_packet.attributes) == 17 >>> assert radius_packet.attributes[0].type == 1 >>> assert type(radius_packet.attributes[0]) == RadiusAttr_User_Name >>> assert radius_packet.attributes[0].len == 6 >>> assert radius_packet.attributes[0].value == b"leap" >>> assert radius_packet.attributes[1].type == 6 >>> assert type(radius_packet.attributes[1]) == RadiusAttr_Service_Type >>> assert radius_packet.attributes[1].len == 6 >>> assert radius_packet.attributes[1].value == 2 >>> assert radius_packet.attributes[2].type == 26 >>> assert type(radius_packet.attributes[2]) == RadiusAttr_Vendor_Specific >>> assert radius_packet.attributes[2].len == 27 >>> assert radius_packet.attributes[2].vendor_id == 9 >>> assert radius_packet.attributes[2].vendor_type == 1 >>> assert radius_packet.attributes[2].vendor_len == 21 >>> assert radius_packet.attributes[2].value == b"service-type=Framed" >>> assert radius_packet.attributes[6].type == 79 >>> assert type(radius_packet.attributes[6]) == RadiusAttr_EAP_Message >>> assert radius_packet.attributes[6].len == 11 >>> assert radius_packet.attributes[6].value.haslayer(EAP) >>> assert radius_packet.attributes[6].value[EAP].code == 2 >>> assert radius_packet.attributes[6].value[EAP].id == 1 >>> assert radius_packet.attributes[6].value[EAP].len == 9 >>> assert radius_packet.attributes[6].value[EAP].type == 1 >>> assert hasattr(radius_packet.attributes[6].value[EAP], "identity") >>> assert radius_packet.attributes[6].value[EAP].identity == b"leap" >>> assert radius_packet.attributes[7].type == 80 >>> assert type(radius_packet.attributes[7]) == RadiusAttr_Message_Authenticator >>> assert radius_packet.attributes[7].len == 18 >>> assert radius_packet.attributes[7].value == b'U\xbc\x12\xcdM\x00\xf8\xdb4\xf1\x18r\xca_\x8c\xf6' >>> assert radius_packet.attributes[11].type == 8 >>> assert type(radius_packet.attributes[11]) == RadiusAttr_Framed_IP_Address >>> assert radius_packet.attributes[11].len == 6 >>> assert radius_packet.attributes[11].value == '192.168.10.185' >>> assert radius_packet.attributes[16].type == 5 >>> assert type(radius_packet.attributes[16]) == RadiusAttr_NAS_Port >>> assert radius_packet.attributes[16].len == 6 >>> assert radius_packet.attributes[16].value == 50118 >>> >>> f,v = radius_packet.getfield_and_val("authenticator") >>> assert f.i2repr(None, v) == '3e6bd4c419560b2a3199c844eac2945a' ###(003)=[passed] RADIUS - compute_message_authenticator() >>> ram = radius_packet[RadiusAttr_Message_Authenticator] >>> assert ram.compute_message_authenticator(radius_packet, b"dummy bytes", b"scapy") == b'I\x85l\x8f\xa5\xd6\xbc\xb5\x08\xe0<\xebH\x9d\xfb?' ###(004)=[passed] RADIUS - Access-Challenge - Dissection (2) >>> s = b'\x0b\xae\x00[\xc7\xae\xfc6\xa1=\xb5\x99&^\xdf=\xe9\x00\xa6\xe8\x12\rHello, leapO\x16\x01\x02\x00\x14\x11\x01\x00\x08\xb8\xc4\x1a4\x97x\xd3\x82leapP\x12\xd3\x12\x17\xa6\x0c.\x94\x85\x03]t\xd1\xdb\xd0\x13\x8c\x18\x12iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO' >>> radius_packet = Radius(s) >>> assert radius_packet.id == 174 >>> assert radius_packet.len == 91 >>> assert radius_packet.authenticator == b'\xc7\xae\xfc6\xa1=\xb5\x99&^\xdf=\xe9\x00\xa6\xe8' >>> assert len(radius_packet.attributes) == 4 >>> assert radius_packet.attributes[0].type == 18 >>> assert type(radius_packet.attributes[0]) == RadiusAttribute >>> assert radius_packet.attributes[0].len == 13 >>> assert radius_packet.attributes[0].value == b"Hello, leap" >>> assert radius_packet.attributes[1].type == 79 >>> assert type(radius_packet.attributes[1]) == RadiusAttr_EAP_Message >>> assert radius_packet.attributes[1].len == 22 >>> assert radius_packet.attributes[1][EAP].code == 1 >>> assert radius_packet.attributes[1][EAP].id == 2 >>> assert radius_packet.attributes[1][EAP].len == 20 >>> assert radius_packet.attributes[1][EAP].type == 17 >>> assert radius_packet.attributes[2].type == 80 >>> assert type(radius_packet.attributes[2]) == RadiusAttr_Message_Authenticator >>> assert radius_packet.attributes[2].len == 18 >>> assert radius_packet.attributes[2].value == b'\xd3\x12\x17\xa6\x0c.\x94\x85\x03]t\xd1\xdb\xd0\x13\x8c' >>> assert radius_packet.attributes[3].type == 24 >>> assert type(radius_packet.attributes[3]) == RadiusAttr_State >>> assert radius_packet.attributes[3].len == 18 >>> assert radius_packet.attributes[3].value == b'iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO' ###(005)=[passed] RADIUS - Access-Request - Dissection (3) >>> s = b'\x01\xaf\x01DC\xbe!J\x08\xdf\xcf\x9f\x00v~,\xfb\x8e`\xc8\x01\x06leap\x06\x06\x00\x00\x00\x02\x1a\x1b\x00\x00\x00\t\x01\x15service-type=Framed\x0c\x06\x00\x00#\xee\x1e\x13AC-7E-8A-4E-E2-92\x1f\x1300-26-73-9E-0F-D3O&\x02\x02\x00$\x11\x01\x00\x18\rE\xc9\x92\xf6\x9ae\x04\xa2\x06\x13\x8f\x0b#\xf1\xc56\x8eU\xd9\x89\xe5\xa1)leapP\x12|\x1c\x9d[dv\x9c\x19\x96\xc6\xec\xb82\x8f\n f\x02\x1a1\x00\x00\x00\t\x01+audit-session-id=0AC8090E0000001A0354CA00\x1a\x14\x00\x00\x00\t\x01\x0emethod=dot1x\x08\x06\xc0\xa8\n\xb9\x04\x06\xc0\xa8\n\x80\x1a\x1d\x00\x00\x00\t\x02\x17GigabitEthernet1/0/18W\x17GigabitEthernet1/0/18=\x06\x00\x00\x00\x0f\x05\x06\x00\x00\xc3\xc6\x18\x12iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO' >>> radius_packet = Radius(s) >>> assert radius_packet.id == 175 >>> assert radius_packet.len == 324 >>> assert radius_packet.authenticator == b'C\xbe!J\x08\xdf\xcf\x9f\x00v~,\xfb\x8e`\xc8' >>> assert len(radius_packet.attributes) == 18 >>> assert radius_packet.attributes[0].type == 1 >>> assert type(radius_packet.attributes[0]) == RadiusAttr_User_Name >>> assert radius_packet.attributes[0].len == 6 >>> assert radius_packet.attributes[0].value == b"leap" >>> assert radius_packet.attributes[1].type == 6 >>> assert type(radius_packet.attributes[1]) == RadiusAttr_Service_Type >>> assert radius_packet.attributes[1].len == 6 >>> assert radius_packet.attributes[1].value == 2 >>> assert radius_packet.attributes[2].type == 26 >>> assert type(radius_packet.attributes[2]) == RadiusAttr_Vendor_Specific >>> assert radius_packet.attributes[2].len == 27 >>> assert radius_packet.attributes[2].vendor_id == 9 >>> assert radius_packet.attributes[2].vendor_type == 1 >>> assert radius_packet.attributes[2].vendor_len == 21 >>> assert radius_packet.attributes[2].value == b"service-type=Framed" >>> assert radius_packet.attributes[6].type == 79 >>> assert type(radius_packet.attributes[6]) == RadiusAttr_EAP_Message >>> assert radius_packet.attributes[6].len == 38 >>> assert radius_packet.attributes[6].value.haslayer(EAP) >>> assert radius_packet.attributes[6].value[EAP].code == 2 >>> assert radius_packet.attributes[6].value[EAP].id == 2 >>> assert radius_packet.attributes[6].value[EAP].len == 36 >>> assert radius_packet.attributes[6].value[EAP].type == 17 >>> assert radius_packet.attributes[7].type == 80 >>> assert type(radius_packet.attributes[7]) == RadiusAttr_Message_Authenticator >>> assert radius_packet.attributes[7].len == 18 >>> assert radius_packet.attributes[7].value == b'|\x1c\x9d[dv\x9c\x19\x96\xc6\xec\xb82\x8f\n ' >>> assert radius_packet.attributes[11].type == 8 >>> assert type(radius_packet.attributes[11]) == RadiusAttr_Framed_IP_Address >>> assert radius_packet.attributes[11].len == 6 >>> assert radius_packet.attributes[11].value == '192.168.10.185' >>> assert radius_packet.attributes[16].type == 5 >>> assert type(radius_packet.attributes[16]) == RadiusAttr_NAS_Port >>> assert radius_packet.attributes[16].len == 6 >>> assert radius_packet.attributes[16].value == 50118 >>> assert radius_packet.attributes[17].type == 24 >>> assert type(radius_packet.attributes[17]) == RadiusAttr_State >>> assert radius_packet.attributes[17].len == 18 >>> assert radius_packet.attributes[17].value == b'iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO' ###(006)=[passed] RADIUS - Access-Challenge - Dissection (4) >>> s = b'\x0b\xaf\x00K\x82 \x95=\xfd\x80\x05 -l}\xab)\xa5kU\x12\rHello, leapO\x06\x03\x03\x00\x04P\x12l0\xb9\x8d\xca\xfc!\xf3\xa7\x08\x80\xe1\xf6}\x84\xff\x18\x12iQs\xf7hRb@k\x9d,\xa0\x99\x8ehO' >>> radius_packet = Radius(s) >>> assert radius_packet.id == 175 >>> assert radius_packet.len == 75 >>> assert radius_packet.authenticator == b'\x82 \x95=\xfd\x80\x05 -l}\xab)\xa5kU' >>> assert len(radius_packet.attributes) == 4 >>> assert radius_packet.attributes[0].type == 18 >>> assert type(radius_packet.attributes[0]) == RadiusAttribute >>> assert radius_packet.attributes[0].len == 13 >>> assert radius_packet.attributes[0].value == b"Hello, leap" >>> assert radius_packet.attributes[1].type == 79 >>> assert type(radius_packet.attributes[1]) == RadiusAttr_EAP_Message >>> assert radius_packet.attributes[1].len == 6 >>> assert radius_packet.attributes[1][EAP].code == 3 >>> assert radius_packet.attributes[1][EAP].id == 3 >>> assert radius_packet.attributes[1][EAP].len == 4 >>> assert radius_packet.attributes[2].type == 80 >>> assert type(radius_packet.attributes[2]) == RadiusAttr_Message_Authenticator >>> assert radius_packet.attributes[2].len == 18 >>> assert radius_packet.attributes[2].value == b'l0\xb9\x8d\xca\xfc!\xf3\xa7\x08\x80\xe1\xf6}\x84\xff' >>> assert radius_packet.attributes[3].type == 24 >>> assert type(radius_packet.attributes[3]) == RadiusAttr_State >>> assert radius_packet.attributes[3].len == 18 >>> assert radius_packet.attributes[3].value == b'iQs\xf7hRb@k\x9d,\xa0\x99\x8ehO' ###(007)=[passed] RADIUS - Response Authenticator computation >>> s = b'\x01\xae\x01\x17>k\xd4\xc4\x19V\x0b*1\x99\xc8D\xea\xc2\x94Z\x01\x06leap\x06\x06\x00\x00\x00\x02\x1a\x1b\x00\x00\x00\t\x01\x15service-type=Framed\x0c\x06\x00\x00#\xee\x1e\x13AC-7E-8A-4E-E2-92\x1f\x1300-26-73-9E-0F-D3O\x0b\x02\x01\x00\t\x01leapP\x12U\xbc\x12\xcdM\x00\xf8\xdb4\xf1\x18r\xca_\x8c\xf6f\x02\x1a1\x00\x00\x00\t\x01+audit-session-id=0AC8090E0000001A0354CA00\x1a\x14\x00\x00\x00\t\x01\x0emethod=dot1x\x08\x06\xc0\xa8\n\xb9\x04\x06\xc0\xa8\n\x80\x1a\x1d\x00\x00\x00\t\x02\x17GigabitEthernet1/0/18W\x17GigabitEthernet1/0/18=\x06\x00\x00\x00\x0f\x05\x06\x00\x00\xc3\xc6' >>> access_request = Radius(s) >>> s = b'\x0b\xae\x00[\xc7\xae\xfc6\xa1=\xb5\x99&^\xdf=\xe9\x00\xa6\xe8\x12\rHello, leapO\x16\x01\x02\x00\x14\x11\x01\x00\x08\xb8\xc4\x1a4\x97x\xd3\x82leapP\x12\xd3\x12\x17\xa6\x0c.\x94\x85\x03]t\xd1\xdb\xd0\x13\x8c\x18\x12iQs\xf7iSb@k\x9d,\xa0\x99\x8ehO' >>> access_challenge = Radius(s) >>> access_challenge.compute_authenticator(access_request.authenticator, b"radiuskey") == access_challenge.authenticator True ###(008)=[passed] RADIUS - Layers (1) >>> radius_attr = RadiusAttr_EAP_Message(value = EAP()) >>> assert RadiusAttr_EAP_Message in radius_attr >>> assert RadiusAttribute in radius_attr >>> type(radius_attr[RadiusAttribute]) >>> assert type(radius_attr[RadiusAttribute]) == RadiusAttr_EAP_Message >>> assert EAP in radius_attr.value ###(009)=[passed] RADIUS - sessions (1) >>> p = IP()/TCP(sport=1812)/Radius(authenticator="scapy")/RadiusAttribute(value="scapy") >>> l = PacketList(p) >>> s = l.sessions() # Crashed on commit: e42ecdc54556c4852ca06b1a6da6c1ccbf3f522e >>> assert len(s) == 1 ###(010)=[passed] RADIUS - sessions (2) >>> p = IP()/UDP(sport=1812)/Radius(authenticator="scapy")/RadiusAttribute(value="scapy") >>> l = PacketList(p) >>> s = l.sessions() # Crashed on commit: e42ecdc54556c4852ca06b1a6da6c1ccbf3f522e >>> assert len(s) == 1 ###(011)=[passed] Issue GH#1407 >>> s = b"Z\xa5\xaaUZ\xa5\xaaU\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe9\xc5\x00\x00\x14'\x02\x00\x00\x001\x9a\xe44\xea4" >>> isinstance(Radius(s), Radius) True ###(012)=[passed] RADIUS - attributes with IPv4 addresses >>> r = raw(RadiusAttr_NAS_IP_Address()) >>> p = RadiusAttr_NAS_IP_Address(r) >>> assert p.type == 4 >>> >>> r = raw(RadiusAttr_Framed_IP_Address()) >>> p = RadiusAttr_Framed_IP_Address(r) >>> assert p.type == 8 ###(013)=[passed] Radius - fragmented EAP - GH2832 >>> conf.contribs["radius"] = {} >>> >>> s = b'\x0b\x1c\x04,%[\xa5\x11\x0b\xdc\x8f\x94\xf2\xe0\x01\x8a\xacNI\x8eO\xff\x01\x97\x00\xff\r\xc0\x00\x1a\x15\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4f\x03\x00P\x12n\x14\xd1\x9f\xa8\xf3\t\xe4\xc0\x82\xd6\x07AB\xd5\xf5\x18\x12\x19\xd6\x9eX\x05A\x93jo\x9a\t:\xa9g_\xc2' >>> >>> pkt = Radius(s) >>> assert len(pkt.attributes) == 3 >>> assert pkt.attributes[0].value.tls_data == b'\0' * 244 >>> assert pkt.attributes[1].type == 80 >>> assert pkt.attributes[1].len == 18 >>> assert pkt.attributes[2].type == 24 >>> assert pkt.attributes[2].len == 18 >>> >>> conf.contribs.setdefault("radius", {})["auto-defrag"] = False >>> >>> with no_debug_dissector(): ... pkt = Radius(s) ... >>> assert len(pkt.attributes) == 4 >>> assert pkt.attributes[0].type == 79 >>> assert pkt.attributes[1].type == 79 >>> assert pkt.attributes[1].value.load == b'\0' >>> assert pkt.attributes[2].type == 80 >>> assert pkt.attributes[2].len == 18 >>> assert pkt.attributes[3].type == 24 >>> assert pkt.attributes[3].len == 18 ###(014)=[passed] RadiusAttr_User_Password >>> r = b'\x01\x00\x00\x1c0x10x20x30x40x50\x02\x08geheim' >>> p = Radius(r) >>> assert isinstance(p.attributes[0], RadiusAttr_User_Password) RIP regression tests for Scapy ━ Run at 01:42:23 from [test/scapy/layers/rip.uts] by UTscapy in 0.006955385208129883 └ Passed=3 └ Failed=0 ###### ## RIP tests ###### ###(000)=[passed] RIP - build >>> s = raw(IP()/UDP(sport=520)/RIP()/RIPEntry()/RIPAuth(authtype=2, password="scapy")) >>> s == b'E\x00\x00H\x00\x01\x00\x00@\x11|\xa2\x7f\x00\x00\x01\x7f\x00\x00\x01\x02\x08\x02\x08\x004\xae\x99\x01\x01\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\x00\x02scapy\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(001)=[passed] RIP - UDP bindings >>> w = IP(raw(IP()/UDP()/RIP()/RIPEntry()/RIPAuth(authtype=2, password="scapy"))) >>> assert RIPAuth in w >>> assert w[RIPAuth].password.startswith(b"scapy") ###(002)=[passed] RIP - dissection >>> p = IP(s) >>> RIPEntry in p and RIPAuth in p and p[RIPAuth].password.startswith(b"scapy") True RTP regression tests for Scapy ━ Run at 01:42:23 from [test/scapy/layers/rtp.uts] by UTscapy in 0.012712955474853516 └ Passed=3 └ Failed=0 ###### ## RTP tests ###### ###(000)=[passed] test rtp with extension header >>> data = b'\x90o\x14~YY\xf5h\xcc#\xd7\xcfUH\x00\x03\x167116621 \x000\x00' >>> pkt = RTP(data) >>> assert "RTP" in pkt >>> parsed = pkt["RTP"] >>> assert parsed.version == 2 >>> assert parsed.extension >>> assert parsed.numsync == 0 >>> assert not parsed.marker >>> assert parsed.payload_type == 111 >>> assert parsed.sequence == 5246 >>> assert parsed.timestamp == 1499067752 >>> assert parsed.sourcesync == 0xcc23d7cf >>> assert "RTPExtension" in parsed, parsed.show() >>> assert parsed["RTPExtension"].header_id == 0x5548 >>> assert parsed["RTPExtension"].header == [0x16373131,0x36363231,0x20003000] ###(001)=[passed] test layer creation >>> created = RTP(extension=True, payload_type="PCMA", sequence=0x1234, timestamp=12345678, sourcesync=0xabcdef01) >>> created /= RTPExtension(header_id=0x4321, header=[0x11223344]) >>> assert raw(created) == b'\x90\x08\x124\x00\xbcaN\xab\xcd\xef\x01C!\x00\x01\x11"3D' >>> parsed = RTP(raw(created)) >>> assert parsed.payload_type == 8 >>> assert "RTPExtension" in parsed, parsed.show() >>> assert parsed["RTPExtension"].header == [0x11223344] ###(002)=[passed] test RTP without extension >>> created = RTP(extension=False, payload_type="DVI4", sequence=0x1234, timestamp=12345678, sourcesync=0xabcdef01) >>> assert raw(created) == b'\x80\x11\x124\x00\xbcaN\xab\xcd\xef\x01' >>> parsed = RTP(raw(created)) >>> assert parsed.sourcesync == 0xabcdef01 >>> assert "RTPExtension" not in parsed SCTP regression tests for Scapy ━ Run at 01:42:23 from [test/scapy/layers/sctp.uts] by UTscapy in 0.05207991600036621 └ Passed=31 └ Failed=0 ###### ## SCTP ###### ###(000)=[passed] SCTP - Chunk Init - build >>> s = raw(IP()/SCTP()/SCTPChunkInit(params=[SCTPChunkParamIPv4Addr()])) >>> s == b'E\x00\x00<\x00\x01\x00\x00@\x84|;\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00@,\x0b_\x01\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x08\x7f\x00\x00\x01' True ###(001)=[passed] SCTP - Chunk Init - dissection >>> p = IP(s) >>> SCTPChunkParamIPv4Addr in p and p[SCTP].chksum == 0x402c0b5f and p[SCTPChunkParamIPv4Addr].addr == "127.0.0.1" True ###(002)=[passed] SCTP - SCTPChunkSACK - build >>> s = raw(IP()/SCTP()/SCTPChunkSACK(gap_ack_list=["7:28"])) >>> s == b'E\x00\x004\x00\x01\x00\x00@\x84|C\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00;\x01\xd4\x04\x03\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x07\x00\x1c' True ###(003)=[passed] SCTP - SCTPChunkSACK - dissection >>> p = IP(s) >>> SCTPChunkSACK in p and p[SCTP].chksum == 0x3b01d404 and p[SCTPChunkSACK].gap_ack_list[0] == "7:28" True ###(004)=[passed] SCTP - answers >>> (IP()/SCTP()).answers(IP()/SCTP()) == True True ###(005)=[passed] SCTP basic header - Dissection >>> blob = b"\x1A\x85\x26\x94\x00\x00\x00\x0D\x00\x00\x04\xD2" >>> p = SCTP(blob) >>> assert p.dport == 9876 >>> assert p.sport == 6789 >>> assert p.tag == 13 >>> assert p.chksum == 1234 ###(006)=[passed] basic SCTPChunkData - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x61\x74\x61" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkData) >>> assert p.reserved == 0 >>> assert p.delay_sack == 0 >>> assert p.unordered == 0 >>> assert p.beginning == 0 >>> assert p.ending == 0 >>> assert p.tsn == 0 >>> assert p.stream_id == 0 >>> assert p.stream_seq == 0 >>> assert p.len == (len("data") + 16) >>> assert p.data == b"data" ###(007)=[passed] basic SCTPChunkIData - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x02\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x64\x61\x74\x61" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkIData) >>> assert p.reserved == 0 >>> assert p.delay_sack == 0 >>> assert p.unordered == 0 >>> assert p.beginning == 1 >>> assert p.ending == 0 >>> assert p.tsn == 0 >>> assert p.stream_id == 0 >>> assert p.reserved_16 == 0 >>> assert p.ppid_fsn == 2 >>> assert p.len == (len("data") + 20) >>> assert p.data == b"data" ###(008)=[passed] basic SCTPChunkForwardTSN - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x10\x00\x00\x1e\x61\x00\x0a\x00\x01\x00\x0b\x00\x02" >>> p = SCTP(blob).lastlayer() >>> skip1 = SCTPForwardSkip(p.skips[0].load[0:4]) >>> skip2 = SCTPForwardSkip(p.skips[0].load[4::]) >>> assert isinstance(p, SCTPChunkForwardTSN) >>> assert p.len == 16 >>> assert p.new_tsn == 7777 >>> assert skip1.stream_id == 10 >>> assert skip1.stream_seq == 1 >>> assert skip2.stream_id == 11 >>> assert skip2.stream_seq == 2 ###(009)=[passed] basic SCTPChunkIForwardTSN - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc2\x00\x00\x18\x00\x00\x1e\x61\x00\x0a\x00\x00\x00\x00\x00\x14\x00\x0b\x00\x01\x00\x00\x00\x15" >>> p = SCTP(blob).lastlayer() >>> skip1 = SCTPIForwardSkip(p.skips[0].load[0:8]) >>> skip2 = SCTPIForwardSkip(p.skips[0].load[8::]) >>> assert isinstance(p, SCTPChunkIForwardTSN) >>> assert p.len == 24 >>> assert p.new_tsn == 7777 >>> assert skip1.stream_id == 10 >>> assert skip1.reserved == 0 >>> assert skip1.unordered == 0 >>> assert skip1.message_id == 20 >>> assert skip2.stream_id == 11 >>> assert skip2.reserved == 0 >>> assert skip2.unordered == 1 >>> assert skip2.message_id == 21 ###(010)=[passed] basic SCTPChunkInit - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkInit) >>> assert p.flags == 0 >>> assert p.len == 20 >>> assert p.init_tag == 0 >>> assert p.a_rwnd == 0 >>> assert p.n_out_streams == 0 >>> assert p.n_in_streams == 0 >>> assert p.init_tsn == 0 >>> assert p.params == [] ###(011)=[passed] SCTPChunkInit multiple valid parameters - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x5C\x00\x00\x00\x65\x00\x00\x00\x66\x00\x67\x00\x68\x00\x00\x00\x69\x00\x0C\x00\x06\x00\x05\x00\x00\x80\x00\x00\x04\xC0\x00\x00\x04\x80\x08\x00\x07\x0F\xC1\x80\x00\x80\x03\x00\x04\x80\x02\x00\x24\x87\x77\x21\x29\x3F\xDA\x62\x0C\x06\x6F\x10\xA5\x39\x58\x60\x98\x4C\xD4\x59\xD8\x8A\x00\x85\xFB\x9E\x2E\x66\xBA\x3A\x23\x54\xEF\x80\x04\x00\x06\x00\x01\x00\x00" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkInit) >>> assert p.flags == 0 >>> assert p.len == 92 >>> assert p.init_tag == 101 >>> assert p.a_rwnd == 102 >>> assert p.n_out_streams == 103 >>> assert p.n_in_streams == 104 >>> assert p.init_tsn == 105 >>> assert len(p.params) == 7 >>> params = {type(param): param for param in p.params} >>> assert (set(params.keys()) == {SCTPChunkParamECNCapable, SCTPChunkParamFwdTSN, ... SCTPChunkParamSupportedExtensions, SCTPChunkParamChunkList, ... SCTPChunkParamRandom, SCTPChunkParamRequestedHMACFunctions, ... SCTPChunkParamSupportedAddrTypes}) >>> assert params[SCTPChunkParamECNCapable] == SCTPChunkParamECNCapable() >>> assert params[SCTPChunkParamFwdTSN] == SCTPChunkParamFwdTSN() >>> assert params[SCTPChunkParamSupportedExtensions] == SCTPChunkParamSupportedExtensions(len=7) >>> assert params[SCTPChunkParamChunkList] == SCTPChunkParamChunkList(len=4) >>> assert params[SCTPChunkParamRandom].len == 4+32 >>> assert len(params[SCTPChunkParamRandom].random) == 32 >>> assert params[SCTPChunkParamRequestedHMACFunctions] == SCTPChunkParamRequestedHMACFunctions(len=6) >>> assert params[SCTPChunkParamSupportedAddrTypes] == SCTPChunkParamSupportedAddrTypes(len=6) ###(012)=[passed] basic SCTPChunkInitAck - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkInitAck) >>> assert p.flags == 0 >>> assert p.len == 20 >>> assert p.init_tag == 0 >>> assert p.a_rwnd == 0 >>> assert p.n_out_streams == 0 >>> assert p.n_in_streams == 0 >>> assert p.init_tsn == 0 >>> assert p.params == [] ###(013)=[passed] SCTPChunkInitAck with state cookie - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x4C\x00\x00\x00\x65\x00\x00\x00\x66\x00\x67\x00\x68\x00\x00\x00\x69\x80\x00\x00\x04\x00\x0B\x00\x0D\x6C\x6F\x63\x61\x6C\x68\x6F\x73\x74\x00\x00\x00\xC0\x00\x00\x04\x80\x08\x00\x07\x0F\xC1\x80\x00\x00\x07\x00\x14\x00\x10\x9E\xB2\x86\xCE\xE1\x7D\x0F\x6A\xAD\xFD\xB3\x5D\xBC\x00" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkInitAck) >>> assert p.flags == 0 >>> assert p.len == 76 >>> assert p.init_tag == 101 >>> assert p.a_rwnd == 102 >>> assert p.n_out_streams == 103 >>> assert p.n_in_streams == 104 >>> assert p.init_tsn == 105 >>> assert len(p.params) == 5 >>> params = {type(param): param for param in p.params} >>> assert (set(params.keys()) == {SCTPChunkParamECNCapable, SCTPChunkParamHostname, ... SCTPChunkParamFwdTSN, SCTPChunkParamSupportedExtensions, ... SCTPChunkParamStateCookie}) >>> assert params[SCTPChunkParamECNCapable] == SCTPChunkParamECNCapable() >>> assert raw(params[SCTPChunkParamHostname]) == raw(SCTPChunkParamHostname(len=13, hostname="localhost")) >>> assert params[SCTPChunkParamFwdTSN] == SCTPChunkParamFwdTSN() >>> assert params[SCTPChunkParamSupportedExtensions] == SCTPChunkParamSupportedExtensions(len=7) >>> assert params[SCTPChunkParamStateCookie].len == 4+16 >>> assert len(params[SCTPChunkParamStateCookie].cookie) == 16 ###(014)=[passed] basic SCTPChunkSACK - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkSACK) >>> assert p.flags == 0 >>> assert p.len == 16 >>> assert p.cumul_tsn_ack == 0 >>> assert p.a_rwnd == 0 >>> assert p.n_gap_ack == 0 >>> assert p.n_dup_tsn == 0 >>> assert p.gap_ack_list == [] >>> assert p.dup_tsn_list == [] ###(015)=[passed] basic SCTPChunkHeartbeatReq - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x04" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkHeartbeatReq) >>> assert p.flags == 0 >>> assert p.len == 4 >>> assert p.params == [] ###(016)=[passed] basic SCTPChunkHeartbeatAck - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x04" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkHeartbeatAck) >>> assert p.flags == 0 >>> assert p.len == 4 >>> assert p.params == [] ###(017)=[passed] basic SCTPChunkAbort - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x04" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkAbort) >>> assert p.reserved == 0 >>> assert p.TCB == 0 >>> assert p.len == 4 >>> assert p.error_causes == b"" ###(018)=[passed] basic SCTPChunkShutDown - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x08\x00\x00\x00\x00" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkShutdown) >>> assert p.flags == 0 >>> assert p.len == 8 >>> assert p.cumul_tsn_ack == 0 ###(019)=[passed] basic SCTPChunkShutDownAck - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x04" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkShutdownAck) >>> assert p.flags == 0 >>> assert p.len == 4 ###(020)=[passed] basic SCTPChunkError - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x04" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkError) >>> assert p.flags == 0 >>> assert p.len == 4 >>> assert p.error_causes == b"" ###(021)=[passed] basic SCTPChunkCookieEcho - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0A\x00\x00\x04" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkCookieEcho) >>> assert p.flags == 0 >>> assert p.len == 4 >>> assert p.cookie == b"" ###(022)=[passed] basic SCTPChunkCookieAck - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0B\x00\x00\x04" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkCookieAck) >>> assert p.flags == 0 >>> assert p.len == 4 ###(023)=[passed] basic SCTPChunkShutdownComplete - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0E\x00\x00\x04" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkShutdownComplete) >>> assert p.reserved == 0 >>> assert p.TCB == 0 >>> assert p.len == 4 ###(024)=[passed] basic SCTPChunkAuthentication - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x08\x00\x00\x00\x00" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkAuthentication) >>> assert p.flags == 0 >>> assert p.len == 8 >>> assert p.shared_key_id == 0 >>> assert p.HMAC_function == 0 ###(025)=[passed] basic SCTPChunkAddressConf - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\x00\x00\x08\x00\x00\x00\x00" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkAddressConf) >>> assert p.flags == 0 >>> assert p.len == 8 >>> assert p.seq == 0 >>> assert p.params == [] ###(026)=[passed] basic SCTPChunkAddressConfAck - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x08\x00\x00\x00\x00" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkAddressConfAck) >>> assert p.flags == 0 >>> assert p.len == 8 >>> assert p.seq == 0 >>> assert p.params == [] ###(027)=[passed] basic SCTPChunkPad - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x84\x00\x00\x0b\x70\x61\x64\x00" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkPad) >>> assert p.flags == 0 >>> assert p.len == 11 >>> assert p.padding == b'pad' ###(028)=[passed] basic SCTPChunkReConfig - Dissection >>> blob = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x82\x00\x00\x04" >>> p = SCTP(blob).lastlayer() >>> assert isinstance(p, SCTPChunkReConfig) >>> assert p.flags == 0 >>> assert p.len == 4 >>> assert p.params == [] ###(029)=[passed] SCTPChunkParamRandom - Consecutive calls >>> param1, param2 = SCTPChunkParamRandom(), SCTPChunkParamRandom() >>> assert param1.random != param2.random ###(030)=[passed] SCTP in ICMP >>> p1 = IP(raw(IP(src=RandIP(), dst=RandIP()) / SCTP(sport=RandShort(), dport=RandShort()))) >>> p2 = IP(raw(IP(src=RandIP(), dst=p1[IP].src) / ICMP(type=3, code=1) / p1)) >>> assert p2.answers(p1) Skinny regression tests for Scapy ━ Run at 01:42:23 from [test/scapy/layers/skinny.uts] by UTscapy in 0.0035791397094726562 └ Passed=1 └ Failed=0 ###### ## Skinny tests ###### ###(000)=[passed] Skinny - build & dissection >>> p = raw(IP(src="127.0.0.1")/TCP()/Skinny(msg="ServiceURLStatMessage")) >>> assert p == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x07\xd0\x07\xd0\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00S3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/\x01\x00\x00' >>> assert IP(p)[Skinny].msg == 303 Test campaign ━ Run at 01:42:23 from [test/scapy/layers/smb.uts] by UTscapy in 0.07616829872131348 └ Passed=14 └ Failed=0 ###### ## SMB basic tests ###### ###(000)=[passed] Import >>> from scapy.layers.smb import * ###(001)=[passed] test SMB Generic Header - dissect >>> from scapy.layers.smb import _SMBGeneric >>> >>> rawpkt = b'\x45\x00\x00\x5b\x69\x10\x40\x00\x73\x06\xca\x85\x7a\xa0\x9a\xb6\xc0\xa8\xfe\x07\xeb\xec\x01\xbd\xaf\x97\x2e\xb7\x78\x60\x84\x6c\x50\x18\x40\x29\xd5\x36\x00\x00\x00\x00\x00\x2f\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x18\x01\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x20\x18\x00\x00\x00\x00\x00\x0c\x00\x02\x4e\x54\x20\x4c\x4d\x20\x30\x2e\x31\x32\x00' >>> pkt = IP(rawpkt) >>> assert TCP in pkt >>> assert NBTSession in pkt >>> assert pkt[NBTSession].LENGTH == 47 >>> assert SMBNegotiate_Request in pkt >>> smb = pkt[SMB_Header] >>> print(smb.show()) ###[ SMB 1 Protocol Request Header ]### Start = b'\xffSMB' Command = SMB_COM_NEGOTIATE Status = STATUS_SUCCESS Flags = CASE_INSENSITIVE+CANONICALIZED_PATHS Flags2 = LONG_NAMES+EXTENDED_SECURITY+NT_STATUS PIDHigh = 0 SecuritySignature= b'' Reserved = 0 TID = 65535 PIDLow = 6176 UID = 0 MID = 0 ###[ SMB Negotiate Request ]### WordCount = 0 ByteCount = 12 \Dialects \ |###[ SMB Dialect ]### | BufferFormat= 2 | DialectString= b'NT LM 0.12' None >>> assert smb.Start == b'\xffSMB' >>> assert smb.Command == 0x72 # SMB_COM_NEGOCIATE >>> >>> rawpkt = b'\x45\x00\x00\x5b\x69\x10\x40\x00\x73\x06\xca\x85\x7a\xa0\x9a\xb6\xc0\xa8\xfe\x07\xeb\xec\x01\xbd\xaf\x97\x2e\xb7\x78\x60\x84\x6c\x50\x18\x40\x29\xd5\x36\x00\x00\x00\x00\x00\x2f\xf0\x53\x4d\x42\x72\x00\x00\x00\x00\x18\x01\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x20\x18\x00\x00\x00\x00\x00\x0c\x00\x02\x4e\x54\x20\x4c\x4d\x20\x30\x2e\x31\x32\x00' >>> pkt = IP(rawpkt) >>> assert TCP in pkt >>> assert NBTSession in pkt >>> assert pkt[NBTSession].LENGTH == 47 >>> assert _SMBGeneric in pkt >>> assert SMB_Header not in pkt ###(002)=[passed] test SMB Negociate Header - assemble >>> pkt = IP() / TCP() / NBTSession() / SMB_Header() / SMBNegotiate_Request() >>> pkt = IP(raw(pkt)) >>> assert pkt[NBTSession].TYPE == 0x00 # session message >>> smb = pkt[SMB_Header] >>> assert smb.Start == b'\xffSMB' ###### ## SMB NTLM exchange ###### ###(003)=[passed] SMB Negotiate Request >>> smb_nego_req = Ether(b'\x00PV\xc0\x00\x01\x00\x0c)a\xf5_\x08\x00E\x00\x00\xb1Qe\x00\x00\x80\x06\xd9\t\xc0\xa8\xc7\x85\xc0\xa8\xc7\x01\xc2\x08\x00\x8b\xd7\xcb\xeeR\x10]{\xadP\x18\x01\x00\xd1w\x00\x00\x00\x00\x00\x85\xffSMBr\x00\x00\x00\x00\x18C\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x00\x00\x00b\x00\x02PC NETWORK PROGRAM 1.0\x00\x02LANMAN1.0\x00\x02Windows for Workgroups 3.1a\x00\x02LM1.2X002\x00\x02LANMAN2.1\x00\x02NT LM 0.12\x00') >>> assert SMBNegotiate_Request in smb_nego_req >>> assert smb_nego_req.Flags2.EXTENDED_SECURITY >>> assert smb_nego_req.Flags2.UNICODE >>> assert len(smb_nego_req[SMBNegotiate_Request].Dialects) == 6 >>> assert smb_nego_req[SMBNegotiate_Request].Dialects[0].DialectString == b'PC NETWORK PROGRAM 1.0' >>> assert smb_nego_req[SMBNegotiate_Request].Dialects[5].DialectString == b'NT LM 0.12' ###(004)=[passed] SMB Negotiate Response Extended Security >>> smb_nego_resp = Ether(b'\x00\x0c)a\xf5_\x00PV\xc0\x00\x01\x08\x00E\x00\x01\xc1\x03H@\x00\x80\x06\xe6\x16\xc0\xa8\xc7\x01\xc0\xa8\xc7\x85\x00\x8b\xc2\x08\x10]{\xad\xd7\xcb\xee\xdbP\x18\x01\x0047\x00\x00\x00\x00\x01\x95\xffSMBr\x00\x00\x00\x00\x98C\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x00\x00\x11\x05\x00\x03\n\x00\x01\x00\x04\x11\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\xfc\xe3\x01\x80\x1dc6\x9b\x84\'\xd2\x01\x88\xff\x00P\x01,\xd0=?\xb2\x00\xe1O\xbd\xd4\xc8\xb7\x0c\'Vf`\x82\x01<\x06\x06+\x06\x01\x05\x05\x02\xa0\x82\x0100\x82\x01,\xa0\x1a0\x18\x06\n+\x06\x01\x04\x01\x827\x02\x02\x1e\x06\n+\x06\x01\x04\x01\x827\x02\x02\n\xa2\x82\x01\x0c\x04\x82\x01\x08NEGOEXTS\x01\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00p\x00\x00\x001<*:\xc7+<\xa9m\xac8t\xa7\xdd\x1d[\xf4Rk\x17\x03\x8aK\x91\xc2\t}\x9a\x8f\xe6,\x96\\Q$/\x90MG\xc7\xad\x8f\x87k"\x02\xbf\xc6\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\3S\r\xea\xf9\rM\xb2\xecJ\xe3xn\xc3\x08NEGOEXTS\x03\x00\x00\x00\x01\x00\x00\x00@\x00\x00\x00\x98\x00\x00\x001<*:\xc7+<\xa9m\xac8t\xa7\xdd\x1d[\\3S\r\xea\xf9\rM\xb2\xecJ\xe3xn\xc3\x08@\x00\x00\x00X\x00\x00\x000V\xa0T0R0\'\x80%0#1!0\x1f\x06\x03U\x04\x03\x13\x18Token Signing Public Key0\'\x80%0#1!0\x1f\x06\x03U\x04\x03\x13\x18Token Signing Public Key') >>> assert SMBNegotiate_Response_Extended_Security in smb_nego_resp >>> assert smb_nego_resp[SMBNegotiate_Response_Extended_Security].ServerTime == 131210789640364829 >>> assert isinstance(smb_nego_resp.SecurityBlob, GSSAPI_BLOB) >>> assert smb_nego_resp.SecurityBlob.MechType.oidname == 'SPNEGO - Simple Protected Negotiation' >>> assert smb_nego_resp.SecurityBlob.innerToken.token.mechTypes[0].oid.oidname == 'NEGOEX - SPNEGO Extended Negotiation Security Mechanism' >>> assert smb_nego_resp.ServerCapabilities.EXTENDED_SECURITY >>> assert smb_nego_resp.Flags2.EXTENDED_SECURITY >>> >>> from uuid import UUID >>> >>> negoex_nego = smb_nego_resp.SecurityBlob.innerToken.token.mechToken.value >>> assert negoex_nego.MessageType == 1 >>> assert negoex_nego.SequenceNum == 0 >>> assert len(negoex_nego.Payload) == 1 >>> assert negoex_nego.sprintf("%Payload%") == '[(\'AuthScheme\', "[UUID(\'[NTLM-UUID]\')]")]' >>> assert negoex_nego.ConversationId == UUID('313c2a3a-c72b-3ca9-6dac-3874a7dd1d5b') >>> >>> negoex_exch = negoex_nego.payload >>> assert negoex_exch.MessageType == 3 >>> assert negoex_exch.SequenceNum == 1 >>> assert negoex_exch.sprintf("%AuthScheme%") == "UUID('[NTLM-UUID]')" >>> assert negoex_exch.ExchangeLen == len(negoex_exch.Payload[0][1]) >>> assert negoex_exch.Payload[0][0] == "Exchange" >>> assert bytes(negoex_exch.Payload[0][1]) == b"0V\xa0T0R0'\x80%0#1!0\x1f\x06\x03U\x04\x03\x13\x18Token Signing Public Key0'\x80%0#1!0\x1f\x06\x03U\x04\x03\x13\x18Token Signing Public Key" >>> assert negoex_exch.Payload[0][1].items[0].token == b"Token Signing Public Key" >>> assert negoex_exch.Payload[0][1].items[0].oid == "2.5.4.3" ###(005)=[passed] SMB Setup AndX Request (ES) >>> from scapy.layers.ntlm import * >>> >>> smb_sax_req_1 = Ether(b'\x00PV\xc0\x00\x01\x00\x0c)a\xf5_\x08\x00E\x00\x00\xb6Qf\x00\x00\x80\x06\xd9\x03\xc0\xa8\xc7\x85\xc0\xa8\xc7\x01\xc2\x08\x00\x8b\xd7\xcb\xee\xdb\x10]}FP\x18\x00\xffw\x7f\x00\x00\x00\x00\x00\x8a\xffSMBs\x00\x00\x00\x00\x18\x07\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe\x00\x00\x10\x00\x0c\xff\x00\x00\x00\x04\x11\n\x00\x00\x00\x00\x00\x00\x00J\x00\x00\x00\x00\x00\xd4\x00\x00\xa0O\x00`H\x06\x06+\x06\x01\x05\x05\x02\xa0>0<\xa0\x0e0\x0c\x06\n+\x06\x01\x04\x01\x827\x02\x02\n\xa2*\x04(NTLMSSP\x00\x01\x00\x00\x00\x97\x82\x08\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00Z)\x00\x00\x00\x0f\x00\x00\x00\x00\x00') >>> assert SMBSession_Setup_AndX_Request_Extended_Security in smb_sax_req_1 >>> assert smb_sax_req_1.Flags2.EXTENDED_SECURITY >>> assert smb_sax_req_1.Flags2.UNICODE >>> assert isinstance(smb_sax_req_1.SecurityBlob.innerToken.token.mechToken.value, NTLM_NEGOTIATE) >>> ntlm_nego = smb_sax_req_1.SecurityBlob.innerToken.token.mechToken.value >>> assert ntlm_nego.ProductBuild == 10586 ###(006)=[passed] SMB Setup AndX Response (ES) >>> from scapy.layers.ntlm import * >>> >>> smb_sax_resp_1 = Ether(b"\x00\x0c)a\xf5_\x00PV\xc0\x00\x01\x08\x00E\x00\x01,\x03I@\x00\x80\x06\xe6\xaa\xc0\xa8\xc7\x01\xc0\xa8\xc7\x85\x00\x8b\xc2\x08\x10]}F\xd7\xcb\xefiP\x18\x00\xff\xeb)\x00\x00\x00\x00\x01\x00\xffSMBs\x16\x00\x00\xc0\x98\x07\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe\x00\x08\x10\x00\x04\xff\x00\x00\x01\x00\x00\x93\x00\xd5\x00\xa1\x81\x900\x81\x8d\xa0\x03\n\x01\x01\xa1\x0c\x06\n+\x06\x01\x04\x01\x827\x02\x02\n\xa2x\x04vNTLMSSP\x00\x02\x00\x00\x00\x06\x00\x06\x008\x00\x00\x00\x15\x82\x8a\xe2\x88\xbc\x9bX4\xbe7\r\x00\x00\x00\x00\x00\x00\x00\x008\x008\x00>\x00\x00\x00\x06\x03\x80%\x00\x00\x00\x0fS\x00C\x00V\x00\x02\x00\x06\x00S\x00C\x00V\x00\x01\x00\x06\x00S\x00C\x00V\x00\x04\x00\x06\x00S\x00C\x00V\x00\x03\x00\x06\x00S\x00C\x00V\x00\x07\x00\x08\x00\xd5\x9d6\x9b\x84'\xd2\x01\x00\x00\x00\x00W\x00i\x00n\x00d\x00o\x00w\x00s\x00 \x008\x00.\x001\x00 \x009\x006\x000\x000\x00\x00\x00W\x00i\x00n\x00d\x00o\x00w\x00s\x00 \x008\x00.\x001\x00 \x006\x00.\x003\x00\x00\x00") >>> assert SMBSession_Setup_AndX_Response_Extended_Security in smb_sax_resp_1 >>> assert smb_sax_resp_1.AndXCommand == 255 >>> assert smb_sax_resp_1.SecurityBlob.token.negResult == 1 >>> assert isinstance(smb_sax_resp_1.SecurityBlob.token.responseToken.value, NTLM_CHALLENGE) >>> ntlm_challenge = smb_sax_resp_1.SecurityBlob.token.responseToken.value >>> assert len(ntlm_challenge.Payload) == 2 >>> assert ntlm_challenge.Payload[0] == ('TargetName', 'SCV') >>> assert ntlm_challenge.Payload[1][0] == 'TargetInfo' >>> assert len(ntlm_challenge.Payload[1][1]) == 6 >>> assert ntlm_challenge.Payload[1][1][0].sprintf("%AvId%") == 'MsvAvNbDomainName' >>> assert ntlm_challenge.Payload[1][1][1].sprintf("%AvId%") == 'MsvAvNbComputerName' >>> assert ntlm_challenge.Payload[1][1][2].sprintf("%AvId%") == 'MsvAvDnsDomainName' >>> assert ntlm_challenge.Payload[1][1][3].sprintf("%AvId%") == 'MsvAvDnsComputerName' >>> assert ntlm_challenge.Payload[1][1][4].sprintf("%AvId%") == 'MsvAvTimestamp' >>> assert ntlm_challenge.Payload[1][1][5].sprintf("%AvId%") == 'MsvAvEOL' >>> for i in range(4): ... assert ntlm_challenge.Payload[1][1][i].Value == "SCV" ... ###(007)=[passed] SMB Setup AndX Request - accept incomplete (ES) >>> from scapy.layers.ntlm import * >>> >>> smb_sax_req_2 = Ether(b'\x00PV\xc0\x00\x01\x00\x0c)a\xf5_\x08\x00E\x00\x01\x18Qg\x00\x00\x80\x06\xd8\xa0\xc0\xa8\xc7\x85\xc0\xa8\xc7\x01\xc2\x08\x00\x8b\xd7\xcb\xefi\x10]~JP\x18\x00\xfey\xc4\x00\x00\x00\x00\x00\xec\xffSMBs\x00\x00\x00\x00\x18\x07\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe\x00\x08 \x00\x0c\xff\x00\x00\x00\x04\x11\n\x00\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x00\xd4\x00\x00\xa0\xb1\x00\xa1\x81\xa90\x81\xa6\xa0\x03\n\x01\x01\xa2\x81\x8a\x04\x81\x87NTLMSSP\x00\x03\x00\x00\x00\x01\x00\x01\x00v\x00\x00\x00\x00\x00\x00\x00w\x00\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x00\x00\x00\x00X\x00\x00\x00\x1e\x00\x1e\x00X\x00\x00\x00\x10\x00\x10\x00w\x00\x00\x00\x15\x8a\x88\xe2\n\x00Z)\x00\x00\x00\x0fN,A\xe36\xa1M\x9dq\xc5\x12\x92\xa4\xc8\xc9\xf2D\x00E\x00S\x00K\x00T\x00O\x00P\x00-\x00V\x001\x00F\x00A\x000\x00U\x00Q\x00\x00/\t\x13+\x81\xa6\x15\x14\xb9\x11\x8b\xe0\x00\x88\xd7\x1f\xa3\x12\x04\x10\x01\x00\x00\x00\xb5\xef\x9d\xa6\x9dm\x12h\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert SMBSession_Setup_AndX_Request_Extended_Security in smb_sax_req_2 >>> assert smb_sax_req_2.Flags2.EXTENDED_SECURITY >>> assert smb_sax_req_2.Flags2.UNICODE >>> assert smb_sax_req_2.AndXCommand == 255 >>> assert smb_sax_req_2.SecurityBlob.token.negResult == 1 >>> ntlm_authenticate = NTLM_Header(smb_sax_req_2.SecurityBlob.token.responseToken.value.val) >>> assert isinstance(ntlm_authenticate, NTLM_AUTHENTICATE) >>> assert len(ntlm_authenticate.Payload) == 3 >>> assert ntlm_authenticate.Payload[0] == ('Workstation', 'DESKTOP-V1FA0UQ') >>> assert ntlm_authenticate.Payload[1][0] == 'LmChallengeResponse' >>> assert isinstance(ntlm_authenticate.Payload[1][1], LMv2_RESPONSE) >>> assert ntlm_authenticate.Payload[2][0] == 'EncryptedRandomSessionKey' >>> assert ntlm_authenticate.Payload[2][1] == b'/\t\x13+\x81\xa6\x15\x14\xb9\x11\x8b\xe0\x00\x88\xd7\x1f' ###(008)=[passed] SMB Setup AndX Response - accept complete (ES) >>> smb_sax_resp_2 = Ether(b'\x00\x0c)a\xf5_\x00PV\xc0\x00\x01\x08\x00E\x00\x00\xb6\x03J@\x00\x80\x06\xe7\x1f\xc0\xa8\xc7\x01\xc0\xa8\xc7\x85\x00\x8b\xc2\x08\x10]~J\xd7\xcb\xf0YP\x18\x00\xfeB\x10\x00\x00\x00\x00\x00\x8a\xffSMBs\x00\x00\x00\x00\x98\x07\xc8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe\x00\x08 \x00\x04\xff\x00\x8a\x00\x00\x00\x1d\x00_\x00\xa1\x1b0\x19\xa0\x03\n\x01\x00\xa3\x12\x04\x10\x01\x00\x00\x00\xee\t\x91S\xab\x7f]\xe6\x00\x00\x00\x00W\x00i\x00n\x00d\x00o\x00w\x00s\x00 \x008\x00.\x001\x00 \x009\x006\x000\x000\x00\x00\x00W\x00i\x00n\x00d\x00o\x00w\x00s\x00 \x008\x00.\x001\x00 \x006\x00.\x003\x00\x00\x00') >>> assert SMBSession_Setup_AndX_Response_Extended_Security in smb_sax_resp_2 >>> assert smb_sax_resp_2.SecurityBlob.token.negResult == 0 >>> assert smb_sax_resp_2.SecurityBlob.token.mechListMIC.value.val == b'\x01\x00\x00\x00\xee\t\x91S\xab\x7f]\xe6\x00\x00\x00\x00' >>> assert smb_sax_resp_2.NativeOS == 'Windows 8.1 9600' >>> assert smb_sax_resp_2.NativeLanMan == 'Windows 8.1 6.3' ###### ## Test BRWS ###### ###(009)=[passed] BRWS BecomeBackup - build >>> pkt = \ ... IP(id=3109, ttl=128, src='192.168.1.2', dst='192.168.1.255') / \ ... UDP(sport=138, dport=138) / \ ... NBTDatagram(Type=17, Flags=2, ID=37087, SourceIP='192.168.1.2', ... SourcePort=138, SourceName=b'VIKRANT-LAPTOP ', ... SUFFIX1=16705, DestinationName=b'WORKGROUP', ... SUFFIX2=16975) / \ ... SMB_Header(Flags=0) / \ ... SMBMailslot_Write(Data=BRWS_BecomeBackup(OpCode=11, BrowserToPromote='LENOVO-NETBOOK'), ... Timeout=1000, Name='\\MAILSLOT\\BROWSE') >>> >>> >>> assert bytes(pkt) == b'E\x00\x00\xd4\x0c%\x00\x00\x80\x11\xa9\xa2\xc0\xa8\x01\x02\xc0\xa8\x01\xff\x00\x8a\x00\x8a\x00\xc0\xca)\x11\x02\x90\xdf\xc0\xa8\x01\x02\x00\x8a\x00\xaa\x00\x00 FGEJELFCEBEOFECNEMEBFAFEEPFACAAA\x00 FHEPFCELEHFCEPFFFACACACACACACABO\x00\xffSMB%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00V\x00\x03\x00\x01\x00\x01\x00\x02\x00!\x00\\MAILSLOT\\BROWSE\x00\x0bLENOVO-NETBOOK\x00' ###(010)=[passed] BRWS BecomeBackup - dissection >>> pkt = IP(b'E\x00\x00\xd4\x0c%\x00\x00\x80\x11\xa9\xa2\xc0\xa8\x01\x02\xc0\xa8\x01\xff\x00\x8a\x00\x8a\x00\xc0\xca)\x11\x02\x90\xdf\xc0\xa8\x01\x02\x00\x8a\x00\xaa\x00\x00 FGEJELFCEBEOFECNEMEBFAFEEPFACAAA\x00 FHEPFCELEHFCEPFFFACACACACACACABO\x00\xffSMB%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x03\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00V\x00\x03\x00\x01\x00\x01\x00\x02\x00!\x00\\MAILSLOT\\BROWSE\x00\x0bLENOVO-NETBOOK\x00') >>> >>> assert SMBMailslot_Write in pkt >>> assert pkt[SMBMailslot_Write].Timeout == 1000 >>> assert pkt[SMBMailslot_Write].Name == b"\\MAILSLOT\\BROWSE" >>> assert pkt[SMBMailslot_Write].Data.BrowserToPromote == b'LENOVO-NETBOOK' ###(011)=[passed] BRWS HostAnnouncement - build >>> pkt = \ ... IP(id=51657, tos=0x20, src='192.168.1.8', dst='192.168.1.255') / \ ... UDP(sport=138, dport=138) / \ ... NBTDatagram(Type=17, Flags=2, ID=18755, SourceIP='192.168.1.8', ... SourcePort=0, SourceName='MACBOOKPRO-199C', ... SUFFIX1=16705, DestinationName='WORKGROUP', ... SUFFIX2=16974) / \ ... SMB_Header(Flags=0, PIDLow=176, MID=18754) / \ ... SMBMailslot_Write(Data=BRWS_HostAnnouncement(ServerName="MACBOOKPRO-122A", Comment="Super's MacBook Pro"), ... Timeout=0, Flags=2, Name='\\MAILSLOT\\BROWSE') >>> >>> >>> assert bytes(pkt) == b"E \x00\xf8\xc9\xc9\x00\x00@\x11+\xb4\xc0\xa8\x01\x08\xc0\xa8\x01\xff\x00\x8a\x00\x8a\x00\xe4\xb3\xb0\x11\x02IC\xc0\xa8\x01\x08\x00\x00\x00\xce\x00\x00 ENEBEDECEPEPELFAFCEPCNDBDJDJEDAA\x00 FHEPFCELEHFCEPFFFACACACACACACABN\x00\xffSMB%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00BI\x11\x00\x004\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004\x00V\x00\x03\x00\x01\x00\x01\x00\x02\x00E\x00\\MAILSLOT\\BROWSE\x00\x01\x00\x00\xf4\x01\x00MACBOOKPRO-122A\x00\x06\x01\x03\x12\x00\x00\x15\x01U\xaaSuper's MacBook Pro\x00" ###(012)=[passed] BRWS HostAnnouncement - dissection >>> pkt = IP(b"E \x00\xf8\xc9\xc9\x00\x00@\x11+\xb4\xc0\xa8\x01\x08\xc0\xa8\x01\xff\x00\x8a\x00\x8a\x00\xe4\xb3\xb0\x11\x02IC\xc0\xa8\x01\x08\x00\x00\x00\xce\x00\x00 ENEBEDECEPEPELFAFCEPCNDBDJDJEDAA\x00 FHEPFCELEHFCEPFFFACACACACACACABN\x00\xffSMB%\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00BI\x11\x00\x004\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004\x00V\x00\x03\x00\x01\x00\x01\x00\x02\x00E\x00\\MAILSLOT\\BROWSE\x00\x01\x00\x00\xf4\x01\x00MACBOOKPRO-122A\x00\x06\x01\x03\x12\x00\x00\x15\x01U\xaaSuper's MacBook Pro\x00") >>> >>> assert SMBMailslot_Write in pkt >>> assert pkt[SMBMailslot_Write].Name == b"\\MAILSLOT\\BROWSE" >>> assert pkt[SMBMailslot_Write].Data.OpCode == 1 >>> assert pkt[SMBMailslot_Write].Data.ServerName == b"MACBOOKPRO-122A\x00" >>> assert pkt[SMBMailslot_Write].Data.Comment == b"Super's MacBook Pro" >>> assert pkt[SMBMailslot_Write].Data.Signature == 0xAA55 ###(013)=[passed] OSS-Fuzz Findings >>> from io import BytesIO >>> file = BytesIO(b'M<\xb2\xa1\x02\x00\x04\x00\x00\x00\x02\xff\xa1\x00\x00\x00\xff\xff\x00\x00\x01\x00\x00\x00\r\x82\xe8Y[\xc6P"\xa1\xb2\x00_h\x00\x00\x00\x00\x10\x94\x00\x01\x00\x00\x1d%\xcb(\xce\x08\x00U\xfa\xf7\x8c\x00\x00@\x00?\x11\xa7R\xe0\xa8\x01\xa1d\xb2\xc3\xd4\n_\x00\x8a \x00\x00\x01\x00\x00\x00\x01\xff\x00\x00\x00\x10\x94\x00\x01\x00\x00\x1d%\xcb(\xce\x08\x00U\xfa\xf7\x8c\x00\x00@\x00?\x11\xa7R\xe0\xa8\x01\xa1d\xb2\xc3\xd4\n_\x00\x8a\xb2\x00\xa1a\xffl\xff\xff\xef\x00\xff\x01\x00\x08\xa1\xa1E\xf9\x00\xa1\x00\x00?\x8c\x08?\x11\x00\xc3\x00+\x10M<\x1a\x01\x00\xffSMB%d\x01\x05\x00\x00\x00\x00\x00\x00\x00\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\xf7\x8c\x00\x00@\x00?\x11\xa7R\xe0\xa8\x01\xa1d\xb2\xc3\xd4\n_\x00\x8a\xb2\x00\xa1a\xffl\xff\xff\xef\x00\xff\x01\x00\x08\xa1\xa1') >>> >>> l = rdpcap(file) >>> assert l[0][NBTDatagram].summary() == "NBTDatagram / SMB_Header / Tran b''" Test campaign ━ Run at 01:42:23 from [test/scapy/layers/smb2.uts] by UTscapy in 0.12904071807861328 └ Passed=37 └ Failed=0 ###### ## SMB2 Header ###### ###(000)=[passed] SMB2 Header dissecting >>> rawpkt = b'\x45\x00\x01\x18\x16\x2c\x40\x00\x37\x06\xc4\x14\x91\xdc\x18\x13\xc0\xa8\xfe\x07\x9d\x76\x01\xbd\x37\x06\x5e\x82\xa3\xca\x83\xd2\x50\x18\x01\xf6\x11\x5b\x00\x00\x00\x00\x00\xec\xfe\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x24\x00\x04\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x59\x9e\x84\xf1\x9d\x61\xce\x99\x1f\x50\x5c\x04\x44\x74\xb1\x0a\x70\x00\x00\x00\x04\x00\x00\x00\x10\x02\x00\x03\x02\x03\x11\x03\x00\x00\x00\x00\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x00\x00\x00\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x31\x00\x37\x00\x38\x00\x2e\x00\x32\x00\x31\x00' >>> pkt = IP(rawpkt) >>> assert TCP in pkt >>> assert NBTSession in pkt >>> assert pkt[NBTSession].LENGTH == 236 >>> assert SMB2_Header in pkt >>> smb2 = pkt[SMB2_Header] >>> >>> assert smb2.Start == b'\xfeSMB' >>> assert smb2.StructureSize == 64 >>> assert smb2.CreditCharge == 1 >>> assert smb2.CreditRequest == 0 >>> assert smb2.Command == 0 >>> assert smb2.Flags == 0 >>> assert smb2.NextCommand == 0 >>> assert smb2.MID == 0 >>> assert smb2.SessionId == 0 >>> assert smb2.SecuritySignature == b'\x00\x11"3DUfw\x88\x99\xaa\xbb\xcc\xdd\xee\xff' >>> >>> rawpkt = b'\x45\x00\x01\x18\x16\x2c\x40\x00\x37\x06\xc4\x14\x91\xdc\x18\x13\xc0\xa8\xfe\x07\x9d\x76\x01\xbd\x37\x06\x5e\x82\xa3\xca\x83\xd2\x50\x18\x01\xf6\x11\x5b\x00\x00\x00\x00\x00\xec\xf0\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x24\x00\x04\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x59\x9e\x84\xf1\x9d\x61\xce\x99\x1f\x50\x5c\x04\x44\x74\xb1\x0a\x70\x00\x00\x00\x04\x00\x00\x00\x10\x02\x00\x03\x02\x03\x11\x03\x00\x00\x00\x00\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x00\x00\x00\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x31\x00\x37\x00\x38\x00\x2e\x00\x32\x00\x31\x00' >>> pkt = IP(rawpkt) >>> assert TCP in pkt >>> assert NBTSession in pkt >>> assert pkt[NBTSession].LENGTH == 236 >>> assert SMB2_Header not in pkt >>> >>> rawpkt = b'\x45\x00\x01\x18\x16\x2c\x40\x00\x37\x06\xc4\x14\x91\xdc\x18\x13\xc0\xa8\xfe\x07\x9d\x76\x01\xbd\x37\x06\x5e\x82\xa3\xca\x83\xd2\x50\x18\x01\xf6\x11\x5b\x00\x00\x00\x00\x00\xec\xfc\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x24\x00\x04\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x59\x9e\x84\xf1\x9d\x61\xce\x99\x1f\x50\x5c\x04\x44\x74\xb1\x0a\x70\x00\x00\x00\x04\x00\x00\x00\x10\x02\x00\x03\x02\x03\x11\x03\x00\x00\x00\x00\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x00\x00\x00\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x31\x00\x37\x00\x38\x00\x2e\x00\x32\x00\x31\x00' >>> pkt = IP(rawpkt) >>> assert TCP in pkt >>> assert NBTSession in pkt >>> assert pkt[NBTSession].LENGTH == 236 >>> assert SMB2_Header not in pkt ###(001)=[passed] SMB2 Header assembling >>> pkt = IP() / TCP() / NBTSession() / SMB2_Header() >>> assert pkt[NBTSession].TYPE == 0x00 # session message >>> smb2 = pkt[SMB2_Header] >>> assert smb2.Start == b'\xfeSMB' ###### ## SMB2 Negotiate Protocol Request Header dissecting ###### ###(002)=[passed] Common fields in header >>> rawpkt = b'\x45\x00\x01\x18\x16\x2c\x40\x00\x37\x06\xc4\x14\x91\xdc\x18\x13\xc0\xa8\xfe\x07\x9d\x76\x01\xbd\x37\x06\x5e\x82\xa3\xca\x83\xd2\x50\x18\x01\xf6\x11\x5b\x00\x00\x00\x00\x00\xec\xfe\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x24\x00\x04\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x59\x9e\x84\xf1\x9d\x61\xce\x99\x1f\x50\x5c\x04\x44\x74\xb1\x0a\x70\x00\x00\x00\x04\x00\x00\x00\x10\x02\x00\x03\x02\x03\x11\x03\x00\x00\x00\x00\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x00\x00\x00\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x31\x00\x37\x00\x38\x00\x2e\x00\x32\x00\x31\x00' >>> pkt = IP(rawpkt) >>> assert TCP in pkt >>> assert NBTSession in pkt >>> assert pkt[NBTSession].LENGTH == 236 >>> assert SMB2_Header in pkt >>> assert SMB2_Negotiate_Protocol_Request in pkt >>> nego_req = pkt[SMB2_Negotiate_Protocol_Request] >>> assert nego_req.StructureSize == 0x24 >>> assert nego_req.DialectCount == 4 >>> assert nego_req.SecurityMode == 0 >>> assert nego_req.Capabilities == 0x7f >>> assert str(nego_req.ClientGUID) == 'f1849e59-619d-99ce-1f50-5c044474b10a' >>> assert nego_req.NegotiateContextsBufferOffset == 0x70 >>> assert nego_req.NegotiateContextsCount == 4 >>> for dialect in nego_req.Dialects: ... assert dialect in SMB_DIALECTS.keys() ... >>> assert 0x210 in nego_req.Dialects >>> assert 0x300 in nego_req.Dialects >>> assert 0x302 in nego_req.Dialects >>> assert 0x311 in nego_req.Dialects >>> assert len(nego_req.NegotiateContexts) == nego_req.NegotiateContextsCount ###(003)=[passed] SMB2 Negotiate Context in Request - type PREAUTH - disassemble >>> preauth = nego_req.NegotiateContexts[0] >>> assert preauth.ContextType == 0x1 >>> assert preauth.DataLength == 38 >>> assert preauth.HashAlgorithmCount == 1 >>> assert preauth.SaltLength == 32 >>> assert preauth.Salt == b'\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18' >>> assert len(preauth.HashAlgorithms) == 1 >>> assert preauth.HashAlgorithms[0] == 0x1 ###(004)=[passed] SMB2 Negotiate Context in Request - type ENCRYPTION disassemble >>> enc = nego_req.NegotiateContexts[1] >>> assert enc.ContextType == 0x2 >>> assert enc.DataLength == 6 >>> assert enc.CipherCount == 2 >>> assert len(enc.Ciphers) == 2 >>> assert enc.Ciphers[0] == 1 >>> assert enc.Ciphers[1] == 2 ###(005)=[passed] SMB2 Negotiate Context in Request - type COMPRESSION >>> comp = nego_req.NegotiateContexts[2] >>> assert comp.ContextType == 0x3 >>> assert comp.DataLength == 16 >>> assert comp.CompressionAlgorithmCount == 4 >>> assert len(comp.CompressionAlgorithms) == 4 >>> assert comp.CompressionAlgorithms[0] == 1 >>> assert comp.CompressionAlgorithms[1] == 2 >>> assert comp.CompressionAlgorithms[2] == 3 >>> assert comp.CompressionAlgorithms[3] == 4 ###(006)=[passed] SMB2 Negotiate Context in Request - type NETNAME NEGOCIATE >>> netname = nego_req.NegotiateContexts[3] >>> assert netname.ContextType == 0x5 >>> assert netname.DataLength == 28 >>> assert netname.NetName == '192.168.178.21' ###(007)=[passed] test SMB2 Negotiate Protocol Request Header - assembling >>> pkt = IP() / TCP() / NBTSession() / SMB2_Header() / SMB2_Negotiate_Protocol_Request() >>> pkt = IP(raw(pkt)) >>> assert SMB2_Negotiate_Protocol_Request in pkt ###(008)=[passed] Request with no 0x0311 in dialects >>> preauth = SMB2_Preauth_Integrity_Capabilities() >>> preauth_context = SMB2_Negotiate_Context(ContextType = 1, DataLength = len(preauth)) / preauth >>> >>> pkt = SMB2_Negotiate_Protocol_Request(Dialects=[0x0202], NegotiateContexts=[preauth_context]) >>> pkt = pkt.__class__(raw(pkt)).NegotiateContexts[0] >>> assert SMB2_Preauth_Integrity_Capabilities in pkt ###### ## SMB2 Negotiate Protocol Response Header dissecting ###### ###(009)=[passed] Common fields in header >>> rawpkt = b'\x45\x00\x02\x3e\x84\xa6\x40\x00\x80\x06\x0b\x74\xc0\xa8\xfe\x07\x91\xdc\x18\x13\x01\xbd\x9d\x76\xa3\xca\x83\xd2\x37\x06\x5f\x72\x50\x18\x04\x01\xe3\x14\x00\x00\x00\x00\x02\x12\xfe\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00\x01\x00\x11\x03\x03\x00\x53\x6d\xdd\x1c\x30\x1f\x44\x42\xa5\xc8\x88\x73\x7a\x68\x05\xe1\x2f\x00\x00\x00\x00\x00\x80\x00\x00\x00\x80\x00\x00\x00\x80\x00\xe9\xbe\x9e\x6c\xa4\xf8\xd5\x01\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x40\x01\xc0\x01\x00\x00\x60\x82\x01\x3c\x06\x06\x2b\x06\x01\x05\x05\x02\xa0\x82\x01\x30\x30\x82\x01\x2c\xa0\x1a\x30\x18\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x1e\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x82\x01\x0c\x04\x82\x01\x08\x4e\x45\x47\x4f\x45\x58\x54\x53\x01\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x70\x00\x00\x00\x11\x70\xff\xd0\xfa\xf1\x4f\xa2\x6f\x40\x5c\x94\x55\x68\x53\xcf\xa1\x77\x02\x7a\x32\xa9\x62\x78\x0a\x21\xfb\x9e\x2c\x5e\xe9\x78\xeb\xab\xee\x91\xfd\xfc\xda\x0f\xc5\x91\x03\x6e\xf8\xfd\x4c\x08\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x33\x53\x0d\xea\xf9\x0d\x4d\xb2\xec\x4a\xe3\x78\x6e\xc3\x08\x4e\x45\x47\x4f\x45\x58\x54\x53\x03\x00\x00\x00\x01\x00\x00\x00\x40\x00\x00\x00\x98\x00\x00\x00\x11\x70\xff\xd0\xfa\xf1\x4f\xa2\x6f\x40\x5c\x94\x55\x68\x53\xcf\x5c\x33\x53\x0d\xea\xf9\x0d\x4d\xb2\xec\x4a\xe3\x78\x6e\xc3\x08\x40\x00\x00\x00\x58\x00\x00\x00\x30\x56\xa0\x54\x30\x52\x30\x27\x80\x25\x30\x23\x31\x21\x30\x1f\x06\x03\x55\x04\x03\x13\x18\x54\x6f\x6b\x65\x6e\x20\x53\x69\x67\x6e\x69\x6e\x67\x20\x50\x75\x62\x6c\x69\x63\x20\x4b\x65\x79\x30\x27\x80\x25\x30\x23\x31\x21\x30\x1f\x06\x03\x55\x04\x03\x13\x18\x54\x6f\x6b\x65\x6e\x20\x53\x69\x67\x6e\x69\x6e\x67\x20\x50\x75\x62\x6c\x69\x63\x20\x4b\x65\x79\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x09\x33\xe9\xe8\xcb\xf4\x8a\x5c\x61\x4d\x38\x42\xa1\x53\x41\x18\x1b\xeb\x99\x78\x0b\x19\x6f\x5c\xef\xdd\x02\x51\x07\x3b\xc6\xcc\x00\x00\x02\x00\x04\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x03\x00\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00' >>> pkt = IP(rawpkt) >>> assert TCP in pkt >>> assert NBTSession in pkt >>> assert pkt[NBTSession].LENGTH == 530 >>> assert SMB2_Header in pkt >>> assert SMB2_Negotiate_Protocol_Response in pkt >>> nego_resp = pkt[SMB2_Negotiate_Protocol_Response] >>> >>> assert nego_resp.StructureSize == 0x41 >>> assert str(nego_resp.SecurityMode) == 'SIGNING_ENABLED' >>> assert nego_resp.DialectRevision == 0x0311 >>> assert nego_resp.NegotiateContextsCount == 0x3 >>> assert str(nego_resp.GUID) == '1cdd6d53-1f30-4244-a5c8-88737a6805e1' >>> assert nego_resp.Capabilities == 0x2f >>> assert nego_resp.MaxTransactionSize == 0x00800000 >>> assert nego_resp.MaxReadSize == 0x00800000 >>> assert nego_resp.MaxWriteSize == 0x00800000 >>> assert nego_resp.SecurityBlobBufferOffset == 0x00000080 >>> assert nego_resp.SecurityBlobLen == 320 >>> assert nego_resp.NegotiateContextsBufferOffset == 0x1c0 >>> assert bytes(nego_resp.SecurityBlob.innerToken.token.mechToken.value) == b"NEGOEXTS\x01\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00p\x00\x00\x00\x11p\xff\xd0\xfa\xf1O\xa2o@\\\x94UhS\xcf\xa1w\x02z2\xa9bx\n!\xfb\x9e,^\xe9x\xeb\xab\xee\x91\xfd\xfc\xda\x0f\xc5\x91\x03n\xf8\xfdL\x08\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\3S\r\xea\xf9\rM\xb2\xecJ\xe3xn\xc3\x08NEGOEXTS\x03\x00\x00\x00\x01\x00\x00\x00@\x00\x00\x00\x98\x00\x00\x00\x11p\xff\xd0\xfa\xf1O\xa2o@\\\x94UhS\xcf\\3S\r\xea\xf9\rM\xb2\xecJ\xe3xn\xc3\x08@\x00\x00\x00X\x00\x00\x000V\xa0T0R0'\x80%0#1!0\x1f\x06\x03U\x04\x03\x13\x18Token Signing Public Key0'\x80%0#1!0\x1f\x06\x03U\x04\x03\x13\x18Token Signing Public Key" >>> assert len(nego_resp.NegotiateContexts) == 3 ###(010)=[passed] SMB2 Negotiate Context in Response - Type PREAUTH >>> preauth = nego_resp.NegotiateContexts[0] >>> assert preauth.ContextType == 0x0001 >>> assert preauth.DataLength == 38 >>> assert preauth.HashAlgorithmCount == 1 >>> assert preauth.SaltLength == 32 >>> assert preauth.Salt == b"\x09\x33\xe9\xe8\xcb\xf4\x8a\x5c\x61\x4d\x38\x42\xa1\x53\x41\x18\x1b\xeb\x99\x78\x0b\x19\x6f\x5c\xef\xdd\x02\x51\x07\x3b\xc6\xcc" >>> assert len(preauth.HashAlgorithms) == 1 >>> assert preauth.HashAlgorithms[0] == 0x1 ###(011)=[passed] SMB2 Negotiate Context in Response - Type ENCRYPTION >>> enc = nego_resp.NegotiateContexts[1] >>> assert enc.ContextType == 0x0002 >>> assert enc.DataLength == 4 >>> assert enc.CipherCount == 1 >>> assert len(enc.Ciphers) == 1 >>> assert enc.Ciphers[0] == 1 ###(012)=[passed] SMB2 Negotiate Context in Response - Type COMPRESSION >>> comp = nego_resp.NegotiateContexts[2] >>> assert comp.ContextType == 0x0003 >>> assert comp.DataLength == 10 >>> assert comp.CompressionAlgorithmCount == 1 >>> assert len(comp.CompressionAlgorithms) == 1 >>> assert comp.CompressionAlgorithms[0] == 1 ###(013)=[passed] SMB2 Negotiate Protocol Response Header assembling >>> pkt = IP() / TCP() / NBTSession() / SMB2_Header() / SMB2_Negotiate_Protocol_Response() >>> pkt = IP(raw(pkt)) >>> assert SMB2_Negotiate_Protocol_Response in pkt ###### ## SMB2 Negotiate Protocol Request Header with 1 dialect ###### ###(014)=[passed] Common fields in header >>> rawpkt = b'\x45\x00\x01\x10\x16\x2c\x40\x00\x37\x06\xc4\x14\x91\xdc\x18\x13\xc0\xa8\xfe\x07\x9d\x76\x01\xbd\x37\x06\x5e\x82\xa3\xca\x83\xd2\x50\x18\x01\xf6\x11\x5b\x00\x00\x00\x00\x00\xe4\xfe\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x24\x00\x01\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x59\x9e\x84\xf1\x9d\x61\xce\x99\x1f\x50\x5c\x04\x44\x74\xb1\x0a\x68\x00\x00\x00\x04\x00\x00\x00\x11\x03\x00\x00\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x00\x00\x00\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x31\x00\x37\x00\x38\x00\x2e\x00\x32\x00\x31\x00' >>> pkt = IP(rawpkt) >>> assert TCP in pkt >>> assert NBTSession in pkt >>> assert pkt[NBTSession].LENGTH == 228 >>> assert SMB2_Header in pkt >>> assert SMB2_Negotiate_Protocol_Request in pkt >>> nego_req = pkt[SMB2_Negotiate_Protocol_Request] >>> assert nego_req.StructureSize == 0x24 >>> assert nego_req.DialectCount == 1 >>> assert nego_req.SecurityMode == 0 >>> assert nego_req.Capabilities == 0x7f >>> assert str(nego_req.ClientGUID) == 'f1849e59-619d-99ce-1f50-5c044474b10a' >>> assert nego_req.NegotiateContextsBufferOffset == 0x68 >>> assert nego_req.NegotiateContextsCount == 4 >>> for dialect in nego_req.Dialects: ... assert dialect in SMB_DIALECTS.keys() ... >>> assert 0x311 in nego_req.Dialects >>> assert len(nego_req.NegotiateContexts) == nego_req.NegotiateContextsCount ###(015)=[passed] SMB2 Negotiate Context in Request - type PREAUTH - disassemble >>> preauth = nego_req.NegotiateContexts[0] >>> assert preauth.ContextType == 0x1 >>> assert preauth.DataLength == 38 >>> assert preauth.HashAlgorithmCount == 1 >>> assert preauth.SaltLength == 32 >>> assert preauth.Salt == b'\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18' >>> assert len(preauth.HashAlgorithms) == 1 >>> assert preauth.HashAlgorithms[0] == 0x1 ###(016)=[passed] SMB2 Negotiate Context in Request - type ENCRYPTION disassemble >>> enc = nego_req.NegotiateContexts[1] >>> assert enc.ContextType == 0x2 >>> assert enc.DataLength == 6 >>> assert enc.CipherCount == 2 >>> assert len(enc.Ciphers) == 2 >>> assert enc.Ciphers[0] == 1 >>> assert enc.Ciphers[1] == 2 ###(017)=[passed] SMB2 Negotiate Context in Request - type COMPRESSION >>> comp = nego_req.NegotiateContexts[2] >>> assert comp.ContextType == 0x3 >>> assert comp.DataLength == 16 >>> assert comp.CompressionAlgorithmCount == 4 >>> assert len(comp.CompressionAlgorithms) == 4 >>> assert comp.CompressionAlgorithms[0] == 1 >>> assert comp.CompressionAlgorithms[1] == 2 >>> assert comp.CompressionAlgorithms[2] == 3 >>> assert comp.CompressionAlgorithms[3] == 4 ###(018)=[passed] SMB2 Negotiate Context in Request - type NETNAME NEGOCIATE >>> netname = nego_req.NegotiateContexts[3] >>> assert netname.ContextType == 0x5 >>> assert netname.DataLength == 28 >>> assert netname.NetName == '192.168.178.21' ###### ## SMB2 Negotiate Protocol Request Header default values ###### ###(019)=[passed] Default DialectCount >>> pkt = SMB2_Negotiate_Protocol_Request() >>> assert len(pkt.Dialects) == pkt.__class__(raw(pkt)).DialectCount ###(020)=[passed] Default NegotiateContextsCount >>> preauth = SMB2_Preauth_Integrity_Capabilities() >>> preauth_context = SMB2_Negotiate_Context(ContextType = 1, DataLength = len(preauth)) / preauth >>> >>> pkt = SMB2_Negotiate_Protocol_Request(Dialects=[0x0311], NegotiateContexts=[preauth_context], NegotiateContextsBufferOffset=0x68) >>> assert len(pkt.NegotiateContexts) == pkt.__class__(raw(pkt)).NegotiateContextsCount ###### ## Negotiate Request without manual padding of Negotiate Contexts ###### ###(021)=[passed] SMB2 Negotiate Context in Request - type PREAUTH - disassemble >>> preauth = SMB2_Preauth_Integrity_Capabilities() >>> preauth_context = SMB2_Negotiate_Context(ContextType = 1, DataLength = len(preauth)) / preauth >>> >>> enc = SMB2_Encryption_Capabilities() >>> enc_context = SMB2_Negotiate_Context(ContextType = 2, DataLength = len(enc)) / enc >>> >>> comp = SMB2_Compression_Capabilities() >>> comp_context = SMB2_Negotiate_Context(ContextType = 3, DataLength = len(comp)) / comp >>> >>> netname = SMB2_Netname_Negotiate_Context_ID("192.168.178.21".encode("utf-16le")) >>> netname_context = SMB2_Negotiate_Context(ContextType = 5, DataLength = len(netname)) / netname >>> >>> pkt = SMB2_Header() / SMB2_Negotiate_Protocol_Request(Dialects=[0x0311], NegotiateContexts=[preauth_context, enc_context, comp_context, netname_context], NegotiateContextsBufferOffset=0x68) >>> >>> pkt = SMB2_Header(raw(pkt)) >>> >>> nego_req = pkt[SMB2_Negotiate_Protocol_Request] >>> >>> preauth_dissected = nego_req.NegotiateContexts[0] >>> assert preauth_dissected.ContextType == preauth_context.ContextType >>> assert preauth_dissected.DataLength == preauth_context.DataLength >>> assert preauth_dissected.HashAlgorithmCount == 1 >>> assert preauth_dissected.SaltLength == 0 >>> assert len(preauth_dissected.HashAlgorithms) == len(preauth_context.HashAlgorithms) >>> assert preauth_dissected.HashAlgorithms[0] == preauth_context.HashAlgorithms[0] ###(022)=[passed] SMB2 Negotiate Context in Request - type ENCRYPTION disassemble >>> enc_dissected = nego_req.NegotiateContexts[1] >>> assert enc_dissected.ContextType == enc_context.ContextType >>> assert enc_dissected.DataLength == enc_context.DataLength >>> assert enc_dissected.CipherCount == 1 >>> assert len(enc_dissected.Ciphers) == len(enc_context.Ciphers) >>> assert enc_dissected.Ciphers[0] == enc_context.Ciphers[0] ###(023)=[passed] SMB2 Negotiate Context in Request - type COMPRESSION >>> comp_dissected = nego_req.NegotiateContexts[2] >>> assert comp_dissected.ContextType == comp_context.ContextType >>> assert comp_dissected.DataLength == 8 >>> assert comp_dissected.CompressionAlgorithmCount == 0 >>> assert len(comp_dissected.CompressionAlgorithms) == len(comp_context.CompressionAlgorithms) ###(024)=[passed] SMB2 Negotiate Context in Request - type NETNAME NEGOCIATE >>> netname_dissected = nego_req.NegotiateContexts[3] >>> assert netname_dissected.ContextType == netname_context.ContextType >>> assert netname_dissected.DataLength == netname_context.DataLength >>> assert netname_dissected.NetName == netname_context.NetName ###### ## SMB 2 Tree connect exchange ###### ###(025)=[passed] SMB2 Tree connect request >>> tree_con = Ether(b'RT\x00\x1c\x91\x8dRT\x00O9T\x08\x00E\x00\x00\xb0\x91\n@\x00\x80\x06\xe7\x1f\xc0\xa8\x00e\xc0\xa8\x00h\xc2@\x01\xbd\xd6a\x0e\xc2gX\xca\xb8P\x18\x04\x02\x82\xc0\x00\x00\x00\x00\x00\x84\xfeSMB@\x00\x01\x00\x00\x00\x00\x00\x03\x00\x01\x00\x18\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00$\x08\x00\xe4\xd7o\xa1\x96\xf9mm\xca[%\x1c\x8bG\x8a\xd6\t\x00\x02\x00H\x00<\x00\\\x00\\\x00s\x00c\x00a\x00l\x00e\x00o\x00u\x00t\x00.\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00s\x00h\x00a\x00r\x00e\x001\x00') >>> assert tree_con.Path == '\\\\scaleout.domain.local\\share1' >>> assert tree_con[SMB2_Tree_Connect_Request].Flags.REDIRECT_TO_OWNER ###(026)=[passed] SMB2 Tree connect response >>> tree_con_resp = Ether(b'RT\x00O9TRT\x00\x1c\x91\x8d\x08\x00E\x00\x00\xfeM\xfb@\x00\x80\x06)\xe1\xc0\xa8\x00h\xc0\xa8\x00e\x01\xbd\xc2@gX\xca\xb8\xd6a\x0fJP\x18 \x13\x83\x0e\x00\x00\x00\x00\x00\xd2\xfeSMB@\x00\x01\x00\xcc\x00\x00\xc0\x03\x00\x01\x00\x19\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00$\x08\x00\x1a\xc0\nRt\xe7\x04\x1b;\xd3gV\xe0\x1e\x87\xd1\t\x00\x01\x00\x8a\x00\x00\x00\x82\x00\x00\x00SRdr0\x00\x00\x00\x03\x00\x00\x00`\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xc0\xa8\x00il\x00\\\x00s\x00h\x00a\x00r\x00\x01\x00\x00\x00\x00\x00\x00\x00\xc0\xa8d\x8f\x1e\xd4.mk\xa0\xa3py\xa4\x9c\x8dJ\xc8\xd0\x9a\xfd\xc1\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x02\x00\x01\x00\x00\x00\\\x00\\\x00S\x00C\x00A\x00L\x00E\x00O\x00U\x00T\x00\\\x00s\x00h\x00a\x00r\x00e\x001\x00') >>> assert tree_con_resp.Status == 0xc00000cc >>> assert tree_con_resp.Flags.SMB2_FLAGS_SERVER_TO_REDIR >>> >>> ctx = SMB2_Error_ContextResponse(tree_con_resp.ErrorData) >>> assert ctx.ErrorId == 0x72645253 >>> assert ctx.ErrorContextData.NotificationType == 3 >>> assert ctx.ErrorContextData.ResourceName == '\\\\SCALEOUT\\share1' >>> assert [x.IPAddress for x in ctx.ErrorContextData.IPAddrMoveList] == ['192.168.0.105', '192.168.100.143'] ###### ## SMB 2 Setup Session ###### ###(027)=[passed] Setup Session Request >>> from scapy.layers.ntlm import * >>> >>> setup_sess = NBTSession(b'\x00\x00\x00\xa2\xfeSMB@\x00\x01\x00\x00\x00\x00\x00\x01\x00!\x00\x10\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00X\x00J\x00\x00\x00\x00\x00\x00\x00\x00\x00`H\x06\x06+\x06\x01\x05\x05\x02\xa0>0<\xa0\x0e0\x0c\x06\n+\x06\x01\x04\x01\x827\x02\x02\n\xa2*\x04(NTLMSSP\x00\x01\x00\x00\x00\x97\x82\x08\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00aJ\x00\x00\x00\x0f') >>> assert isinstance(setup_sess.Buffer[0][1].innerToken.token.mechToken.value, NTLM_NEGOTIATE) >>> assert setup_sess.Buffer[0][1].innerToken.token.mechToken.value.ProductBuild == 19041 ###(028)=[passed] Setup Session Response >>> from scapy.layers.ntlm import * >>> >>> setup_sess = NBTSession(b'\x00\x00\x00\xe7\xfeSMB@\x00\x01\x00\x16\x00\x00\xc0\x01\x00\x01\x00\x11\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00H\x00\x9f\x00\xa1\x81\x9c0\x81\x99\xa0\x03\n\x01\x01\xa1\x0c\x06\n+\x06\x01\x04\x01\x827\x02\x02\n\xa2\x81\x83\x04\x81\x80NTLMSSP\x00\x02\x00\x00\x00\x08\x00\x08\x008\x00\x00\x00\x15\x82\x8a\xe2\xe0\x14\xe7\xbf\xfd@\x01+\x00\x00\x00\x00\x00\x00\x00\x00@\x00@\x00@\x00\x00\x00\n\x00aJ\x00\x00\x00\x0fW\x00I\x00N\x001\x00\x02\x00\x08\x00W\x00I\x00N\x001\x00\x01\x00\x08\x00W\x00I\x00N\x001\x00\x04\x00\x08\x00W\x00I\x00N\x001\x00\x03\x00\x08\x00W\x00I\x00N\x001\x00\x07\x00\x08\x00\xef\x1f\x0e\tE\xe6\xd7\x01\x00\x00\x00\x00') >>> assert isinstance(setup_sess.Buffer[0][1].token.responseToken.value, NTLM_CHALLENGE) >>> assert setup_sess.Buffer[0][1].token.responseToken.value >>> assert setup_sess.Buffer[0][1].token.responseToken.value.Payload[0] == ('TargetName', 'WIN1') >>> assert setup_sess.Buffer[0][1].token.responseToken.value.Payload[1][1][-1].AvId == 0 ###(029)=[passed] SMB2 IOCTL Request - Validate negotiate info >>> ioctl_req = Ether(b'RT\x00>> assert ioctl_req.CtlCode == 1311236 >>> assert ioctl_req.InputBufferOffset == 120 >>> assert ioctl_req.InputLen == 34 >>> validate_neg = ioctl_req.Buffer[0][1] >>> assert isinstance(validate_neg, SMB2_IOCTL_Validate_Negotiate_Info_Request) >>> assert validate_neg.SecurityMode.SIGNING_ENABLED >>> assert validate_neg.Dialects == [514, 528, 768, 770, 785] >>> >>> c = ioctl_req.copy() >>> c.InputLen = None >>> c.InputBufferOffset = None >>> c = Ether(raw(c)) >>> assert c.InputBufferOffset == 120 >>> assert c.InputLen == 34 >>> assert len(c.Buffer[0][1]) == 34 ###(030)=[passed] SMB2 IOCTL Request - DFS referral (TargetSetBoundary) >>> ioctl_req = NBTSession(b'\x00\x00\x01t\xfeSMB@\x00\x01\x00\x00\x00\x00\x00\x0b\x00\x01\x009\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x01\x00\x00\x00i\x00\x00\x00\x00D\x00\x00\x93\xefQ\xd3\xf2\xc7\xc3\xf3m\xcf.\xb4\xe9\x16\xb7+1\x00\x00\x00\x94\x01\x06\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffp\x00\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x04\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\x00\x02\x00\x03\x00\x00\x00\x04\x00"\x00\x01\x00\x04\x00,\x01\x00\x00D\x00n\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00"\x00\x01\x00\x00\x00,\x01\x00\x00"\x00L\x00\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00c\x00o\x00m\x00m\x00o\x00n\x00\x00\x00\\\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00c\x00o\x00m\x00m\x00o\x00n\x00\x00\x00\\\x00D\x00C\x001\x00.\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00c\x00o\x00m\x00m\x00o\x00n\x00\x00\x00\\\x00D\x00C\x002\x00.\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00c\x00o\x00m\x00m\x00o\x00n\x00\x00\x00') >>> assert ioctl_req.CtlCode == 393620 >>> dfs_referral = ioctl_req.Output >>> >>> assert isinstance(dfs_referral, SMB2_IOCTL_RESP_GET_DFS_Referral) >>> assert dfs_referral.ReferralBuffer[0].DFSPath == '\\domain.local\\common' >>> assert dfs_referral.ReferralBuffer[0].DFSAlternatePath == '\\domain.local\\common' >>> assert dfs_referral.ReferralBuffer[0].NetworkAddress == '\\DC1.domain.local\\common' >>> assert dfs_referral.ReferralBuffer[1].DFSPath == '\\domain.local\\common' >>> assert dfs_referral.ReferralBuffer[1].DFSAlternatePath == '\\domain.local\\common' >>> assert dfs_referral.ReferralBuffer[1].NetworkAddress == '\\DC2.domain.local\\common' ###(031)=[passed] SMB2 IOCTL Response - DFS referral (TargetSetBoundary) >>> dfs_referral = SMB2_IOCTL_RESP_GET_DFS_Referral( ... ReferralHeaderFlags="ReferralServers+StorageServers", ... ReferralEntries=[ ... DFS_REFERRAL_V4( ... ServerType="root", ... ReferralEntryFlags="TargetSetBoundary", ... TimeToLive=300, ... ), ... DFS_REFERRAL_V4( ... ServerType="root", ... ReferralEntryFlags="TargetSetBoundary", ... TimeToLive=300, ... ) ... ], ... ReferralBuffer=[ ... DFS_REFERRAL_ENTRY0( ... DFSPath="\\domain.local\\common", ... DFSAlternatePath="\\domain.local\\common", ... NetworkAddress="\\DC1.domain.local\\common", ... ), ... DFS_REFERRAL_ENTRY0( ... DFSPath="\\domain.local\\common", ... DFSAlternatePath="\\domain.local\\common", ... NetworkAddress="\\DC2.domain.local\\common", ... ) ... ] ... ) >>> assert bytes(dfs_referral) == b'\x00\x00\x02\x00\x03\x00\x00\x00\x04\x00"\x00\x01\x00\x04\x00,\x01\x00\x00D\x00n\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00"\x00\x01\x00\x04\x00,\x01\x00\x00\xa8\x00\xd2\x00\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00c\x00o\x00m\x00m\x00o\x00n\x00\x00\x00\\\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00c\x00o\x00m\x00m\x00o\x00n\x00\x00\x00\\\x00D\x00C\x001\x00.\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00c\x00o\x00m\x00m\x00o\x00n\x00\x00\x00\\\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00c\x00o\x00m\x00m\x00o\x00n\x00\x00\x00\\\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00c\x00o\x00m\x00m\x00o\x00n\x00\x00\x00\\\x00D\x00C\x002\x00.\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\\\x00c\x00o\x00m\x00m\x00o\x00n\x00\x00\x00' >>> >>> dfs_referral = SMB2_IOCTL_RESP_GET_DFS_Referral(bytes(dfs_referral)) >>> assert dfs_referral.ReferralBuffer[0].DFSPath == '\\domain.local\\common' >>> assert dfs_referral.ReferralBuffer[0].DFSAlternatePath == '\\domain.local\\common' >>> assert dfs_referral.ReferralBuffer[0].NetworkAddress == '\\DC1.domain.local\\common' >>> assert dfs_referral.ReferralBuffer[1].DFSPath == '\\domain.local\\common' >>> assert dfs_referral.ReferralBuffer[1].DFSAlternatePath == '\\domain.local\\common' >>> assert dfs_referral.ReferralBuffer[1].NetworkAddress == '\\DC2.domain.local\\common' ###(032)=[passed] SMB2 IOCTL Request - DFS referral (NameListReferral) >>> ioctl_req = NBTSession(b'\x00\x00\x00\xc8\xfeSMB@\x00\x01\x00\x00\x00\x00\x00\x0b\x00\x01\x009\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x01\x00\x00\x00}\x00\x00\x10\x00\xf8\x01\x00\xd4UjTy\xef\xdd2\x19)\x9a\r\x15\xa7\x1f11\x00\x00\x00\x94\x01\x06\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffp\x00\x00\x00\x00\x00\x00\x00p\x00\x00\x00X\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x03\x00\x12\x00\x00\x00\x02\x00X\x02\x00\x00$\x00\x00\x00\x00\x00\x03\x00\x12\x00\x00\x00\x02\x00X\x02\x00\x00"\x00\x00\x00\x00\x00\\\x00D\x00O\x00M\x00A\x00I\x00N\x00\x00\x00\\\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\x00\x00') >>> assert ioctl_req.CtlCode == 393620 >>> dfs_referral = ioctl_req.Output >>> >>> assert isinstance(dfs_referral, SMB2_IOCTL_RESP_GET_DFS_Referral) >>> assert dfs_referral.ReferralEntries[0].SpecialNameOffset == 36 >>> assert dfs_referral.ReferralEntries[0].ExpandedNameOffset == 0 >>> assert dfs_referral.ReferralEntries[1].SpecialNameOffset == 34 >>> assert dfs_referral.ReferralEntries[1].ExpandedNameOffset == 0 >>> >>> assert dfs_referral.ReferralBuffer[0].SpecialName == "\\DOMAIN" >>> assert dfs_referral.ReferralBuffer[0].ExpandedName == [] >>> assert dfs_referral.ReferralBuffer[1].SpecialName == "\\domain.local" >>> assert dfs_referral.ReferralBuffer[1].ExpandedName == [] ###(033)=[passed] SMB2 IOCTL Response - DFS referral (NameListReferral) >>> DOMAIN_REFERRALS = ["\\DOMAIN", "\\domain.local"] >>> dfs_referral = SMB2_IOCTL_RESP_GET_DFS_Referral( ... ReferralEntries=[ ... DFS_REFERRAL_V3( ... ReferralEntryFlags="NameListReferral", ... TimeToLive=600, ... ) ... for _ in DOMAIN_REFERRALS ... ], ... ReferralBuffer=[ ... DFS_REFERRAL_ENTRY1( ... SpecialName=name ... ) ... for name in DOMAIN_REFERRALS ... ] ... ) >>> >>> assert bytes(dfs_referral) == b'\x00\x00\x02\x00\x00\x00\x00\x00\x03\x00\x12\x00\x00\x00\x02\x00X\x02\x00\x00$\x00\x00\x00\x00\x00\x03\x00\x12\x00\x00\x00\x02\x00X\x02\x00\x00"\x00\x00\x00\x00\x00\\\x00D\x00O\x00M\x00A\x00I\x00N\x00\x00\x00\\\x00d\x00o\x00m\x00a\x00i\x00n\x00.\x00l\x00o\x00c\x00a\x00l\x00\x00\x00' >>> >>> dfs_referral = SMB2_IOCTL_RESP_GET_DFS_Referral(bytes(dfs_referral)) >>> assert dfs_referral.ReferralBuffer[0].SpecialName == "\\DOMAIN" >>> assert dfs_referral.ReferralBuffer[0].ExpandedName == [] >>> assert dfs_referral.ReferralBuffer[1].SpecialName == "\\domain.local" >>> assert dfs_referral.ReferralBuffer[1].ExpandedName == [] ###(034)=[passed] SMB2 Create Request with Contexts >>> sess_create_context = NBTSession(b'\x00\x00\x01D\xfeSMB@\x00\x01\x00\x00\x00\x00\x00\x05\x00\x00\x000\x00\x00\x00\x00\x00\x00\x00\x80\xcd\t\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x9bk>\xb6[=\x16\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x009\x00\x00\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x89\x00\x12\x00\x00\x00\x00\x00\x07\x00\x00\x00\x01\x00\x00\x00d\x00\x00\x00x\x00\x16\x00\x90\x00\x00\x00\xb4\x00\x00\x00d\x00e\x00s\x00k\x00t\x00o\x00p\x00.\x00i\x00n\x00i\x00\x00\x008\x00\x00\x00\x10\x00\x04\x00\x00\x00\x18\x00 \x00\x00\x00DH2Q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000\x1d\xb3\xc8\xfa\r\xed\x11\xb7R\x808\xfb\xd6\xa0~\x18\x00\x00\x00\x10\x00\x04\x00\x00\x00\x18\x00\x00\x00\x00\x00MxAc\x00\x00\x00\x00\x18\x00\x00\x00\x10\x00\x04\x00\x00\x00\x18\x00\x00\x00\x00\x00QFid\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x04\x00\x00\x00\x18\x004\x00\x00\x00RqLs\x00\x00\x00\x00\xc8\x9bA\xdb\x8e\xd1\x19\xf4\\;\x846;\xf6\xca\xe0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert sess_create_context.Name == "desktop.ini" >>> assert isinstance(sess_create_context.CreateContexts[0].Data, SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2) >>> assert sess_create_context.CreateContexts[1].Name == b"MxAc" >>> assert sess_create_context.CreateContexts[2].Name == b"QFid" >>> assert isinstance(sess_create_context.CreateContexts[3].Data, SMB2_CREATE_REQUEST_LEASE_V2) >>> >>> sess_create_context_response = NBTSession(b"\x00\x00\x00\xf0\xfeSMB@\x00\x01\x00\x00\x00\x00\x00\x05\x00\x01\x001\x00\x00\x00\x00\x00\x00\x00\x7f\xcd\t\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x9bk>\xb6[=\x16\xb4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x01\x00\x00\x00\x9d\x89JH\xbe\xa1\xd8\x01\x9d\x89JH\xbe\xa1\xd8\x01{\x0f$W\x06\xa2\xd8\x01{\x0f$W\x06\xa2\xd8\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x13\x17\xe8L\x00\x00\x00\x00'\x1aT\xad\x00\x00\x00\x00\x98\x00\x00\x00X\x00\x00\x00 \x00\x00\x00\x10\x00\x04\x00\x00\x00\x18\x00\x08\x00\x00\x00MxAc\x00\x00\x00\x00\x00\x00\x00\x00\xff\x01\x1f\x00\x00\x00\x00\x00\x10\x00\x04\x00\x00\x00\x18\x00 \x00\x00\x00QFid\x00\x00\x00\x00\x01\x00$\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") >>> assert sess_create_context_response.CreateContexts[0].Data.QueryStatus == 0 >>> assert sess_create_context_response.CreateContexts[1].Data.DiskFileId == 2359297 >>> assert sess_create_context_response.CreateContexts[1].Data.Reserved == b'\x00' * 16 ###(035)=[passed] SMB2 Query Info Response with Security Descriptor >>> qr = SMB2_Query_Info_Response(b'\t\x00H\x00\xe0\x00\x00\x00\x01\x00\x14\x9c\x14\x00\x00\x004\x00\x00\x00\x00\x00\x00\x00T\x00\x00\x00\x01\x06\x00\x00\x00\x00\x00\x05P\x00\x00\x00\xb5\x89\xfb8\x19\x84\xc2\xcb\\l#mW\x00wn\xc0\x02d\x87\x01\x06\x00\x00\x00\x00\x00\x05P\x00\x00\x00\xb5\x89\xfb8\x19\x84\xc2\xcb\\l#mW\x00wn\xc0\x02d\x87\x02\x00\x8c\x00\x06\x00\x00\x00\x00\x03\x18\x00\xa9\x00\x12\x00\x01\x02\x00\x00\x00\x00\x00\x0f\x02\x00\x00\x00\x01\x00\x00\x00\x00\x0b\x14\x00\xff\x01\x1f\x00\x01\x01\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x03\x14\x00\xff\x01\x1f\x00\x01\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x03\x14\x00\xff\x01\x1f\x00\x01\x01\x00\x00\x00\x00\x00\x05\x12\x00\x00\x00\x00\x03\x18\x00\xff\x01\x1f\x00\x01\x02\x00\x00\x00\x00\x00\x05 \x00\x00\x00 \x02\x00\x00\x00\x03\x18\x00\xa9\x00\x12\x00\x01\x02\x00\x00\x00\x00\x00\x05 \x00\x00\x00!\x02\x00\x00') >>> sd = SECURITY_DESCRIPTOR(qr.Output) >>> >>> assert sd.OwnerSid.summary() == 'S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464' >>> assert sd.GroupSid.summary() == 'S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464' >>> >>> assert sd.DACL.toSDDL() == [ ... '(A;OI+CI;;;;S-1-15-2-1)', ... '(A;OI+CI+IO;;;;S-1-3-0)', ... '(A;OI+CI;;;;S-1-1-0)', ... '(A;OI+CI;;;;S-1-5-18)', ... '(A;OI+CI;;;;S-1-5-32-544)', ... '(A;OI+CI;;;;S-1-5-32-545)', ... ] ###(036)=[passed] SMB2 Set Info Request with Rename >>> set_info = NBTSession(b'\x00\x00\x00|\xfeSMB@\x00\x01\x00#\x00\x00\x00\x11\x00\x01\x000\x00\x00\x00\x00\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x01\x00\x00\x00\x15\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x01\n\x1c\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\xb0\n\x9c\xfd@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc3\x01\xc1\\\\1\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00t\x00e\x00s\x00t\x00') >>> >>> assert set_info.FileId.Persistent == 0x40fd9c0ab0 >>> assert isinstance(set_info.Data, FileRenameInformation) >>> assert set_info.Data.FileName == "test" >>> assert not set_info.Data.ReplaceIfExists SMB2 Client and Server tests ━ Run at 01:42:28 from [test/scapy/layers/smbclientserver.uts] by UTscapy in 5.082796335220337 └ Passed=13 └ Failed=0 ###### ## SMB2 Client tests ###### ###(000)=[passed] Define samba server >>> import subprocess >>> >>> TEMP_DIR = pathlib.Path(get_temp_dir()) >>> TEMP_DIR.chmod(0o0755) >>> print(TEMP_DIR) /tmp/scapymg1yb66k >>> >>> SHARE_DIR = TEMP_DIR / "share" >>> SHARE_DIR.mkdir() >>> SHARE_DIR.chmod(0o0777) >>> (SHARE_DIR / "fileA").touch() >>> (SHARE_DIR / "fileB").touch() >>> (SHARE_DIR / "fileScapy").touch() >>> (SHARE_DIR / "ignoredFile").symlink_to("fileA") >>> (SHARE_DIR / "sub").mkdir() >>> (SHARE_DIR / "sub").chmod(0o0777) >>> (SHARE_DIR / "sub" / "secret").touch() >>> >>> LOGS_DIR = TEMP_DIR / "logs" >>> LOCK_DIR = TEMP_DIR / "lock" >>> PRIVATE_DIR = TEMP_DIR / "private" >>> PID_DIR = TEMP_DIR / "pid" >>> CACHE_DIR = TEMP_DIR / "cache" >>> STATE_DIRECTORY = TEMP_DIR / "state" >>> NCALRPC_DIR = TEMP_DIR / "ncalrpc" >>> >>> for dir in [LOGS_DIR, LOCK_DIR, PRIVATE_DIR, PID_DIR, CACHE_DIR, STATE_DIRECTORY, NCALRPC_DIR]: ... dir.mkdir() ... >>> SMBD_LOG = LOGS_DIR / "log.smbd" >>> SMBD_LOG.touch() >>> >>> CONF_FILE = get_temp_file(autoext=".conf") >>> CONF = """ ... ... [global] ... workgroup = WORKGROUP ... server role = standalone server ... security = user ... map to guest = bad user ... log level = 1 smb2:5 auth:3 ... ... bind interfaces only = yes ... interfaces = 127.0.0.0/8 ... ... lock directory = %s ... private directory = %s ... cache directory = %s ... ncalrpc dir = %s ... pid directory = %s ... state directory = %s ... ... [test] ... comment = Test share ... path = %s ... guest ok = yes ... browseable = yes ... read only = no ... public = yes ... """ % ( ... LOCK_DIR, ... PRIVATE_DIR, ... CACHE_DIR, ... NCALRPC_DIR, ... PID_DIR, ... STATE_DIRECTORY, ... SHARE_DIR, ... ) >>> >>> print(CONF) [global] workgroup = WORKGROUP server role = standalone server security = user map to guest = bad user log level = 1 smb2:5 auth:3 bind interfaces only = yes interfaces = 127.0.0.0/8 lock directory = /tmp/scapymg1yb66k/lock private directory = /tmp/scapymg1yb66k/private cache directory = /tmp/scapymg1yb66k/cache ncalrpc dir = /tmp/scapymg1yb66k/ncalrpc pid directory = /tmp/scapymg1yb66k/pid state directory = /tmp/scapymg1yb66k/state [test] comment = Test share path = /tmp/scapymg1yb66k/share guest ok = yes browseable = yes read only = no public = yes >>> >>> with open(CONF_FILE, "w") as fd: ... fd.write(CONF) ... 619 >>> >>> class run_smbserver: ... def __init__(self): ... self.proc = None ... ... def __enter__(self): ... # Empty log ... with SMBD_LOG.open('w') as fd: ... fd.write("") ... print("@ Starting smbd server") ... # Start server ... self.proc = subprocess.Popen(["/usr/sbin/smbd", "-F", "-p", "12345", "-s", CONF_FILE, "-l", LOGS_DIR]) ... # wait for it to start ... for i in range(10): ... sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ... sock.settimeout(1) ... try: ... sock.connect(("127.0.0.1", 12345)) ... break ... except Exception: ... time.sleep(0.5) ... finally: ... sock.close() ... else: ... raise TimeoutError ... print("@ Server started !") ... ... def __exit__(self, exc_type, exc_value, traceback): ... print("@ Stopping smbd server !") ... self.proc.terminate() ... self.proc.wait() ... if traceback: ... # failed ... print("\nTest failed. Smbd logs:") ... with SMBD_LOG.open('r') as fd: ... print(fd.read()) ... print("@ smbd server stopped !") ... ... >>> >>> >>> def run_smbclient(max_dialect=0x0202): ... return smbclient("localhost", "guest", port=12345, guest=True, cli=False, debug=4, MAX_DIALECT=max_dialect) ... ###(001)=[passed] smbclient: SMB 2.0.2 - connect then list shares >>> with run_smbserver(): ... try: ... cli = run_smbclient() ... results = cli.shares() ... print(results) ... assert ('test', 'DISKTREE', 'Test share') in results ... assert any(x[0] == "IPC$" for x in results) ... finally: ... cli.close() ... @ Starting smbd server @ Server started ! Starting control thread [tid=140735965753600] ## state=[BEGIN] Condition [continue_smb2] not taken Condition [send_negotiate] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate] SENT : DirectTCP / SMB_Header / SMBNegotiate_Request switching from [BEGIN] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [SMB2_NEGOTIATE] switching from [SENT_NEGOTIATE] to [SMB2_NEGOTIATE] ## state=[SMB2_NEGOTIATE] Condition [send_negotiate_smb2] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate_smb2] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request switching from [SMB2_NEGOTIATE] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [NEGOTIATED] switching from [SENT_NEGOTIATE] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [NEGOTIATED] switching from [SENT_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [AUTHENTICATED] switching from [SENT_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [authenticated_post_actions] taken to state [SOCKET_BIND] switching from [AUTHENTICATED] to [SOCKET_BIND] ## state=[SOCKET_BIND] Condition [start_smb_socket] taken to state [SOCKET_MODE_SMB] switching from [SOCKET_BIND] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] SMB 2.002 authentication successful using SPNEGOSSP[NTLMSSP] as GUEST ! IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_IOCTL_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Error_Response / Raw Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_IOCTL_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_IOCTL_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_IOCTL_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] [('test', 'DISKTREE', 'Test share'), ('IPC$', 'IPC', 'IPC Service (Samba 4.21.2)')] Connection closed Stopping control thread (tid=140735965753600) @ Stopping smbd server ! @ smbd server stopped ! ###(002)=[passed] smbclient: SMB 2.0.2 - connect to test share and list files >>> with run_smbserver(): ... try: ... cli = run_smbclient() ... cli.use("test") ... files = cli.ls() ... names = [x[0] for x in files] ... assert all(x in names for x in ['.', '..', 'sub', 'fileB', 'fileScapy', 'fileA']) ... finally: ... cli.close() ... @ Starting smbd server @ Server started ! Starting control thread [tid=140735762329856] ## state=[BEGIN] Condition [continue_smb2] not taken Condition [send_negotiate] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate] SENT : DirectTCP / SMB_Header / SMBNegotiate_Request switching from [BEGIN] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [SMB2_NEGOTIATE] switching from [SENT_NEGOTIATE] to [SMB2_NEGOTIATE] ## state=[SMB2_NEGOTIATE] Condition [send_negotiate_smb2] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate_smb2] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request switching from [SMB2_NEGOTIATE] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [NEGOTIATED] switching from [SENT_NEGOTIATE] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [NEGOTIATED] switching from [SENT_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [AUTHENTICATED] switching from [SENT_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [authenticated_post_actions] taken to state [SOCKET_BIND] switching from [AUTHENTICATED] to [SOCKET_BIND] ## state=[SOCKET_BIND] Condition [start_smb_socket] taken to state [SOCKET_MODE_SMB] switching from [SOCKET_BIND] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] SMB 2.002 authentication successful using SPNEGOSSP[NTLMSSP] as GUEST ! IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Error_Response / Raw Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Connection closed Stopping control thread (tid=140735762329856) @ Stopping smbd server ! @ smbd server stopped ! ###(003)=[passed] smbclient: SMB 2.0.2 - connect to test share and get file >>> LOCALPATH = pathlib.Path(get_temp_dir()) >>> >>> with run_smbserver(): ... try: ... cli = run_smbclient() ... cli.use("test") ... cli.lcd(str(LOCALPATH)) ... completions = cli.get_complete("file") ... assert all(x in completions for x in ['fileA', 'fileB']) ... cli.get('fileA') ... assert (LOCALPATH / "fileA").exists() ... assert [x.name for x in cli.lls()] == ['fileA'] ... finally: ... cli.close() ... @ Starting smbd server @ Server started ! Starting control thread [tid=140735770784000] ## state=[BEGIN] Condition [continue_smb2] not taken Condition [send_negotiate] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate] SENT : DirectTCP / SMB_Header / SMBNegotiate_Request switching from [BEGIN] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [SMB2_NEGOTIATE] switching from [SENT_NEGOTIATE] to [SMB2_NEGOTIATE] ## state=[SMB2_NEGOTIATE] Condition [send_negotiate_smb2] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate_smb2] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request switching from [SMB2_NEGOTIATE] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [NEGOTIATED] switching from [SENT_NEGOTIATE] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [NEGOTIATED] switching from [SENT_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [AUTHENTICATED] switching from [SENT_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [authenticated_post_actions] taken to state [SOCKET_BIND] switching from [AUTHENTICATED] to [SOCKET_BIND] ## state=[SOCKET_BIND] Condition [start_smb_socket] taken to state [SOCKET_MODE_SMB] switching from [SOCKET_BIND] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] SMB 2.002 authentication successful using SPNEGOSSP[NTLMSSP] as GUEST ! IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Error_Response / Raw Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] ('fileA', 0) Connection closed Stopping control thread (tid=140735770784000) @ Stopping smbd server ! @ smbd server stopped ! ###(004)=[passed] smbclient: SMB 2.0.2 - connect to test share, cd, put file and cat it >>> LOCALPATH = pathlib.Path(get_temp_dir()) >>> with (LOCALPATH / "fileC").open("w") as fd: ... fd.write("Nice\nData") ... 9 >>> with run_smbserver(): ... try: ... cli = run_smbclient() ... cli.use("test") ... cli.lcd(str(LOCALPATH)) ... cli.cd("sub") ... # upload ... cli.put('fileC') ... # check completion ... completions = cli.get_complete("") ... assert all(x in completions for x in ['secret', 'fileC']) ... # cat ... assert cli.cat('fileC') == b'Nice\nData' ... # check on disk ... with (SHARE_DIR / "sub" / "fileC").open("r") as fd: ... assert fd.read() == "Nice\nData" ... finally: ... cli.close() ... @ Starting smbd server @ Server started ! Starting control thread [tid=140735974207744] ## state=[BEGIN] Condition [continue_smb2] not taken Condition [send_negotiate] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate] SENT : DirectTCP / SMB_Header / SMBNegotiate_Request switching from [BEGIN] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [SMB2_NEGOTIATE] switching from [SENT_NEGOTIATE] to [SMB2_NEGOTIATE] ## state=[SMB2_NEGOTIATE] Condition [send_negotiate_smb2] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate_smb2] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request switching from [SMB2_NEGOTIATE] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [NEGOTIATED] switching from [SENT_NEGOTIATE] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [NEGOTIATED] switching from [SENT_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [AUTHENTICATED] switching from [SENT_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [authenticated_post_actions] taken to state [SOCKET_BIND] switching from [AUTHENTICATED] to [SOCKET_BIND] ## state=[SOCKET_BIND] Condition [start_smb_socket] taken to state [SOCKET_MODE_SMB] switching from [SOCKET_BIND] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] SMB 2.002 authentication successful using SPNEGOSSP[NTLMSSP] as GUEST ! IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Write_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Write_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] ('fileC', 9) IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Error_Response / Raw Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Read_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Read_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] Connection closed Stopping control thread (tid=140735974207744) @ Stopping smbd server ! @ smbd server stopped ! ###(005)=[passed] smbclient: SMB 2.0.2 - connect to test share and recursive get >>> LOCALPATH = pathlib.Path(get_temp_dir()) >>> >>> with run_smbserver(): ... try: ... cli = run_smbclient() ... cli.use("test") ... cli.lcd(str(LOCALPATH)) ... cli.get(".", r=True) ... # check on disk ... finally: ... cli.close() ... @ Starting smbd server @ Server started ! Starting control thread [tid=140735957299456] ## state=[BEGIN] Condition [continue_smb2] not taken Condition [send_negotiate] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate] SENT : DirectTCP / SMB_Header / SMBNegotiate_Request switching from [BEGIN] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [SMB2_NEGOTIATE] switching from [SENT_NEGOTIATE] to [SMB2_NEGOTIATE] ## state=[SMB2_NEGOTIATE] Condition [send_negotiate_smb2] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate_smb2] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request switching from [SMB2_NEGOTIATE] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [NEGOTIATED] switching from [SENT_NEGOTIATE] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [NEGOTIATED] switching from [SENT_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [AUTHENTICATED] switching from [SENT_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [authenticated_post_actions] taken to state [SOCKET_BIND] switching from [AUTHENTICATED] to [SOCKET_BIND] ## state=[SOCKET_BIND] Condition [start_smb_socket] taken to state [SOCKET_MODE_SMB] switching from [SOCKET_BIND] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] SMB 2.002 authentication successful using SPNEGOSSP[NTLMSSP] as GUEST ! IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Error_Response / Raw Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] fileA IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] fileB IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] fileScapy IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] ignoredFile IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Error_Response / Raw Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] sub\secret IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Read_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Read_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] sub\fileC sub ('.', 9) Connection closed Stopping control thread (tid=140735957299456) @ Stopping smbd server ! @ smbd server stopped ! >>> assert (LOCALPATH / "fileA").exists() >>> assert (LOCALPATH / "fileB").exists() >>> assert (LOCALPATH / "fileScapy").exists() >>> assert (LOCALPATH / "sub").exists() >>> assert (LOCALPATH / "sub" / "secret").exists() ###(006)=[passed] smbclient: SMB 3.1.1 - connect to test share and recursive get >>> LOCALPATH = pathlib.Path(get_temp_dir()) >>> >>> with run_smbserver(): ... try: ... cli = run_smbclient(max_dialect=0x0311) ... cli.use("test") ... cli.lcd(str(LOCALPATH)) ... cli.get(".", r=True) ... # check on disk ... finally: ... cli.close() ... @ Starting smbd server @ Server started ! Starting control thread [tid=140735810629888] ## state=[BEGIN] Condition [continue_smb2] not taken Condition [send_negotiate] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate] SENT : DirectTCP / SMB_Header / SMBNegotiate_Request switching from [BEGIN] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [SMB2_NEGOTIATE] switching from [SENT_NEGOTIATE] to [SMB2_NEGOTIATE] ## state=[SMB2_NEGOTIATE] Condition [send_negotiate_smb2] taken to state [SENT_NEGOTIATE] + Running action [on_negotiate_smb2] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request switching from [SMB2_NEGOTIATE] to [SENT_NEGOTIATE] ## state=[SENT_NEGOTIATE] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response Receive condition [receive_negotiate_response] taken to state [NEGOTIATED] switching from [SENT_NEGOTIATE] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [NEGOTIATED] switching from [SENT_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] Condition [should_send_setup_andx_request] taken to state [SENT_SETUP_ANDX_REQUEST] + Running action [send_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Request switching from [NEGOTIATED] to [SENT_SETUP_ANDX_REQUEST] ## state=[SENT_SETUP_ANDX_REQUEST] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Response Receive condition [receive_setup_andx_response] taken to state [AUTHENTICATED] switching from [SENT_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [authenticated_post_actions] taken to state [SOCKET_BIND] switching from [AUTHENTICATED] to [SOCKET_BIND] ## state=[SOCKET_BIND] Condition [start_smb_socket] taken to state [SOCKET_MODE_SMB] switching from [SOCKET_BIND] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] SMB 3.1.1 authentication successful using SPNEGOSSP[NTLMSSP] as GUEST ! IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Error_Response / Raw Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] fileA IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] fileB IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] fileScapy IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] ignoredFile IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Error_Response / Raw Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] sub\secret IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Create_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Read_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Read_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] IOEVENT on smbpipe I/O event [outgoing_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [send_data] SENT : DirectTCP / SMB2_Header / SMB2_Close_Request switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Response Receive condition [incoming_data_received_smb] taken to state [SOCKET_MODE_SMB] + Running action [receive_data_smb] switching from [SOCKET_MODE_SMB] to [SOCKET_MODE_SMB] ## state=[SOCKET_MODE_SMB] sub\fileC sub ('.', 9) Connection closed Stopping control thread (tid=140735810629888) @ Stopping smbd server ! @ smbd server stopped ! >>> assert (LOCALPATH / "fileA").exists() >>> assert (LOCALPATH / "fileB").exists() >>> assert (LOCALPATH / "fileScapy").exists() >>> assert (LOCALPATH / "sub").exists() >>> assert (LOCALPATH / "sub" / "secret").exists() ###### ## SMB2 Server tests ###### ###(007)=[passed] Define Scapy smb server >>> import subprocess >>> import select >>> >>> ROOTPATH = pathlib.Path(get_temp_dir()) >>> >>> (ROOTPATH / "fileA").touch() >>> (ROOTPATH / "fileB").touch() >>> (ROOTPATH / "fileScapy").touch() >>> (ROOTPATH / "sub").mkdir() >>> (ROOTPATH / "sub" / "secret").touch() >>> >>> with (ROOTPATH / "fileScapy").open("w") as fd: ... fd.write("Nice\nData") ... 9 >>> class run_smbserver: ... def __init__(self, guest=False, readonly=True): ... self.srv = None ... self.guest = guest ... self.readonly = readonly ... ... def __enter__(self): ... if self.guest: ... IDENTITIES = None ... else: ... IDENTITIES = { ... "User1": MD4le("Password1"), ... "Administrator": MD4le("Password2") ... } ... self.srv = smbserver( ... shares=[SMBShare("Scapy", ROOTPATH), SMBShare("test", ROOTPATH)], ... iface=conf.loopback_name, ... debug=4, ... port=12345, ... bg=True, ... readonly=self.readonly, ... # NTLMSSP ... IDENTITIES=IDENTITIES, ... ) ... ... def __exit__(self, exc_type, exc_value, traceback): ... self.srv.close() ... >>> >>> >>> class run_smbclient: ... def __init__(self, user=None, password=None, share=None, list=False, cwd=None, debug=None, maxversion=None): ... args = [ ... "smbclient", ... ] + (["-L"] if list else []) + [ ... "//127.0.0.1%s" % (("/%s" % share) if share else ""), ... "-p", "12345", ... ] ... if user and password: ... args.extend([ ... "-U", ... "DOMAIN/%s" % user, ... "--password", ... password, ... ]) ... else: ... args.append("-N") ... if maxversion: ... args.extend(["-m", maxversion]) ... self.args = args ... self.proc = subprocess.Popen( ... args, ... text=True, ... bufsize=0, ... stdin=subprocess.PIPE, ... stdout=subprocess.PIPE, ... stderr=subprocess.STDOUT, ... cwd=cwd, ... ) ... self.output = "" ... def cmd(self, command): ... # send command ... self.proc.stdin.write(command + "\n") ... self.proc.stdin.flush() ... def getoutput(self): ... self.output += self.proc.communicate(input="exit\n", timeout=10)[0] ... return [x.strip() for x in self.output.split("\n") if x.strip()] ... def close(self): ... if self.proc.poll(): ... self.proc.terminate() ... def printdebug(self): ... # Print stuff ... print("\nTest failed.") ... print("smbclient arguments:", self.args) ... print("smbclient output:") ... print(self.output) ... >>> cli = None ###(008)=[passed] smbserver: SMB 3.1.1 - connect then list shares >>> with run_smbserver(guest=True): ... try: ... cli = run_smbclient(list=True) ... output = cli.getoutput() ... shares = [x[0] for x in (y.split(" ") for y in output if "Disk" in y)] ... assert shares == ['Scapy', 'test'] ... except Exception: ... cli.printdebug() ... raise ... finally: ... cli.close() ... -- Scapy 2.5.0.dev467 SMB Server -- SSP: NTLM (guest). Read-Only: YES. Serving 2 shares: * * Server SMB_Server started listening on ('127.0.0.1', 12345) ┃ Connection received from ('127.0.0.1', 58604) Starting control thread [tid=140735957299456] ## state=[BEGIN] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request Receive condition [received_negotiate] not taken Receive condition [received_negotiate_smb2_begin] taken to state [NEGOTIATED] + Running action [on_negotiate_smb2_begin] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response switching from [BEGIN] to [NEGOTIATED] ## state=[NEGOTIATED] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Request Receive condition [received_negotiate_smb2] not taken Receive condition [receive_setup_andx_request] taken to state [RECEIVED_SETUP_ANDX_REQUEST] + Running action [on_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Response switching from [NEGOTIATED] to [RECEIVED_SETUP_ANDX_REQUEST] ## state=[RECEIVED_SETUP_ANDX_REQUEST] Condition [wait_for_next_request] taken to state [NEGOTIATED] switching from [RECEIVED_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Request Receive condition [received_negotiate_smb2] not taken Receive condition [receive_setup_andx_request] taken to state [RECEIVED_SETUP_ANDX_REQUEST] + Running action [on_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Response switching from [NEGOTIATED] to [RECEIVED_SETUP_ANDX_REQUEST] ## state=[RECEIVED_SETUP_ANDX_REQUEST] > User authenticated as guest! Condition [wait_for_next_request] taken to state [AUTHENTICATED] switching from [RECEIVED_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [should_serve] taken to state [SERVING] switching from [AUTHENTICATED] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] taken to state [SERVING] + Running action [send_tree_connect_response] > Tree Connect on: IPC$ SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] taken to state [SERVING] + Running action [send_create_file_response] > Opened: srvsvc SENT : DirectTCP / SMB2_Header / SMB2_Create_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_IOCTL_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] taken to state [SERVING] + Running action [send_ioctl_response] << DceRpc5Bind >> DceRpc5BindAck srvsvc is on port '\\PIPE\\srvsvc' using NDR 2.0 SENT : DirectTCP / SMB2_Header / SMB2_IOCTL_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_IOCTL_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] taken to state [SERVING] + Running action [send_ioctl_response] << REQUEST: NetrShareEnum_Request >> RESPONSE: NetrShareEnum_Response SENT : DirectTCP / SMB2_Header / SMB2_IOCTL_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] taken to state [SERVING] + Running action [send_close_response] SENT : DirectTCP / SMB2_Header / SMB2_Close_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] not taken Receive condition [receive_tree_disconnect_request] taken to state [SERVING] + Running action [send_tree_disconnect_response] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] Transferring exception from tid=140735957299456: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1434, in _do_iter pkt = self.listen_sock.recv() File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smb2.py", line 4529, in recv pkt = super(SMBStreamSocket, self).recv(x) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/supersocket.py", line 481, in recv raise EOFError EOFError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1338, in _do_control state = next(iterator) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1451, in _do_iter raise EOFError("Socket ended arbruptly.") EOFError: Socket ended arbruptly. Stopping control thread (tid=140735957299456) X Server closed. ###(009)=[passed] smbserver: SMB 3.1.1 - connect then ls Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1010, in _run clientsocket, address = ssock.accept() ~~~~~~~~~~~~^^ File "/usr/lib64/python3.13/socket.py", line 295, in accept fd, addr = self._accept() ~~~~~~~~~~~~^^ OSError: [Errno 22] Invalid argument >>> with run_smbserver(): ... try: ... cli = run_smbclient(user="Administrator", password="Password2", share="test") ... cli.cmd("ls") ... output = cli.getoutput()[1:] ... files = [x[0] for x in (y.split(" ") for y in output if "blocks" not in y)] ... print(files) ... assert files == ['.', 'fileA', 'fileB', 'fileScapy', 'sub'] ... except Exception: ... cli.printdebug() ... raise ... finally: ... cli.close() ... -- Scapy 2.5.0.dev467 SMB Server -- SSP: NTLM (guest). Read-Only: YES. Serving 2 shares: * * Server SMB_Server started listening on ('127.0.0.1', 12345) ┃ Connection received from ('127.0.0.1', 58620) Starting control thread [tid=140735974207744] ## state=[BEGIN] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request Receive condition [received_negotiate] not taken Receive condition [received_negotiate_smb2_begin] taken to state [NEGOTIATED] + Running action [on_negotiate_smb2_begin] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response switching from [BEGIN] to [NEGOTIATED] ## state=[NEGOTIATED] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Request Receive condition [received_negotiate_smb2] not taken Receive condition [receive_setup_andx_request] taken to state [RECEIVED_SETUP_ANDX_REQUEST] + Running action [on_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Response switching from [NEGOTIATED] to [RECEIVED_SETUP_ANDX_REQUEST] ## state=[RECEIVED_SETUP_ANDX_REQUEST] Condition [wait_for_next_request] taken to state [NEGOTIATED] switching from [RECEIVED_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Request Receive condition [received_negotiate_smb2] not taken Receive condition [receive_setup_andx_request] taken to state [RECEIVED_SETUP_ANDX_REQUEST] + Running action [on_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Response switching from [NEGOTIATED] to [RECEIVED_SETUP_ANDX_REQUEST] ## state=[RECEIVED_SETUP_ANDX_REQUEST] > User authenticated as guest! Condition [wait_for_next_request] taken to state [AUTHENTICATED] switching from [RECEIVED_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [should_serve] taken to state [SERVING] switching from [AUTHENTICATED] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] taken to state [SERVING] + Running action [send_tree_connect_response] > Tree Connect on: IPC$ SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_IOCTL_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] taken to state [SERVING] + Running action [send_ioctl_response] SENT : DirectTCP / SMB2_Header / SMB2_Error_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] not taken Receive condition [receive_tree_disconnect_request] taken to state [SERVING] + Running action [send_tree_disconnect_response] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] taken to state [SERVING] + Running action [send_tree_connect_response] > Tree Connect on: test SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Request / Raw Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] taken to state [SERVING] + Running action [send_create_file_response] /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): SENT : DirectTCP / SMB2_Header / SMB2_Create_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] taken to state [SERVING] + Running action [send_query_directory_response] > Query directory: /tmp/scapyjhi0y3jk /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] taken to state [SERVING] + Running action [send_query_directory_response] > Query directory: /tmp/scapyjhi0y3jk /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): SENT : DirectTCP / SMB2_Header / SMB2_Error_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] taken to state [SERVING] + Running action [send_close_response] > Closed: /tmp/scapyjhi0y3jk SENT : DirectTCP / SMB2_Header / SMB2_Close_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Request / Raw Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] taken to state [SERVING] + Running action [send_create_file_response] /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): SENT : DirectTCP / SMB2_Header / SMB2_Create_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Request / Raw Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] taken to state [SERVING] + Running action [send_query_info_response] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] taken to state [SERVING] + Running action [send_close_response] > Closed: /tmp/scapyjhi0y3jk SENT : DirectTCP / SMB2_Header / SMB2_Close_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] not taken Receive condition [receive_tree_disconnect_request] taken to state [SERVING] + Running action [send_tree_disconnect_response] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] Transferring exception from tid=140735974207744: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1434, in _do_iter pkt = self.listen_sock.recv() File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smb2.py", line 4529, in recv pkt = super(SMBStreamSocket, self).recv(x) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/supersocket.py", line 481, in recv raise EOFError EOFError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1338, in _do_control state = next(iterator) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1451, in _do_iter raise EOFError("Socket ended arbruptly.") EOFError: Socket ended arbruptly. Stopping control thread (tid=140735974207744) ['.', 'fileA', 'fileB', 'fileScapy', 'sub'] ###(010)=[passed] smbserver: SMB 2.0.2 - connect then ls >>> with run_smbserver(): ... try: ... cli = run_smbclient(user="Administrator", password="Password2", share="test", maxversion="SMB2_02") ... cli.cmd("ls") ... output = cli.getoutput()[1:] ... files = [x[0] for x in (y.split(" ") for y in output if "blocks" not in y)] ... print(files) ... assert files == ['.', 'fileA', 'fileB', 'fileScapy', 'sub'] ... except Exception: ... cli.printdebug() ... raise ... finally: ... cli.close() ... -- Scapy 2.5.0.dev467 SMB Server -- SSP: NTLM (guest). Read-Only: YES. Serving 2 shares: * * Server SMB_Server started listening on ('127.0.0.1', 12345) X Server closed. Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1010, in _run clientsocket, address = ssock.accept() ~~~~~~~~~~~~^^ File "/usr/lib64/python3.13/socket.py", line 295, in accept fd, addr = self._accept() ~~~~~~~~~~~~^^ OSError: [Errno 22] Invalid argument ┃ Connection received from ('127.0.0.1', 58636) Starting control thread [tid=140735802175744] ## state=[BEGIN] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request Receive condition [received_negotiate] not taken Receive condition [received_negotiate_smb2_begin] taken to state [NEGOTIATED] + Running action [on_negotiate_smb2_begin] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response switching from [BEGIN] to [NEGOTIATED] ## state=[NEGOTIATED] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Request Receive condition [received_negotiate_smb2] not taken Receive condition [receive_setup_andx_request] taken to state [RECEIVED_SETUP_ANDX_REQUEST] + Running action [on_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Response switching from [NEGOTIATED] to [RECEIVED_SETUP_ANDX_REQUEST] ## state=[RECEIVED_SETUP_ANDX_REQUEST] Condition [wait_for_next_request] taken to state [NEGOTIATED] switching from [RECEIVED_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Request Receive condition [received_negotiate_smb2] not taken Receive condition [receive_setup_andx_request] taken to state [RECEIVED_SETUP_ANDX_REQUEST] + Running action [on_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Response switching from [NEGOTIATED] to [RECEIVED_SETUP_ANDX_REQUEST] ## state=[RECEIVED_SETUP_ANDX_REQUEST] > User authenticated as guest! Condition [wait_for_next_request] taken to state [AUTHENTICATED] switching from [RECEIVED_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [should_serve] taken to state [SERVING] switching from [AUTHENTICATED] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] taken to state [SERVING] + Running action [send_tree_connect_response] > Tree Connect on: IPC$ SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_IOCTL_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] taken to state [SERVING] + Running action [send_ioctl_response] SENT : DirectTCP / SMB2_Header / SMB2_Error_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] not taken Receive condition [receive_tree_disconnect_request] taken to state [SERVING] + Running action [send_tree_disconnect_response] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] taken to state [SERVING] + Running action [send_tree_connect_response] > Tree Connect on: test SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Request / Raw Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] taken to state [SERVING] + Running action [send_create_file_response] /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): SENT : DirectTCP / SMB2_Header / SMB2_Create_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] taken to state [SERVING] + Running action [send_query_directory_response] > Query directory: /tmp/scapyjhi0y3jk /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): SENT : DirectTCP / SMB2_Header / SMB2_Query_Directory_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Directory_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] taken to state [SERVING] + Running action [send_query_directory_response] > Query directory: /tmp/scapyjhi0y3jk /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): SENT : DirectTCP / SMB2_Header / SMB2_Error_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] taken to state [SERVING] + Running action [send_close_response] > Closed: /tmp/scapyjhi0y3jk SENT : DirectTCP / SMB2_Header / SMB2_Close_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Request / Raw Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] taken to state [SERVING] + Running action [send_create_file_response] /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): SENT : DirectTCP / SMB2_Header / SMB2_Create_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Request / Raw Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] taken to state [SERVING] + Running action [send_query_info_response] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] taken to state [SERVING] + Running action [send_close_response] > Closed: /tmp/scapyjhi0y3jk SENT : DirectTCP / SMB2_Header / SMB2_Close_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] not taken Receive condition [receive_tree_disconnect_request] taken to state [SERVING] + Running action [send_tree_disconnect_response] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] Transferring exception from tid=140735802175744: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1434, in _do_iter pkt = self.listen_sock.recv() File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smb2.py", line 4529, in recv pkt = super(SMBStreamSocket, self).recv(x) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/supersocket.py", line 481, in recv raise EOFError EOFError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1338, in _do_control state = next(iterator) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1451, in _do_iter raise EOFError("Socket ended arbruptly.") EOFError: Socket ended arbruptly. Stopping control thread (tid=140735802175744) ['.', 'fileA', 'fileB', 'fileScapy', 'sub'] ###(011)=[passed] smbserver: SMB 3.1.1 - connect then get file X Server closed. Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1010, in _run clientsocket, address = ssock.accept() ~~~~~~~~~~~~^^ File "/usr/lib64/python3.13/socket.py", line 295, in accept fd, addr = self._accept() ~~~~~~~~~~~~^^ OSError: [Errno 22] Invalid argument >>> LOCALPATH = pathlib.Path(get_temp_dir()) >>> >>> with run_smbserver(): ... try: ... cli = run_smbclient(user="Administrator", password="Password2", share="test", cwd=LOCALPATH) ... cli.cmd("get fileScapy") ... output = cli.getoutput() ... print(output) ... assert "size 9" in output[0], "no size" ... assert (LOCALPATH / "fileScapy").exists(), "file doesn't exist" ... with (LOCALPATH / "fileScapy").open("r") as fd: ... assert fd.read() == "Nice\nData", "invalid data" ... except Exception: ... cli.printdebug() ... raise ... finally: ... cli.close() ... -- Scapy 2.5.0.dev467 SMB Server -- SSP: NTLM (guest). Read-Only: YES. Serving 2 shares: * * Server SMB_Server started listening on ('127.0.0.1', 12345) ┃ Connection received from ('127.0.0.1', 58652) Starting control thread [tid=140735793721600] ## state=[BEGIN] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request Receive condition [received_negotiate] not taken Receive condition [received_negotiate_smb2_begin] taken to state [NEGOTIATED] + Running action [on_negotiate_smb2_begin] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response switching from [BEGIN] to [NEGOTIATED] ## state=[NEGOTIATED] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Request Receive condition [received_negotiate_smb2] not taken Receive condition [receive_setup_andx_request] taken to state [RECEIVED_SETUP_ANDX_REQUEST] + Running action [on_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Response switching from [NEGOTIATED] to [RECEIVED_SETUP_ANDX_REQUEST] ## state=[RECEIVED_SETUP_ANDX_REQUEST] Condition [wait_for_next_request] taken to state [NEGOTIATED] switching from [RECEIVED_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Request Receive condition [received_negotiate_smb2] not taken Receive condition [receive_setup_andx_request] taken to state [RECEIVED_SETUP_ANDX_REQUEST] + Running action [on_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Response switching from [NEGOTIATED] to [RECEIVED_SETUP_ANDX_REQUEST] ## state=[RECEIVED_SETUP_ANDX_REQUEST] > User authenticated as guest! Condition [wait_for_next_request] taken to state [AUTHENTICATED] switching from [RECEIVED_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [should_serve] taken to state [SERVING] switching from [AUTHENTICATED] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] taken to state [SERVING] + Running action [send_tree_connect_response] > Tree Connect on: IPC$ SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_IOCTL_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] taken to state [SERVING] + Running action [send_ioctl_response] SENT : DirectTCP / SMB2_Header / SMB2_Error_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] not taken Receive condition [receive_tree_disconnect_request] taken to state [SERVING] + Running action [send_tree_disconnect_response] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] taken to state [SERVING] + Running action [send_tree_connect_response] > Tree Connect on: test SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Request / Raw Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] taken to state [SERVING] + Running action [send_create_file_response] > Opened: fileScapy /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): SENT : DirectTCP / SMB2_Header / SMB2_Create_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Query_Info_Request / Raw Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] taken to state [SERVING] + Running action [send_query_info_response] SENT : DirectTCP / SMB2_Header / SMB2_Query_Info_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Read_Request / Raw Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] taken to state [SERVING] + Running action [send_read_response] > Reading 9 bytes at 0 SENT : DirectTCP / SMB2_Header / SMB2_Read_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] taken to state [SERVING] + Running action [send_close_response] > Closed: /tmp/scapyjhi0y3jk/fileScapy SENT : DirectTCP / SMB2_Header / SMB2_Close_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] not taken Receive condition [receive_tree_disconnect_request] taken to state [SERVING] + Running action [send_tree_disconnect_response] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] Transferring exception from tid=140735793721600: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1434, in _do_iter pkt = self.listen_sock.recv() File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smb2.py", line 4529, in recv pkt = super(SMBStreamSocket, self).recv(x) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/supersocket.py", line 481, in recv raise EOFError EOFError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1338, in _do_control state = next(iterator) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1451, in _do_iter raise EOFError("Socket ended arbruptly.") EOFError: Socket ended arbruptly. Stopping control thread (tid=140735793721600) ['getting file \\fileScapy of size 9 as fileScapy (0.6 KiloBytes/sec) (average 0.6 KiloBytes/sec)', 'Try "help" to get a list of possible commands.'] ###(012)=[passed] smbserver: SMB 3.1.1 - connect then put file >>> LOCALPATH = pathlib.Path(get_temp_dir()) >>> >>> nicedata = ("A" * 100 + "\n") * 5 >>> with open(LOCALPATH / "newCustomFile", "w") as fd: ... fd.write(nicedata) ... 505 >>> with run_smbserver(readonly=False): ... try: ... cli = run_smbclient(user="Administrator", password="Password2", share="test", cwd=LOCALPATH) ... cli.cmd("put newCustomFile") ... output = cli.getoutput() ... print(output) ... assert "putting file newCustomFile" in output[0], "strange output" ... assert (ROOTPATH / "newCustomFile").exists(), "file doesn't exist" ... with (ROOTPATH / "newCustomFile").open("r") as fd: ... assert fd.read() == nicedata, "invalid data" ... except Exception: ... cli.printdebug() ... raise ... finally: ... cli.close() ... -- Scapy 2.5.0.dev467 SMB Server -- SSP: NTLM (guest). Read-Only: NO. Serving 2 shares: * * Server SMB_Server started listening on ('127.0.0.1', 12345) X Server closed. Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1010, in _run clientsocket, address = ssock.accept() ~~~~~~~~~~~~^^ File "/usr/lib64/python3.13/socket.py", line 295, in accept fd, addr = self._accept() ~~~~~~~~~~~~^^ OSError: [Errno 22] Invalid argument ┃ Connection received from ('127.0.0.1', 58654) Starting control thread [tid=140735965753600] ## state=[BEGIN] RECVD: DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Request Receive condition [received_negotiate] not taken Receive condition [received_negotiate_smb2_begin] taken to state [NEGOTIATED] + Running action [on_negotiate_smb2_begin] SENT : DirectTCP / SMB2_Header / SMB2_Negotiate_Protocol_Response switching from [BEGIN] to [NEGOTIATED] ## state=[NEGOTIATED] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Request Receive condition [received_negotiate_smb2] not taken Receive condition [receive_setup_andx_request] taken to state [RECEIVED_SETUP_ANDX_REQUEST] + Running action [on_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Response switching from [NEGOTIATED] to [RECEIVED_SETUP_ANDX_REQUEST] ## state=[RECEIVED_SETUP_ANDX_REQUEST] Condition [wait_for_next_request] taken to state [NEGOTIATED] switching from [RECEIVED_SETUP_ANDX_REQUEST] to [NEGOTIATED] ## state=[NEGOTIATED] RECVD: DirectTCP / SMB2_Header / SMB2_Session_Setup_Request Receive condition [received_negotiate_smb2] not taken Receive condition [receive_setup_andx_request] taken to state [RECEIVED_SETUP_ANDX_REQUEST] + Running action [on_setup_andx_request] SENT : DirectTCP / SMB2_Header / SMB2_Session_Setup_Response switching from [NEGOTIATED] to [RECEIVED_SETUP_ANDX_REQUEST] ## state=[RECEIVED_SETUP_ANDX_REQUEST] > User authenticated as guest! Condition [wait_for_next_request] taken to state [AUTHENTICATED] switching from [RECEIVED_SETUP_ANDX_REQUEST] to [AUTHENTICATED] ## state=[AUTHENTICATED] Condition [should_serve] taken to state [SERVING] switching from [AUTHENTICATED] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] taken to state [SERVING] + Running action [send_tree_connect_response] > Tree Connect on: IPC$ SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_IOCTL_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] taken to state [SERVING] + Running action [send_ioctl_response] SENT : DirectTCP / SMB2_Header / SMB2_Error_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] not taken Receive condition [receive_tree_disconnect_request] taken to state [SERVING] + Running action [send_tree_disconnect_response] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Connect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] taken to state [SERVING] + Running action [send_tree_connect_response] > Tree Connect on: test SENT : DirectTCP / SMB2_Header / SMB2_Tree_Connect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Create_Request / Raw Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] taken to state [SERVING] + Running action [send_create_file_response] > Opened: newCustomFile /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smbserver.py:960: DeprecationWarning: pathlib.PurePath.is_reserved() is deprecated and scheduled for removal in Python 3.15. Use os.path.isreserved() to detect reserved paths on Windows. if path.is_reserved(): > Created file:newCustomFile SENT : DirectTCP / SMB2_Header / SMB2_Create_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Write_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] taken to state [SERVING] + Running action [send_write_response] > Writing 505 bytes at 0 SENT : DirectTCP / SMB2_Header / SMB2_Write_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Close_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] taken to state [SERVING] + Running action [send_close_response] > Closed: /tmp/scapyjhi0y3jk/newCustomFile SENT : DirectTCP / SMB2_Header / SMB2_Close_Response switching from [SERVING] to [SERVING] ## state=[SERVING] RECVD: DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Request Receive condition [receive_logoff_request] not taken Receive condition [receive_setup_andx_request_in_serving] not taken Receive condition [is_smb1_tree] not taken Receive condition [receive_tree_connect] not taken Receive condition [receive_ioctl] not taken Receive condition [receive_create_file] not taken Receive condition [receive_change_notify_info] not taken Receive condition [receive_query_directory_info] not taken Receive condition [receive_query_info] not taken Receive condition [receive_set_info_request] not taken Receive condition [receive_write_request] not taken Receive condition [receive_read_request] not taken Receive condition [receive_close_request] not taken Receive condition [receive_tree_disconnect_request] taken to state [SERVING] + Running action [send_tree_disconnect_response] SENT : DirectTCP / SMB2_Header / SMB2_Tree_Disconnect_Response switching from [SERVING] to [SERVING] ## state=[SERVING] Transferring exception from tid=140735965753600: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1434, in _do_iter pkt = self.listen_sock.recv() File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/layers/smb2.py", line 4529, in recv pkt = super(SMBStreamSocket, self).recv(x) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/supersocket.py", line 481, in recv raise EOFError EOFError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1338, in _do_control state = next(iterator) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1451, in _do_iter raise EOFError("Socket ended arbruptly.") EOFError: Socket ended arbruptly. Stopping control thread (tid=140735965753600) ['putting file newCustomFile as \\newCustomFile (82.2 kb/s) (average 82.2 kb/s)', 'Try "help" to get a list of possible commands.'] SNMP regression tests for Scapy ━ Run at 01:42:28 from [test/scapy/layers/snmp.uts] by UTscapy in 0.01943063735961914 └ Passed=6 └ Failed=0 ###### ## SNMP layer ###### ###(000)=[passed] SNMP assembling >>> r = raw(SNMP()) >>> r b'0\x18\x02\x01\x01\x04\x06public\xa0\x0b\x02\x01\x00\x02\x01\x00\x02\x01\x000\x00' >>> assert r == b'0\x18\x02\x01\x01\x04\x06public\xa0\x0b\x02\x01\x00\x02\x01\x00\x02\x01\x000\x00' >>> p = SNMP(version="v2c", community="ABC", PDU=SNMPbulk(id=4,varbindlist=[SNMPvarbind(oid="1.2.3.4",value=ASN1_INTEGER(7)),SNMPvarbind(oid="4.3.2.1.2.3",value=ASN1_IA5_STRING("testing123"))])) >>> p |>, |>] |> |> >>> r = raw(p) >>> r b'05\x02\x01\x01\x04\x03ABC\xa5+\x02\x01\x04\x02\x01\x00\x02\x01\x000 0\x08\x06\x03*\x03\x04\x02\x01\x070\x14\x06\x06\x81#\x02\x01\x02\x03\x16\ntesting123' >>> assert r == b'05\x02\x01\x01\x04\x03ABC\xa5+\x02\x01\x04\x02\x01\x00\x02\x01\x000 0\x08\x06\x03*\x03\x04\x02\x01\x070\x14\x06\x06\x81#\x02\x01\x02\x03\x16\ntesting123' ###(001)=[passed] SNMP disassembling >>> x=SNMP(b'0y\x02\x01\x00\x04\x06public\xa2l\x02\x01)\x02\x01\x00\x02\x01\x000a0!\x06\x12+\x06\x01\x04\x01\x81}\x08@\x04\x02\x01\x07\n\x86\xde\xb78\x04\x0b172.31.19.20#\x06\x12+\x06\x01\x04\x01\x81}\x08@\x04\x02\x01\x07\n\x86\xde\xb76\x04\r255.255.255.00\x17\x06\x12+\x06\x01\x04\x01\x81}\x08@\x04\x02\x01\x05\n\x86\xde\xb9`\x02\x01\x01') >>> x.show() ###[ SNMP ]### version = 'v1' 0x0 community = \PDU \ |###[ SNMPresponse ]### | id = 0x29 | error = 'no_error' 0x0 | error_index= 0x0 | \varbindlist\ | |###[ SNMPvarbind ]### | | oid = | | value = | | noSuchObject= None | | noSuchInstance= None | | endOfMibView= None | |###[ SNMPvarbind ]### | | oid = | | value = | | noSuchObject= None | | noSuchInstance= None | | endOfMibView= None | |###[ SNMPvarbind ]### | | oid = | | value = 0x1 | | noSuchObject= None | | noSuchInstance= None | | endOfMibView= None >>> assert x.community==b"public" and x.version == 0 >>> assert x.PDU.id == 41 and len(x.PDU.varbindlist) == 3 >>> assert x.PDU.varbindlist[0].oid == "1.3.6.1.4.1.253.8.64.4.2.1.7.10.14130104" >>> assert x.PDU.varbindlist[0].value == b"172.31.19.2" >>> assert x.PDU.varbindlist[2].oid == "1.3.6.1.4.1.253.8.64.4.2.1.5.10.14130400" >>> assert x.PDU.varbindlist[2].value == 1 X Server closed. ###(002)=[passed] Basic UDP/SNMP bindings Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/automaton.py", line 1010, in _run clientsocket, address = ssock.accept() ~~~~~~~~~~~~^^ File "/usr/lib64/python3.13/socket.py", line 295, in accept fd, addr = self._accept() ~~~~~~~~~~~~^^ OSError: [Errno 22] Invalid argument >>> z = UDP()/x >>> z = UDP(raw(z)) No IP underlayer to compute checksum. Leaving null. >>> assert SNMP in z >>> >>> x = UDP()/SNMP() >>> assert x.sport == x.dport == 161 ###(003)=[passed] Basic SNMPvarbind build >>> x = SNMPvarbind(oid=ASN1_OID("1.3.6.1.2.1.1.4.0"), value=RandBin()) >>> x = SNMPvarbind(raw(x)) >>> assert isinstance(x.value, ASN1_STRING) ###(004)=[passed] SNMPvarbind noSuchInstance dissection >>> x = SNMPvarbind(b'0\x10\x06\x0c+\x06\x01\x02\x01/\x01\x01\x01\x01\n\x01\x81\x00') >>> assert not x.noSuchObject >>> assert x.noSuchInstance >>> assert not x.endOfMibView ###(005)=[passed] Failing SNMPvarbind dissection >>> try: ... SNMP(b'0a\x02\x01\x00\x04\x06public\xa3T\x02\x02D\xd0\x02\x01\x00\x02\x01\x000H0F\x06\x08+\x06\x01\x02\x01\x01\x05\x00\x00\x03\x01\x02D\x00\x03\x01\x02D\x00\x03\x01\x02D\x00\x03\x01\x02D\x00\x03\x01\x02D\x00\x03\x01\x02D\x00\x03\x01\x02D\x00\x03\x01\x02D\x00\x03\x01\x02D\x00\x03\x01\x02D\x00\x03\x01\x02D\x00\x03\x01\x02D') ... assert False ... except BER_Decoding_Error: ... pass ... SSH regression tests for Scapy ━ Run at 01:42:28 from [test/scapy/layers/ssh.uts] by UTscapy in 0.03675341606140137 └ Passed=6 └ Failed=0 ###### ## SSH tests ###### ###(000)=[passed] Load SSH and SSH pcap >>> from scapy.layers.ssh import * >>> pkts = rdpcap(scapy_path("/test/pcaps/ssh_ed25519.pcap")) ###(001)=[passed] Check for SSHVersionExchange >>> assert SSHVersionExchange in pkts[3] >>> assert pkts[3].lines == [b'SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u1'] ###(002)=[passed] Check for SSH KexInit >>> assert pkts[8].pay.type == 20 >>> assert pkts[8].pay.kex_algorithms.names == [b'sntrup761x25519-sha512@openssh.com', b'curve25519-sha256', b'curve25519-sha256@libssh.org', b'ecdh-sha2-nistp256', b'ecdh-sha2-nistp384', b'ecdh-sha2-nistp521', b'diffie-hellman-group-exchange-sha256', b'diffie-hellman-group16-sha512', b'diffie-hellman-group18-sha512', b'diffie-hellman-group14-sha256'] >>> assert pkts[8].pay.compression_algorithms_client_to_server.names == [b'none', b'zlib@openssh.com'] >>> assert pkts[8].pay.first_kex_packet_follows == 0 ###(003)=[passed] Check for SSH Kex DH Init >>> assert pkts[9].pay.e.value == 2350579254774455149352841074576538343990628078324267734527140871419932900538846241321452574779013468175018290651674793284015144587365340014962083771650859331476013596977123734998706481058518220105378857548427645559226229797476788395456646389818256564838400739135010680681163456095677232493468587230912056633743356721223955966756143014970734820639779746710511156996619195651512803235508645669051962031830043263352566212925544898655158819407252176433755590900240990111833619058714386338971655960765233885975850331922799954445954999296511309262036243757363804224821843032668273263064448847356873248470173458896243397517402866118125112555466428030166305568609671333602038983517505792245686243281766138834921907336198416449172686346486278292406454736650900489703602941311383274571253473117352192402069818356338637658276508681778175858698292872544113899589241205559671386224999719303843179598966006636814844667908804397048115462945951578163865384872376314062218622823399683168509281546378022234848416282276373248755506541244682438394426446625521247772730497030387798046748675856950435919346613694108323269457293633349708282520556429147475379754811181108827452704284587405668562299209768965780662855380191554093502874303015220051947466960323628390298028334555285261078171376959928596505395834904631983924930632066431620277301098016669514461539415396461120090857273167687140578309080011600491384868409678444601854368584606594031430672989514629489628693896623746874263590779323124144977231406480674784862894820443935735009785417326990153059454525335480905124180809168192695170554860881795940302149730125034860576014797577021907464402342887433222178995989216549376816454492040151004613910636289921361266911700572137074963622410473946132501034758965925448585513804452940921661377181371668124810916661795313840472724039889785883499146147917756012320556865741641210760458632895093416475238323450214341924898457846364890041182141641464569458439289152005646151462927271290045368143992045845833755058875621892664952349241777000175525150234301417133611325716295866942917806328460205857145603834255471170372323643072574234093090258963511137747272416302757220165305443240348220594316744411327905569373474701071080394539231361841208268626239088329642014216286141161796678306068065801822739617419769840590119143287370990841250896367782388086153939896000077437989471526045058990545907990089943059323343511158016141104461822684535344848072465778114834380180144470998703244485996404968078774187171096252472206846575112317045051585989901412734220984229769099373462781991394933642599850052765470790711255335450011529534223200229563089616493679704133500670071803056311472370457584460617950784473886654145020569892882621834458180061425761806601776138949785217977296683442504030198235793054259542236826904098257847794792743244091577002001218915723232763883537852453240602434246755006330557239933 ###(004)=[passed] Check for SSH Kex DH Reply >>> assert isinstance(pkts[10].pay, SSHKexDHReply) >>> assert isinstance(pkts[10].pay.K_S.value.data, SSHPublicKeyEd25519) >>> assert pkts[10].pay.f.value == 145420364842225773825302401106325914711274265993324154430728894326534621359109155840425186538544552052796050053335958730866886288740744420249345515750154798851184330959497070659898985425204715378366354679146309457749164371561091155243958216182101971799434050687511559028317449152411472762323723877627671103812914723157350965167617881557068354019877391362267976527576493473875435265184048851428107514944286989616342786043599413975131699425817361398892615937862444397978104862748600515902989933687456311656405442430739088222322061894563421315591443786569893421006874109563323602421056664468719115729999515282373592751468532774515579030227333862046510775187524340678261311443115463596625632382798119365245475607690175500571706486276645913449452000600385503347151840872914773898773488397031589360149311688536059026933073591802120869627115324168091970764557964769308675365930500125154235572029870366848539246435374954851006770023189648291776010080795050223050860998900405137902471191697225277049222592746894837282272020541849100564888026189233806723871439229668619801557051355230295711162074261723735096669381118352514087748543069098521714367520620776857909533548692973709024859908263199571215346407936984296807266382121546828903054910125941912141681820440324847067053005923257053547200527533308902169030187411617725866120378101642906954603853930588700927719183637036840650380578915269559991390749067662922590313459051714023483342069069486856997828131877064697883838294364044597377634856362822832142618450301805844505073311557951656608292385708401134544514223462642265767599035258374748229336714718608533685329531126529049892131138601419901815421341388895007293701087086445997233255224283053634387459108049782685439584490166669027769404082346078709263888381794126372684739109951124329930500566714883267402922809647283904702829959640898613561998011861738175990862617646085551086342592758425640217942375761120002214263525285687683437628809639146334705175599606153814250017075639638206689953262483413749172593472713439934441043308651524160071237216451477801106668255062822659635335764848170476026942604710330092513922989750910298327358097823488084536544440798321307308541642435897397586864585774450444856007727437988290169282904777426371810586287022758237175995926455562260123808781040290584381913532810485127812346450200037604344159195037050778864761984776712383681923622054756893185075573777827838180404632794820045063257647197822508971656160962510350864007240071912329456453627835389896781002210494913596666104457655076724437210855739938617334378596008363125551567605259368940675801716 >>> assert isinstance(pkts[10].pay.H_hash.value.data, SSHSignatureEd25519) >>> assert pkts[10].pay.H_hash.value.data.key.value == b"\xef\xecj=~\xe4Y'\xe9\xad\xb7?\xfe?[\xf3\xddn\x1e\x91\xb5\x1c\xb6O\xf5&\xc7$\x9f\x0c\xeb\x1c<\xf2n\x87iH\xb9\xaf\xf5\xdfXB\xb7\x99\xd1\xbe%\x92\x98a)+\x01\\\xa7\xb4\xb2\x82!\x05e\x0e" ###(005)=[passed] Check for the 2 SSH New Msgs >>> assert isinstance(pkts[10][SSH:2].pay, SSHNewKeys) >>> assert isinstance(pkts[12].pay, SSHNewKeys) TFTP regression tests for Scapy ━ Run at 01:42:28 from [test/scapy/layers/tftp.uts] by UTscapy in 0.007135152816772461 └ Passed=1 └ Failed=0 ###### ## TFTP tests ###### ###(000)=[passed] TFTP Options >>> x=IP()/UDP(sport=12345)/TFTP()/TFTP_RRQ(filename="fname")/TFTP_Options(options=[TFTP_Option(oname="blksize", value="8192"),TFTP_Option(oname="other", value="othervalue")]) >>> assert raw(x) == b'E\x00\x00H\x00\x01\x00\x00@\x11|\xa2\x7f\x00\x00\x01\x7f\x00\x00\x0109\x00E\x004B6\x00\x01fname\x00octet\x00blksize\x008192\x00other\x00othervalue\x00' >>> y=IP(raw(x)) >>> y[TFTP_Option].oname b'blksize' >>> y[TFTP_Option:2].oname b'other' >>> assert len(y[TFTP_Options].options) == 2 and y[TFTP_Option].oname == b"blksize" Scapy USB tests ━ Run at 01:42:28 from [test/scapy/layers/usb.uts] by UTscapy in 0.010010242462158203 └ Passed=5 └ Failed=0 ###### ## USBpcap tests ###### ###(000)=[passed] load module >>> load_layer("usb") ###(001)=[passed] linklayer test >>> from io import BytesIO >>> >>> data = b"\xd4\xc3\xb2\xa1\x02\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\xf9\x00\x00\x00\xb6\xaau[B\xd7\n\x00'\x00\x00\x00'\x00\x00\x00\x1b\x00\x008\xeeM\n\x97\xff\xff\x00\x00\x00\x00\t\x00\x01\x01\x00\x04\x00\x81\x01\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbd\xaau[\xdc\x88\x0c\x00$\x00\x00\x00$\x00\x00\x00\x1c\x000g4K\n\x97\xff\xff\x00\x00\x00\x00\x0b\x00\x00\x01\x00\x05\x00\x00\x02\x08\x00\x00\x00\x00\x80\x06\x00\x01\x00\x00\x12\x00\xbd\xaau[}\xa7\x0c\x00.\x00\x00\x00.\x00\x00\x00\x1c\x000g4K\n\x97\xff\xff\x00\x00\x00\x00\x0b\x00\x01\x01\x00\x05\x00\x00\x02\x12\x00\x00\x00\x01\x12\x01\x10\x02\x00\x00\x00@^\x04\xe8\x07\x07\x02\x01\x02\x00\x01\xbd\xaau[\x7f\xa7\x0c\x00\x1c\x00\x00\x00\x1c\x00\x00\x00\x1c\x000g4K\n\x97\xff\xff\x00\x00\x00\x00\x0b\x00\x01\x01\x00\x05\x00\x00\x02\x00\x00\x00\x00\x02\xbd\xaau[\x8d\xa7\x0c\x00$\x00\x00\x00$\x00\x00\x00\x1c\x00\x10\xe0\x98J\n\x97\xff\xff\x00\x00\x00\x00\x0b\x00\x00\x01\x00\x05\x00\x00\x02\x08\x00\x00\x00\x00\x80\x06\x00\x02\x00\x00\t\x00" >>> pcap = rdpcap(BytesIO(data)) >>> >>> pkt1 = USBpcap(function=9, info=1, endpoint=129, res=0, transfer=1, usbd_status=0, dataLength=12, bus=1, device=4, irpId=18446628669245765632, headerLen=27)/Raw(load=b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert raw(pcap[0]) == raw(pkt1) >>> assert isinstance(pcap[0], USBpcap) >>> >>> pkt2 = USBpcap(function=11, info=0, endpoint=0, res=0, transfer=2, usbd_status=0, dataLength=8, bus=1, device=5, irpId=18446628669200033584, headerLen=28)/USBpcapTransferControl(stage=0)/Raw(load=b'\x80\x06\x00\x01\x00\x00\x12\x00') >>> assert raw(pcap[1]) == raw(pkt2) >>> assert USBpcap in pcap[1] >>> assert USBpcapTransferControl in pcap[1] ###(002)=[passed] USBpcapTransferIsochronous >>> pkt = USBpcap(irpId=0x359275, function=0x1235, info=10, bus=35)/USBpcapTransferIsochronous(usbd_status=0x40000000) >>> assert raw(pkt) == b"'\x00u\x925\x00\x00\x00\x00\x00\x00\x00\x00\x005\x12\n#\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@" ###(003)=[passed] USBpcapTransferInterrupt >>> pkt = USBpcap(irpId=0x359275, function=0x1235, info=10, bus=35)/USBpcapTransferInterrupt(startFrame=0x40000000, numberOfPackets=0x80000000, errorCount=2) >>> assert raw(pkt) == b"'\x00u\x925\x00\x00\x00\x00\x00\x00\x00\x00\x005\x12\n#\x00\x00\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x80\x02\x00\x00\x00" ###(004)=[passed] USBpcapTransferControl >>> pkt = USBpcap(irpId=0x359275, function=0x1235, info=10, bus=35)/USBpcapTransferControl(stage=11) >>> assert raw(pkt) == b'\x1c\x00u\x925\x00\x00\x00\x00\x00\x00\x00\x00\x005\x12\n#\x00\x00\x00\x00\x02\x01\x00\x00\x00\x0b' VRRP regression tests for Scapy ━ Run at 01:42:28 from [test/scapy/layers/vrrp.uts] by UTscapy in 0.011313915252685547 └ Passed=6 └ Failed=0 ###### ## VRRP tests ###### ###(000)=[passed] VRRP - build >>> s = raw(IP()/VRRP()) >>> s == b'E\x00\x00$\x00\x01\x00\x00@p|g\x7f\x00\x00\x01\x7f\x00\x00\x01!\x01d\x00\x00\x01z\xfd\x00\x00\x00\x00\x00\x00\x00\x00' True ###(001)=[passed] VRRP - dissection >>> p = IP(s) >>> VRRP in p and p[VRRP].chksum == 0x7afd True ###(002)=[passed] VRRP IPv6 - build >>> s6 = raw(IPv6()/VRRPv3()) >>> s6 == b'`\x00\x00\x00\x00\x08p@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x011\x01d\x01\x00dj\x1f' True ###(003)=[passed] VRRP IPv6 - dissection >>> p6 = IPv6(s6) >>> VRRPv3 in p6 and p6[VRRPv3].chksum == 0x6a1f True ###(004)=[passed] VRRP - chksums >>> p = Ether(src="00:00:5e:00:02:02",dst="01:00:5e:00:00:12")/IP(src="20.0.0.3", dst="224.0.0.18",ttl=255)/VRRPv3(priority=254,vrid=2,version=3,adv=1,addrlist=["20.0.1.2","20.0.1.3"]) >>> a = Ether(raw(p)) >>> assert a[VRRPv3].chksum == 0xb25e >>> p = Ether(src="00:00:5e:00:02:02",dst="01:00:5e:00:00:12")/IP(src="20.0.0.3", dst="224.0.0.18",ttl=255)/VRRP(priority=254,vrid=2,version=1,adv=1,addrlist=["20.0.1.2","20.0.1.3"]) >>> b = Ether(raw(p)) >>> assert b[VRRP].chksum == 0xc6f4 ###(005)=[passed] VRRP IPv6 - chksums >>> p = Ether(src="00:00:5e:00:02:02",dst="33:33:00:00:00:12")/IPv6(src="2001:db8::1", dst="ff02::12",hlim=255)/VRRPv3(priority=254,vrid=2,version=3,adv=1,ipcount=2,addrlist=["2001:db8::2","2001:db8::3"]) >>> c = Ether(raw(p)) >>> assert c[VRRPv3].chksum == 0x481b VXLAN regression tests for Scapy ━ Run at 01:42:28 from [test/scapy/layers/vxlan.uts] by UTscapy in 0.03942108154296875 └ Passed=8 └ Failed=0 ###### ## VXLAN layer ###### ###(000)=[passed] Build a VXLAN packet with VNI of 42 >>> raw(UDP(sport=1024, dport=4789, len=None, chksum=None)/VXLAN(flags=0x08, vni=42)) == b'\x04\x00\x12\xb5\x00\x10\x00\x00\x08\x00\x00\x00\x00\x00\x2a\x00' No IP underlayer to compute checksum. Leaving null. True ###(001)=[passed] Verify VXLAN Ethernet Binding >>> pkt = VXLAN(raw(VXLAN(vni=23)/Ether(dst="11:11:11:11:11:11", src="11:11:11:11:11:11", type=0x800))) >>> pkt.flags.NextProtocol and pkt.NextProtocol == 3 True ###(002)=[passed] Verify UDP dport overloading >>> p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") >>> p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111) >>> p /= VXLAN(flags=0xC, vni=42, NextProtocol=0) / Ether() / IP() >>> p = Ether(raw(p)) >>> assert p[UDP].dport == 4789 >>> assert p[Ether:2].type == 0x800 ###(003)=[passed] Build a VXLAN packet with next protocol field >>> p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") >>> p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111) >>> p /= VXLAN(flags=0xC, vni=42, NextProtocol=3) / Ether() / IP() >>> p = Ether(raw(p)) >>> assert p[UDP].dport == 4789 >>> assert p[VXLAN].reserved0 == 0x0 >>> assert p[VXLAN].NextProtocol == 3 >>> assert p[Ether:2].type == 0x800 ###(004)=[passed] Build a VXLAN packet with no group policy ID >>> p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") >>> p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111) >>> p /= VXLAN(flags=0xC, vni=42) / Ether() / IP() >>> p = Ether(raw(p)) >>> assert p[VXLAN].reserved2 == 0x0 >>> assert p[VXLAN].gpid is None >>> assert p[Ether:2].type == 0x800 ###(005)=[passed] Build a VXLAN packet with group policy ID = 42 >>> p = Ether(dst="11:11:11:11:11:11", src="22:22:22:22:22:22") >>> p /= IP(src="1.1.1.1", dst="2.2.2.2") / UDP(sport=1111) >>> p /= VXLAN(flags=0x8C, gpid=42, vni=42) / Ether() / IP() >>> p = Ether(raw(p)) >>> assert p[VXLAN].gpid == 42 >>> assert p[VXLAN].reserved1 is None >>> assert p[Ether:2].type == 0x800 ###(006)=[passed] Build a VXLAN packet followed by and IP or IPv6 layer >>> etherproto = 0x0 >>> ipproto = 0x1 >>> ipv6proto = 0x2 >>> iptest = "192.168.20.20" >>> ipv6test = "659f:2c23:565:3fab:32d5:bb95:a0ed:2e3b" >>> >>> expkt = UDP() / VXLAN() / IP(dst=iptest) / "testing" >>> expkt = UDP(bytes(expkt)) No IP underlayer to compute checksum. Leaving null. >>> assert expkt[VXLAN].NextProtocol == ipproto >>> assert IP in expkt >>> assert expkt[IP].dst == iptest >>> >>> expkt = UDP() / VXLAN() / IPv6(dst=ipv6test) / "testing" >>> expkt = UDP(bytes(expkt)) No IP underlayer to compute checksum. Leaving null. >>> assert expkt[VXLAN].NextProtocol == ipv6proto >>> assert IPv6 in expkt >>> assert expkt[IPv6].dst == ipv6test >>> >>> expkt = UDP() / VXLAN(flags=0x4, NextProtocol=ipproto) / "0xfffffffffffffffffffffffffffffffffffffffffffff" >>> expkt = UDP(bytes(expkt)) No IP underlayer to compute checksum. Leaving null. >>> assert IP in expkt >>> >>> expkt = UDP() / VXLAN(flags=0x4, NextProtocol=ipv6proto) / "0xfffffffffffffffffffffffffffffffffffffffffffff" >>> expkt = UDP(bytes(expkt)) No IP underlayer to compute checksum. Leaving null. >>> assert IPv6 in expkt >>> >>> expkt = UDP() / VXLAN(flags=0x4, NextProtocol=etherproto) / "0xfffffffffffffffffffffffffffffffffffffffffffff" >>> expkt = UDP(bytes(expkt)) No IP underlayer to compute checksum. Leaving null. >>> assert Ether in expkt ###(007)=[passed] Dissect VXLAN with no NextProtocol >>> pkt = VXLAN(b'\x08\x00\x00\x00\x00"H\x00\xcaF\xae\x10\xed\x0f\x0c\x00\x00\x00\x00\x00\x08\x06\x00\x01\x08\x00\x06\x04\x00\x02\x0c\x00\x00\x00\x00\x00\x7f\xff\xff\xfe\x11"3DUf\x7f\x00\x00\x02') >>> >>> assert pkt.NextProtocol is None >>> assert Ether in pkt >>> assert ARP in pkt Tests for X.509 objects ━ Run at 01:42:28 from [test/scapy/layers/x509.uts] by UTscapy in 0.2129077911376953 └ Passed=58 └ Failed=0 ###### ## General BER decoding tests ###### ###(000)=[passed] Decoding an ASN.1 SEQUENCE with an unknown, high-tag identifier >>> from scapy.layers.x509 import ASN1P_PRIVSEQ >>> s = b'\xff\x84\x92\xb9\x86H\x1e0\x1c\x16\x04BNCH\x04\x14\xb7\xca\x01wO\x9b\xbaz\xbb\xb5\x92\x87>T\xb2\xc3g\xc1]\xfb' >>> p = ASN1P_PRIVSEQ(s) ###### ## Private RSA & ECDSA keys class tests ###### ###(001)=[passed] Key class : Importing DER encoded RSA private key >>> from scapy.layers.x509 import RSAPrivateKey >>> k = base64.b64decode('MIIEowIBAAKCAQEAmFdqP+nTEZukS0lLP+yj1gNImsEIf7P2ySTunceYxwkm4VE5QReDbb2L5/HL\nA9pPmIeQLSq/BgO1meOcbOSJ2YVHQ28MQ56+8Crb6n28iycX4hp0H3AxRAjh0edX+q3yilvYJ4W9\n/NnIb/wAZwS0oJif/tTkVF77HybAfJde5Eqbp+bCKIvMWnambh9DRUyjrBBZo5dA1o32zpuFBrJd\nI8dmUpw9gtf0F0Ba8lGZm8Uqc0GyXeXOJUE2u7CiMu3M77BM6ZLLTcow5+bQImkmTL1SGhzwfinM\nE1e6p3Hm//pDjuJvFaY22k05LgLuyqc59vFiB3Toldz8+AbMNjvzAwIDAQABAoIBAH3KeJZL2hhI\n/1GXNMaU/PfDgFkgmYbxMA8JKusnm/SFjxAwBGnGI6UjBXpBgpQs2Nqm3ZseF9u8hmCKvGiCEX2G\nesCo2mSfmSQxD6RBrMTuQ99UXpxzBIscFnM/Zrs8lPBARGzmF2nI3qPxXtex4ABX5o0Cd4NfZlZj\npj96skUoO8+bd3I4OPUFYFFFuv81LoSQ6Hew0a8xtJXtKkDp9h1jTGGUOc189WACNoBLH0MGeVoS\nUfc1++RcC3cypUZ8fNP1OO6GBfv06f5oXES4ZbxGYpa+nCfNwb6V2gWbkvaYm7aFn0KWGNZXS1P3\nOcWv6IWdOmg2CI7MMBLJ0LyWVCECgYEAyMJYw195mvHl8VyxJ3HkxeQaaozWL4qhNQ0Kaw+mzD+j\nYdkbHb3aBYghsgEDZjnyOVblC7I+4smvAZJLWJaf6sZ5HAw3zmj1ibCkXx7deoRc/QVcOikl3dE/\nymO0KGJNiGzJZmxbRS3hTokmVPuxSWW4p5oSiMupFHKa18Uv8DECgYEAwkJ7iTOUL6b4e3lQuHQn\nJbsiQpd+P/bsIPP7kaaHObewfHpfOOtIdtN4asxVFf/PgW5uWmBllqAHZYR14DEYIdL+hdLrdvk5\nnYQ3YfhOnp+haHUPCdEiXrRZuGXjmMA4V0hL3HPF5ZM8H80fLnN8Pgn2rIC7CZQ46y4PnoV1nXMC\ngYBBwCUCF8rkDEWa/ximKo8aoNJmAypC98xEa7j1x3KBgnYoHcrbusok9ajTe7F5UZEbZnItmnsu\nG4/Nm/RBV1OYuNgBb573YzjHl6q93IX9EkzCMXc7NS7JrzaNOopOj6OFAtwTR3m89oHMDu8W9jfi\nKgaIHdXkJ4+AuugrstE4gQKBgFK0d1/8g7SeA+Cdz84YNaqMt5NeaDPXbsTA23QxUBU0rYDxoKTd\nFybv9a6SfA83sCLM31K/A8FTNJL2CDGA9WNBL3fOSs2GYg88AVBGpUJHeDK+0748OcPUSPaG+pVI\nETSn5RRgffq16r0nWYUvSdAn8cuTqw3y+yC1pZS6AU8dAoGBAL5QCi0dTWKN3kf3cXaCAnYiWe4Q\ng2S+SgLE+F1U4Xws2rqAuSvIiuT5i5+Mqk9ZCGdoReVbAovJFoRqe7Fj9yWM+b1awGjL0bOTtnqx\n0iljob6uFyhpl1xgW3a3ICJ/ZYLvkgb4IBEteOwWpp37fX57vzhW8EmUV2UX7ve1uNRI') >>> x=RSAPrivateKey(k) ###(002)=[passed] Key class : key version >>> x.version == ASN1_INTEGER(0) True ###(003)=[passed] Key class : key modulus >>> x.modulus == ASN1_INTEGER(19231328316532061413420367242571475005688288081144416166988378525696075445024135424022026378563116068168327239354659928492979285632474448448624869172454076124150405352043642781483254546569202103296262513098482624188672299255268092629150366527784294463900039290024710152521604731213565912934889752122898104556895316819303096201441834849255370122572613047779766933573375974464479123135292080801384304131606933504677232323037116557327478512106367095125103346134248056463878553619525193565824925835325216545121044922690971718737998420984924512388011040969150550056783451476150234324593710633552558175109683813482739004163) True ###(004)=[passed] Key class : key public exponent >>> x.publicExponent == ASN1_INTEGER(65537) True ###(005)=[passed] Key class : key private exponent >>> x.privateExponent == ASN1_INTEGER(15879630313397508329451198152673380989865598204237760057319927734227125481903063742175442230739018051313441697936698689753842471306305671266572085925009572141819112648211571007521954312641597446020984266846581125287547514750428503480880603089110687015181510081018160579576523796170439894692640171752302225125980423560965987469457505107324833137678663960560798216976668670722016960863268272661588745006387723814962668678285659376534048525020951633874488845649968990679414325096323920666486328886913648207836459784281744709948801682209478580185160477801656666089536527545026197569990716720623647770979759861119273292833) True ###(006)=[passed] Key class : key prime1 >>> x.prime1 == ASN1_INTEGER(140977881300857803928857666115326329496639762170623218602431133528876162476487960230341078724702018316260690172014674492782486113504117653531825010840338251572887403113276393351318549036549656895326851872473595350667293402676143426484331639796163189182788306480699144107905869179435145810212051656274284113969) True ###(007)=[passed] Key class : key prime2 >>> x.prime2 == ASN1_INTEGER(136413798668820291889092636919077529673097927884427227010121877374504825870002258140616512268521246045642663981036167305976907058413796938050224182519965099316625879807962173794483933183111515251808827349718943344770056106787713032506379905031673992574818291891535689493330517205396872699985860522390496583027) True ###(008)=[passed] Key class : key exponent1 >>> x.exponent1 == ASN1_INTEGER(46171616708754015342920807261537213121074749458020000367465429453038710215532257783908950878847126373502288079285334594398328912526548076894076506899568491565992572446455658740752572386903609191774044411412991906964352741123956581870694330173563737928488765282233340389888026245745090096745219902501964298369) True ###(009)=[passed] Key class : key exponent2 >>> x.exponent2 == ASN1_INTEGER(58077388505079936284685944662039782610415160654764308528562806086690474868010482729442634318267235411531220690585030443434512729356878742778542733733189895801341155353491318998637269079682889033003797865508917973141494201620317820971253064836562060222814287812344611566640341960495346782352037479526674026269) True ###(010)=[passed] Key class : key coefficient >>> x.coefficient == ASN1_INTEGER(133642091354977099805228515340626956943759840737228695249787077343495440064451558090846230978708992851702164116059746794777336918772240719297253693109788134358485382183551757562334253896010728509892421673776502933574360356472723011839127418477652997263867089539752161307227878233961465798519818890416647361608) True ###### ## X509_Cert class tests ###### ###(011)=[passed] Cert class : Importing DER encoded X.509 Certificate with RSA public key >>> from scapy.layers.x509 import X509_Cert >>> c = base64.b64decode('MIIFEjCCA/qgAwIBAgIJALRecEPnCQtxMA0GCSqGSIb3DQEBBQUAMIG2MQswCQYDVQQGEwJGUjEO\nMAwGA1UECBMFUGFyaXMxDjAMBgNVBAcTBVBhcmlzMRcwFQYDVQQKEw5NdXNocm9vbSBDb3JwLjEe\nMBwGA1UECxMVTXVzaHJvb20gVlBOIFNlcnZpY2VzMSUwIwYDVQQDExxJS0V2MiBYLjUwOSBUZXN0\nIGNlcnRpZmljYXRlMScwJQYJKoZIhvcNAQkBFhhpa2V2Mi10ZXN0QG11c2hyb29tLmNvcnAwHhcN\nMDYwNzEzMDczODU5WhcNMjYwMzMwMDczODU5WjCBtjELMAkGA1UEBhMCRlIxDjAMBgNVBAgTBVBh\ncmlzMQ4wDAYDVQQHEwVQYXJpczEXMBUGA1UEChMOTXVzaHJvb20gQ29ycC4xHjAcBgNVBAsTFU11\nc2hyb29tIFZQTiBTZXJ2aWNlczElMCMGA1UEAxMcSUtFdjIgWC41MDkgVGVzdCBjZXJ0aWZpY2F0\nZTEnMCUGCSqGSIb3DQEJARYYaWtldjItdGVzdEBtdXNocm9vbS5jb3JwMIIBIjANBgkqhkiG9w0B\nAQEFAAOCAQ8AMIIBCgKCAQEAmFdqP+nTEZukS0lLP+yj1gNImsEIf7P2ySTunceYxwkm4VE5QReD\nbb2L5/HLA9pPmIeQLSq/BgO1meOcbOSJ2YVHQ28MQ56+8Crb6n28iycX4hp0H3AxRAjh0edX+q3y\nilvYJ4W9/NnIb/wAZwS0oJif/tTkVF77HybAfJde5Eqbp+bCKIvMWnambh9DRUyjrBBZo5dA1o32\nzpuFBrJdI8dmUpw9gtf0F0Ba8lGZm8Uqc0GyXeXOJUE2u7CiMu3M77BM6ZLLTcow5+bQImkmTL1S\nGhzwfinME1e6p3Hm//pDjuJvFaY22k05LgLuyqc59vFiB3Toldz8+AbMNjvzAwIDAQABo4IBHzCC\nARswHQYDVR0OBBYEFPPYTt6Q9+Zd0s4zzVxWjG+XFDFLMIHrBgNVHSMEgeMwgeCAFPPYTt6Q9+Zd\n0s4zzVxWjG+XFDFLoYG8pIG5MIG2MQswCQYDVQQGEwJGUjEOMAwGA1UECBMFUGFyaXMxDjAMBgNV\nBAcTBVBhcmlzMRcwFQYDVQQKEw5NdXNocm9vbSBDb3JwLjEeMBwGA1UECxMVTXVzaHJvb20gVlBO\nIFNlcnZpY2VzMSUwIwYDVQQDExxJS0V2MiBYLjUwOSBUZXN0IGNlcnRpZmljYXRlMScwJQYJKoZI\nhvcNAQkBFhhpa2V2Mi10ZXN0QG11c2hyb29tLmNvcnCCCQC0XnBD5wkLcTAMBgNVHRMEBTADAQH/\nMA0GCSqGSIb3DQEBBQUAA4IBAQA2zt0BvXofiVvHMWlftZCstQaawej1SmxrAfDB4NUM24NsG+UZ\nI88XA5XM6QolmfyKnNromMLC1+6CaFxjq3jC/qdS7ifalFLQVo7ik/te0z6Olo0RkBNgyagWPX2L\nR5kHe9RvSDuoPIsbSHMmJA98AZwatbvEhmzMINJNUoHVzhPeHZnIaBgUBg02XULk/ElidO51Rf3g\nh8dR/kgFQSQT687vs1x9TWD00z0Q2bs2UF3Ob3+NYkEGEo5F9RePQm0mY94CT2xs6WpHo060Fo7f\nVpAFktMWx1vpu+wsEbQAhgGqV0fCR2QwKDIbTrPW/p9HJtJDYVjYdAFxr3s7V77y') >>> x=X509_Cert(c) ###(012)=[passed] Cert class : Rebuild certificate >>> raw(x) == c True ###(013)=[passed] Cert class : Version >>> tbs = x.tbsCertificate >>> tbs.version == ASN1_INTEGER(2) True ###(014)=[passed] Cert class : Serial >>> tbs.serialNumber == ASN1_INTEGER(0xb45e7043e7090b71) True ###(015)=[passed] Cert class : Signature algorithm (as advertised by TBSCertificate) >>> from scapy.layers.x509 import X509_AlgorithmIdentifier >>> assert type(tbs.signature) is X509_AlgorithmIdentifier >>> tbs.signature.algorithm == ASN1_OID("sha1-with-rsa-signature") True ###(016)=[passed] Cert class : Issuer structure >>> from scapy.layers.x509 import X509_AttributeTypeAndValue >>> from scapy.layers.x509 import X509_RDN >>> assert type(tbs.issuer) is list >>> assert len(tbs.issuer) == 7 >>> assert type(tbs.issuer[0]) is X509_RDN >>> assert type(tbs.issuer[0].rdn) is list >>> assert type(tbs.issuer[0].rdn[0]) is X509_AttributeTypeAndValue ###(017)=[passed] Cert class : Issuer first attribute >>> tbs.issuer[0].rdn[0].type == ASN1_OID("countryName") and tbs.issuer[0].rdn[0].value == ASN1_PRINTABLE_STRING(b"FR") True ###(018)=[passed] Cert class : Issuer string >>> tbs.get_issuer_str() == '/C=FR/ST=Paris/L=Paris/O=Mushroom Corp./OU=Mushroom VPN Services/CN=IKEv2 X.509 Test certificate/emailAddress=ikev2-test@mushroom.corp' True ###(019)=[passed] Cert class : Validity >>> from scapy.layers.x509 import X509_Validity >>> assert type(tbs.validity) is X509_Validity >>> tbs.validity.not_before == ASN1_UTC_TIME("060713073859Z") and tbs.validity.not_after == ASN1_UTC_TIME("260330073859Z") True ###(020)=[passed] Cert class : Subject structure >>> assert type(tbs.subject) is list >>> assert len(tbs.subject) == 7 >>> assert type(tbs.subject[0]) is X509_RDN >>> assert type(tbs.subject[0].rdn) is list >>> assert type(tbs.subject[0].rdn[0]) is X509_AttributeTypeAndValue ###(021)=[passed] Cert class : Subject last attribute >>> tbs.issuer[6].rdn[0].type == ASN1_OID("emailAddress") and tbs.issuer[6].rdn[0].value == ASN1_IA5_STRING(b"ikev2-test@mushroom.corp") True ###(022)=[passed] Cert class : Subject string >>> tbs.get_subject_str() == '/C=FR/ST=Paris/L=Paris/O=Mushroom Corp./OU=Mushroom VPN Services/CN=IKEv2 X.509 Test certificate/emailAddress=ikev2-test@mushroom.corp' True ###(023)=[passed] Cert class : SubjectPublicKey algorithm >>> from scapy.layers.x509 import X509_SubjectPublicKeyInfo >>> assert type(tbs.subjectPublicKeyInfo) is X509_SubjectPublicKeyInfo >>> spki = tbs.subjectPublicKeyInfo >>> spki.signatureAlgorithm.algorithm == ASN1_OID("rsaEncryption") True ###(024)=[passed] Cert class : SubjectPublicKey value >>> from scapy.layers.x509 import RSAPublicKey >>> assert type(spki.subjectPublicKey) is RSAPublicKey >>> spki.subjectPublicKey.modulus == ASN1_INTEGER(19231328316532061413420367242571475005688288081144416166988378525696075445024135424022026378563116068168327239354659928492979285632474448448624869172454076124150405352043642781483254546569202103296262513098482624188672299255268092629150366527784294463900039290024710152521604731213565912934889752122898104556895316819303096201441834849255370122572613047779766933573375974464479123135292080801384304131606933504677232323037116557327478512106367095125103346134248056463878553619525193565824925835325216545121044922690971718737998420984924512388011040969150550056783451476150234324593710633552558175109683813482739004163) and spki.subjectPublicKey.publicExponent == ASN1_INTEGER(65537) True ###(025)=[passed] Cert class : Extensions structure >>> ext = tbs.extensions >>> assert type(ext) is list >>> assert len(ext) == 3 ###(026)=[passed] Cert class : Subject key identifier extension info >>> from scapy.layers.x509 import X509_Extension >>> assert type(ext[0]) is X509_Extension >>> ext[0].extnID == ASN1_OID("subjectKeyIdentifier") and ext[0].critical == None True ###(027)=[passed] Cert class : Subject key identifier extension value >>> from scapy.layers.x509 import X509_ExtSubjectKeyIdentifier >>> assert type(ext[0].extnValue) is X509_ExtSubjectKeyIdentifier >>> ext[0].extnValue.keyIdentifier == ASN1_STRING(b'\xf3\xd8N\xde\x90\xf7\xe6]\xd2\xce3\xcd\\V\x8co\x97\x141K') True ###(028)=[passed] Cert class : Signature algorithm >>> from scapy.layers.x509 import X509_AlgorithmIdentifier >>> assert type(x.signatureAlgorithm) is X509_AlgorithmIdentifier >>> x.signatureAlgorithm.algorithm == ASN1_OID("sha1-with-rsa-signature") True ###(029)=[passed] Cert class : Signature value >>> x.signatureValue == ASN1_BIT_STRING(b"6\xce\xdd\x01\xbdz\x1f\x89[\xc71i_\xb5\x90\xac\xb5\x06\x9a\xc1\xe8\xf5Jlk\x01\xf0\xc1\xe0\xd5\x0c\xdb\x83l\x1b\xe5\x19#\xcf\x17\x03\x95\xcc\xe9\n%\x99\xfc\x8a\x9c\xda\xe8\x98\xc2\xc2\xd7\xee\x82h\\c\xabx\xc2\xfe\xa7R\xee'\xda\x94R\xd0V\x8e\xe2\x93\xfb^\xd3>\x8e\x96\x8d\x11\x90\x13`\xc9\xa8\x16=}\x8bG\x99\x07{\xd4oH;\xa8<\x8b\x1bHs&$\x0f|\x01\x9c\x1a\xb5\xbb\xc4\x86l\xcc \xd2MR\x81\xd5\xce\x13\xde\x1d\x99\xc8h\x18\x14\x06\r6]B\xe4\xfcIbt\xeeuE\xfd\xe0\x87\xc7Q\xfeH\x05A$\x13\xeb\xce\xef\xb3\\}M`\xf4\xd3=\x10\xd9\xbb6P]\xceo\x7f\x8dbA\x06\x12\x8eE\xf5\x17\x8fBm&c\xde\x02Oll\xe9jG\xa3N\xb4\x16\x8e\xdfV\x90\x05\x92\xd3\x16\xc7[\xe9\xbb\xec,\x11\xb4\x00\x86\x01\xaaWG\xc2Gd0(2\x1bN\xb3\xd6\xfe\x9fG&\xd2CaX\xd8t\x01q\xaf{;W\xbe\xf2", readable=True) True ###(030)=[passed] Cert class : Default X509_Cert from scratch >>> from scapy.layers.x509 import X509_Cert >>> raw(X509_Cert(raw(X509_Cert()))) == raw(X509_Cert()) True ###(031)=[passed] Cert class : Error >>> try: ... Cert("fail") ... except: ... assert True ... else: ... assert False ... ###(032)=[passed] Cert class: Import Windows AD certificate >>> from scapy.layers.x509 import X509_Cert >>> c = base64.b64decode('MIIHKjCCBRKgAwIBAgITEgAAAAerpFLcIBwL6QAAAAAABzANBgkqhkiG9w0BAQsFADBHMRUwEwYKCZImiZPyLGQBGRYFbG9jYWwxFjAUBgoJkiaJk/IsZAEZFgZkb21haW4xFjAUBgNVBAMTDWRvbWFpbi1EQzEtQ0EwHhcNMjQwNDMwMTEyOTA5WhcNMjUwNDMwMTEyOTA5WjAbMRkwFwYDVQQDExBEQzEuZG9tYWluLmxvY2FsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvTvRYsSLoBJnHA+L62fgLUTN0JmBGONhz4qduRWBcpqOJIivxK2AcPThr8xdVcS5T80vUaT2SIzSvSp2RGdDbBWYGhRpZKkuCGA94PBYowb6aZuWF3RCm3kyySa/hisx4rlly+oERMtjvtgIHFAodu14gtA4YwKDwUwHY2bAE2Btxfsqrmzk8ezGpEB7/wO83zhLbc05ZMD43VwUEmTS5RSE2/1B/6gnO1KeAOrvUD6aiybvWKLNaEKsecsmqay60S+kFGcnXyji/CSv78URaetkJ7mRqPDR5E9DnWjfgAFBOYPoGE/XlV2duo3vBzasYIQtkBZvqeb9n/PkbIKmbQIDAQABo4IDOTCCAzUwLwYJKwYBBAGCNxQCBCIeIABEAG8AbQBhAGkAbgBDAG8AbgB0AHIAbwBsAGwAZQByMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAOBgNVHQ8BAf8EBAMCBaAweAYJKoZIhvcNAQkPBGswaTAOBggqhkiG9w0DAgICAIAwDgYIKoZIhvcNAwQCAgCAMAsGCWCGSAFlAwQBKjALBglghkgBZQMEAS0wCwYJYIZIAWUDBAECMAsGCWCGSAFlAwQBBTAHBgUrDgMCBzAKBggqhkiG9w0DBzAdBgNVHQ4EFgQU1vUiq6+MemfH69K9TnY2VDcBzdIwHwYDVR0jBBgwFoAUP8rKky+uwfavmkn3YezKPryPZXkwgcgGA1UdHwSBwDCBvTCBuqCBt6CBtIaBsWxkYXA6Ly8vQ049ZG9tYWluLURDMS1DQSxDTj1EQzEsQ049Q0RQLENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9ZG9tYWluLERDPWxvY2FsP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFzcz1jUkxEaXN0cmlidXRpb25Qb2ludDCBwAYIKwYBBQUHAQEEgbMwgbAwga0GCCsGAQUFBzAChoGgbGRhcDovLy9DTj1kb21haW4tREMxLUNBLENOPUFJQSxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERDPWRvbWFpbixEQz1sb2NhbD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlmaWNhdGlvbkF1dGhvcml0eTA8BgNVHREENTAzoB8GCSsGAQQBgjcZAaASBBBzEAh+YqaMQ5DcXUF1z8mXghBEQzEuZG9tYWluLmxvY2FsME0GCSsGAQQBgjcZAgRAMD6gPAYKKwYBBAGCNxkCAaAuBCxTLTEtNS0yMS0xOTI0MTM3MjE0LTM3MTg2NDYyNzQtNDAyMTU3MjEtMTAwMDANBgkqhkiG9w0BAQsFAAOCAgEAWwJuAQIRP3w9XheBdw+PgvMlfeIPV615Ce9C47HJto0kJOWtlBk3gF0WEjP7l8sToBU9v9L1zkczDh42XvSYSipv1q+20fRiXWQj0HqZRPt7yKcN3nnW4Foj6nFUlKjp8WIViQvJxUP2IP/SeblPRADry4AfRgxipq5rikl1PIQTH99u5MNEIePeP7apCcMizOd72RE/S9bPpQ4vB6vJ5T20YNSspHqC2qQnqOUqQwKrd+0i44bV4NANDPwv8wqzTvbDA9JMWm7sUanrl0x2yvfB9JyuZmo8y3JE7D8RFs/Z5btvWvQ4CWWIgVKnVncXOr98ytSaGNOift2NNz/2sox26Dgls4xklllnHiF2353IDSNPZqTNruWjUyM+4RuGKu6djqlaTneNEOi9Cu5HSE95JC03k9NhYyDW8PUIAWksLiWMYFng4KH37U9P15EiPsgPY70nP4ll6NqKt7RfXnSH7AmvacvY7dazsKOulAdzp8YuQ5vjR61FsbB/jn1hwtR7OdNYFKd9KK66zFSrX+n0sTXMou1FzvqDUj5+qLlbyEzYvU/QbNTxYUIjjNv+asXtD9T+UaKoI5PyeRBA4cnU7+klduy0vVh2Lx6lnIZPVCG7i1sQYRQQ3ESP7QSUuJtG/wgJZ5KspzfIHBjt62549oVj0CoJcvMZ2wOr8iY=') >>> x=X509_Cert(c) ###(033)=[passed] Cert class: Check some Windows-specific extensions >>> tbs = x.tbsCertificate >>> ext = tbs.extensions >>> assert type(ext) is list >>> assert len(ext) == 10 >>> >>> assert [x[0].extnID.oidname for x in ext] == [ ... 'ENROLL_CERTTYPE', ... 'extKeyUsage', ... 'keyUsage', ... 'smimeCapabilities', ... 'subjectKeyIdentifier', ... 'authorityKeyIdentifier', ... 'cRLDistributionPoints', ... 'authorityInfoAccess', ... 'subjectAltName', ... 'NTDS_CA_SECURITY_EXT', ... ] >>> assert ext[0].extnValue.Name == b'\x00D\x00o\x00m\x00a\x00i\x00n\x00C\x00o\x00n\x00t\x00r\x00o\x00l\x00l\x00e\x00r' >>> assert ext[1].extnValue.extendedKeyUsage[0].oid == '1.3.6.1.5.5.7.3.2' >>> assert ext[6].extnValue.cRLDistributionPoints[0].distributionPoint.distributionPointName.fullName[0].generalName.uniformResourceIdentifier == b'ldap:///CN=domain-DC1-CA,CN=DC1,CN=CDP,CN=Public%20Key%20Services,CN=Services,CN=Configuration,DC=domain,DC=local?certificateRevocationList?base?objectClass=cRLDistributionPoint' >>> assert ext[8].extnValue.subjectAltName[1].generalName.dNSName == b"DC1.domain.local" >>> assert ext[9].extnValue.value == b'S-1-5-21-1924137214-3718646274-40215721-1000' ###### ## X509_CRL class tests ###### ###(034)=[passed] CRL class : Importing DER encoded X.509 CRL >>> from scapy.layers.x509 import X509_CRL >>> c = base64.b64decode('MIICHjCCAYcwDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWdu\nLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5Fw0wNjExMDIwMDAwMDBaFw0wNzAyMTcyMzU5NTlaMIH2MCECECzSS2LEl6QXzW6jyJx6\nLcgXDTA0MDQwMTE3NTYxNVowIQIQOkXeVssCzdzcTndjIhvU1RcNMDEwNTA4MTkyMjM0WjAhAhBB\nXYg2gRUg1YCDRqhZkngsFw0wMTA3MDYxNjU3MjNaMCECEEc5gf/9hIHxlfnrGMJ8DfEXDTAzMDEw\nOTE4MDYxMlowIQIQcFR+auK62HZ/R6mZEEFeZxcNMDIwOTIzMTcwMDA4WjAhAhB+C13eGPI5ZoKm\nj2UiOCPIFw0wMTA1MDgxOTA4MjFaMCICEQDQVEhgGGfTrTXKLw1KJ5VeFw0wMTEyMTExODI2MjFa\nMA0GCSqGSIb3DQEBBQUAA4GBACLJ9rsdoaU9JMf/sCIRs3AGW8VV3TN2oJgiCGNEac9PRyV3mRKE\n0hmuIJTKLFSaa4HSAzimWpWNKuJhztsZzXUnWSZ8VuHkgHEaSbKqzUlb2g+o/848CvzJrcbeyEBk\nDCYJI5C3nLlQA49LGJ+w4GUPYBwaZ+WFxCX1C8kzglLm') >>> x=X509_CRL(c) ###(035)=[passed] CRL class : Rebuild crl >>> raw(x) == c True ###(036)=[passed] CRL class : Version >>> tbs = x.tbsCertList >>> tbs.version == None True ###(037)=[passed] CRL class : Signature algorithm (as advertised by TBSCertList) >>> assert type(tbs.signature) is X509_AlgorithmIdentifier >>> tbs.signature.algorithm == ASN1_OID("sha1-with-rsa-signature") True ###(038)=[passed] CRL class : Issuer structure >>> assert type(tbs.issuer) is list >>> assert len(tbs.issuer) == 3 >>> assert type(tbs.issuer[0]) is X509_RDN >>> assert type(tbs.issuer[0].rdn) is list >>> assert type(tbs.issuer[0].rdn[0]) is X509_AttributeTypeAndValue ###(039)=[passed] CRL class : Issuer first attribute >>> tbs.issuer[0].rdn[0].type == ASN1_OID("countryName") and tbs.issuer[0].rdn[0].value == ASN1_PRINTABLE_STRING(b"US") True ###(040)=[passed] CRL class : Issuer string >>> tbs.get_issuer_str() == '/C=US/O=VeriSign, Inc./OU=Class 1 Public Primary Certification Authority' True ###(041)=[passed] CRL class : This update >>> tbs.this_update == ASN1_UTC_TIME("061102000000Z") True ###(042)=[passed] CRL class : Optional next update >>> tbs.next_update == ASN1_UTC_TIME("070217235959Z") True ###(043)=[passed] CRL class : Optional revoked_certificates structure >>> from scapy.layers.x509 import X509_RevokedCertificate >>> assert type(tbs.revokedCertificates) is list >>> assert len(tbs.revokedCertificates) == 7 >>> assert type(tbs.revokedCertificates[0]) is X509_RevokedCertificate ###(044)=[passed] CRL class : Revoked_certificates first attribute >>> tbs.revokedCertificates[0].serialNumber == ASN1_INTEGER(59577943160751197113872490992424857032) and tbs.revokedCertificates[0].revocationDate == ASN1_UTC_TIME("040401175615Z") True ###(045)=[passed] CRL class : Extensions structure >>> tbs.crlExtensions == None True ###(046)=[passed] CRL class : Signature algorithm >>> assert type(x.signatureAlgorithm) is X509_AlgorithmIdentifier >>> x.signatureAlgorithm.algorithm == ASN1_OID("sha1-with-rsa-signature") True ###(047)=[passed] CRL class : Signature value >>> x.signatureValue == ASN1_BIT_STRING(b'"\xc9\xf6\xbb\x1d\xa1\xa5=$\xc7\xff\xb0"\x11\xb3p\x06[\xc5U\xdd3v\xa0\x98"\x08cDi\xcfOG%w\x99\x12\x84\xd2\x19\xae \x94\xca,T\x9ak\x81\xd2\x038\xa6Z\x95\x8d*\xe2a\xce\xdb\x19\xcdu\'Y&|V\xe1\xe4\x80q\x1aI\xb2\xaa\xcdI[\xda\x0f\xa8\xff\xce<\n\xfc\xc9\xad\xc6\xde\xc8@d\x0c&\t#\x90\xb7\x9c\xb9P\x03\x8fK\x18\x9f\xb0\xe0e\x0f`\x1c\x1ag\xe5\x85\xc4%\xf5\x0b\xc93\x82R\xe6', readable=True) True ###(048)=[passed] CRL class : Default X509_CRL from scratch >>> s = raw(X509_CRL()) >>> raw(X509_CRL(s)) == s True ###(049)=[passed] Randval tests : ASN1F_SEQUENCE_OF >>> from scapy.layers.x509 import ASN1P_INTEGER, X509_OtherName >>> random.seed(42) >>> r = ASN1F_SEQUENCE_OF("test", [], ASN1P_INTEGER).randval().number >>> assert isinstance(r, RandNum) >>> int(r) == -16393048219351680611 True ###(050)=[passed] Randval tests : ASN1F_PACKET >>> random.seed(0xcafecafe) >>> r = ASN1F_PACKET("otherName", None, X509_OtherName).randval() >>> assert isinstance(r, X509_OtherName) >>> str(r.type_id) == '171.184.10.271' True ###(051)=[passed] OCSP class : OCSP Response import >>> from scapy.layers.x509 import OCSP_Response >>> s = b'0\x82\x01\xd3\n\x01\x00\xa0\x82\x01\xcc0\x82\x01\xc8\x06\t+\x06\x01\x05\x05\x070\x01\x01\x04\x82\x01\xb90\x82\x01\xb50\x81\x9e\xa2\x16\x04\x14Qh\xff\x90\xaf\x02\x07u<\xcc\xd9edb\xa2\x12\xb8Yr;\x18\x0f20160914121000Z0s0q0I0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\xcf&\xf5\x18\xfa\xc9~\x8f\x8c\xb3B\xe0\x1c/j\x10\x9e\x8e_\n\x04\x14Qh\xff\x90\xaf\x02\x07u<\xcc\xd9edb\xa2\x12\xb8Yr;\x02\x10\x07z]\xc36#\x01\xf9\x89\xfeT\xf7\xf8o>d\x80\x00\x18\x0f20160914121000Z\xa0\x11\x18\x0f20160921112500Z0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x00\x03\x82\x01\x01\x00\x90\xef\xf9\x15U\x88\xac@l\xf6n\x04C/\x1a\xf5\xbc[Xi\xd9U\xbe\'\xd3\xb7\xf5\xbb\t\xd8\xb1Tw\x9c2\xac\x7f\x88\xba\x98\xe4\xa13\xf4\xdc\xea\xf3\xacX\xe4,E\xf5\xa9\xc3\xf4B-N\xe0\x89D[\xbe\n\xc2h\x9ar\xfd\'.\xc8,\xed\x83\xc2\xf0\x89_\x8c\xc3\xe7\x8a\xad\xa4\x14\x03\x96\x02\xc4\xa8\xc8\x90\x96%X\x80\x95\x02\x9d_\xc82;m\xe9\x15\x00\xa8\x00\xb9\x01\xe3aN&\xe4\xd5\x8a\xc4w7\x0b\xc3~\xc5\xb1M\x10~T\x9e\x1d\xf6\x06\xf8\x12sTg\x14b_\xe7\xc04\xb4\xa3\xd2\x8f\xe6\xa6\xc4\x01q\x03j\xc8\xd4\xc7\x89\xdde\x99\x1a\xd9\x02\xe7\x17\xd1\xf40P\xef\xf6$\xee\xfad\xf4\xeb\xc8\xf7\x0bRL\x8b\xa5x\xe4R2\xe9\xc2\xfcB\nh\x93\xf7\x0ep4h\xeb\x17\x83\xc8\x88!\xc3W\x94WG\xfe3\x15C0qE&A\x99\xa8}\x1a\xda"\xa9O\xba\x90W_W\xado\x1c\xf0`g7\xbb$\x91o\xec\xdd\xbd\x9e\x8bb\xfc' >>> response = OCSP_Response(s) ###(052)=[passed] OCSP class : OCSP Response global checks >>> from scapy.layers.x509 import OCSP_ResponseBytes >>> assert response.responseStatus.val == 0 >>> assert isinstance(response.responseBytes, OCSP_ResponseBytes) >>> responseBytes = response.responseBytes >>> assert responseBytes.responseType == ASN1_OID("basic-response") >>> assert responseBytes.signatureAlgorithm.algorithm == ASN1_OID("sha256WithRSAEncryption") >>> assert responseBytes.signatureAlgorithm.parameters == ASN1_NULL(0) >>> assert responseBytes.signature.val_readable[:3] == b"\x90\xef\xf9" and responseBytes.signature.val_readable[-3:] == b"\x8bb\xfc" >>> responseBytes.certs is None True ###(053)=[passed] OCSP class : OCSP ResponseData checks >>> from scapy.layers.x509 import OCSP_ByKey >>> responseData = responseBytes.tbsResponseData >>> assert responseData.version is None >>> rID = responseData.responderID.responderID >>> assert isinstance(rID, OCSP_ByKey) >>> assert rID.byKey.val[:3] == b"Qh\xff" and rID.byKey.val[-3:] == b"Yr;" >>> assert responseData.producedAt == ASN1_GENERALIZED_TIME("20160914121000Z") >>> assert len(responseData.responses) == 1 >>> responseData.responseExtensions is None True ###(054)=[passed] OCSP class : OCSP ResponseData dissection with RecokedInfo >>> from scapy.layers.x509 import OCSP_ResponseData >>> pkt = OCSP_ResponseData(b"0\x81\xdf\xa2\x16\x04\x14\x11\x7f\x8eD\xbb\xe9\x7f\xca'\xfeG\x90\x89\\\x18\xea\x0e\xa5#W\x18\x0f20240121133708Z0\x81\x8e0\x81\x8b0M0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\x0b\xaf\xcc#$\xb8\xb0\xf8\xb02,\x9aPn9VSW\x14\x14\x04\x14\x11\x7f\x8eD\xbb\xe9\x7f\xca'\xfeG\x90\x89\\\x18\xea\x0e\xa5#W\x02\x14\x10&\x99j\t\xaa\xb9>\xde\x06\xb6#b\xa9\xe4GA\x07\x1b2\xa1\x16\x18\x0f20240120133708Z\xa0\x03\n\x01\x01\x18\x0f20240121133708Z\xa0\x11\x18\x0f20240122133708Z\xa1#0!0\x1f\x06\t+\x06\x01\x05\x05\x070\x01\x02\x04\x12\x04\x10\xfc\xb6\x92\xdf^\xf3\x03{\tH}\x12\x9f\xaa\x13^") >>> assert pkt.responderID.responderID.byKey == b"\x11\x7f\x8eD\xbb\xe9\x7f\xca'\xfeG\x90\x89\\\x18\xea\x0e\xa5#W" >>> assert pkt.responses[0].certID.issuerNameHash == b'\x0b\xaf\xcc#$\xb8\xb0\xf8\xb02,\x9aPn9VSW\x14\x14' >>> assert pkt.responses[0].certStatus.certStatus.revocationReason.cRLReason == 0x1 ###(055)=[passed] OCSP class : OCSP SingleResponse checks >>> from scapy.layers.x509 import OCSP_GoodInfo >>> singleResponse = responseData.responses[0] >>> assert singleResponse.certID.hashAlgorithm.algorithm == ASN1_OID("sha1") >>> assert singleResponse.certID.hashAlgorithm.parameters == ASN1_NULL(0) >>> assert singleResponse.certID.issuerNameHash.val[:3] == b"\xcf&\xf5" and singleResponse.certID.issuerNameHash.val[-3:] == b"\x8e_\n" >>> assert singleResponse.certID.issuerKeyHash.val[:3] == b"Qh\xff" and singleResponse.certID.issuerKeyHash.val[-3:] == b"Yr;" >>> assert singleResponse.certID.serialNumber.val == 0x77a5dc3362301f989fe54f7f86f3e64 >>> assert isinstance(singleResponse.certStatus.certStatus, OCSP_GoodInfo) >>> assert singleResponse.thisUpdate == ASN1_GENERALIZED_TIME("20160914121000Z") >>> assert singleResponse.nextUpdate == ASN1_GENERALIZED_TIME("20160921112500Z") >>> singleResponse.singleExtensions is None True ###(056)=[passed] OCSP class : OCSP Response reconstruction >>> raw(response) == s True ###(057)=[passed] OSCP class : OSCP Response with ECDSA >>> response = OCSP_ResponseBytes() >>> assert bytes(response.signature) == b'\x03!\x00defaultsignaturedefaultsignature' >>> response.signatureAlgorithm.algorithm = ASN1_OID('1.2.840.10045.4.3.2') >>> assert bytes(response.signature) == b'\x03\t\x000\x06\x02\x01\x00\x02\x01\x00' >>> response = OCSP_ResponseBytes(bytes(response)) >>> assert isinstance(response.signature, ECDSASignature) Test campaign ━ Run at 01:42:30 from [test/scapy/layers/tls/cert.uts] by UTscapy in 1.1513190269470215 └ Passed=65 └ Failed=0 ###### ## PKCS helpers tests ###### ###(000)=[passed] PKCS os2ip basic tests >>> pkcs_os2ip(b'\x00\x00\xff\xff') == 0xffff and pkcs_os2ip(b'\xff\xff\xff\xff\xff') == 0xffffffffff True ###(001)=[passed] PKCS i2osp basic tests >>> pkcs_i2osp(0xffff, 4) == b'\x00\x00\xff\xff' and pkcs_i2osp(0xffff, 2) == b'\xff\xff' and pkcs_i2osp(0xffffeeee, 3) == b'\xff\xff\xee\xee' True ###### ## PubKey class tests ###### ###(002)=[passed] PubKey class : Importing PEM-encoded RSA public key >>> x = PubKey(""" ... -----BEGIN PUBLIC KEY----- ... MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmFdqP+nTEZukS0lLP+yj ... 1gNImsEIf7P2ySTunceYxwkm4VE5QReDbb2L5/HLA9pPmIeQLSq/BgO1meOcbOSJ ... 2YVHQ28MQ56+8Crb6n28iycX4hp0H3AxRAjh0edX+q3yilvYJ4W9/NnIb/wAZwS0 ... oJif/tTkVF77HybAfJde5Eqbp+bCKIvMWnambh9DRUyjrBBZo5dA1o32zpuFBrJd ... I8dmUpw9gtf0F0Ba8lGZm8Uqc0GyXeXOJUE2u7CiMu3M77BM6ZLLTcow5+bQImkm ... TL1SGhzwfinME1e6p3Hm//pDjuJvFaY22k05LgLuyqc59vFiB3Toldz8+AbMNjvz ... AwIDAQAB ... -----END PUBLIC KEY----- ... """) >>> x_pubNum = x.pubkey.public_numbers() >>> type(x) is PubKeyRSA True ###(003)=[passed] PubKey class : Verifying PEM key format >>> x.frmt == "PEM" True ###(004)=[passed] PubKey class : Importing DER-encoded RSA Key >>> y = PubKey(b'0\x82\x01\"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\x98Wj?\xe9\xd3\x11\x9b\xa4KIK?\xec\xa3\xd6\x03H\x9a\xc1\x08\x7f\xb3\xf6\xc9$\xee\x9d\xc7\x98\xc7\t&\xe1Q9A\x17\x83m\xbd\x8b\xe7\xf1\xcb\x03\xdaO\x98\x87\x90-*\xbf\x06\x03\xb5\x99\xe3\x9cl\xe4\x89\xd9\x85GCo\x0cC\x9e\xbe\xf0*\xdb\xea}\xbc\x8b\'\x17\xe2\x1at\x1fp1D\x08\xe1\xd1\xe7W\xfa\xad\xf2\x8a[\xd8\'\x85\xbd\xfc\xd9\xc8o\xfc\x00g\x04\xb4\xa0\x98\x9f\xfe\xd4\xe4T^\xfb\x1f&\xc0|\x97^\xe4J\x9b\xa7\xe6\xc2(\x8b\xccZv\xa6n\x1fCEL\xa3\xac\x10Y\xa3\x97@\xd6\x8d\xf6\xce\x9b\x85\x06\xb2]#\xc7fR\x9c=\x82\xd7\xf4\x17@Z\xf2Q\x99\x9b\xc5*sA\xb2]\xe5\xce%A6\xbb\xb0\xa22\xed\xcc\xef\xb0L\xe9\x92\xcbM\xca0\xe7\xe6\xd0\"i&L\xbdR\x1a\x1c\xf0~)\xcc\x13W\xba\xa7q\xe6\xff\xfaC\x8e\xe2o\x15\xa66\xdaM9.\x02\xee\xca\xa79\xf6\xf1b\x07t\xe8\x95\xdc\xfc\xf8\x06\xcc6;\xf3\x03\x02\x03\x01\x00\x01') >>> y_pubNum = y.pubkey.public_numbers() >>> type(y) is PubKeyRSA True ###(005)=[passed] PubKey class : Verifying DER key format >>> y.frmt == "DER" True ###(006)=[passed] PubKey class : Checking modulus value >>> x_pubNum.n == y_pubNum.n and x_pubNum.n == 19231328316532061413420367242571475005688288081144416166988378525696075445024135424022026378563116068168327239354659928492979285632474448448624869172454076124150405352043642781483254546569202103296262513098482624188672299255268092629150366527784294463900039290024710152521604731213565912934889752122898104556895316819303096201441834849255370122572613047779766933573375974464479123135292080801384304131606933504677232323037116557327478512106367095125103346134248056463878553619525193565824925835325216545121044922690971718737998420984924512388011040969150550056783451476150234324593710633552558175109683813482739004163 True ###(007)=[passed] PubKey class : Checking public exponent value >>> x_pubNum.e == y_pubNum.e and x_pubNum.e == 65537 True ###(008)=[passed] PubKey class : Importing PEM-encoded ECDSA public key >>> z = PubKey(""" ... -----BEGIN PUBLIC KEY----- ... MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE55WjbZjS/88K1kYagsO9wtKifw0IKLp4 ... Jd5qtmDF2Zu+xrwrBRT0HBnPweDU+RsFxcyU/QxD9WYORzYarqxbcA== ... -----END PUBLIC KEY----- ... """) >>> type(z) is PubKeyECDSA True ###(009)=[passed] PubKey class : Checking curve >>> z.pubkey.curve.name == "secp256k1" True ###(010)=[passed] PubKey class : Checking point value >>> z.pubkey.public_numbers().x == 104748656174769496952370005421566518252704263000192720134585149244759951661467 True ###(011)=[passed] PubKeyRSA class : Generate without modulus >>> t = PubKeyRSA() >>> t.fill_and_store(modulus=None, pubExp=65537, modulusLen=1024) >>> assert t.pubkey.key_size == 1024 >>> assert t.pubkey.public_numbers().e == 65537 ###### ## PrivKey class tests ###### ###(012)=[passed] PrivKey class : Importing PEM-encoded RSA private key >>> x = PrivKey(""" ... -----BEGIN RSA PRIVATE KEY----- ... MIIEowIBAAKCAQEAmFdqP+nTEZukS0lLP+yj1gNImsEIf7P2ySTunceYxwkm4VE5 ... QReDbb2L5/HLA9pPmIeQLSq/BgO1meOcbOSJ2YVHQ28MQ56+8Crb6n28iycX4hp0 ... H3AxRAjh0edX+q3yilvYJ4W9/NnIb/wAZwS0oJif/tTkVF77HybAfJde5Eqbp+bC ... KIvMWnambh9DRUyjrBBZo5dA1o32zpuFBrJdI8dmUpw9gtf0F0Ba8lGZm8Uqc0Gy ... XeXOJUE2u7CiMu3M77BM6ZLLTcow5+bQImkmTL1SGhzwfinME1e6p3Hm//pDjuJv ... FaY22k05LgLuyqc59vFiB3Toldz8+AbMNjvzAwIDAQABAoIBAH3KeJZL2hhI/1GX ... NMaU/PfDgFkgmYbxMA8JKusnm/SFjxAwBGnGI6UjBXpBgpQs2Nqm3ZseF9u8hmCK ... vGiCEX2GesCo2mSfmSQxD6RBrMTuQ99UXpxzBIscFnM/Zrs8lPBARGzmF2nI3qPx ... Xtex4ABX5o0Cd4NfZlZjpj96skUoO8+bd3I4OPUFYFFFuv81LoSQ6Hew0a8xtJXt ... KkDp9h1jTGGUOc189WACNoBLH0MGeVoSUfc1++RcC3cypUZ8fNP1OO6GBfv06f5o ... XES4ZbxGYpa+nCfNwb6V2gWbkvaYm7aFn0KWGNZXS1P3OcWv6IWdOmg2CI7MMBLJ ... 0LyWVCECgYEAyMJYw195mvHl8VyxJ3HkxeQaaozWL4qhNQ0Kaw+mzD+jYdkbHb3a ... BYghsgEDZjnyOVblC7I+4smvAZJLWJaf6sZ5HAw3zmj1ibCkXx7deoRc/QVcOikl ... 3dE/ymO0KGJNiGzJZmxbRS3hTokmVPuxSWW4p5oSiMupFHKa18Uv8DECgYEAwkJ7 ... iTOUL6b4e3lQuHQnJbsiQpd+P/bsIPP7kaaHObewfHpfOOtIdtN4asxVFf/PgW5u ... WmBllqAHZYR14DEYIdL+hdLrdvk5nYQ3YfhOnp+haHUPCdEiXrRZuGXjmMA4V0hL ... 3HPF5ZM8H80fLnN8Pgn2rIC7CZQ46y4PnoV1nXMCgYBBwCUCF8rkDEWa/ximKo8a ... oNJmAypC98xEa7j1x3KBgnYoHcrbusok9ajTe7F5UZEbZnItmnsuG4/Nm/RBV1OY ... uNgBb573YzjHl6q93IX9EkzCMXc7NS7JrzaNOopOj6OFAtwTR3m89oHMDu8W9jfi ... KgaIHdXkJ4+AuugrstE4gQKBgFK0d1/8g7SeA+Cdz84YNaqMt5NeaDPXbsTA23Qx ... UBU0rYDxoKTdFybv9a6SfA83sCLM31K/A8FTNJL2CDGA9WNBL3fOSs2GYg88AVBG ... pUJHeDK+0748OcPUSPaG+pVIETSn5RRgffq16r0nWYUvSdAn8cuTqw3y+yC1pZS6 ... AU8dAoGBAL5QCi0dTWKN3kf3cXaCAnYiWe4Qg2S+SgLE+F1U4Xws2rqAuSvIiuT5 ... i5+Mqk9ZCGdoReVbAovJFoRqe7Fj9yWM+b1awGjL0bOTtnqx0iljob6uFyhpl1xg ... W3a3ICJ/ZYLvkgb4IBEteOwWpp37fX57vzhW8EmUV2UX7ve1uNRI ... -----END RSA PRIVATE KEY----- ... """) >>> x_privNum = x.key.private_numbers() >>> x_pubNum = x.pubkey.public_numbers() >>> type(x) is PrivKeyRSA True ###(013)=[passed] PrivKey class : Checking public attributes >>> assert x_pubNum.n == 19231328316532061413420367242571475005688288081144416166988378525696075445024135424022026378563116068168327239354659928492979285632474448448624869172454076124150405352043642781483254546569202103296262513098482624188672299255268092629150366527784294463900039290024710152521604731213565912934889752122898104556895316819303096201441834849255370122572613047779766933573375974464479123135292080801384304131606933504677232323037116557327478512106367095125103346134248056463878553619525193565824925835325216545121044922690971718737998420984924512388011040969150550056783451476150234324593710633552558175109683813482739004163 >>> x_pubNum.e == 65537 True ###(014)=[passed] PrivKey class : Checking private attributes >>> assert x_privNum.p == 140977881300857803928857666115326329496639762170623218602431133528876162476487960230341078724702018316260690172014674492782486113504117653531825010840338251572887403113276393351318549036549656895326851872473595350667293402676143426484331639796163189182788306480699144107905869179435145810212051656274284113969 >>> assert x_privNum.q == 136413798668820291889092636919077529673097927884427227010121877374504825870002258140616512268521246045642663981036167305976907058413796938050224182519965099316625879807962173794483933183111515251808827349718943344770056106787713032506379905031673992574818291891535689493330517205396872699985860522390496583027 >>> assert x_privNum.dmp1 == 46171616708754015342920807261537213121074749458020000367465429453038710215532257783908950878847126373502288079285334594398328912526548076894076506899568491565992572446455658740752572386903609191774044411412991906964352741123956581870694330173563737928488765282233340389888026245745090096745219902501964298369 >>> assert x_privNum.dmq1 == 58077388505079936284685944662039782610415160654764308528562806086690474868010482729442634318267235411531220690585030443434512729356878742778542733733189895801341155353491318998637269079682889033003797865508917973141494201620317820971253064836562060222814287812344611566640341960495346782352037479526674026269 >>> x_privNum.d == 15879630313397508329451198152673380989865598204237760057319927734227125481903063742175442230739018051313441697936698689753842471306305671266572085925009572141819112648211571007521954312641597446020984266846581125287547514750428503480880603089110687015181510081018160579576523796170439894692640171752302225125980423560965987469457505107324833137678663960560798216976668670722016960863268272661588745006387723814962668678285659376534048525020951633874488845649968990679414325096323920666486328886913648207836459784281744709948801682209478580185160477801656666089536527545026197569990716720623647770979759861119273292833 True ###(015)=[passed] PrivKey class : Importing PEM-encoded ECDSA private key >>> y = PrivKey(""" ... -----BEGIN EC PRIVATE KEY----- ... MHQCAQEEIMiRlFoy6046m1NXu911ukXyjDLVgmOXWCKWdQMd8gCRoAcGBSuBBAAK ... oUQDQgAE55WjbZjS/88K1kYagsO9wtKifw0IKLp4Jd5qtmDF2Zu+xrwrBRT0HBnP ... weDU+RsFxcyU/QxD9WYORzYarqxbcA== ... -----END EC PRIVATE KEY----- ... """) >>> type(y) is PrivKeyECDSA True ###(016)=[passed] PrivKey class : Checking public attributes >>> assert y.key.curve.name == "secp256k1" >>> y.key.public_key().public_numbers().y == 86290575637772818452062569410092503179882738810918951913926481113065456425840 True ###(017)=[passed] PrivKey class : Checking private attributes >>> y.key.private_numbers().private_value == 90719786431263082134670936670180839782031078050773732489701961692235185651857 True ###(018)=[passed] PrivKeyECDSA sign & verify >>> a = PrivKeyECDSA() >>> a.fill_and_store() >>> msg = b"Scapy test message" >>> data = a.sign(msg) >>> assert a.verify(msg, data) >>> assert not a.verify(b"Hello", data) ###(019)=[passed] PubKeyECDSA verify >>> b = PubKeyECDSA() >>> b.pubkey = a.pubkey >>> assert b.verify(msg, data) >>> assert not b.verify(b"Hello", data) ###(020)=[passed] PrivKey class : Importing DER-encoded RSA private key >>> a = PrivKeyRSA(b'0\x82\x04\xa3\x02\x01\x00\x02\x82\x01\x01\x00\x98Wj?\xe9\xd3\x11\x9b\xa4KIK?\xec\xa3\xd6\x03H\x9a\xc1\x08\x7f\xb3\xf6\xc9$\xee\x9d\xc7\x98\xc7\t&\xe1Q9A\x17\x83m\xbd\x8b\xe7\xf1\xcb\x03\xdaO\x98\x87\x90-*\xbf\x06\x03\xb5\x99\xe3\x9cl\xe4\x89\xd9\x85GCo\x0cC\x9e\xbe\xf0*\xdb\xea}\xbc\x8b\'\x17\xe2\x1at\x1fp1D\x08\xe1\xd1\xe7W\xfa\xad\xf2\x8a[\xd8\'\x85\xbd\xfc\xd9\xc8o\xfc\x00g\x04\xb4\xa0\x98\x9f\xfe\xd4\xe4T^\xfb\x1f&\xc0|\x97^\xe4J\x9b\xa7\xe6\xc2(\x8b\xccZv\xa6n\x1fCEL\xa3\xac\x10Y\xa3\x97@\xd6\x8d\xf6\xce\x9b\x85\x06\xb2]#\xc7fR\x9c=\x82\xd7\xf4\x17@Z\xf2Q\x99\x9b\xc5*sA\xb2]\xe5\xce%A6\xbb\xb0\xa22\xed\xcc\xef\xb0L\xe9\x92\xcbM\xca0\xe7\xe6\xd0"i&L\xbdR\x1a\x1c\xf0~)\xcc\x13W\xba\xa7q\xe6\xff\xfaC\x8e\xe2o\x15\xa66\xdaM9.\x02\xee\xca\xa79\xf6\xf1b\x07t\xe8\x95\xdc\xfc\xf8\x06\xcc6;\xf3\x03\x02\x03\x01\x00\x01\x02\x82\x01\x00}\xcax\x96K\xda\x18H\xffQ\x974\xc6\x94\xfc\xf7\xc3\x80Y \x99\x86\xf10\x0f\t*\xeb\'\x9b\xf4\x85\x8f\x100\x04i\xc6#\xa5#\x05zA\x82\x94,\xd8\xda\xa6\xdd\x9b\x1e\x17\xdb\xbc\x86`\x8a\xbch\x82\x11}\x86z\xc0\xa8\xdad\x9f\x99$1\x0f\xa4A\xac\xc4\xeeC\xdfT^\x9cs\x04\x8b\x1c\x16s?f\xbb<\x94\xf0@Dl\xe6\x17i\xc8\xde\xa3\xf1^\xd7\xb1\xe0\x00W\xe6\x8d\x02w\x83_fVc\xa6?z\xb2E(;\xcf\x9bwr88\xf5\x05`QE\xba\xff5.\x84\x90\xe8w\xb0\xd1\xaf1\xb4\x95\xed*@\xe9\xf6\x1dcLa\x949\xcd|\xf5`\x026\x80K\x1fC\x06yZ\x12Q\xf75\xfb\xe4\\\x0bw2\xa5F||\xd3\xf58\xee\x86\x05\xfb\xf4\xe9\xfeh\\D\xb8e\xbcFb\x96\xbe\x9c\'\xcd\xc1\xbe\x95\xda\x05\x9b\x92\xf6\x98\x9b\xb6\x85\x9fB\x96\x18\xd6WKS\xf79\xc5\xaf\xe8\x85\x9d:h6\x08\x8e\xcc0\x12\xc9\xd0\xbc\x96T!\x02\x81\x81\x00\xc8\xc2X\xc3_y\x9a\xf1\xe5\xf1\\\xb1\'q\xe4\xc5\xe4\x1aj\x8c\xd6/\x8a\xa15\r\nk\x0f\xa6\xcc?\xa3a\xd9\x1b\x1d\xbd\xda\x05\x88!\xb2\x01\x03f9\xf29V\xe5\x0b\xb2>\xe2\xc9\xaf\x01\x92KX\x96\x9f\xea\xc6y\x1c\x0c7\xceh\xf5\x89\xb0\xa4_\x1e\xddz\x84\\\xfd\x05\\:)%\xdd\xd1?\xcac\xb4(bM\x88l\xc9fl[E-\xe1N\x89&T\xfb\xb1Ie\xb8\xa7\x9a\x12\x88\xcb\xa9\x14r\x9a\xd7\xc5/\xf01\x02\x81\x81\x00\xc2B{\x893\x94/\xa6\xf8{yP\xb8t\'%\xbb"B\x97~?\xf6\xec \xf3\xfb\x91\xa6\x879\xb7\xb0|z_8\xebHv\xd3xj\xccU\x15\xff\xcf\x81nnZ`e\x96\xa0\x07e\x84u\xe01\x18!\xd2\xfe\x85\xd2\xebv\xf99\x9d\x847a\xf8N\x9e\x9f\xa1hu\x0f\t\xd1"^\xb4Y\xb8e\xe3\x98\xc08WHK\xdcs\xc5\xe5\x93<\x1f\xcd\x1f.s|>\t\xf6\xac\x80\xbb\t\x948\xeb.\x0f\x9e\x85u\x9ds\x02\x81\x80A\xc0%\x02\x17\xca\xe4\x0cE\x9a\xff\x18\xa6*\x8f\x1a\xa0\xd2f\x03*B\xf7\xccDk\xb8\xf5\xc7r\x81\x82v(\x1d\xca\xdb\xba\xca$\xf5\xa8\xd3{\xb1yQ\x91\x1bfr-\x9a{.\x1b\x8f\xcd\x9b\xf4AWS\x98\xb8\xd8\x01o\x9e\xf7c8\xc7\x97\xaa\xbd\xdc\x85\xfd\x12L\xc21w;5.\xc9\xaf6\x8d:\x8aN\x8f\xa3\x85\x02\xdc\x13Gy\xbc\xf6\x81\xcc\x0e\xef\x16\xf67\xe2*\x06\x88\x1d\xd5\xe4\'\x8f\x80\xba\xe8+\xb2\xd18\x81\x02\x81\x80R\xb4w_\xfc\x83\xb4\x9e\x03\xe0\x9d\xcf\xce\x185\xaa\x8c\xb7\x93^h3\xd7n\xc4\xc0\xdbt1P\x154\xad\x80\xf1\xa0\xa4\xdd\x17&\xef\xf5\xae\x92|\x0f7\xb0"\xcc\xdfR\xbf\x03\xc1S4\x92\xf6\x081\x80\xf5cA/w\xceJ\xcd\x86b\x0f<\x01PF\xa5BGx2\xbe\xd3\xbe<9\xc3\xd4H\xf6\x86\xfa\x95H\x114\xa7\xe5\x14`}\xfa\xb5\xea\xbd\'Y\x85/I\xd0\'\xf1\xcb\x93\xab\r\xf2\xfb \xb5\xa5\x94\xba\x01O\x1d\x02\x81\x81\x00\xbeP\n-\x1dMb\x8d\xdeG\xf7qv\x82\x02v"Y\xee\x10\x83d\xbeJ\x02\xc4\xf8]T\xe1|,\xda\xba\x80\xb9+\xc8\x8a\xe4\xf9\x8b\x9f\x8c\xaaOY\x08ghE\xe5[\x02\x8b\xc9\x16\x84j{\xb1c\xf7%\x8c\xf9\xbdZ\xc0h\xcb\xd1\xb3\x93\xb6z\xb1\xd2)c\xa1\xbe\xae\x17(i\x97\\`[v\xb7 "\x7fe\x82\xef\x92\x06\xf8 \x11-x\xec\x16\xa6\x9d\xfb}~{\xbf8V\xf0I\x94We\x17\xee\xf7\xb5\xb8\xd4H') >>> a_privNum = a.key.private_numbers() >>> a_pubNum = a.pubkey.public_numbers() >>> >>> assert x_pubNum.n == x_pubNum.n >>> assert x_pubNum.e == x_pubNum.e >>> >>> assert x_privNum.p == a_privNum.p >>> assert x_privNum.q == a_privNum.q >>> assert x_privNum.dmp1 == a_privNum.dmp1 >>> assert x_privNum.dmq1 == a_privNum.dmq1 >>> assert x_privNum.d == a_privNum.d ###(021)=[passed] PrivKey class: Importing PEM-encoded EdDSA private key >>> y = PrivKey(""" ... -----BEGIN PRIVATE KEY----- ... MC4CAQAwBQYDK2VwBCIEIGu36oadjA6raCmwtImfAWI/DSCENM/uQCsUaClVoUTZ ... -----END PRIVATE KEY----- ... """) ###### ## PrivKey/Pubkey test signatures ###### ###(022)=[passed] PrivKey class : sign tbs cert >>> pkey_sign = PrivKey(""" ... -----BEGIN RSA PRIVATE KEY----- ... MIIEowIBAAKCAQEA1L8KacejlbFJ18bvAz5/W9mF+0GglJs6qyv8pAPPiX1mWaLZ ... Y42Kf/axHYrxUPXEqitRG3VkOy1HONAZhl90rY0jVUyYps94om4S98NECbY3eiVc ... 02ZqQng5HyzBYJQeTh+EYrDaxPUXcVXjthmrt/6vbUHI1Kgk/gok8IBFMSzilxeO ... ZMJJ+dQigeDiaJGwHb3U5KzOm+hFb/IbwjdXJm3CG/58bCQp0rp6RD2qI/D6Xtvj ... pc/ms6q7vfBVpquSLeEIt4Jq2XC9RKGR7TGHaVe8vmU5rb/Y36ReYCw5+fMJqcP4 ... fFlC6iexBDhgy1sqV0o0tu4TzJodn8n3SFResQIDAQABAoIBAHcXEe8w0AOloJ5n ... P7hjLcvusi96BzfoxSi4kM4HTA+84KRgoqw1uUf0giT1eCxHx3Uylk52okr2B55n ... 70HnAVt9XEANho4qKW9Tis6iwd1l4RxA+ftkoyrePauT1BQKFgTJY8QTGAOU5zCM ... UdHIAPYYXX8dihxwm3SRnSf7xb/GSRkj5sMr0ioiBOZ91fwzbtOEbVXE58DyPNJm ... w/tBCFbibpr4iCU/6US8OyCxR/X4heRyKCcANXlHyE/eUO6TY8J2RaKbSQi+c3/y ... Y11ypSboyM3cGJ/URS5wRd0oQMQMANck4w+MlNU5jxsfN9wF32HWII8wq/6n3hHR ... M+H+3YECgYEA79nc8BLzFPrzuJud9JvCFEh0pNb0gLRb/MvIsaVUT7ac8/89tfvQ ... 6qxWgP81ldJ7S+d/uh80CKg0lVwaxF4sQ6yNn/cvebW8tCCm0RkD8q3R9kxOd3Q/ ... kLNeeBS/gPzh2xOmVuTE0ruv7ovYowU8WfJG2z20lv7WNsrN/Jm526kCgYEA4xH+ ... EBVqoPYxzKoa0LNxSPfVOBO7wT19pS5Ny7yjI9oy724cNXn39H5KaCHC3ZnR0mII ... 0znf7cbtbFHLSkR2MNzy1MC1VhIxFQ5yHLRCjZcKkjd+gZuJp0tCgY/r2dNYsBCR ... 7W1vMz/wNsbufkOhi/DqC0Ru7onFbouGBdpID8kCgYEAjamr6NAIarfeA4dGQBdP ... BhPVcRbUyr+8JQ9ntiTkK0C8axCyLi5RMooffYk+6QKseCR/ODr9zK8sf5sq5BiL ... JF1iOL0SeVxx3CH85TtVLZykikh/f+ZVNO38OghnI5Q5AeAVOvVbmuvn+Yj3pzGM ... d8O1PgCwDQ7vDuWxzCQvtiECgYAGWA9YFbEX9CjqBeqf4BOPLVVorqx1NqmW/tcv ... lQKd0s/Pfq0NFW5HB2w+woq2NED3dsO2WwyVkRQ7DYH3fjgrH1EtfoDSecmjQ/cO ... ND8Tw5+I/EHtjxHmeaTPB91YBZ6ZtKzPDFqp/ORSM3agUnVl+oIfdHcA9Rpt/zns ... We/feQKBgGimvdIrurKPTrV49ltAKdkHmglpYeCaDr6aZKwWMcsrLmTZ6a4uRPFF ... TdK+rCyGyjmibTVRjdg5+7KXshSlBleNR3v+AySAxzpjwySVhTfRirCogHRFHrnK ... kXqy5xUkg11ETv6v91n3u5NVBlXVN4iwFRGSKsecw0qxSgKjbP4n ... -----END RSA PRIVATE KEY----- ... """) >>> >>> c_tosign = Cert(""" ... -----BEGIN CERTIFICATE----- ... MIIC/TCCAeWgAwIBAgIJALkQBZa7rCRFMA0GCSqGSIb3DQEBBQUAMBUxEzARBgNV ... BAMMCnNlY2Rldi5vcmcwHhcNMTgwMjI3MTY1NjIyWhcNMjgwMjI1MTY1NjIyWjAV ... MRMwEQYDVQQDDApzZWNkZXYub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB ... CgKCAQEA1L8KacejlbFJ18bvAz5/W9mF+0GglJs6qyv8pAPPiX1mWaLZY42Kf/ax ... HYrxUPXEqitRG3VkOy1HONAZhl90rY0jVUyYps94om4S98NECbY3eiVc02ZqQng5 ... HyzBYJQeTh+EYrDaxPUXcVXjthmrt/6vbUHI1Kgk/gok8IBFMSzilxeOZMJJ+dQi ... geDiaJGwHb3U5KzOm+hFb/IbwjdXJm3CG/58bCQp0rp6RD2qI/D6Xtvjpc/ms6q7 ... vfBVpquSLeEIt4Jq2XC9RKGR7TGHaVe8vmU5rb/Y36ReYCw5+fMJqcP4fFlC6iex ... BDhgy1sqV0o0tu4TzJodn8n3SFResQIDAQABo1AwTjAdBgNVHQ4EFgQUf98kGOpM ... CVBFdHxFb8DaL6tPe+8wHwYDVR0jBBgwFoAUf98kGOpMCVBFdHxFb8DaL6tPe+8w ... DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAmw0lTyEVH8YfytbVS9AW ... rTJ1wWhDGf+9jHHEjX/OIq5ii0Ks38WyybhD7cMQNfkZCgIjrutrLHN/m/wn9aDx ... y9vuubWvrcbqhur82YZbVnlvEiqEEyY/ULqCaW2X7UC2K/2NAy14oF6bClLX8LBq ... 3G/lc6GUOToN6i4OuKeB9xxvJaBxsVIdnUW9IqesHatqV4yIhH1/flhqWM47LjHP ... a/uIGboyhl8p5bt3aVbXFwm/NeqsOVPDcQsBdWGldCN6loLE7b4eJDhjHbsuR2C3 ... aomWcyGW1mRxNJUI0GQ5EHB5Vvy4mcxKG1DMYxG/rGf/EHk+xPJXpITIugbispbm ... uA== ... -----END CERTIFICATE----- ... """) >>> tbs_signed = pkey_sign.signTBSCert(c_tosign.tbsCertificate) >>> assert raw(tbs_signed.signatureValue) == b"BH\xdb@>\x82\x08b\xbc\xaf\x04%_\xeaV\xf5_\xa8\xf4\xf3\xd1\x0f\x86\xbd\x1b\xe2U\xfb\xf5/\rN\xc2\r\xbc\xa0Hn\xed\xb7\x18\xb2\xb3\xa5\x08m9\x9fY\xa6\xb32\xcd:\xd7\xab\xac\x8c\xcf@\xbb\x08Gt2\xb7\x93\x95\x92\x17\xa7j\x99\xa7)\xab\xbc\x07HP\xca\x00M$\xfb.\xb9\xb8\xac%i\x8c\xa2+\xe7ny!\xa1\xd2l\x0f>j\xd6\xb0\x9e\xcat)+\xbc\x16'\x9d\x1e\x80\x89\x01.\x9dS\xbb\xa0-\xb8\x0c\xe9\xe9:a\xbe\x14p\xd1\xbb\xf0I\xa2\x8fio`2\x1b7\xb8]\t3\xced`\x86\x97\x01\x82t\xd0\xc3c%\xa7\xda\\[]9\xfa\xba\r\x83\x8b\r\xa2(\x87\xe87C\xb7\\\x11\x163\x8e\xbf\xe2\x80\x7f\xf2\x93\xa4\x04w\xddG\x88\x1e#\xa6l\x15\xa1\xc6\xda\x1f\xd4\xb4$T\xa1\xd0\xe9\xd5t\xc4\xe4q\xbe\xa2\xd2\xba\x1b!/\x1dK\x17}\xc6.\xba\x81;\x00ft\x8du)\x15\n\t\x08\x1b\xb2Ol\xe1\x94g\xc8\xc0\xd6>" ###(023)=[passed] PrivKey class : resign cert >>> correct_sha1_sig = c_tosign.signatureValue >>> c_tosign.x509Cert.signatureValue.val = 512*'0' >>> >>> c_resigned = pkey_sign.resignCert(c_tosign) >>> assert pkey_sign.verifyCert(c_resigned) >>> assert raw(c_resigned.signatureValue) == correct_sha1_sig ###### ## PubKey/PrivKey classes crypto tests ###### ###(024)=[passed] PrivKey/PubKey classes : Signing/Verifying with MD5_SHA1 hash >>> m = "Testing our PKCS #1 legacy methods" # ignore this string >>> s = x.sign(m, t="pkcs", h="md5-sha1") >>> assert s == b"\x0cm\x8a\x8f\xae`o\xcdC=\xfea\xf4\xff\xf0i\xfe\xa3!\xfd\xa5=*\x99?\x08!\x03A~\xa3-B\xe8\xca\xaf\xb4H|\xa3\x98\xe9\xd5U\xfdL\xb1\x9c\xd8\xb2{\xa1/\xfcr\x8c\xa7\xd3\xa9%\xde\x13\xa8\xf6\xc6<\xc7\xdb\xe3\xa62\xeb\xe9?\xe5by\xc2\x9e\xad\xec\x92:\x14\xd96\xa8\xc0+\xea8'{=\x91$\xdf\xed\xe1+eF8\x9fI\x1f\xa1\xcb4s\xd1#\xdf\xa11\x88o\x050i Hg\x0690\xe6\xe8?\\<:k\x94\x82\x91\x0f\x06\xc7>ZQ\xc2\xcdn\xdb\xf4\x9d\x7f!\xa9>\xe8\xea\xb3\xd83]\x8d\x90\xd4\xa0b\xe6\xe6$d[\xe4\xb4 |W\xb2t\x8c\xb2\xd5>>+\xf1\xa6W'\xaf\xc2CU\x82\x13\xc4\x0b\xc4vD*\xc3\xef\xa6s\nQ\xe6\rS@B\xd2\xa4V\xdc\xd1D\x7f\x00\xaa\xac\xac\x96i\xf1kg*\xe9*\x90a@\xc8uDy\x16\xe2\x03\xd1\x9fa\xe2s\xdb\xees\xa4\x8cna\xba\xdaE\x006&\xa4" >>> x_pub = PubKey((x._pubExp, x._modulus, x._modulusLen)) >>> x_pub.verify(m, s, t="pkcs", h="md5-sha1") True ###(025)=[passed] PrivKey/PubKey classes : Signing/Verifying with MD5_SHA1 hash with legacy support >>> m = "Testing our PKCS #1 legacy methods" >>> s = x._legacy_sign_md5_sha1(m) >>> assert s == b"\x0cm\x8a\x8f\xae`o\xcdC=\xfea\xf4\xff\xf0i\xfe\xa3!\xfd\xa5=*\x99?\x08!\x03A~\xa3-B\xe8\xca\xaf\xb4H|\xa3\x98\xe9\xd5U\xfdL\xb1\x9c\xd8\xb2{\xa1/\xfcr\x8c\xa7\xd3\xa9%\xde\x13\xa8\xf6\xc6<\xc7\xdb\xe3\xa62\xeb\xe9?\xe5by\xc2\x9e\xad\xec\x92:\x14\xd96\xa8\xc0+\xea8\'{=\x91$\xdf\xed\xe1+eF8\x9fI\x1f\xa1\xcb4s\xd1#\xdf\xa11\x88o\x050i Hg\x0690\xe6\xe8?\\<:k\x94\x82\x91\x0f\x06\xc7>ZQ\xc2\xcdn\xdb\xf4\x9d\x7f!\xa9>\xe8\xea\xb3\xd83]\x8d\x90\xd4\xa0b\xe6\xe6$d[\xe4\xb4 |W\xb2t\x8c\xb2\xd5>>+\xf1\xa6W\'\xaf\xc2CU\x82\x13\xc4\x0b\xc4vD*\xc3\xef\xa6s\nQ\xe6\rS@B\xd2\xa4V\xdc\xd1D\x7f\x00\xaa\xac\xac\x96i\xf1kg*\xe9*\x90a@\xc8uDy\x16\xe2\x03\xd1\x9fa\xe2s\xdb\xees\xa4\x8cna\xba\xdaE\x006&\xa4" >>> x_pub = PubKey((x._pubExp, x._modulus, x._modulusLen)) >>> x_pub._legacy_verify_md5_sha1(m, s) True ###### ## Cert class tests ###### ###(026)=[passed] Cert class : Importing PEM-encoded X.509 Certificate >>> x = Cert(""" ... -----BEGIN CERTIFICATE----- ... MIIFEjCCA/qgAwIBAgIJALRecEPnCQtxMA0GCSqGSIb3DQEBBQUAMIG2MQswCQYD ... VQQGEwJGUjEOMAwGA1UECBMFUGFyaXMxDjAMBgNVBAcTBVBhcmlzMRcwFQYDVQQK ... Ew5NdXNocm9vbSBDb3JwLjEeMBwGA1UECxMVTXVzaHJvb20gVlBOIFNlcnZpY2Vz ... MSUwIwYDVQQDExxJS0V2MiBYLjUwOSBUZXN0IGNlcnRpZmljYXRlMScwJQYJKoZI ... hvcNAQkBFhhpa2V2Mi10ZXN0QG11c2hyb29tLmNvcnAwHhcNMDYwNzEzMDczODU5 ... WhcNMjYwMzMwMDczODU5WjCBtjELMAkGA1UEBhMCRlIxDjAMBgNVBAgTBVBhcmlz ... MQ4wDAYDVQQHEwVQYXJpczEXMBUGA1UEChMOTXVzaHJvb20gQ29ycC4xHjAcBgNV ... BAsTFU11c2hyb29tIFZQTiBTZXJ2aWNlczElMCMGA1UEAxMcSUtFdjIgWC41MDkg ... VGVzdCBjZXJ0aWZpY2F0ZTEnMCUGCSqGSIb3DQEJARYYaWtldjItdGVzdEBtdXNo ... cm9vbS5jb3JwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmFdqP+nT ... EZukS0lLP+yj1gNImsEIf7P2ySTunceYxwkm4VE5QReDbb2L5/HLA9pPmIeQLSq/ ... BgO1meOcbOSJ2YVHQ28MQ56+8Crb6n28iycX4hp0H3AxRAjh0edX+q3yilvYJ4W9 ... /NnIb/wAZwS0oJif/tTkVF77HybAfJde5Eqbp+bCKIvMWnambh9DRUyjrBBZo5dA ... 1o32zpuFBrJdI8dmUpw9gtf0F0Ba8lGZm8Uqc0GyXeXOJUE2u7CiMu3M77BM6ZLL ... Tcow5+bQImkmTL1SGhzwfinME1e6p3Hm//pDjuJvFaY22k05LgLuyqc59vFiB3To ... ldz8+AbMNjvzAwIDAQABo4IBHzCCARswHQYDVR0OBBYEFPPYTt6Q9+Zd0s4zzVxW ... jG+XFDFLMIHrBgNVHSMEgeMwgeCAFPPYTt6Q9+Zd0s4zzVxWjG+XFDFLoYG8pIG5 ... MIG2MQswCQYDVQQGEwJGUjEOMAwGA1UECBMFUGFyaXMxDjAMBgNVBAcTBVBhcmlz ... MRcwFQYDVQQKEw5NdXNocm9vbSBDb3JwLjEeMBwGA1UECxMVTXVzaHJvb20gVlBO ... IFNlcnZpY2VzMSUwIwYDVQQDExxJS0V2MiBYLjUwOSBUZXN0IGNlcnRpZmljYXRl ... MScwJQYJKoZIhvcNAQkBFhhpa2V2Mi10ZXN0QG11c2hyb29tLmNvcnCCCQC0XnBD ... 5wkLcTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQA2zt0BvXofiVvH ... MWlftZCstQaawej1SmxrAfDB4NUM24NsG+UZI88XA5XM6QolmfyKnNromMLC1+6C ... aFxjq3jC/qdS7ifalFLQVo7ik/te0z6Olo0RkBNgyagWPX2LR5kHe9RvSDuoPIsb ... SHMmJA98AZwatbvEhmzMINJNUoHVzhPeHZnIaBgUBg02XULk/ElidO51Rf3gh8dR ... /kgFQSQT687vs1x9TWD00z0Q2bs2UF3Ob3+NYkEGEo5F9RePQm0mY94CT2xs6WpH ... o060Fo7fVpAFktMWx1vpu+wsEbQAhgGqV0fCR2QwKDIbTrPW/p9HJtJDYVjYdAFx ... r3s7V77y ... -----END CERTIFICATE----- ... """) ###(027)=[passed] Cert class : Checking version >>> x.version == 3 True ###(028)=[passed] Cert class : Checking certificate serial number extraction >>> x.serial == 0xB45E7043E7090B71 True ###(029)=[passed] Cert class : Checking signature algorithm >>> x.sigAlg == 'sha1-with-rsa-signature' True ###(030)=[passed] Cert class : Checking issuer extraction in basic format (/C=FR ...) >>> x.issuer_str == '/C=FR/ST=Paris/L=Paris/O=Mushroom Corp./OU=Mushroom VPN Services/CN=IKEv2 X.509 Test certificate/emailAddress=ikev2-test@mushroom.corp' True ###(031)=[passed] Cert class : Checking subject extraction in basic format (/C=FR ...) >>> x.subject_str == '/C=FR/ST=Paris/L=Paris/O=Mushroom Corp./OU=Mushroom VPN Services/CN=IKEv2 X.509 Test certificate/emailAddress=ikev2-test@mushroom.corp' True ###(032)=[passed] Cert class : Checking start date extraction in simple and tuple formats >>> assert x.notBefore_str_simple == '07/13/06' >>> x.notBefore == (2006, 7, 13, 7, 38, 59, 3, 194, -1) True ###(033)=[passed] Cert class : Checking end date extraction in simple and tuple formats >>> assert x.notAfter_str_simple == '03/30/26' >>> x.notAfter == (2026, 3, 30, 7, 38, 59, 0, 89, -1) True ###(034)=[passed] Cert class : test remainingDays >>> assert abs(x.remainingDays("02/12/11")) > 5000 >>> assert abs(x.remainingDays("Feb 12 10:00:00 2011 Paris, Madrid")) > 1 Bad time string provided, will use localtime() instead. ###(035)=[passed] Cert class : Checking RSA public key >>> assert type(x.pubKey) is PubKeyRSA >>> x_pubNum = x.pubKey.pubkey.public_numbers() >>> assert x_pubNum.n == 19231328316532061413420367242571475005688288081144416166988378525696075445024135424022026378563116068168327239354659928492979285632474448448624869172454076124150405352043642781483254546569202103296262513098482624188672299255268092629150366527784294463900039290024710152521604731213565912934889752122898104556895316819303096201441834849255370122572613047779766933573375974464479123135292080801384304131606933504677232323037116557327478512106367095125103346134248056463878553619525193565824925835325216545121044922690971718737998420984924512388011040969150550056783451476150234324593710633552558175109683813482739004163 >>> x_pubNum.e == 0x10001 True ###(036)=[passed] Cert class : Checking extensions >>> x.show() Serial: 12996949011579079537 Issuer: /C=FR/ST=Paris/L=Paris/O=Mushroom Corp./OU=Mushroom VPN Services/CN=IKEv2 X.509 Test certificate/emailAddress=ikev2-test@mushroom.corp Subject: /C=FR/ST=Paris/L=Paris/O=Mushroom Corp./OU=Mushroom VPN Services/CN=IKEv2 X.509 Test certificate/emailAddress=ikev2-test@mushroom.corp Validity: 2006-07-13 07:38:59 UTC to 2026-03-30 07:38:59 UTC >>> x.tbsCertificate.show() ###[ X509_TBSCertificate ]### version = 'v3' 0x2 serialNumber= 0xb45e7043e7090b71 \signature \ |###[ X509_AlgorithmIdentifier ]### | algorithm = | parameters= \issuer \ |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = \validity \ |###[ X509_Validity ]### | not_before= 2006-07-13 07:38:59 UTC | not_after = 2026-03-30 07:38:59 UTC \subject \ |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = |###[ X509_RDN ]### | \rdn \ | |###[ X509_AttributeTypeAndValue ]### | | type = | | value = \subjectPublicKeyInfo\ |###[ X509_SubjectPublicKeyInfo ]### | \signatureAlgorithm\ | |###[ X509_AlgorithmIdentifier ]### | | algorithm = | | parameters= | \subjectPublicKey\ | |###[ RSAPublicKey ]### | | modulus = 0x98576a3fe9...cc363bf303 | | publicExponent= 0x10001 issuerUniqueID= None subjectUniqueID= None \extensions\ |###[ X509_Extension ]### | extnID = | critical = None | \extnValue \ | |###[ X509_ExtSubjectKeyIdentifier ]### | | keyIdentifier= |###[ X509_Extension ]### | extnID = | critical = None | \extnValue \ | |###[ X509_ExtAuthorityKeyIdentifier ]### | | keyIdentifier= | | \authorityCertIssuer\ | | |###[ X509_GeneralName ]### | | | \generalName\ | | | |###[ X509_DirectoryName ]### | | | | \directoryName\ | | | | |###[ X509_RDN ]### | | | | | \rdn \ | | | | | |###[ X509_AttributeTypeAndValue ]### | | | | | | type = | | | | | | value = | | | | |###[ X509_RDN ]### | | | | | \rdn \ | | | | | |###[ X509_AttributeTypeAndValue ]### | | | | | | type = | | | | | | value = | | | | |###[ X509_RDN ]### | | | | | \rdn \ | | | | | |###[ X509_AttributeTypeAndValue ]### | | | | | | type = | | | | | | value = | | | | |###[ X509_RDN ]### | | | | | \rdn \ | | | | | |###[ X509_AttributeTypeAndValue ]### | | | | | | type = | | | | | | value = | | | | |###[ X509_RDN ]### | | | | | \rdn \ | | | | | |###[ X509_AttributeTypeAndValue ]### | | | | | | type = | | | | | | value = | | | | |###[ X509_RDN ]### | | | | | \rdn \ | | | | | |###[ X509_AttributeTypeAndValue ]### | | | | | | type = | | | | | | value = | | | | |###[ X509_RDN ]### | | | | | \rdn \ | | | | | |###[ X509_AttributeTypeAndValue ]### | | | | | | type = | | | | | | value = | | authorityCertSerialNumber= 0xb45e7043e7090b71 |###[ X509_Extension ]### | extnID = | critical = None | \extnValue \ | |###[ X509_ExtBasicConstraints ]### | | cA = True | | pathLenConstraint= None >>> assert x.cA >>> assert x.authorityKeyID == b'\xf3\xd8N\xde\x90\xf7\xe6]\xd2\xce3\xcd\\V\x8co\x97\x141K' >>> not hasattr(x, "keyUsage") True ###(037)=[passed] Cert class : encrypt >>> assert len(x.encrypt(b"Scapy")) == 256 ###(038)=[passed] Cert class : export >>> import tempfile, os >>> filename = tempfile.mktemp() >>> x.export(filename) >>> fstat = os.stat(filename) >>> assert fstat.st_size == 1302 >>> os.remove(filename) ###(039)=[passed] Cert class : isIssuerCert >>> assert x.isIssuerCert(x) ###(040)=[passed] Cert class : Importing another PEM-encoded X.509 Certificate >>> y = Cert(""" ... -----BEGIN CERTIFICATE----- ... MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw ... CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu ... ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg ... RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV ... UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu ... Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq ... hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf ... Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q ... RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ ... BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD ... AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY ... JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv ... 6pZjamVFkpUBtA== ... -----END CERTIFICATE----- ... """) ###(041)=[passed] Cert class : Checking ECDSA public key >>> assert type(y.pubKey) is PubKeyECDSA >>> pubkey = y.pubKey.pubkey >>> assert pubkey.curve.name == 'secp384r1' >>> pubkey.public_numbers().x == 3987178688175281746349180015490646948656137448666005327832107126183726641822596270780616285891030558662603987311874 True ###(042)=[passed] Cert class : Checking ECDSA signature >>> raw(y.signatureValue) == b'0d\x020%\xa4\x81E\x02k\x12KutO\xc8#\xe3p\xf2ur\xde|\x89\xf0\xcf\x91ra\x9e^\x10\x92YV\xb9\x83\xc7\x10\xe78\xe9X&6}\xd5\xe44\x869\x020|6S\xf00\xe5bc:\x99\xe2\xb6\xa3;\x9b4\xfa\x1e\xda\x10\x92q^\x91\x13\xa7\xdd\xa4n\x92\xcc2\xd6\xf5!f\xc7/\xea\x96cjeE\x92\x95\x01\xb4' True ###(043)=[passed] Cert class : Test show >>> awaited = """ ... Serial: 15459312981008553731928384953135426796 ... Issuer: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root G3 ... Subject: /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root G3 ... Validity: 2013-08-01 12:00:00 UTC to 2038-01-15 12:00:00 UTC ... """ >>> >>> with ContextManagerCaptureOutput() as cmco: ... y.show() ... assert cmco.get_output().strip() == awaited.strip() ... ###(044)=[passed] Cert: Check split_pem on chained certs with missing end \n >>> from scapy.layers.tls.cert import split_pem >>> ks = split_pem(b""" ... -----BEGIN EC PRIVATE KEY----- ... MHQCAQEEIMiRlFoy6046m1NXu911ukXyjDLVgmOXWCKWdQMd8gCRoAcGBSuBBAAK ... oUQDQgAE55WjbZjS/88K1kYagsO9wtKifw0IKLp4Jd5qtmDF2Zu+xrwrBRT0HBnP ... weDU+RsFxcyU/QxD9WYORzYarqxbcA== ... -----END EC PRIVATE KEY----- ... -----BEGIN EC PRIVATE KEY----- ... MHQCAQEEIMiRlFoy6046m1NXu911ukXyjDLVgmOXWCKWdQMd8gCRoAcGBSuBBAAK ... oUQDQgAE55WjbZjS/88K1kYagsO9wtKifw0IKLp4Jd5qtmDF2Zu+xrwrBRT0HBnP ... weDU+RsFxcyU/QxD9WYORzYarqxbcA== ... -----END EC PRIVATE KEY-----""") >>> assert ks[0][:-1] == ks[1] ###(045)=[passed] Import PEM-encoded certificate with ed25519 signature >>> x = Cert(""" ... -----BEGIN CERTIFICATE----- ... MIICqDCCAZCgAwIBAgIUYYDvh160/Q32Q/MuCGSfIYxTwwEwDQYJKoZIhvcNAQEL ... BQAwVDELMAkGA1UEBhMCTU4xFDASBgNVBAcMC1VsYWFuYmFhdGFyMRcwFQYDVQQL ... DA5TY2FweSBUZXN0IFBLSTEWMBQGA1UEAwwNU2NhcHkgVGVzdCBDQTAeFw0yNDA3 ... MTQxOTU4MzNaFw0zNDA3MTUxOTU4MzNaMFgxCzAJBgNVBAYTAk1OMRQwEgYDVQQH ... DAtVbGFhbmJhYXRhcjEXMBUGA1UECwwOU2NhcHkgVGVzdCBQS0kxGjAYBgNVBAMM ... EVNjYXB5IFRlc3QgU2VydmVyMCowBQYDK2VwAyEAB8exZcGWUFeio0aPES732u5l ... GXRUuaktLmSIQB8PoPejaDBmMA8GA1UdEwEB/wQFMAMCAQEwEwYDVR0lBAwwCgYI ... KwYBBQUHAwEwHQYDVR0OBBYEFJOzQR0udLrz7IiLP3q+FehLxijkMB8GA1UdIwQY ... MBaAFGZTlPQV0b1naLBRNzI14aSq3gd8MA0GCSqGSIb3DQEBCwUAA4IBAQCRk6TP ... XKfSy2fwodsYe1bedhL9mlm9xDDOu6ILkDZtCpbOwrjeSf+U7VQYvdlI8QCeQyEK ... ZE/S3S5UzOjEv7fQpyqfG9aJJbH7OQwG25ShiX86Kt/RAkgtjyCmKevhT6uSs5fa ... BsdYWnS9WHWH5ZkWkjZt1K2xYJP4Lqg9VpHy/YNz4b5swXEWf+MdayVSgzPxoviG ... zXnsTrxiTcGvelGFm/lYc42u6cSqrHoLtfniyaGNvPwrfBsiY/cypN4GZLNgEk80 ... /tcAg2TeUGNbMbT4Rko1OMLxMT9zRzgJyjd/XyW/5fCE/Xm0q7VYo1EF1ScywU1B ... XwZH9DJ6Ud0s8/j+ ... -----END CERTIFICATE----- ... """) ###### ## CRL class tests ###### ###(046)=[passed] CRL class : Importing PEM-encoded CRL >>> x = CRL(""" ... -----BEGIN X509 CRL----- ... MIICHjCCAYcwDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoT ... DlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmltYXJ5 ... IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Fw0wNjExMDIwMDAwMDBaFw0wNzAyMTcy ... MzU5NTlaMIH2MCECECzSS2LEl6QXzW6jyJx6LcgXDTA0MDQwMTE3NTYxNVowIQIQ ... OkXeVssCzdzcTndjIhvU1RcNMDEwNTA4MTkyMjM0WjAhAhBBXYg2gRUg1YCDRqhZ ... kngsFw0wMTA3MDYxNjU3MjNaMCECEEc5gf/9hIHxlfnrGMJ8DfEXDTAzMDEwOTE4 ... MDYxMlowIQIQcFR+auK62HZ/R6mZEEFeZxcNMDIwOTIzMTcwMDA4WjAhAhB+C13e ... GPI5ZoKmj2UiOCPIFw0wMTA1MDgxOTA4MjFaMCICEQDQVEhgGGfTrTXKLw1KJ5Ve ... Fw0wMTEyMTExODI2MjFaMA0GCSqGSIb3DQEBBQUAA4GBACLJ9rsdoaU9JMf/sCIR ... s3AGW8VV3TN2oJgiCGNEac9PRyV3mRKE0hmuIJTKLFSaa4HSAzimWpWNKuJhztsZ ... zXUnWSZ8VuHkgHEaSbKqzUlb2g+o/848CvzJrcbeyEBkDCYJI5C3nLlQA49LGJ+w ... 4GUPYBwaZ+WFxCX1C8kzglLm ... -----END X509 CRL----- ... """) ###(047)=[passed] CRL class : Checking version >>> x.version == 1 True ###(048)=[passed] CRL class : Checking issuer extraction in basic format (/C=FR ...) >>> x.issuer_str == '/C=US/O=VeriSign, Inc./OU=Class 1 Public Primary Certification Authority' True ###(049)=[passed] CRL class : Checking lastUpdate date extraction in tuple format >>> x.lastUpdate == (2006, 11, 2, 0, 0, 0, 3, 306, -1) True ###(050)=[passed] CRL class : Checking nextUpdate date extraction in tuple format >>> x.nextUpdate == (2007, 2, 17, 23, 59, 59, 5, 48, -1) True ###(051)=[passed] CRL class : Checking number of revoked certificates >>> len(x.revoked_cert_serials) == 7 True ###(052)=[passed] CRL class : Checking presence of one revoked certificate >>> (94673785334145723688625287778885438961, '030109180612') in x.revoked_cert_serials True ###(053)=[passed] Cert/CRL class : Checking isRevoked >>> cx = X509_Cert() >>> cx.tbsCertificate.serialNumber.val = 59577943160751197113872490992424857032 >>> cx.tbsCertificate.issuer = x.x509CRL.tbsCertList.issuer >>> cx = Cert(raw(cx)) >>> assert cx.isRevoked([x]) ###(054)=[passed] CRL class : Test show >>> awaited = """ ... Version: 1 ... sigAlg: sha1-with-rsa-signature ... Issuer: /C=US/O=VeriSign, Inc./OU=Class 1 Public Primary Certification Authority ... lastUpdate: 2006-11-02 00:00:00 UTC ... nextUpdate: 2007-02-17 23:59:59 UTC ... """ >>> >>> with ContextManagerCaptureOutput() as cmco: ... x.show() ... assert cmco.get_output().strip() == awaited.strip() ... ###(055)=[passed] Cert class : Checking isIssuerCert() >>> c0 = Cert(""" ... -----BEGIN CERTIFICATE----- ... MIIFVjCCBD6gAwIBAgIJAJmDv7HOC+iUMA0GCSqGSIb3DQEBCwUAMIHGMQswCQYD ... VQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEl ... MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEzMDEGA1UECxMq ... aHR0cDovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMTQwMgYD ... VQQDEytTdGFyZmllbGQgU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcy ... MB4XDTE1MTAxMzE2NDIzOFoXDTE2MTEzMDIzMzQxOVowPjEhMB8GA1UECxMYRG9t ... YWluIENvbnRyb2wgVmFsaWRhdGVkMRkwFwYDVQQDDBAqLnRvb2xzLmlldGYub3Jn ... MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAseE36OuC1on62/XCS3fw ... LErecm4+E2DRqGYexK09MmDl8Jm19Hp6SFUh7g45EvnODcr1aWHHBO1uDx07HlCI ... eToOMUEW8bECZGilzfVKCsqZljUIw34nXdCpz/PnKK832LZ73fN+rm6Xf/fKaU7M ... 0AbfXSebOxLn5v4Ia1J7ghF8crNG68HoeLgPy+HrvQZEWNyDULKgYlvcgbg24558 ... ebKpU4rgC8lKKhM5MRO9LM+ocM+MjT0Bo4iuEgA2HR4kK9152FMBJu0oT8mGlINO ... yOEULoWzr9Ru3WlGr0ElDnqti/KSynnZezJP93fo+bRPI1zUXAOu2Ks6yhNfXV1d ... oQIDAQABo4IBzDCCAcgwDAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcD ... AQYIKwYBBQUHAwIwDgYDVR0PAQH/BAQDAgWgMDwGA1UdHwQ1MDMwMaAvoC2GK2h0 ... dHA6Ly9jcmwuc3RhcmZpZWxkdGVjaC5jb20vc2ZpZzJzMS0xNy5jcmwwWQYDVR0g ... BFIwUDBOBgtghkgBhv1uAQcXATA/MD0GCCsGAQUFBwIBFjFodHRwOi8vY2VydGlm ... aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMIGCBggrBgEFBQcB ... AQR2MHQwKgYIKwYBBQUHMAGGHmh0dHA6Ly9vY3NwLnN0YXJmaWVsZHRlY2guY29t ... LzBGBggrBgEFBQcwAoY6aHR0cDovL2NlcnRpZmljYXRlcy5zdGFyZmllbGR0ZWNo ... LmNvbS9yZXBvc2l0b3J5L3NmaWcyLmNydDAfBgNVHSMEGDAWgBQlRYFoUCY4PTst ... LL7Natm2PbNmYzArBgNVHREEJDAighAqLnRvb2xzLmlldGYub3Jngg50b29scy5p ... ZXRmLm9yZzAdBgNVHQ4EFgQUrYq0HAdR15KJB7C3hGIvNlV6X00wDQYJKoZIhvcN ... AQELBQADggEBAAxfzShHiatHrWnTGuRX9BmFpHOFGmLs3PtRRPoOUEbZrcTbaJ+i ... EZpjj4R3eiLITgObcib8+NR1eZsN6VkswZ+rr54aeQ1WzWlsVwBP1t0h9lIbaonD ... wDV6ME3KzfFwwsZWqMBgLin8TcoMadAkXhdfcEKNndKSMsowgEjigP677l24nHf/ ... OcnMftgErmTm+jEdW1wUooJoWgbt8TT2uWD8MC62sIIgSQ6miKtg7LhCC1ScyVuN ... Erk3YzF8mPwouOcnNOKsUnkDXLA2REMedVp48c4ikjLClu6AcIg03ZU+o8fLNqcZ ... zd1s7DbacrRSSQ+nXDTodqw1HB+77u0RFs0= ... -----END CERTIFICATE----- ... """) >>> c1 = Cert(""" ... -----BEGIN CERTIFICATE----- ... MIIFADCCA+igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx ... EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT ... HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs ... ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAw ... MFoXDTMxMDUwMzA3MDAwMFowgcYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 ... b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj ... aG5vbG9naWVzLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydHMuc3RhcmZpZWxk ... dGVjaC5jb20vcmVwb3NpdG9yeS8xNDAyBgNVBAMTK1N0YXJmaWVsZCBTZWN1cmUg ... Q2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB ... DwAwggEKAoIBAQDlkGZL7PlGcakgg77pbL9KyUhpgXVObST2yxcT+LBxWYR6ayuF ... pDS1FuXLzOlBcCykLtb6Mn3hqN6UEKwxwcDYav9ZJ6t21vwLdGu4p64/xFT0tDFE ... 3ZNWjKRMXpuJyySDm+JXfbfYEh/JhW300YDxUJuHrtQLEAX7J7oobRfpDtZNuTlV ... Bv8KJAV+L8YdcmzUiymMV33a2etmGtNPp99/UsQwxaXJDgLFU793OGgGJMNmyDd+ ... MB5FcSM1/5DYKp2N57CSTTx/KgqT3M0WRmX3YISLdkuRJ3MUkuDq7o8W6o0OPnYX ... v32JgIBEQ+ct4EMJddo26K3biTr1XRKOIwSDAgMBAAGjggEsMIIBKDAPBgNVHRMB ... Af8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUJUWBaFAmOD07LSy+ ... zWrZtj2zZmMwHwYDVR0jBBgwFoAUfAwyH6fZMH/EfWijYqihzqsHWycwOgYIKwYB ... BQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNo ... LmNvbS8wOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5zdGFyZmllbGR0ZWNo ... LmNvbS9zZnJvb3QtZzIuY3JsMEwGA1UdIARFMEMwQQYEVR0gADA5MDcGCCsGAQUF ... BwIBFitodHRwczovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkv ... MA0GCSqGSIb3DQEBCwUAA4IBAQBWZcr+8z8KqJOLGMfeQ2kTNCC+Tl94qGuc22pN ... QdvBE+zcMQAiXvcAngzgNGU0+bE6TkjIEoGIXFs+CFN69xpk37hQYcxTUUApS8L0 ... rjpf5MqtJsxOYUPl/VemN3DOQyuwlMOS6eFfqhBJt2nk4NAfZKQrzR9voPiEJBjO ... eT2pkb9UGBOJmVQRDVXFJgt5T1ocbvlj2xSApAer+rKluYjdkf5lO6Sjeb6JTeHQ ... sPTIFwwKlhR8Cbds4cLYVdQYoKpBaXAko7nv6VrcPuuUSvC33l8Odvr7+2kDRUBQ ... 7nIMpBKGgc0T0U7EPMpODdIm8QC3tKai4W56gf0wrHofx1l7 ... -----END CERTIFICATE----- ... """) >>> c2 = Cert(""" ... -----BEGIN CERTIFICATE----- ... MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx ... EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT ... HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs ... ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw ... MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 ... b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj ... aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp ... Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ... ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg ... nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 ... HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N ... Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN ... dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 ... HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO ... BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G ... CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU ... sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 ... 4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg ... 8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K ... pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 ... mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ... -----END CERTIFICATE----- ... """) >>> c0.isIssuerCert(c1) and c1.isIssuerCert(c2) and not c0.isIssuerCert(c2) True ###(056)=[passed] Cert class : Checking isSelfSigned() >>> c2.isSelfSigned() and not c1.isSelfSigned() and not c0.isSelfSigned() True ###(057)=[passed] PubKey class : Checking verifyCert() >>> c2.pubKey.verifyCert(c2) and c1.pubKey.verifyCert(c0) True ###(058)=[passed] Chain class : Checking chain construction >>> assert len(Chain([c0, c1, c2])) == 3 >>> assert len(Chain([c0], c1)) == 2 >>> len(Chain([c0], c2)) == 1 True ###(059)=[passed] Chain class : repr >>> expected_repr = """__ /C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Root Certificate Authority - G2 [Self Signed] ... _ /C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./OU=http://certs.starfieldtech.com/repository//CN=Starfield Secure Certificate Authority - G2 ... _ /OU=Domain Control Validated/CN=*.tools.ietf.org""" >>> assert str(Chain([c0, c1, c2])) == expected_repr ###(060)=[passed] Chain class : Checking chain verification >>> assert Chain([], c0).verifyChain([c2], [c1]) >>> not Chain([c1]).verifyChain([c0]) True ###(061)=[passed] Chain class: Checking chain verification with file >>> import tempfile >>> >>> tf_folder = tempfile.mkdtemp() >>> >>> try: ... os.makedirs(tf_folder) ... except: ... pass ... >>> tf = os.path.join(tf_folder, "trusted") >>> utf = os.path.join(tf_folder, "untrusted") >>> >>> tf '/tmp/tmptt5rn9nl/trusted' >>> utf '/tmp/tmptt5rn9nl/untrusted' >>> >>> trusted = open(tf, "w") >>> trusted.write(""" ... -----BEGIN CERTIFICATE----- ... MIIFADCCA+igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx ... EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT ... HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs ... ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAw ... MFoXDTMxMDUwMzA3MDAwMFowgcYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 ... b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj ... aG5vbG9naWVzLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydHMuc3RhcmZpZWxk ... dGVjaC5jb20vcmVwb3NpdG9yeS8xNDAyBgNVBAMTK1N0YXJmaWVsZCBTZWN1cmUg ... Q2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB ... DwAwggEKAoIBAQDlkGZL7PlGcakgg77pbL9KyUhpgXVObST2yxcT+LBxWYR6ayuF ... pDS1FuXLzOlBcCykLtb6Mn3hqN6UEKwxwcDYav9ZJ6t21vwLdGu4p64/xFT0tDFE ... 3ZNWjKRMXpuJyySDm+JXfbfYEh/JhW300YDxUJuHrtQLEAX7J7oobRfpDtZNuTlV ... Bv8KJAV+L8YdcmzUiymMV33a2etmGtNPp99/UsQwxaXJDgLFU793OGgGJMNmyDd+ ... MB5FcSM1/5DYKp2N57CSTTx/KgqT3M0WRmX3YISLdkuRJ3MUkuDq7o8W6o0OPnYX ... v32JgIBEQ+ct4EMJddo26K3biTr1XRKOIwSDAgMBAAGjggEsMIIBKDAPBgNVHRMB ... Af8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUJUWBaFAmOD07LSy+ ... zWrZtj2zZmMwHwYDVR0jBBgwFoAUfAwyH6fZMH/EfWijYqihzqsHWycwOgYIKwYB ... BQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNo ... LmNvbS8wOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5zdGFyZmllbGR0ZWNo ... LmNvbS9zZnJvb3QtZzIuY3JsMEwGA1UdIARFMEMwQQYEVR0gADA5MDcGCCsGAQUF ... BwIBFitodHRwczovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkv ... MA0GCSqGSIb3DQEBCwUAA4IBAQBWZcr+8z8KqJOLGMfeQ2kTNCC+Tl94qGuc22pN ... QdvBE+zcMQAiXvcAngzgNGU0+bE6TkjIEoGIXFs+CFN69xpk37hQYcxTUUApS8L0 ... rjpf5MqtJsxOYUPl/VemN3DOQyuwlMOS6eFfqhBJt2nk4NAfZKQrzR9voPiEJBjO ... eT2pkb9UGBOJmVQRDVXFJgt5T1ocbvlj2xSApAer+rKluYjdkf5lO6Sjeb6JTeHQ ... sPTIFwwKlhR8Cbds4cLYVdQYoKpBaXAko7nv6VrcPuuUSvC33l8Odvr7+2kDRUBQ ... 7nIMpBKGgc0T0U7EPMpODdIm8QC3tKai4W56gf0wrHofx1l7 ... -----END CERTIFICATE----- ... """) 1794 >>> trusted.close() >>> >>> untrusted = open(utf, "w") >>> untrusted.write(""" ... -----BEGIN CERTIFICATE----- ... MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx ... EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT ... HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs ... ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw ... MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 ... b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj ... aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp ... Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ... ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg ... nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 ... HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N ... Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN ... dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 ... HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO ... BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G ... CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU ... sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 ... 4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg ... 8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K ... pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 ... mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ... -----END CERTIFICATE----- ... """) 1400 >>> untrusted.close() >>> >>> assert Chain([], c0).verifyChainFromCAFile(tf, untrusted_file=utf) >>> assert Chain([], c0).verifyChainFromCAPath(tf_folder, untrusted_file=utf) ###(062)=[passed] Clear files >>> try: ... os.remove("./certs_test_ca/trusted") ... os.remove("./certs_test_ca/untrusted") ... except: ... pass ... >>> try: ... os.rmdir("././certs_test_ca") ... except: ... pass ... ###(063)=[passed] Test __repr__ >>> repr_str = Chain([], c0).__repr__() >>> assert repr_str == '__ /OU=Domain Control Validated/CN=*.tools.ietf.org [Not Self Signed]\n' ###(064)=[passed] Test GeneralizedTime >>> data = b"MHAwXAIBADANBgkqhkiG9w0BAQ0FADAAMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMAAwHDANBgkqhkiG9w0BAQEFAAMLADAIAgEAAgMBAAGjAjAAMA0GCSqGSIb3DQEBDQUAAwEA" >>> import tempfile, os >>> _, filename = tempfile.mkstemp() >>> fd = open(filename, "wb") >>> fd.write(b"-----BEGIN CERTIFICATE-----\n") 28 >>> fd.write(data) 152 >>> fd.write(b"-----END CERTIFICATE-----\n") 26 >>> fd.close() >>> cert = Cert(filename) >>> assert "2011" in cert.notBefore_str and "2046" in cert.notAfter_str Tests for TLS module ━ Run at 01:42:30 from [test/scapy/layers/tls/sslv2.uts] by UTscapy in 0.23191523551940918 └ Passed=28 └ Failed=0 ###### ## Read a vulnerable SSLv2 session ###### ###(000)=[passed] Reading SSLv2 session - Loading unparsed SSLv2 records >>> ch = b'\x80.\x01\x00\x02\x00\x15\x00\x00\x00\x10\x07\x00\xc0\x05\x00\x80\x03\x00\x80\x01\x00\x80\x06\x00@\x04\x00\x80\x02\x00\x80\x1a\xfb/\x9c\xa3\xd1)4T\xa3\x15(!\xff\xd1\x0c' >>> sh = b'\x83\xc0\x04\x00\x01\x00\x02\x03\xa2\x00\x03\x00\x100\x82\x03\x9e0\x82\x02\x86\xa0\x03\x02\x01\x02\x02\t\x00\xfe\x04W\r\xc7\'\xe9\xf60\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000T1\x0b0\t\x06\x03U\x04\x06\x13\x02MN1\x140\x12\x06\x03U\x04\x07\x0c\x0bUlaanbaatar1\x170\x15\x06\x03U\x04\x0b\x0c\x0eScapy Test PKI1\x160\x14\x06\x03U\x04\x03\x0c\rScapy Test CA0\x1e\x17\r160916102811Z\x17\r260915102811Z0X1\x0b0\t\x06\x03U\x04\x06\x13\x02MN1\x140\x12\x06\x03U\x04\x07\x0c\x0bUlaanbaatar1\x170\x15\x06\x03U\x04\x0b\x0c\x0eScapy Test PKI1\x1a0\x18\x06\x03U\x04\x03\x0c\x11Scapy Test Server0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xcc\xf1\xf1\x9b`-`\xae\xf2\x98\r\')\xd9\xc0\tYL\x0fJ0\xa8R\xdf\xe5\xb1!\x9fO\xc3=V\x93\xdd_\xc6\xf7\xb3\xf6U\x8b\xe7\x92\xe2\xde\xf2\x85I\xb4\xa1,\xf4\xfdv\xa8g\xca\x04 `\x11\x18\xa6\xf2\xa9\xb6\xa6\x1d\xd9\xaa\xe5\xd9\xdb\xaf\xe6\xafUW\x9f\xffR\x89e\xe6\x80b\x80!\x94\xbc\xcf\x81\x1b\xcbg\xc2\x9d\xb5\x05w\x04\xa6\xc7\x88\x18\x80xh\x956\xde\x97\x1b\xb6a\x87B\x1au\x98E\x82\xeb>2\x11\xc8\x9b\x86B9\x8dM\x12\xb7X\x1b\x19\xf3\x9d+\xa1\x98\x82\xca\xd7;$\xfb\t9\xb0\xbc\xc2\x95\xcf\x82)u\x16)?B \x17+M@\x8cVl\xad\xba\x0f4\x85\xb1\x7f@yqx\xb7\xa5\x04\xbb\x94\xf7\xb5A\x95\xee|\xeb\x8d\x0cyhY\xef\xcb\xb3\xfa>x\x1e\xeegLz\xdd\xe0\x99\xef\xda\xe7\xef\xb2\t]\xbe\x80 !\x05\x83,D\xdb]*v)\xa5\xb0#\x88t\x07T"\xd6)z\x92\xf5o-\x9e\xe7\xf8&+\x9cXe\x02\x03\x01\x00\x01\xa3o0m0\t\x06\x03U\x1d\x13\x04\x020\x000\x0b\x06\x03U\x1d\x0f\x04\x04\x03\x02\x05\xe00\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\xa1+ p\xd2k\x80\xe5e\xbc\xeb\x03\x0f\x88\x9ft\xad\xdd\xf6\x130\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14fS\x94\xf4\x15\xd1\xbdgh\xb0Q725\xe1\xa4\xaa\xde\x07|0\x13\x06\x03U\x1d%\x04\x0c0\n\x06\x08+\x06\x01\x05\x05\x07\x03\x010\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x00\x03\x82\x01\x01\x00\x81\x88\x92sk\x93\xe7\x95\xd6\xddA\xee\x8e\x1e\xbd\xa3HX\xa7A5?{}\xd07\x98\x0e\xb8,\x94w\xc8Q6@\xadY\t(\xc8V\xd6\xea[\xac\xb4\xd8?h\xb7f\xca\xe1V7\xa9\x00e\xeaQ\xc9\xec\xb2iI]\xf9\xe3\xc0\xedaT\xc9\x12\x9f\xc6\xb0\nsU\xe8U5`\xef\x1c6\xf0\xda\xd1\x90wV\x04\xb8\xab8\xee\xf7\t\xc5\xa5\x98\x90#\xea\x1f\xdb\x15\x7f2(\x81\xab\x9b\x85\x02K\x95\xe77Q{\x1bH.\xfb>R\xa3\r\xb4F\xa9\x92:\x1c\x1f\xd7\n\x1eXJ\xfa.Q\x8f)\xc6\x1e\xb8\x0e1\x0es\xf1\'\x88\x17\xca\xc8i\x0c\xfa\x83\xcd\xb3y\x0e\x14\xb0\xb8\x9b/:-\t\xe3\xfc\x06\xf0:n\xfd6;+\x1a\t*\xe8\xab_\x8c@\xe4\x81\xb2\xbc\xf7\x83g\x11nN\x93\xea"\xaf\xff\xa3\x9awWv\xd0\x0b8\xac\xf8\x8a\x945\x8e\xd7\xd4a\xcc\x01\xff$\xb4\x8fa#\xba\x88\xd7Y\xe4\xe9\xba*N\xb5\x15\x0f\x9c\xd0\xea\x06\x91\xd9\xde\xab\x02\x00\x809\x19R\xa4\xab)\x93\x94\xcd\x8a,^\x03\xb9\xf1\x80' >>> mk = b"\x81\x15\x02\x02\x00\x80\x00\x0b\x01\x00\x00\x00~\xc2\xf9\x9e\x94i\x02\xfe\xed\xc4\xdc\x9b\xe0\xe7 \xa8\xcct'\xf7\xc3\x05\xfc\xa5^\x13\xdc\xaa\xf6\xfa\x88\x9f\xf9\x89\xc5@\x86\xfe\xe3\xe0\x88\xd8\x02B%5\x8e\xeaV\xd9\x08\xd2In\x9aY\xca\x87\x86k\xdf\xc3W\x13x\xff\x98\xb9!bU9\x07R.i\xce\x19\xf0\xa0\xc0\x1af\x87\\M&4\x8d\xa8G\xc1\xcd\x1d\x8a\x95F\t\xba\x07\x193\xb44\x8f\xbd+\xbdmz\xd0\x11\xa3\xbd9\xaaU\xbd\xfcX\xbb\xf0%V\x1e\xae\xd1\xf3\xe9\xa0\xd7\x19E\r\xac\xad\xde/mc\xa4\xb0\xb0\x12No\xd9\xf5\xd9\xb4\xcb\xa7\xa5\t\xa6\xb9L,\x07\xfc\x9f>m4\x96\xadlS\xf1b\xdeo\xa2\xb6Hh\x85\xc5P\xec\x89i \xf7\xd6\xa0h\xa7\xa4\x95\x8dL\x16\xde_\x14\xe3\x18\xb2\x05\x1a1g\xdd\x9f\xd0\x06\x16\x06\x8c\xd4\xcc\x8a\x89\xbc\x9c6\xa9\xa1\xa8+5\x19g\xd6\x83\x1f\xe0\xd8j\x1a\x98!\x95Y\xbb\x1et\x1e2-\xab\xf8\xe3\xb7d\x92\xbe\xb0\x1a\xcf\x84G\xcc\xf4}\x01\x9eq\x14`q*z\xeaW." >>> sv = b'\x80!\xc5\x84A`t1\xc3\xeaZ\xea\xdf\xd9\x87e_\xb9j`Yb\xbc\xbc\x08\xf5\x9c\x9b\xe6\xfaF\xa0\x87\x02\x07' >>> cf = b'\x80!w\xa2\x88\x83uv\xd5|\xde\xbdoz\xba&^O\xda\x82k\x01L_xSx\x08\xe0\x1a\xaf\xa0\x07\x93\xa5' >>> rc = b'\x80"\xfe\x03\xe0$\xec{\x08-\xe9h\xf7\xc9(i\xa6N\xd8\xaa\xe3\xb2;\xf1\xfd\xf5+\x80\xa9\x1a*\xb3Z\xa7\xbe\xde' >>> cc = b'\x84\xb8\xe3j:\xc9\xa9OL\x9d\x08\xb7"\xf4)<\xf7\x0c\x92\x10{u\xd1\t\xccR(R\xc2\x02\xe0\n\x85i\xffJ\xb7\xc7\xf09\x98\x99\xde\x06\xd1\xe2\x1a\xeff[.`\x85\xf0_gs\x91\'\x0e\x82\x1b\xf6\x93\xf34m\x9d\xdc=\xf9\xeas\xac;\xe3\xcbB\xcf`\x899S"\xa8\xf9\x9b-\x07<\xfa\xf9|j\x11Z{\xa1\x1d\xd6\xf6\xdbgv\t\xa8\xa3[\x85\x82\x02^\x17\xd6\xcb\x8e\x08\xae\x87\xa1\x84\xec\x17\x0fuX,\xd4\x95\x98\x91\xea\xb3o4\x8a\xbc\x14\xfc"\x97\xfa_\xf9D\x0cB+\x07\x16K\x18&\x05x\x97.\xbc\xe1\xc4e\xb8S\xadwh\x8b\xeb\xe0\x10\x01\xd7\x08-\x81\xac\xff\xb2\x10\xcf\x14\x99VNw\xb618\xbd\xff\x18\x9c\xfb\x08\x07\xce{\x03b\x12\x81\x1d!t\xf9l\x84^d\x0eA\xdbj\xb7\xc6\x7f3\xf9t\x15\xa7)1\x95ko\xe6\x95\xd0\xbc\xe6S!"\xcaO>\x80\xad\xe0|\xb8+\xc4\x88me.\xe3O\xaf\xe2\x14k\xdc\x89\xe9\xc0O4\xa7\xc9\xb9\xe9a\xf7i\xb0\x1eH\xc7\x90\xe5ep\xa4\x8d2\x9d)MD\xb5\xc3\xc6G\xdd\xf3\x8f\x0e\xe0\xef\x17\x7f\x9f\x02\x02\xe7\xd7U\xc5\xfc+\x9d_\xf4\x1e#\x0e\x19\x9cX\xd4\xe6\x85\xe5\x1bR\xd2\xb1\xdf\x93K\xb9\xecD\xbbx\xda\x8f\x08u\xee\xad\xb6a\xc7\xb1\xed\xd7\xf9!/O\xb4\x17kg/D\xd7/\x9f\x1e\t\xf2\x9d\xc3i\xfb\xa9V\x19yme\xe8\xaa\x0e]\x7f\xff\xbf\xdc\xa5\xd8b\\\x14\x11f\xcdI\xe5\xb4\xc4\x0cl\x87z\xfb\xec\xbe\x06G\x05\xf5\xf7D.w[\xcf)}T\x13\x99]L\xeeg\xf1\x1f\xcc\xfc\xed\\\xf7Xh\xc5\x9f>}\xc0\xfb\xce=Ngr\x99\xcb6^\xdc\x86a\xb8w\xd8\xd5\x0e\xd7\x1f\xd7\x9d\xc52\x10 \xc4{\xb0\xb2\xc6\xdaJ3\xd1R\xd7\xe5\xc8\xe4e\xa6g[\xa5\xecVL\xf4\x15\x0b\x94\x81\xe2\x7fU\xff\xf9\x8c\x01\xf2\xc1\xae\xc7>\xe2U\x89\x92\xc4\t\x95@\x83}\x83\xca\xd2\xca\x02-.\xf9N&\xbb\xb3i\xba\xfe\xcf\x7f\xd6t\x03\xb8\x05~\xf89[@\xa0\xc5u\xf5\xe9\x89`jE9G1\xad\x18\xccQc(T\x1cc\xa98\x1e\xf4\xec\xac"\xed$3K\x1fM\xa1\xbc`3\x81k\x81\xc6|\xaeh\x86\xca\xde\x18h\n\x95\xb6M*MNNTugX\xfbC\xfe\xb9K\xf4\x01\xa0:S\x10\x9b\xf7\x1aW\x91\x86\xc7[\xf7r\xb8\xc2^P\xdf\x14\x90\xc3\x8d\x1f\xb0^\xe8\xd2\xd9\xd7i\x0e\xa1\x0b>\nr\xdcl\xce\x8a\x11\xd6(\xabq\xd6\x05\x1f9\x9c\x7f5\xacw\xb0L\x97J\n\x94\xac\x00\xda(-@\x0c\xc5\xd8\x86\x82\x91\xe2\t\xd7\xc9\xc0\xb0\x1fs4etn{\xfaE\xd4\xce\x9b\xc9\xd6B\xe9\xbd\xf1.\xd4\xf65\xb8[a\x80\x80?3\xa7\x0b\x05\xe3)\xd3r\xbdd\xe9\xd5+\x99\xcc\x0f,xi(\xbd@\xb2\x8b\xe4\xf8\x12\xebt\xd5\xdfg\xe1\xd4\x16+,\xa8e\xf3z\\\x15\xfc\xd0D\xfc\xad\xbc\xa5\xad\xa5\xad\xde\xb7"\x18?\x84\r\xe6\xb1\xd7io\xea\xf0\xaf\xe6;\xaf\xdc\xa5@\x7f7\x99\xe0\xd2\x00\x0f_\xcd\x12\xe5\xf7\x9b\xbd\x8b\xa6_\xf0\xe5B\xf5\x7f\x96\xa8B\xeff{,V\x83b\xc7Y\xe5Z|QE\xe3\x8e\xb9\xed=\x16\x9e\x9e\xdeW\xa7X\x10\x02:\xd2\x8bl~$\xc2\xd6\xec\xc5\xfa=)\x93\xe9gJ\x8f\xc9\xb5\xb5A\xd0\x11]\xb9;ks\xfba\x84\xa0\x94,W\x1e\x07\x1e\xc2j\xa1\x9f\x8d\xbb\xe2\xb9 \x0f\xac\x9b\xbb\xe1\x12\t7\x8eJ;\x9d\xd4\x15\x197\x97\xf7xo\xcdJ\x15(\x88`z\x00\xff\xd0R.:\xc9\x92\xcbY~\xc3\x8ex\xd7\xab\xf6q\x98x\x99\xf2R;# \x0e\x16F\x9b\x15\xff\x90\x08\x06F\x01\xb7\xcd\xa0\xbaM\xf8xy\x99W\xaa\x82\xcc70\x02\x97\x0e\xd8\xeb\xdeLk\xa4\xe8\xbb\x7f\x0fN\xc6>hTN\n\xe2\xb1\xcc\xb0\xbcH\x99\x83]\x0f\x84\x07\xf5\x1e\x079\xb0[\xd8\xc9I\x93\xa0-\x0c\xc2\xd8W\x13\xed;\r\xe0S\xe6\x82m<\x8b\x0c\xfd\xce\xd6\xecA\xe7Zm\xeb\x03\x9b%p\xfa\xb0\x8c^\x7f\xb5e\xa8\xb0\x7f\xbf\xcd\xbf\x1f3\xa3\xb3\xddZ\xb3\'\x1arO?\x16\x8a\x90\xb3n$\xd5\xa5\x91\xe2\x91\x00Qy\xdb\xcf\xc8\xd9xP\x92\xd3 \xfd\xb2R\xb7\xe0\x8f\x02\xcf\x15\xad3\xda\xa8\xe0}\xa0\x8c\xfb\xfe-\x14\xb3\x85E\xe6\x91@1\xb6\n\x90;\xb6\xbf\xbb\x16e{\xce\xaf\xd7\xdf\xac\xc9\xe7-,\xd0<\xf8L[f~\x13R\xf7\xaf\xff\xa3\xe1\x98\x93\x03V9\x04\x13y\xaa\x17=\xef\xe6`f\xb49\x8e3\xc8\xac\x81+}\x9a\xaf\xfbe\xa0J\xd2\xcb?\x870\xd9\x0e\x87\xa2\xe1YS\x06v\xc51\x18\x9a\x8b\xd5\xc8\xdd\x01y\xee\xab3\x16\xfd\x93\xc7\x1a8\xe9' >>> sf = b'\x80!\xc9\x18i\x80\xfb\xe9\xea\xa7F\x83n\xaaP\xc0\x88\x8a\x03\xce"9p\xbcW\xb1r\xac\xcc\xb1\xaa\x08\x85\xb4\xe2' >>> d1 = b'\x80C\x99\x83z\xc0\xdc\xe7\xf0I\x80\x8c\x8e\x1c\xc7bx\x98\xd3\x84\xd6\x06\xc8r\x9b\x197\xd2\xe9\x08\xc53s\x88 y\x8e)\x9f\xdcE*e\xb2r\xa2$>> d2 = b"\x80%\xee'\xc9\xb5(\xe3`\xcf\xaf\x1b\xa3 \x81\xad\x8b0\xc2Y\x8eg\xaaV\x90\x92\x02\xfe\xd1\xd0\t\xa3fE\x88\x97\x85\x08\xf5" >>> import binascii ###(001)=[passed] Reading SSLv2 session - SSLv2 parsing does not raise any error >>> t = SSLv2(ch) ###(002)=[passed] Reading SSLv2 session - Record with cleartext >>> assert t.len == 46 >>> assert not t.padlen >>> assert not t.mac >>> assert not t.pad >>> len(t.msg) == 1 True ###(003)=[passed] Reading SSLv2 session - Record __getitem__ >>> SSLv2ClientHello in t True ###(004)=[passed] Reading SSLv2 session - ClientHello >>> ch = t.msg[0] >>> assert isinstance(ch, SSLv2ClientHello) >>> assert ch.msgtype == 1 >>> assert ch.version == 0x0002 >>> assert ch.cipherslen == 21 >>> assert not ch.sid >>> assert ch.challengelen == 16 >>> assert ch.ciphers == [0x0700c0, 0x050080, 0x030080, 0x010080, 0x060040, 0x040080, 0x020080] >>> ch.challenge == binascii.unhexlify('1afb2f9ca3d1293454a3152821ffd10c') True ###(005)=[passed] Reading SSLv2 session - ServerHello >>> t = SSLv2(sh, tls_session=t.tls_session.mirror()) >>> sh = t.msg[0] >>> assert isinstance(sh, SSLv2ServerHello) >>> assert sh.msgtype == 4 >>> assert sh.sid_hit == 0 >>> assert sh.certtype == 1 >>> assert sh.version == 0x0002 >>> assert sh.certlen == 930 >>> assert sh.cipherslen == 3 >>> assert sh.connection_idlen == 16 >>> assert isinstance(sh.cert, Cert) >>> assert len(sh.cert.der) == 930 >>> assert sh.cert.subject_str == '/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server' >>> assert sh.ciphers == [0x020080] >>> sh.connection_id == binascii.unhexlify('391952a4ab299394cd8a2c5e03b9f180') True ###(006)=[passed] Reading SSLv2 session - ClientMasterKey with unknown server key >>> t_enc = SSLv2(mk) >>> mk_enc = t_enc.msg[0] >>> assert mk_enc.clearkeylen == 11 >>> assert mk_enc.encryptedkeylen == 256 >>> assert mk_enc.clearkey == binascii.unhexlify('7ec2f99e946902feedc4dc') >>> assert mk_enc.encryptedkey[:3] == b"\x9b\xe0\xe7" and mk_enc.encryptedkey[-3:] == b"\xea\x57\x2e" >>> assert t_enc.tls_session.pwcs.tls_version == 0x0002 >>> assert t_enc.tls_session.prcs.tls_version == 0x0002 >>> mk_enc.decryptedkey is None True ###(007)=[passed] Reading SSLv2 session - Importing server compromised key >>> import os >>> filename = scapy_path("/test/scapy/layers/tls/pki/srv_key.pem") >>> rsa_key = PrivKeyRSA(filename) >>> t.tls_session.server_rsa_key = rsa_key ###(008)=[passed] Reading SSLv2 session - ClientMasterKey with compromised server key >>> t = SSLv2(mk, tls_session=t.tls_session.mirror()) >>> assert t.len == 277 and not t.padlen and not t.mac and not t.pad >>> mk = t.msg[0] >>> assert isinstance(mk, SSLv2ClientMasterKey) >>> assert mk.msgtype == 2 >>> assert mk.cipher == 0x020080 >>> assert mk.clearkeylen == 11 >>> assert mk.encryptedkeylen == 256 >>> assert mk.keyarglen == 0 >>> assert mk.clearkey == binascii.unhexlify('7ec2f99e946902feedc4dc') >>> assert mk.decryptedkey == binascii.unhexlify('e2d430fc04') >>> not mk.keyarg True ###(009)=[passed] Reading SSLv2 session - Checking session secrets >>> s = t.tls_session >>> assert s.sslv2_common_cs == [0x020080] >>> assert s.sslv2_challenge == ch.challenge >>> assert not s.pre_master_secret >>> assert s.master_secret == b'~\xc2\xf9\x9e\x94i\x02\xfe\xed\xc4\xdc\xe2\xd40\xfc\x04' >>> assert s.sslv2_key_material == b'\xf4\xae\x00\x03kB>\x06\xba[\xd7\xea,\x08\xc2\xae\xba\xf3\x10\xbf\xea\x08\x8flV\x11D\xc5L\xad3\xf9' >>> assert s.rcs.cipher.key == b'\xba\xf3\x10\xbf\xea\x08\x8flV\x11D\xc5L\xad3\xf9' >>> s.wcs.cipher.key == b'\xf4\xae\x00\x03kB>\x06\xba[\xd7\xea,\x08\xc2\xae' True ###(010)=[passed] Reading SSLv2 session - Record with ciphertext >>> t = SSLv2(sv, tls_session=t.tls_session.mirror()) >>> assert t.len == 33 >>> assert not t.padlen >>> assert t.mac == b'?:\xf3vE\xf3\xe83\x1a\xd0\xab\xba\xb6\x86\xe6\x89' >>> not t.pad True ###(011)=[passed] Reading SSLv2 session - ServerVerify >>> sv = t.msg[0] >>> assert isinstance(sv, SSLv2ServerVerify) >>> assert sv.msgtype == 5 >>> sv.challenge == ch.challenge True ###(012)=[passed] Reading SSLv2 session - ClientFinished >>> t = SSLv2(cf, tls_session=t.tls_session.mirror()) >>> cf = t.msg[0] >>> assert isinstance(cf, SSLv2ClientFinished) >>> assert cf.msgtype == 3 >>> cf.connection_id == sh.connection_id True ###(013)=[passed] Reading SSLv2 session - RequestCertificate >>> t = SSLv2(rc, tls_session=t.tls_session.mirror()) >>> rc = t.msg[0] >>> assert isinstance(rc, SSLv2RequestCertificate) >>> assert rc.msgtype == 7 >>> assert rc.authtype == 1 >>> rc.challenge == binascii.unhexlify('19619ddf7384d68e7a614ae1989ab41e') True ###(014)=[passed] Reading SSLv2 session - ClientCertificate >>> t = SSLv2(cc, tls_session=t.tls_session.mirror()) No client certificate provided. We're making a wild guess about the signature size. >>> cc = t.msg[0] >>> assert isinstance(cc, SSLv2ClientCertificate) >>> assert cc.msgtype == 8 >>> assert cc.certtype == 1 >>> assert cc.certlen == 930 >>> assert cc.responselen == 256 >>> assert isinstance(cc.certdata, Cert) >>> assert len(cc.certdata.der) == 930 >>> assert cc.certdata.subject_str == '/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Client' >>> assert len(cc.responsedata.sig_val) == 256 >>> cc.responsedata.sig_val[:4] == b"\x81#\x95\xb5" and cc.responsedata.sig_val[-4:] == b"RM6\xd3" True ###(015)=[passed] Reading SSLv2 session - ServerFinished >>> t = SSLv2(sf, tls_session=t.tls_session.mirror()) >>> sf = t.msg[0] >>> assert isinstance(sf, SSLv2ServerFinished) >>> assert sf.msgtype == 6 >>> sf.sid == binascii.unhexlify('11c1e8070b2cf249ad3d85caf8854bc8') True ###(016)=[passed] Reading SSLv2 session - Application data >>> t1 = SSLv2(d1, tls_session=t.tls_session.mirror()) >>> data1 = t1.msg[0] >>> assert isinstance(data1, Raw) >>> assert data1.load == b'These are horrendous parameters for a TLS session.\n' >>> t2 = SSLv2(d2, tls_session=t1.tls_session) >>> data2 = t2.msg[0] >>> assert isinstance(data2, Raw) >>> data2.load == b'*nothing to do here*\n' True ###(017)=[passed] Reading SSLv2 session - Checking final sequence numbers >>> t2.tls_session.rcs.seq_num == 6 and t2.tls_session.wcs.seq_num == 4 True ###### ## Check TLS-related scapy internals ###### ###(018)=[passed] Check TLS-related scapy internals - Checking raw() harmlessness (with RC4) >>> t1.show() ###[ SSLv2 ]### len = 67 padlen = None mac = b'\x81|\xaa\xe7\xcc\x86\xe0\xc6\x83\x89\x08\xcbk\x0f\xfa\xcc' \msg \ |###[ Raw ]### | load = b'These are horrendous parameters for a TLS session.\n' pad = b'' >>> assert t1.msg[0].load == b'These are horrendous parameters for a TLS session.\n' >>> assert t1.tls_session.rcs.seq_num == 6 and t1.tls_session.wcs.seq_num == 4 >>> d1 == raw(t1) True ###(019)=[passed] Check TLS-related scapy internals - Checking show2() harmlessness (with RC4) >>> t2.show2() ###[ SSLv2 ]### len = 37 padlen = None mac = b'\xd1\xe7\xae\xc1\x9d\xce\x81\xbe\x18\xa3\x88\xe0T\x97\xf2\xb0' \msg \ |###[ Raw ]### | load = b'*nothing to do here*\n' pad = b'' >>> assert t2.msg[0].load == b'*nothing to do here*\n' >>> assert t2.tls_session.rcs.seq_num == 6 and t2.tls_session.wcs.seq_num == 4 >>> d2 == raw(t2) True ###(020)=[passed] Check TLS-related scapy internals - Checking show2() harmlessness (with 3DES) >>> ch = b'\x80.\x01\x00\x02\x00\x15\x00\x00\x00\x10\x07\x00\xc0\x05\x00\x80\x03\x00\x80\x01\x00\x80\x06\x00@\x04\x00\x80\x02\x00\x80!2bc\x97^\xa3\r9\x14*\xe4\xd6\xd4\n\x1e' >>> sh = b'\x83\xd2\x04\x00\x01\x00\x02\x03\xa2\x00\x15\x00\x100\x82\x03\x9e0\x82\x02\x86\xa0\x03\x02\x01\x02\x02\t\x00\xfe\x04W\r\xc7\'\xe9\xf60\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000T1\x0b0\t\x06\x03U\x04\x06\x13\x02MN1\x140\x12\x06\x03U\x04\x07\x0c\x0bUlaanbaatar1\x170\x15\x06\x03U\x04\x0b\x0c\x0eScapy Test PKI1\x160\x14\x06\x03U\x04\x03\x0c\rScapy Test CA0\x1e\x17\r160916102811Z\x17\r260915102811Z0X1\x0b0\t\x06\x03U\x04\x06\x13\x02MN1\x140\x12\x06\x03U\x04\x07\x0c\x0bUlaanbaatar1\x170\x15\x06\x03U\x04\x0b\x0c\x0eScapy Test PKI1\x1a0\x18\x06\x03U\x04\x03\x0c\x11Scapy Test Server0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xcc\xf1\xf1\x9b`-`\xae\xf2\x98\r\')\xd9\xc0\tYL\x0fJ0\xa8R\xdf\xe5\xb1!\x9fO\xc3=V\x93\xdd_\xc6\xf7\xb3\xf6U\x8b\xe7\x92\xe2\xde\xf2\x85I\xb4\xa1,\xf4\xfdv\xa8g\xca\x04 `\x11\x18\xa6\xf2\xa9\xb6\xa6\x1d\xd9\xaa\xe5\xd9\xdb\xaf\xe6\xafUW\x9f\xffR\x89e\xe6\x80b\x80!\x94\xbc\xcf\x81\x1b\xcbg\xc2\x9d\xb5\x05w\x04\xa6\xc7\x88\x18\x80xh\x956\xde\x97\x1b\xb6a\x87B\x1au\x98E\x82\xeb>2\x11\xc8\x9b\x86B9\x8dM\x12\xb7X\x1b\x19\xf3\x9d+\xa1\x98\x82\xca\xd7;$\xfb\t9\xb0\xbc\xc2\x95\xcf\x82)u\x16)?B \x17+M@\x8cVl\xad\xba\x0f4\x85\xb1\x7f@yqx\xb7\xa5\x04\xbb\x94\xf7\xb5A\x95\xee|\xeb\x8d\x0cyhY\xef\xcb\xb3\xfa>x\x1e\xeegLz\xdd\xe0\x99\xef\xda\xe7\xef\xb2\t]\xbe\x80 !\x05\x83,D\xdb]*v)\xa5\xb0#\x88t\x07T"\xd6)z\x92\xf5o-\x9e\xe7\xf8&+\x9cXe\x02\x03\x01\x00\x01\xa3o0m0\t\x06\x03U\x1d\x13\x04\x020\x000\x0b\x06\x03U\x1d\x0f\x04\x04\x03\x02\x05\xe00\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\xa1+ p\xd2k\x80\xe5e\xbc\xeb\x03\x0f\x88\x9ft\xad\xdd\xf6\x130\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14fS\x94\xf4\x15\xd1\xbdgh\xb0Q725\xe1\xa4\xaa\xde\x07|0\x13\x06\x03U\x1d%\x04\x0c0\n\x06\x08+\x06\x01\x05\x05\x07\x03\x010\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x00\x03\x82\x01\x01\x00\x81\x88\x92sk\x93\xe7\x95\xd6\xddA\xee\x8e\x1e\xbd\xa3HX\xa7A5?{}\xd07\x98\x0e\xb8,\x94w\xc8Q6@\xadY\t(\xc8V\xd6\xea[\xac\xb4\xd8?h\xb7f\xca\xe1V7\xa9\x00e\xeaQ\xc9\xec\xb2iI]\xf9\xe3\xc0\xedaT\xc9\x12\x9f\xc6\xb0\nsU\xe8U5`\xef\x1c6\xf0\xda\xd1\x90wV\x04\xb8\xab8\xee\xf7\t\xc5\xa5\x98\x90#\xea\x1f\xdb\x15\x7f2(\x81\xab\x9b\x85\x02K\x95\xe77Q{\x1bH.\xfb>R\xa3\r\xb4F\xa9\x92:\x1c\x1f\xd7\n\x1eXJ\xfa.Q\x8f)\xc6\x1e\xb8\x0e1\x0es\xf1\'\x88\x17\xca\xc8i\x0c\xfa\x83\xcd\xb3y\x0e\x14\xb0\xb8\x9b/:-\t\xe3\xfc\x06\xf0:n\xfd6;+\x1a\t*\xe8\xab_\x8c@\xe4\x81\xb2\xbc\xf7\x83g\x11nN\x93\xea"\xaf\xff\xa3\x9awWv\xd0\x0b8\xac\xf8\x8a\x945\x8e\xd7\xd4a\xcc\x01\xff$\xb4\x8fa#\xba\x88\xd7Y\xe4\xe9\xba*N\xb5\x15\x0f\x9c\xd0\xea\x06\x91\xd9\xde\xab\x07\x00\xc0\x05\x00\x80\x03\x00\x80\x01\x00\x80\x06\x00@\x04\x00\x80\x02\x00\x80\x03\xea\xd5\x88T&\xe7\\\xc9wM\x05\x1fo\xbf\xec' >>> mk = b'\x81\x12\x02\x07\x00\xc0\x00\x00\x01\x00\x00\x08(\xc98#b\xc1\x94\x9e\xf1|\xd3\x98/\x84\xa6\xfb\x1e}b7\xf1\xfa9\xc3\xb4A\xe4\xb7\x97\xcd\x0c\xd4\x81\x82\xee\x8b\x80f]_\xbc\xe5\xeb\xe4}b\x82 \xa1S\xd5\xbe\xb3\xf7\xbb\x1c]zm\xe6\xc5\x95\xe3Y\x9d\x84b\xf2\x89\x08i\xf9"\x8d\xf7\xb9\xe3\xb5\xcb\x90\xc2V\xcel\x14\xb0\xd4-\xb3\xd3\xfe\x83\x8a(\x025\xd0Y\x9b4M\xde\xc6\x99{H\x89u.\xfa\x17\x13|\xd39\xf6sc\xaat\x9fy\xf69s9\xbfM\xdc\xcdT\x8d~U"\xdd\xce\xab\xfa\x0e\xa9\x90$s&\x0c8\xe4\x13b\x15\xc7\xc2\r#\xc96\x04{\x14\xd0\x19\xef\x13ql\x07\xbf\'\xfb\xdc\x14t\xf6I\xe6\x0b\xe7\xf2\xd6e\'%2H\x81\x16\x0bT;0\x95G%E\xc559p\x85S\x07\xbf\x03\xb0^\x06\xf0\xdcL\xd4\xf2\x9b\xf7\xc6T\xdb%MS\x8ch\xb5\x91H\xffF\xf0\xafCw\x1a:7\x1f\xf8\x05\x944\xc1p\xb6\x8e\x12.#,a\xd4s\xc7\x9f\xe5\xbf\xcb\xee\x1aS\xa71\x15\xf5pE' >>> sv = b'\x00(\x07q\x8c\x08\xdb\xa8\xaa\x8d\x87\x0b\xe8\x01^\xed\x87\x8e\xb2\xc0\xa9\x84\x11v)~\xf8\xd9,\xea\xe2\x05\x86\x1d\x01n\xe1\xe6\xccE[\xcej' >>> t = SSLv2(ch) >>> t.show2() ###[ SSLv2 ]### len = 46 padlen = None mac = b'' \msg \ |###[ SSLv2 Handshake - Client Hello ]### | msgtype = client_hello | version = SSLv2 | cipherslen= 21 | sidlen = 0 | challengelen= 16 | sid = | ciphers = [SSL_CK_DES_192_EDE3_CBC_WITH_MD5, SSL_CK_IDEA_128_CBC_WITH_MD5, SSL_CK_RC2_128_CBC_WITH_MD5, SSL_CK_RC4_128_WITH_MD5, SSL_CK_DES_64_CBC_WITH_MD5, SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5, SSL_CK_RC4_128_EXPORT40_WITH_MD5] | challenge = 21326263975ea30d39142ae4d6d40a1e pad = b'' >>> challenge = t.msg[0].challenge >>> t = SSLv2(sh, tls_session=t.tls_session.mirror()) >>> t.show2() ###[ SSLv2 ]### len = 978 padlen = None mac = b'' \msg \ |###[ SSLv2 Handshake - Server Hello ]### | msgtype = server_hello | sid_hit = 0 | certtype = x509_cert | version = SSLv2 | certlen = 930 | cipherslen= 21 | connection_idlen= 16 | cert = [X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA] | ciphers = [SSL_CK_DES_192_EDE3_CBC_WITH_MD5, SSL_CK_IDEA_128_CBC_WITH_MD5, SSL_CK_RC2_128_CBC_WITH_MD5, SSL_CK_RC4_128_WITH_MD5, SSL_CK_DES_64_CBC_WITH_MD5, SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5, SSL_CK_RC4_128_EXPORT40_WITH_MD5] | connection_id= 03ead5885426e75cc9774d051f6fbfec pad = b'' >>> t.tls_session.server_rsa_key = rsa_key >>> t = SSLv2(mk, tls_session=t.tls_session.mirror()) >>> t.show2() ###[ SSLv2 ]### len = 274 padlen = None mac = b'' \msg \ |###[ SSLv2 Handshake - Client Master Key ]### | msgtype = client_master_key | cipher = SSL_CK_DES_192_EDE3_CBC_WITH_MD5 | clearkeylen= 0 | encryptedkeylen= 256 | keyarglen = 8 | clearkey = | encryptedkey= 28c9382362c1949ef17cd3982f84a6fb1e7d6237f1fa39c3b441e4b797cd0cd48182ee8b80665d5fbce5ebe47d628220a153d5beb3f7bb1c5d7a6de6c595e3599d8462f2890869f9228df7b9e3b5cb90c256ce6c14b0d42db3d3fe838a280235d0599b344ddec6997b4889752efa17137cd339f67363aa749f79f6397339bf4ddccd548d7e5522ddceabfa0ea9902473260c38e4136215c7c20d23c936047b14d019ef13716c07bf27fbdc1474f649e60be7f2d6652725324881160b543b3095472545c5353970855307bf03b05e06f0dc4cd4f29bf7c654db254d538c68b59148ff46f0af43771a3a371ff8059434c170b68e122e232c61d473c79fe5bfcbee [decryptedkey= 0a7b73562cc2989f80c0e03eff796b99b1416d5df09dd5b0] | keyarg = 1a53a73115f57045 pad = b'' >>> t.show2() ###[ SSLv2 ]### len = 274 padlen = None mac = b'' \msg \ |###[ SSLv2 Handshake - Client Master Key ]### | msgtype = client_master_key | cipher = SSL_CK_DES_192_EDE3_CBC_WITH_MD5 | clearkeylen= 0 | encryptedkeylen= 256 | keyarglen = 8 | clearkey = | encryptedkey= 28c9382362c1949ef17cd3982f84a6fb1e7d6237f1fa39c3b441e4b797cd0cd48182ee8b80665d5fbce5ebe47d628220a153d5beb3f7bb1c5d7a6de6c595e3599d8462f2890869f9228df7b9e3b5cb90c256ce6c14b0d42db3d3fe838a280235d0599b344ddec6997b4889752efa17137cd339f67363aa749f79f6397339bf4ddccd548d7e5522ddceabfa0ea9902473260c38e4136215c7c20d23c936047b14d019ef13716c07bf27fbdc1474f649e60be7f2d6652725324881160b543b3095472545c5353970855307bf03b05e06f0dc4cd4f29bf7c654db254d538c68b59148ff46f0af43771a3a371ff8059434c170b68e122e232c61d473c79fe5bfcbee [decryptedkey= 0a7b73562cc2989f80c0e03eff796b99b1416d5df09dd5b0] | keyarg = 1a53a73115f57045 pad = b'' >>> t = SSLv2(sv, tls_session=t.tls_session.mirror()) >>> t.show2() ###[ SSLv2 ]### len = 40 [with padding: 0x8028] padlen = 7 mac = b'\xe7\xe4\x08\x0e\x86\xc4\x93\t\x80l/\x80\xdaQ\xa0z' \msg \ |###[ SSLv2 Handshake - Server Verify ]### | msgtype = server_verify | challenge = 21326263975ea30d39142ae4d6d40a1e pad = b'\x00\x00\x00\x00\x00\x00\x00' >>> t.show2() ###[ SSLv2 ]### len = 40 [with padding: 0x8028] padlen = 7 mac = b'\xe7\xe4\x08\x0e\x86\xc4\x93\t\x80l/\x80\xdaQ\xa0z' \msg \ |###[ SSLv2 Handshake - Server Verify ]### | msgtype = server_verify | challenge = 21326263975ea30d39142ae4d6d40a1e pad = b'\x00\x00\x00\x00\x00\x00\x00' >>> assert t.padlen == 7 >>> assert t.mac == b'\xe7\xe4\x08\x0e\x86\xc4\x93\t\x80l/\x80\xdaQ\xa0z' >>> assert t.tls_session.rcs.seq_num == 2 >>> assert t.tls_session.wcs.seq_num == 2 >>> t.msg[0].challenge == challenge True ###(021)=[passed] Check TLS-related scapy internals - Checking tls_session freeze during show2() >>> l = len(t.tls_session.handshake_messages) >>> t.show2() ###[ SSLv2 ]### len = 40 [with padding: 0x8028] padlen = 7 mac = b'\xe7\xe4\x08\x0e\x86\xc4\x93\t\x80l/\x80\xdaQ\xa0z' \msg \ |###[ SSLv2 Handshake - Server Verify ]### | msgtype = server_verify | challenge = 21326263975ea30d39142ae4d6d40a1e pad = b'\x00\x00\x00\x00\x00\x00\x00' >>> l == len(t.tls_session.handshake_messages) True ###(022)=[passed] Check TLS-related scapy internals - Checking SSLv2 cast from TLS class >>> t = TLS(ch) >>> assert isinstance(t, SSLv2) >>> t.msg[0].challenge == challenge True ###### ## Build SSLv2 packets ###### ###(023)=[passed] Building SSLv2 packets - Various default messages >>> raw(SSLv2()) b'\x80\x00' >>> raw(SSLv2Error()) b'\x00\x00\x00' >>> raw(SSLv2ClientHello()) b'\x01\x00\x02\x00\x03\x00\x00\x00\x00\x07\x00\xc0' >>> raw(SSLv2ServerHello()) b'\x04\x00\x01\x00\x02\x00\x00\x00\x00\x00\x00' >>> raw(SSLv2ClientMasterKey()) No known common cipher suite between SSLv2 Hellos. b'\x02\x07\x00\xc0\x00\x00\x00\x00\x00\x08\xd1\xc3\xf8Vk&\xdc\xaf' >>> raw(SSLv2ServerVerify()) b'\x05' >>> raw(SSLv2ClientFinished()) b'\x03' >>> raw(SSLv2RequestCertificate()) b'\x07\x01' >>> raw(SSLv2ClientCertificate()) b'\x08\x01\x00\x00\x00\x00' >>> raw(SSLv2ServerFinished()) b'\x06' ###(024)=[passed] Building SSLv2 packets - Error within clear record >>> t = SSLv2(msg=SSLv2Error(code='no_cipher')) >>> raw(t) == b'\x80\x03\x00\x00\x01' True ###(025)=[passed] Building SSLv2 packets - ClientHello with automatic length computation >>> ch_pkt = SSLv2ClientHello() >>> ch_pkt.msgtype = 'client_hello' >>> ch_pkt.version = 0x0002 >>> ch_pkt.ciphers = [SSL_CK_DES_192_EDE3_CBC_WITH_MD5, SSL_CK_IDEA_128_CBC_WITH_MD5, SSL_CK_RC2_128_CBC_WITH_MD5, SSL_CK_RC4_128_WITH_MD5, SSL_CK_DES_64_CBC_WITH_MD5, SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5, SSL_CK_RC4_128_EXPORT40_WITH_MD5] >>> ch_pkt.challenge = b'!2bc\x97^\xa3\r9\x14*\xe4\xd6\xd4\n\x1e' >>> t = SSLv2(msg=ch_pkt) >>> raw(t) == ch True ###(026)=[passed] Building SSLv2 packets - ClientMasterKey context linking >>> mk = SSLv2ClientMasterKey(cipher='SSL_CK_DES_192_EDE3_CBC_WITH_MD5', clearkey=b'\xff'*19, encryptedkey=b'\0'*256, decryptedkey=b'\xaa'*5, keyarg=b'\x01'*8) >>> t = SSLv2(msg=mk) >>> t.tls_session.sslv2_connection_id = b'\xba'*16 >>> t.tls_session.sslv2_challenge = b'\x42'*16 >>> t.raw_stateful() b'\x81%\x02\x07\x00\xc0\x00\x13\x01\x00\x00\x08\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x01\x01\x01\x01\x01\x01' >>> s = t.tls_session >>> assert s.master_secret == b'\xff'*19 + b'\xaa'*5 >>> assert isinstance(s.rcs.ciphersuite, SSL_CK_DES_192_EDE3_CBC_WITH_MD5) >>> assert isinstance(s.wcs.ciphersuite, SSL_CK_DES_192_EDE3_CBC_WITH_MD5) >>> s.rcs.cipher.iv == b'\x01'*8 True >>> s.wcs.cipher.iv == b'\x01'*8 True ###(027)=[passed] Dissect invalid payload >>> p = SSLv2() >>> with no_debug_dissector(): ... p.do_dissect_payload(b'\x00') ... assert raw(p.payload) == b'\x00' ... Tests for TLS module ━ Run at 01:42:31 from [test/scapy/layers/tls/tls.uts] by UTscapy in 1.227358341217041 └ Passed=85 └ Failed=0 ###### ## Test HMACs ###### ###(000)=[passed] Crypto - Hmac_MD5 instantiation, parameter check >>> from scapy.layers.tls.crypto.h_mac import Hmac_MD5 >>> a = Hmac_MD5("somekey") >>> a.key_len == 16 and a.hmac_len == 16 True ###(001)=[passed] Crypto - Hmac_MD5 behavior on test vectors from RFC 2202 (+ errata) >>> a = Hmac_MD5 >>> t1 = a(b'\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b').digest("Hi There") == b'\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d' >>> t2 = a('Jefe').digest('what do ya want for nothing?') == b'\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7\x38' >>> t3 = a(b'\xaa'*16).digest(b'\xdd'*50) == b'\x56\xbe\x34\x52\x1d\x14\x4c\x88\xdb\xb8\xc7\x33\xf0\xe8\xb3\xf6' >>> t4 = a(b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19').digest(b'\xcd'*50) == b'\x69\x7e\xaf\x0a\xca\x3a\x3a\xea\x3a\x75\x16\x47\x46\xff\xaa\x79' >>> t5 = a(b'\x0c'*16).digest("Test With Truncation") == b'\x56\x46\x1e\xf2\x34\x2e\xdc\x00\xf9\xba\xb9\x95\x69\x0e\xfd\x4c' >>> t6 = a(b'\xaa'*80).digest("Test Using Larger Than Block-Size Key - Hash Key First") == b'\x6b\x1a\xb7\xfe\x4b\xd7\xbf\x8f\x0b\x62\xe6\xce\x61\xb9\xd0\xcd' >>> t7 = a(b'\xaa'*80).digest("Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data") == b'\x6f\x63\x0f\xad\x67\xcd\xa0\xee\x1f\xb1\xf5\x62\xdb\x3a\xa5\x3e' >>> t1 and t2 and t3 and t4 and t5 and t6 and t7 True ###(002)=[passed] Crypto - Hmac_SHA instantiation, parameter check >>> from scapy.layers.tls.crypto.h_mac import Hmac_SHA >>> a = Hmac_SHA("somekey") >>> a.key_len == 20 and a.hmac_len == 20 True ###(003)=[passed] Crypto - Hmac_SHA behavior on test vectors from RFC 2202 (+ errata) >>> a = Hmac_SHA >>> t1 = a(b'\x0b'*20).digest("Hi There") == b'\xb6\x17\x31\x86\x55\x05\x72\x64\xe2\x8b\xc0\xb6\xfb\x37\x8c\x8e\xf1\x46\xbe\x00' >>> t2 = a('Jefe').digest("what do ya want for nothing?") == b'\xef\xfc\xdf\x6a\xe5\xeb\x2f\xa2\xd2\x74\x16\xd5\xf1\x84\xdf\x9c\x25\x9a\x7c\x79' >>> t3 = a(b'\xaa'*20).digest(b'\xdd'*50) == b'\x12\x5d\x73\x42\xb9\xac\x11\xcd\x91\xa3\x9a\xf4\x8a\xa1\x7b\x4f\x63\xf1\x75\xd3' >>> t4 = a(b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19').digest(b'\xcd'*50) == b'\x4c\x90\x07\xf4\x02\x62\x50\xc6\xbc\x84\x14\xf9\xbf\x50\xc8\x6c\x2d\x72\x35\xda' >>> t5 = a(b'\x0c'*20).digest("Test With Truncation") == b'\x4c\x1a\x03\x42\x4b\x55\xe0\x7f\xe7\xf2\x7b\xe1\xd5\x8b\xb9\x32\x4a\x9a\x5a\x04' >>> t6 = a(b'\xaa'*80).digest("Test Using Larger Than Block-Size Key - Hash Key First") == b'\xaa\x4a\xe5\xe1\x52\x72\xd0\x0e\x95\x70\x56\x37\xce\x8a\x3b\x55\xed\x40\x21\x12' >>> t7 = a(b'\xaa'*80).digest("Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data") == b'\xe8\xe9\x9d\x0f\x45\x23\x7d\x78\x6d\x6b\xba\xa7\x96\x5c\x78\x08\xbb\xff\x1a\x91' >>> t1 and t2 and t3 and t4 and t5 and t6 and t7 True ###(004)=[passed] Crypto - Hmac_SHA2 behavior on test vectors from RFC 4231 >>> class _hmac_test_case_1: ... Key = (b'\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b'+ ... b'\x0b\x0b\x0b\x0b\x0b\x0b\x0b') ... Data = b'\x48\x69\x20\x54\x68\x65\x72\x65' ... HMAC_SHA_224 = (b'\x89\x6f\xb1\x12\x8a\xbb\xdf\x19\x68\x32\x10\x7c\xd4'+ ... b'\x9d\xf3\x3f\x47\xb4\xb1\x16\x99\x12\xba\x4f\x53\x68'+ ... b'\x4b\x22') ... HMAC_SHA_256 = (b'\xb0\x34\x4c\x61\xd8\xdb\x38\x53\x5c\xa8\xaf\xce\xaf'+ ... b'\x0b\xf1\x2b\x88\x1d\xc2\x00\xc9\x83\x3d\xa7\x26\xe9'+ ... b'\x37\x6c\x2e\x32\xcf\xf7') ... HMAC_SHA_384 = (b'\xaf\xd0\x39\x44\xd8\x48\x95\x62\x6b\x08\x25\xf4\xab'+ ... b'\x46\x90\x7f\x15\xf9\xda\xdb\xe4\x10\x1e\xc6\x82\xaa'+ ... b'\x03\x4c\x7c\xeb\xc5\x9c\xfa\xea\x9e\xa9\x07\x6e\xde'+ ... b'\x7f\x4a\xf1\x52\xe8\xb2\xfa\x9c\xb6') ... HMAC_SHA_512 = (b'\x87\xaa\x7c\xde\xa5\xef\x61\x9d\x4f\xf0\xb4\x24\x1a'+ ... b'\x1d\x6c\xb0\x23\x79\xf4\xe2\xce\x4e\xc2\x78\x7a\xd0'+ ... b'\xb3\x05\x45\xe1\x7c\xde\xda\xa8\x33\xb7\xd6\xb8\xa7'+ ... b'\x02\x03\x8b\x27\x4e\xae\xa3\xf4\xe4\xbe\x9d\x91\x4e'+ ... b'\xeb\x61\xf1\x70\x2e\x69\x6c\x20\x3a\x12\x68\x54') ... >>> class _hmac_test_case_2: ... Key = b'\x4a\x65\x66\x65' ... Data = (b'\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61\x20\x77\x61'+ ... b'\x6e\x74\x20\x66\x6f\x72\x20\x6e\x6f\x74\x68\x69\x6e'+ ... b'\x67\x3f') ... HMAC_SHA_224 = (b'\xa3\x0e\x01\x09\x8b\xc6\xdb\xbf\x45\x69\x0f\x3a\x7e'+ ... b'\x9e\x6d\x0f\x8b\xbe\xa2\xa3\x9e\x61\x48\x00\x8f\xd0'+ ... b'\x5e\x44') ... HMAC_SHA_256 = (b'\x5b\xdc\xc1\x46\xbf\x60\x75\x4e\x6a\x04\x24\x26\x08'+ ... b'\x95\x75\xc7\x5a\x00\x3f\x08\x9d\x27\x39\x83\x9d\xec'+ ... b'\x58\xb9\x64\xec\x38\x43') ... HMAC_SHA_384 = (b'\xaf\x45\xd2\xe3\x76\x48\x40\x31\x61\x7f\x78\xd2\xb5'+ ... b'\x8a\x6b\x1b\x9c\x7e\xf4\x64\xf5\xa0\x1b\x47\xe4\x2e'+ ... b'\xc3\x73\x63\x22\x44\x5e\x8e\x22\x40\xca\x5e\x69\xe2'+ ... b'\xc7\x8b\x32\x39\xec\xfa\xb2\x16\x49') ... HMAC_SHA_512 = (b'\x16\x4b\x7a\x7b\xfc\xf8\x19\xe2\xe3\x95\xfb\xe7\x3b'+ ... b'\x56\xe0\xa3\x87\xbd\x64\x22\x2e\x83\x1f\xd6\x10\x27'+ ... b'\x0c\xd7\xea\x25\x05\x54\x97\x58\xbf\x75\xc0\x5a\x99'+ ... b'\x4a\x6d\x03\x4f\x65\xf8\xf0\xe6\xfd\xca\xea\xb1\xa3'+ ... b'\x4d\x4a\x6b\x4b\x63\x6e\x07\x0a\x38\xbc\xe7\x37') ... >>> class _hmac_test_case_3: ... Key = (b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa') ... Data = (b'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd'+ ... b'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd'+ ... b'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd'+ ... b'\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd') ... HMAC_SHA_224 = (b'\x7f\xb3\xcb\x35\x88\xc6\xc1\xf6\xff\xa9\x69\x4d\x7d'+ ... b'\x6a\xd2\x64\x93\x65\xb0\xc1\xf6\x5d\x69\xd1\xec\x83'+ ... b'\x33\xea') ... HMAC_SHA_256 = (b'\x77\x3e\xa9\x1e\x36\x80\x0e\x46\x85\x4d\xb8\xeb\xd0'+ ... b'\x91\x81\xa7\x29\x59\x09\x8b\x3e\xf8\xc1\x22\xd9\x63'+ ... b'\x55\x14\xce\xd5\x65\xfe') ... HMAC_SHA_384 = (b'\x88\x06\x26\x08\xd3\xe6\xad\x8a\x0a\xa2\xac\xe0\x14'+ ... b'\xc8\xa8\x6f\x0a\xa6\x35\xd9\x47\xac\x9f\xeb\xe8\x3e'+ ... b'\xf4\xe5\x59\x66\x14\x4b\x2a\x5a\xb3\x9d\xc1\x38\x14'+ ... b'\xb9\x4e\x3a\xb6\xe1\x01\xa3\x4f\x27') ... HMAC_SHA_512 = (b'\xfa\x73\xb0\x08\x9d\x56\xa2\x84\xef\xb0\xf0\x75\x6c'+ ... b'\x89\x0b\xe9\xb1\xb5\xdb\xdd\x8e\xe8\x1a\x36\x55\xf8'+ ... b'\x3e\x33\xb2\x27\x9d\x39\xbf\x3e\x84\x82\x79\xa7\x22'+ ... b'\xc8\x06\xb4\x85\xa4\x7e\x67\xc8\x07\xb9\x46\xa3\x37'+ ... b'\xbe\xe8\x94\x26\x74\x27\x88\x59\xe1\x32\x92\xfb') ... >>> class _hmac_test_case_4: ... Key = (b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d'+ ... b'\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19') ... Data = (b'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd'+ ... b'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd'+ ... b'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd'+ ... b'\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd') ... HMAC_SHA_224 = (b'\x6c\x11\x50\x68\x74\x01\x3c\xac\x6a\x2a\xbc\x1b\xb3'+ ... b'\x82\x62\x7c\xec\x6a\x90\xd8\x6e\xfc\x01\x2d\xe7\xaf'+ ... b'\xec\x5a') ... HMAC_SHA_256 = (b'\x82\x55\x8a\x38\x9a\x44\x3c\x0e\xa4\xcc\x81\x98\x99'+ ... b'\xf2\x08\x3a\x85\xf0\xfa\xa3\xe5\x78\xf8\x07\x7a\x2e'+ ... b'\x3f\xf4\x67\x29\x66\x5b') ... HMAC_SHA_384 = (b'\x3e\x8a\x69\xb7\x78\x3c\x25\x85\x19\x33\xab\x62\x90'+ ... b'\xaf\x6c\xa7\x7a\x99\x81\x48\x08\x50\x00\x9c\xc5\x57'+ ... b'\x7c\x6e\x1f\x57\x3b\x4e\x68\x01\xdd\x23\xc4\xa7\xd6'+ ... b'\x79\xcc\xf8\xa3\x86\xc6\x74\xcf\xfb') ... HMAC_SHA_512 = (b'\xb0\xba\x46\x56\x37\x45\x8c\x69\x90\xe5\xa8\xc5\xf6'+ ... b'\x1d\x4a\xf7\xe5\x76\xd9\x7f\xf9\x4b\x87\x2d\xe7\x6f'+ ... b'\x80\x50\x36\x1e\xe3\xdb\xa9\x1c\xa5\xc1\x1a\xa2\x5e'+ ... b'\xb4\xd6\x79\x27\x5c\xc5\x78\x80\x63\xa5\xf1\x97\x41'+ ... b'\x12\x0c\x4f\x2d\xe2\xad\xeb\xeb\x10\xa2\x98\xdd') ... >>> class _hmac_test_case_5: ... Key = (b'\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c'+ ... b'\x0c\x0c\x0c\x0c\x0c\x0c\x0c') ... Data = (b'\x54\x65\x73\x74\x20\x57\x69\x74\x68\x20\x54\x72\x75'+ ... b'\x6e\x63\x61\x74\x69\x6f\x6e') ... HMAC_SHA_224 = (b'\x0e*\xeah\xa9\x0c\x8d7\xc9\x88\xbc\xdb\x9f\xcao\xa8'+ ... b'\t\x9c\xd8W\xc7\xecJ\x18\x15\xca\xc5L') ... HMAC_SHA_256 = (b'\xa3\xb6\x16ts\x10\x0e\xe0n\x0cyl)UU+\xfao|\nj\x8a'+ ... b'\xef\x8b\x93\xf8`\xaa\xb0\xcd \xc5') ... HMAC_SHA_384 = (b':\xbf4\xc3P;*#\xa4n\xfca\x9b\xae\xf8\x97\xf4\xc8\xe4'+ ... b',\x93L\xe5\\\xcb\xae\x97@\xfc\xbc\x1a\xf4\xcab&\x9e*'+ ... b'7\xcd\x88\xba\x92cA\xef\xe4\xae\xea') ... HMAC_SHA_512 = (b'A_\xadbqX\nS\x1dAy\xbc\x89\x1d\x87\xa6P\x18\x87\x07'+ ... b'\x92*O\xbb6f:\x1e\xb1m\xa0\x08q\x1c[P\xdd\xd0\xfc#P'+ ... b'\x84\xeb\x9d3d\xa1EO\xb2\xefg\xcd\x1d)\xfegs\x06\x8e'+ ... b'\xa2f\xe9k') ... >>> class _hmac_test_case_6: ... Key = (b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa') ... Data = (b'\x54\x65\x73\x74\x20\x55\x73\x69\x6e\x67\x20\x4c\x61'+ ... b'\x72\x67\x65\x72\x20\x54\x68\x61\x6e\x20\x42\x6c\x6f'+ ... b'\x63\x6b\x2d\x53\x69\x7a\x65\x20\x4b\x65\x79\x20\x2d'+ ... b'\x20\x48\x61\x73\x68\x20\x4b\x65\x79\x20\x46\x69\x72'+ ... b'\x73\x74') ... HMAC_SHA_224 = (b'\x95\xe9\xa0\xdb\x96\x20\x95\xad\xae\xbe\x9b\x2d\x6f'+ ... b'\x0d\xbc\xe2\xd4\x99\xf1\x12\xf2\xd2\xb7\x27\x3f\xa6'+ ... b'\x87\x0e') ... HMAC_SHA_256 = (b'\x60\xe4\x31\x59\x1e\xe0\xb6\x7f\x0d\x8a\x26\xaa\xcb'+ ... b'\xf5\xb7\x7f\x8e\x0b\xc6\x21\x37\x28\xc5\x14\x05\x46'+ ... b'\x04\x0f\x0e\xe3\x7f\x54') ... HMAC_SHA_384 = (b'\x4e\xce\x08\x44\x85\x81\x3e\x90\x88\xd2\xc6\x3a\x04'+ ... b'\x1b\xc5\xb4\x4f\x9e\xf1\x01\x2a\x2b\x58\x8f\x3c\xd1'+ ... b'\x1f\x05\x03\x3a\xc4\xc6\x0c\x2e\xf6\xab\x40\x30\xfe'+ ... b'\x82\x96\x24\x8d\xf1\x63\xf4\x49\x52') ... HMAC_SHA_512 = (b'\x80\xb2\x42\x63\xc7\xc1\xa3\xeb\xb7\x14\x93\xc1\xdd'+ ... b'\x7b\xe8\xb4\x9b\x46\xd1\xf4\x1b\x4a\xee\xc1\x12\x1b'+ ... b'\x01\x37\x83\xf8\xf3\x52\x6b\x56\xd0\x37\xe0\x5f\x25'+ ... b'\x98\xbd\x0f\xd2\x21\x5d\x6a\x1e\x52\x95\xe6\x4f\x73'+ ... b'\xf6\x3f\x0a\xec\x8b\x91\x5a\x98\x5d\x78\x65\x98') ... >>> class _hmac_test_case_7: ... Key = (b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'+ ... b'\xaa') ... Data = (b'\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73'+ ... b'\x74\x20\x75\x73\x69\x6e\x67\x20\x61\x20\x6c\x61\x72'+ ... b'\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63'+ ... b'\x6b\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20\x61\x6e'+ ... b'\x64\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68'+ ... b'\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65'+ ... b'\x20\x64\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b\x65'+ ... b'\x79\x20\x6e\x65\x65\x64\x73\x20\x74\x6f\x20\x62\x65'+ ... b'\x20\x68\x61\x73\x68\x65\x64\x20\x62\x65\x66\x6f\x72'+ ... b'\x65\x20\x62\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20'+ ... b'\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41\x43\x20\x61'+ ... b'\x6c\x67\x6f\x72\x69\x74\x68\x6d\x2e') ... HMAC_SHA_224 = (b'\x3a\x85\x41\x66\xac\x5d\x9f\x02\x3f\x54\xd5\x17\xd0'+ ... b'\xb3\x9d\xbd\x94\x67\x70\xdb\x9c\x2b\x95\xc9\xf6\xf5'+ ... b'\x65\xd1') ... HMAC_SHA_256 = (b'\x9b\x09\xff\xa7\x1b\x94\x2f\xcb\x27\x63\x5f\xbc\xd5'+ ... b'\xb0\xe9\x44\xbf\xdc\x63\x64\x4f\x07\x13\x93\x8a\x7f'+ ... b'\x51\x53\x5c\x3a\x35\xe2') ... HMAC_SHA_384 = (b'\x66\x17\x17\x8e\x94\x1f\x02\x0d\x35\x1e\x2f\x25\x4e'+ ... b'\x8f\xd3\x2c\x60\x24\x20\xfe\xb0\xb8\xfb\x9a\xdc\xce'+ ... b'\xbb\x82\x46\x1e\x99\xc5\xa6\x78\xcc\x31\xe7\x99\x17'+ ... b'\x6d\x38\x60\xe6\x11\x0c\x46\x52\x3e') ... HMAC_SHA_512 = (b'\xe3\x7b\x6a\x77\x5d\xc8\x7d\xba\xa4\xdf\xa9\xf9\x6e'+ ... b'\x5e\x3f\xfd\xde\xbd\x71\xf8\x86\x72\x89\x86\x5d\xf5'+ ... b'\xa3\x2d\x20\xcd\xc9\x44\xb6\x02\x2c\xac\x3c\x49\x82'+ ... b'\xb1\x0d\x5e\xeb\x55\xc3\xe4\xde\x15\x13\x46\x76\xfb'+ ... b'\x6d\xe0\x44\x60\x65\xc9\x74\x40\xfa\x8c\x6a\x58') ... >>> def _all_hmac_sha2_tests(): ... from scapy.layers.tls.crypto.h_mac import (Hmac_SHA224, Hmac_SHA256, ... Hmac_SHA384, Hmac_SHA512) ... res = True ... for t in [_hmac_test_case_1, _hmac_test_case_2, _hmac_test_case_3, ... _hmac_test_case_4, _hmac_test_case_5, _hmac_test_case_6, ... _hmac_test_case_7 ]: ... tmp = ((Hmac_SHA224(t.Key).digest(t.Data) == t.HMAC_SHA_224) and ... (Hmac_SHA256(t.Key).digest(t.Data) == t.HMAC_SHA_256) and ... (Hmac_SHA384(t.Key).digest(t.Data) == t.HMAC_SHA_384) and ... (Hmac_SHA512(t.Key).digest(t.Data) == t.HMAC_SHA_512)) ... res = res and tmp ... return res ... >>> _all_hmac_sha2_tests() True ###### ## Test PRFs and associated methods ###### ###(005)=[passed] Crypto - _tls_P_MD5 behavior on test vectors borrowed from RFC 2202 (+ errata) >>> from scapy.layers.tls.crypto.prf import _tls_P_MD5 >>> t1 = _tls_P_MD5(b'\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b', "Hi There", 64) == b'8\x99\xc0\xb8!\xd7}RI\xb2\xbb\x8e\xbe\xf8\x97Y\xcc\xffL\xae\xc3I\x8f\x7f .\x81\xe0\xce\x1a\x82\xbd\x19\xa0\x16\x10P}\xf0\xda\xdc\xa0>\xc4,\xa1\xcfS`\x85\xc5\x084+QN31b\xd7%L\x9d\xdc' >>> t2 = _tls_P_MD5(b"Jefe", b"what do ya want for nothing?", 64) == b"\xec\x99'|,\xd5gj\x82\xb9\xa0\x12\xdb\x83\xd3\xa3\x93\x19\xa6N\x89g\x99\xc2!9\xd8\xcf\xc1WTi\xc4D \x19l\x03\xa8PCo\x10`-\x98\xd0\xe1\xbc\xefAJkx\x95\x0c\x08*\xd6C\x8fS\x0e\xd9" >>> t3 = _tls_P_MD5(b'\xaa'*16,b'\xdd'*50, 64) == b'\xe5_\xe8.l\xee\xd8AP\xfc$$\xda\tX\x93O\xa7\xd2\xe2\xa2\xa9\x02\xa1\x07t\x19\xd1\xe3%\x80\x19\rV\x19\x0f\xfa\x01\xce\x0eJ\x7fN\xdf\xed\xb5lS\x06\xb5|\x96\xa6\x1cc)h\x88\x8d\x0c@\xfdX\xaa' >>> t4 = _tls_P_MD5(b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19', b'\xcd'*50, 64) == b'\x8e\xa6\x1f\x82\x1e\xad\xbe4q\x93\xf4\x1c\xb7\x87\xb3\x15\x13F\x8b\xfd\x89m\x0e\xa6\xdc\xe9\xceZ\xcdOc>gN\xa4\x9cK\xf89\xfc6\t%T=j\xf0\x0f\xfdl\xbf\xfbj\xc4$zR"\xf4\xa4=\x18\x8b\x8d' >>> t5 = _tls_P_MD5(b'\x0c'*16, b"Test With Truncation", 64) == b'\xb3>\xfaj\xc8\x95S\xcd\xdd\xea\x8b\xee7\xa5ru\xf4\x00\xd6\xed\xd5\x9aH\x1f,F\xb6\x93\r\xc3Z<"\x1e\xf7rx\xf0\xd7\x0f`zy\xe9\r\xb4\xf4}\xab2\xa5\xfe\xd0z@\x87\xc1c\x8b\xa0\xc8\xf5\x0bd' >>> t6 = _tls_P_MD5(b'\xaa'*80, b"Test Using Larger Than Block-Size Key - Hash Key First", 64) == b';\xcf\xa4\xd8\xccH\xa0\xa4\xf1\x10d\xfa\xd4\xb1\x7f\xda\x80\xf6\xe2\xb9\xf4\xd3WtS\x1c\x83\xb4(\x94\xfe\xa7\xb9\xc1\xcd\xf9\xe7\xae\xbc\x0c\x0f\xbae\xc3\x9e\x11\xe2+\x11\xe9\xd4\x8fK&\x99\xfe[\xfa\x02\x85\xb4\xd8\x8e\xdf' >>> t7 = _tls_P_MD5(b'\xaa'*80, b"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 64) == b'\x12\x06EI1\x81fP\x8dn\xa6WC\xfb\xbf\x1e\xefC[|\x0f\x05w\x14@\xfc\xa5 \xeak\xc9\xb9\x1c&\x80\x81.\x85#\xa9\x0ff\xea\xaa\x01"v\'\xd8X"\xbd\xa2\x86\xbd\xe3?6\xc7|\xc6WNO' >>> t1 and t2 and t3 and t4 and t5 and t6 and t7 True ###(006)=[passed] Crypto - _tls_P_SHA1 behavior on test vectors borrowed from RFC 2202 (+ errata) >>> from scapy.layers.tls.crypto.prf import _tls_P_SHA1 >>> t1 = _tls_P_SHA1(b'\x0b'*20, b"Hi There", 80) == b'\x13\r\x11Q7(\xc1\xad\x7f>%m\xfc\x08\xb6\xb9$\xb1MG\xe4\x9c\xcdY\x0e\\T\xd0\x8f\x1a-O@`\xd2\x9eV_\xfd\xed\x1f\x93V\xfb\x18\xb6\xbclq3A\xa2\x87\xb1u\xfc\xb3RQ\x19;#\n(\xd2o%lB\x8b\x01\x89\x1c6m"\xc3\xe2\xa0\xe7' >>> t2 = _tls_P_SHA1(b'Jefe', b"what do ya want for nothing?", 80) == b'\xba\xc4i\xf1\xa0\xc5eO\x844\xb6\xbd%L\xe1\xfe\xef\x08\x00\x1c^l\xaf\xbbN\x9f\xd8\xe5}\x87U\xc1\xd2&4zu\x9a1\xef\xd6M+\x1e\x84\xb4\xcb\xc9\xa7\n\x90f\x8aJ\xde\xd5\xa4\x8f,D\xe8.\x98\x9c)\xc7hlct\x1em(\xb73b[L\x96c' >>> t3 = _tls_P_SHA1(b'\xaa'*20, b'\xdd'*50, 80) == b'Lm\x848}\xe8?\x88\x82\x85\xc3\xe6\xc9\x1f\x80Z\xf5D\xeeI\xa1m\x08h)\xea>> t4 = _tls_P_SHA1(b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19', b'\xcd'*50, 80) == b'\xd6\xe4\x8a\x91\xb3\xac\xe16\x9d\x10s\xf1\x1bu\x96(6f\xed\xd8x\x19\xcd<:\x15\xb2z\xc1\xa9\xdf\x89=\xeb!\xfb\n\x0e\xdf0\xb9\xb5\xa96\xcf\x9b\xd4\xcaD\x12Y1[p\xb9\xf9\xbb=\xa9\xcd\xb7\xe0L\xb00\xafK\xc4\x9c\xc6?#\xb6$\xebM\x1a\xba;3' >>> t5 = _tls_P_SHA1(b'\x0c'*20, b"Test With Truncation", 80) == b'`\x1d\xe4\x98Q\xa1\xdbW\xc5a\xa9@\x8fQ\x86\xfc\x17\xca\xda\x1a\xdd\xb8\xab\x94M_Y\xd1%Pj\xfc\xd4\xca\x82\x88\xdb\x04\xf9F\xbe\xbf\xecR\xa4\x0c}[\x8e\xc7\xdf\x88I:\xea2v\xbe\x06\x8fcx\xf1Q\xb7z1\x1455?\xc0_\xda\xbb;\xa6Q\xb3\xc5' >>> t6 = _tls_P_SHA1(b'\xaa'*80, b"Test Using Larger Than Block-Size Key - Hash Key First", 80) == b'\x00W\xbaq>^\x047;\xcezY}\x16\xc6\xf10\x80:\xe2K\x87i{\xc7V\xad2\xda=\xf3d7\x047\xf7r\xf1&\x04\xb1\xd1\xf8\x88H\'\r\x08\xc4\x81\xa3\xa1Q\xa5\x90\xed\xef\xd8\x9c\x14\xdc\x80\xab){3\xde\x87\x8a\x1e"\x1e\xad54rM\x94\xe1\xb8' >>> t7 = _tls_P_SHA1(b'\xaa'*80, b"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 80) == b'N/PKC\x1d\xb5[}gUk\xc7\xaf\xb4-\xef\x9e\xe63$E=\xfc\xc4\xd0l]EA\x84\xb0\x1e\x91]\xcc[\x0e-\xec\xd5\x90\x19,\xc6\xffn\xf8\xbe1Ck\xe6\x9cF*\x8c"_\x05\x14%h\x98\xa1\xc2\xf1bCt\xd4S\xc1:{\x96\xa4\x14c ' >>> t1 and t2 and t3 and t4 and t5 and t6 and t7 True ###(007)=[passed] Crypto - _tls_PRF behavior on test vectors borrowed from RFC 2202 (+ errata) >>> from scapy.layers.tls.crypto.prf import _tls_PRF >>> t1 = _tls_PRF(b'\x0b'*20, b"Test Label XXXX", b"Hi There", 80) == b'E\xcc\xeb\x12\x0b<\xbfh\x1f\xc3\xd3%J\x85\xdeQ\t\xbc[\xcd.\xbe\x170\xf2\xebm\xe6g\x05x\xad\x86V\x0b\xb3\xb7\xe5i\x7fh}T\xe5$\xe4\xba\xa0\xc6\xf0\xf1\xb1\xe1\x8a\xf5\xcc\x9ab\x1c\xc9\x10\x82\x93\x82Q\xd2\x80\xf0\xf8\x0f\x03\xe2\xbe\xc3\x94T\x05\xben\x9e' >>> t2 = _tls_PRF(b'Jefe', b"Test Label YYYYYYY", b"what do ya want for nothing?", 80) == b'n\xbet\x06\x82\x87\xcd\xea\xd9\x8b\xf8J\x17\x07\x84\xbc\xf3\x07\x9a\x99\n\xa6,\x97\xe6CRO\x7f\x0e[,\xa9\x83\xe6\xce?6\x12x\xc8Q\x00kO\x06s\xc5\xd7\xda\x1fd_\xe8\xad\xd4\xea\xfe\xd8\xc8 \x92e\x80\x8a\xafxF\xd6-/\x14\x94\x05a\x94\x0b\x1d\xf83' >>> t3 = _tls_PRF(b'\xaa'*20, b"Test Label ZZ", b'\xdd'*50, 80) == b"Ad\xe2B\xa0\xb0+G#\x0f%\x19\xae\xdd\xb1d\xa0\x99\x15\x98\xa43c?\xaa\xd1\xc0\xf7\xc39V\xcb\x9b}\x95T\xd9\xde \xecr{/\xfb\x018\xeeR \x18Awi\x86=\xb4rg\x13\\\xaf<\x17\xd3_\xc5'U[\xa5\x83\xfa<\xa6\xc9\xdd\x85l\x1a\xdb" >>> t4 = _tls_PRF(b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19', b"Test Label UUUUUUUUUUUUUUU", b'\xcd'*50, 80) == b'<\xf0\xe9\xaa\x95w\t\xa7\xb0!w\xf1EoC\x8fJ\x1f\xec\x80.\x89X\xe3O4Vl\xd1\xb7]\xa1\xb9o\xdf/&!\xb8n\xeb\x04"\xeftxs 6E+\xf1\xb3\xb6/vd\xd1h\xa3\x80>\x83Y\xbd]\xda\xab\xb8\xd8\x01\xc5b3K\xe7\x08\r\x12\x14' >>> t5 = _tls_PRF(b'\x0c'*20, b"Test Label KKKKKKKKK", b"Test With Truncation", 80) == b"gq\xa5\xc4\xf5\x86z.\x03\n\xa3\x85\x87\xbc\xabm\xf1\xd2\x06\xf6\xbc\xc8\xab\xf0\xee\xd2>e'!\xd3zW\x81\x10|^(\x8d~\xa5s&p\xef]\rDa\x113\xa6z\x9f\xf2\xe2_}\xd8.u\xbe\xb1\x7fx\xe0r~\xdc\xa2\x0f\xcd\xcd\x1d\x81\x1a`#\xc6O" >>> t6 = _tls_PRF(b'\xaa'*80, b"Test Label PPPPPPPPP", b"Test Using Larger Than Block-Size Key - Hash Key First", 80) == b'\x994^fx\x17\xbaaj\xc0"\xd1g\xbfh#uE\xee\xd8\xf1,\xab\xe7w\xfa\xc8\x0c\xf9\xcd\xbb\xbb\xa71U\xbe\xeb@\x90\xc2\x04\x93\xa5\xcf\x8e\xda\xbb\x93n\x99^\xa2{\x8b{\x18\xd7\xf7e\x8a~\xfbA\xdd\xc3\xd9\x9b\x1c\x82$\xf5YX{\xaa\xb4\xf2\x04\xb3%' >>> t7 = _tls_PRF(b'\xaa'*80, b"Test Label MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM", b"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 80) == b'\xd6N\x12S\x18]\x87\x19\xacD\x1b4\xc3"\xc2\xd9J\xb8\xee/\xb0?\xc2_\x10\xb2\x196\xdaXC\xe0Ft\xd3:a\xcd\xb8\xdd\x8a\xb6\xb1\xc6sx\xb8\x87\x8a\x93\xf8~\xad\xc7\xd1\xa7I=\xceVW\x0f\x9a\xcc-\x8cv^o\x12\xa4\xcd\x10\xb1\xb0\x1f\xdd\x94,\x03' >>> t1 and t2 and t3 and t4 and t5 and t6 and t7 True ###(008)=[passed] Crypto - _ssl_PRF behavior on test vectors >>> from scapy.layers.tls.crypto.prf import _ssl_PRF >>> t1 = _ssl_PRF(b'\x0b'*20, b"Hi There", 80) == b'\x0fo\xbe9\x83>~Bc\xaea^\x86\xd2b\x94X\xfd9Be\xe799\xf2\x00\xfcS\xd6\x1c=\xe5\x7fin\x1e\xf9r\xc8\xe6k\x19K\x8a\x85SK\xe5\xb7;A\x19b\x86F3M\x8d=\xcf\x15\xeedo\xd3\xae\xa2\x95\x8e\x80\x13\xabG\x8d\x1c,\x8c\xab\xf7\xd4' >>> t2 = _ssl_PRF(b'Jefe', b"what do ya want for nothing?", 80) == b'\x19\x9f\xb9{\x87.\xd0\xf5\xc4\t.\xb6#\xae\x95\xe0S~\x15\xce\xe6\xb7oe\xad\x127\xb8\xc2C?\r\x87\xa6\x7f\x86y\xfa\xae\xcf\x0e\xb9\x01\xa5B\x07\x9d\x95\xf1]\xdc\x1bCb&T\xa0\xb0\x8a3\xcf\\\xaf\xe8j/\xbdx\x13\\\x91\xc8\xdfZ\xde"R`K\xd6' >>> t3 = _ssl_PRF(b'\xaa'*20, b'\xdd'*50, 80) == b'\xe3*\xce\xdc?k{\x10\x80\x8dt\x0e\xdaA\xf9}\x1d\x8e|\xc9Ux\x88\\\xf1a\xcfJ\xedi\xc1[C-\xf3\xa4\xcc\xf9\xce\xa3P\xe3\x9ai\x0b\xb7\xce\x8bar\x93\xc5\x93\x1a\x82\xc8{\x1c\xf2\x87\x9d\xe1\xf5\x9e\x0c\xf6\xa6\x91\xb9\x97\x17Y,\x11\x00\rs\xdd\xcf]' >>> t4 = _ssl_PRF(b'\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19', b'\xcd'*50, 80) == b"\x8c\x83!h\x1b\xf2\x96f\x04\x15\x80H\x88\xcb\x80\x03\xc0\xfc\x05\xe5q\x93]\xeb\t\xd4B\xbc\xa4{\xb9\xd8\xb6IF\xc2\x80\x87\x9e2*\x82\x0ef\xc8\xbbBi\xb15\x90\xd6MW\xebM\xd7\xf9u\xd5+\xa8\x81\x11'\x8c\x88]b\r,\xde\xd9d[t\t\x199\x0b" >>> t5 = _ssl_PRF(b'\x0c'*20, b"Test With Truncation", 80) == b"\x85\xf5\xe8\xd2\xddW$\x14\xde\x84\x08@\xca\x86\x8bZn\x07\x87AKg\x18\xc3\x1a'\xc2\xb9\xdd\x17\xb5K1\xb9\x9a=\xe4\x1f/\xfe\xa6\x96\x10\x0c\x15@:z\xbf\x1dM\xa3\x90\x01\xb67\x07Z\xe0\xfe}U=\x81\xb2~\xc6\x1a\xcb\xe7\x9b\x90+\xa0\x86\xb2\x8b\xae\xc7\x9f" >>> t6 = _ssl_PRF(b'\xaa'*80, b"Test Using Larger Than Block-Size Key - Hash Key First", 80) == b'\x99\x11\x92\x8dw\xf1\xab\xdfr\x96S\xf5\xc1\x96\xc0\x16W*=\xa49\xd0\xf0\xf15\x91le\xda\x16\xfe8\x834kC3\x1b\xdf\xfc\xd8\x82\xe1\x9c\xfe9(4\xf9\x9c\x12\xc5~\xd1\xdc\xf3\xe5\x91\xbd\xbb\xb5$\x1c\xe4fs\xf2\xedM\xb7pO\x17\xdf\x01K\xf8\xed2-' >>> t7 = _ssl_PRF(b'\xaa'*80, b"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 80) == b"\x8esl|C\x81\x80vv\xe1\x89H\xc9'oC\x1b\xbe\xc3\xbbE\x04)\xed\x1c\x84\xa9)\x08\xf5\xeb-\x93\xe9\x0f}\xeb[\xc4w\xd53y$\x07\xdc\x0f\\\xfc\xb2\x05r+\x13\xd8\xc3\xe7Lsz\xa1\x03\x93\xdd-\xf9l\xb7\xe6\xb3\x7fM\xfa\x90\xadeo\xcer*" >>> t1 and t2 and t3 and t4 and t5 and t6 and t7 True ###(009)=[passed] Crypto - _tls12_*_PRF behavior, using SHA-256, SHA-384 and SHA-512 >>> from scapy.layers.tls.crypto.prf import PRF >>> class _prf_tls12_sha256_test: ... h= "SHA256" ... k= b"\x9b\xbe\x43\x6b\xa9\x40\xf0\x17\xb1\x76\x52\x84\x9a\x71\xdb\x35" ... s= b"\xa0\xba\x9f\x93\x6c\xda\x31\x18\x27\xa6\xf7\x96\xff\xd5\x19\x8c" ... o=(b"\xe3\xf2\x29\xba\x72\x7b\xe1\x7b\x8d\x12\x26\x20\x55\x7c\xd4\x53" + ... b"\xc2\xaa\xb2\x1d\x07\xc3\xd4\x95\x32\x9b\x52\xd4\xe6\x1e\xdb\x5a") ... >>> class _prf_tls12_sha384_test: ... h= "SHA384" ... k= b"\xb8\x0b\x73\x3d\x6c\xee\xfc\xdc\x71\x56\x6e\xa4\x8e\x55\x67\xdf" ... s= b"\xcd\x66\x5c\xf6\xa8\x44\x7d\xd6\xff\x8b\x27\x55\x5e\xdb\x74\x65" ... o=(b"\x7b\x0c\x18\xe9\xce\xd4\x10\xed\x18\x04\xf2\xcf\xa3\x4a\x33\x6a" + ... b"\x1c\x14\xdf\xfb\x49\x00\xbb\x5f\xd7\x94\x21\x07\xe8\x1c\x83\xcd") ... >>> class _prf_tls12_sha512_test: ... h= "SHA512" ... k= b"\xb0\x32\x35\x23\xc1\x85\x35\x99\x58\x4d\x88\x56\x8b\xbb\x05\xeb" ... s= b"\xd4\x64\x0e\x12\xe4\xbc\xdb\xfb\x43\x7f\x03\xe6\xae\x41\x8e\xe5" ... o=(b"\x12\x61\xf5\x88\xc7\x98\xc5\xc2\x01\xff\x03\x6e\x7a\x9c\xb5\xed" + ... b"\xcd\x7f\xe3\xf9\x4c\x66\x9a\x12\x2a\x46\x38\xd7\xd5\x08\xb2\x83") ... >>> def _all_prf_tls12_tests(): ... res = True ... for t in [ _prf_tls12_sha256_test, ... _prf_tls12_sha384_test, ... _prf_tls12_sha512_test ]: ... p = PRF(tls_version=0x303, hash_name=t.h) ... tmp = p.prf(t.k, b"test label", t.s, 32) == t.o ... res = res and tmp ... return res ... >>> _all_prf_tls12_tests() True ###(010)=[passed] Crypto - compute_master_secret() in SSL mode >>> f = PRF(tls_version=0x300) >>> t1 = f.compute_master_secret(b"A"*48, b"B"*32, b"C"*32) == b'\xe8\xb5O68e\x8c\x1e\xd0hD!\xc1Zk\x9e\xc7x3\xfc".\xf9\x17\xd5B\xfc\xef\x8d\xed\x9fP\xcer\x83|6\x02\xe0\x86\xda\xab-G\x8c\xa9H5' >>> t2 = f.compute_master_secret(b"A"*48, b"C"*32, b"B"*32) == b'Ts/q\x83\x88\x10\x9c1Y\xff\xf3vo\xe3\x8aM\x9b\xa3k[J\xeeWXs\xcfTe\x19\xc6\xb1\x0ebj1}\x0c\xca\x97=|\x88W\xd8q\xfb|' >>> t3 = f.compute_master_secret(b"C"*48, b"A"*32, b"B"*32) == b'Q\xde\x06L\xdb\xe9\x9dC\x19\x8a:m@\xce\xbf\xc0\n\xd8\xd4H!#\x06\xad\x929\x85\xc9@\x1f\xb5\xe2)^{c\x94\x06&\xad\xb56\x13^\xd6\xa5\x19\xe7' >>> t4 = f.compute_master_secret(b"D"*48, b"B"*32, b"A"*32) == b'\xbe\x9a\xc8)\xb5{.H1\x8382\xc2\xdff\xdf@\xda\xde\x88\xe1\xf3\xad9\xcc\x14\xb1\x7f\x90\x00;B)\x8c\xdb\xdbH\xfe=%^\xe9\x83\x0eV\x86\x83\x8d' >>> t1 and t2 and t3 and t4 True ###(011)=[passed] Crypto - derive_key_block() in SSL mode >>> t1 = f.derive_key_block(b"A"*48, b"B"*32, b"C"*32, 72) == b'\xe8\xb5O68e\x8c\x1e\xd0hD!\xc1Zk\x9e\xc7x3\xfc".\xf9\x17\xd5B\xfc\xef\x8d\xed\x9fP\xcer\x83|6\x02\xe0\x86\xda\xab-G\x8c\xa9H5\xdf\x14\xa9\xcfV\r\xea}\x98\x04\x8dK,\xb6\xf7;\xaa\xa8\xa5\xad\x7f\x0fCY' >>> t2 = f.derive_key_block(b"A"*48, b"C"*32, b"B"*32, 72) == b'Ts/q\x83\x88\x10\x9c1Y\xff\xf3vo\xe3\x8aM\x9b\xa3k[J\xeeWXs\xcfTe\x19\xc6\xb1\x0ebj1}\x0c\xca\x97=|\x88W\xd8q\xfb|\x17\x99\nH;\xec\xd2\x15\xabd\xed\xc3\xe0p\xd8\x1eS\xb5\xf4*8\xceE^' >>> t3 = f.derive_key_block(b"C"*48, b"A"*32, b"B"*32, 72) == b'Q\xde\x06L\xdb\xe9\x9dC\x19\x8a:m@\xce\xbf\xc0\n\xd8\xd4H!#\x06\xad\x929\x85\xc9@\x1f\xb5\xe2)^{c\x94\x06&\xad\xb56\x13^\xd6\xa5\x19\xe7\xed\xd6\x92\xe0O\x0e\xbf\xc6\x97\x9f~\x95\xcf\xb0\xe7a\x1d\xbc]\xf4&Z\x81J' >>> t4 = f.derive_key_block(b"D"*48, b"B"*32, b"A"*32, 72) == b'\xbe\x9a\xc8)\xb5{.H1\x8382\xc2\xdff\xdf@\xda\xde\x88\xe1\xf3\xad9\xcc\x14\xb1\x7f\x90\x00;B)\x8c\xdb\xdbH\xfe=%^\xe9\x83\x0eV\x86\x83\x8d\xeal\x8ea\x08\x9d\xb3\xf3\xf4\xa6[\'j\xda\rT"\x10\xa5Z\n\xc0r\xf3' >>> t1 and t2 and t3 and t4 True ###(012)=[passed] Crypto - compute_master_secret() in TLS 1.0 mode >>> from scapy.layers.tls.crypto.prf import PRF >>> f = PRF(tls_version=0x301) >>> t1 = f.compute_master_secret(b"A"*48, b"B"*32, b"C"*32) == b"k\\[e\x11\xab\xfe6\trN\x9e\x8d\xb09{\x17\x8d\x9f\xc6_' G\x05\x08}\xf7Q\x8e\xcb\xff\x00\xfc7\xd0\xf0z\xea\x8b\x98%\x90\x89sd\x98\xa1" >>> t2 = f.compute_master_secret(b"A"*48, b"C"*32, b"B"*32) == b'k\xd2\xf7\x1aqt\xa4~\x9bqf\x0f:\xc4%\x9a\x07\x17\x14\xf4\xdf&)*\x1c\x9c8\x8em\xe1\x13\x17\xa7\xd2\x051Q>> t3 = f.compute_master_secret(b"C"*48, b"A"*32, b"B"*32) == b'\xe57\xae.,B\xeb(/?\xf4tR#\xd0\xa9"\xf7-\x9d\x0e\xd7\xd9\x1c\x1f\x9b\x95\xe6\xd0\x0e(\x06W7s(^"x\xbb\xdb\xb6\xae\xf75J\x0f\xbf' >>> t4 = f.compute_master_secret(b"D"*48, b"B"*32, b"A"*32) == b'\xeb3\xf5Ty\x08xqP\x01p\x12\x95\xd4\xf5y{\xe7\xea5\nS\xb1T\xea\xe3d\x8b\xd7\xb89\xcf\xb9\xe0l\x95d\xbd-\x97\xea\xf20n\x96t\xfe\xff' >>> t1 and t2 and t3 and t4 True ###(013)=[passed] Crypto - derive_key_block() in TLS 1.0 mode >>> t1 = f.derive_key_block(b"A"*48, b"B"*32, b"C"*32, 72) == b'\x06\xccA\xd5\xf3\x9dT`ZC!/\xa0\xbe\x95\x86m\xdb@\x18\xfb\x95\xad\xcd\xac<(K\x88\xacB\x92s\x8d7AVG\xf04\x0be\x8dv\x02\xd6\x03\x7f\xe4\x8eYe\x88\xb7YI\xc2\xf0!\x1dSx\x86\xdeY\x81\x89\x11\xa6\xd9\xd1\xed' >>> t2 = f.derive_key_block(b"A"*48, b"C"*32, b"B"*32, 72) == b"\\@d\x1d9V\xae\xe2'\xf6Q\xc9\xd7\x8beu\xe8u\xd9\xe8\r\x18a\x8c|\xde\x95H\xec\xc5}I\xf9s(e\xe4\x87*s\x98=\x96wsj\xfe\x0euo\x1f\\1hh-\x0f\xda9\x9etk\x0fW\x03\xe2k\xb0\x87Pb3" >>> t3 = f.derive_key_block(b"C"*48, b"A"*32, b"B"*32, 72) == b'\x9c\xaate\x07\x12K\xb2\xc3zT1\xf4\x1fN\xa8\x03\xbd\xcfF_\x0c\x0bF\x14\x8f\xcf\x08c\xa6\x80\x1d\xd8Wh.E\xf5\x9a\xfd\x1d\x8a6\xf7\x950\xf4\xbcm\x89\xa6!\x7fc\x19D\xb4\xcc\x8f\xf7x\x12\xe0q\x17\x84-\xcc[\x7f@p' >>> t4 = f.derive_key_block(b"D"*48, b"B"*32, b"A"*32, 72) == b't{P+k\xe1\xe5O\xbe]L?$\x8d7O.\xe6\xd6\xa8\x19U\x87\x04%\x13m+_\xb9\x99\x03\xe1\xfd1]*7\x8d\xa0Xx\xa1\xd1\xfe\x0c\xb1\xb1\xa8\xdd\x0c\xb20@v\xb6\xdc\x86d\n\x8a-\x95\xaeL\x97\xfaFjl\xfb^' >>> t1 and t2 and t3 and t4 True ###### ## Test RC4 ###### ###(014)=[passed] Crypto - RC4 stream cipher, encryption/decryption checks from RFC 6229 >>> class _rc4_40_test: ... k= b"\x01\x02\x03\x04\x05" ... s=(b"\xb2\x39\x63\x05\xf0\x3d\xc0\x27\xcc\xc3\x52\x4a\x0a\x11\x18\xa8" + ... b"\x69\x82\x94\x4f\x18\xfc\x82\xd5\x89\xc4\x03\xa4\x7a\x0d\x09\x19") ... s_1024= b"\x30\xab\xbc\xc7\xc2\x0b\x01\x60\x9f\x23\xee\x2d\x5f\x6b\xb7\xdf" ... >>> class _rc4_128_test: ... k= b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10" ... s=(b"\x9a\xc7\xcc\x9a\x60\x9d\x1e\xf7\xb2\x93\x28\x99\xcd\xe4\x1b\x97" ... b"\x52\x48\xc4\x95\x90\x14\x12\x6a\x6e\x8a\x84\xf1\x1d\x1a\x9e\x1c") ... s_1024=b"\xbd\xf0\x32\x4e\x60\x83\xdc\xc6\xd3\xce\xdd\x3c\xa8\xc5\x3c\x16" ... >>> def _all_rc4_tests(): ... from scapy.layers.tls.crypto.cipher_stream import (Cipher_RC4_40, ... Cipher_RC4_128) ... res = True ... t = _rc4_40_test ... c = Cipher_RC4_40(t.k).encrypt(b"\x00"*(1024+16)) ... res = res and (c[:32] == t.s) and (c[-16:] == t.s_1024) ... res = res and Cipher_RC4_40(t.k).decrypt(t.s) == b"\x00"*32 ... t = _rc4_128_test ... c = Cipher_RC4_128(t.k).encrypt(b"\x00"*(1024+16)) ... res = res and (c[:32] == t.s) and (c[-16:] == t.s_1024) ... res = res and Cipher_RC4_128(t.k).decrypt(t.s) == b"\x00"*32 ... return res ... >>> _all_rc4_tests() True ###(015)=[passed] Crypto - RC2 block cipher, encryption/decryption checks from RFC 2268 >>> import binascii >>> class _rc2_128_cbc_test: ... k= binascii.unhexlify("88bca90e90875a7f0f79c384627bafb2") ... p= binascii.unhexlify("0000000000000000") ... c= binascii.unhexlify("2269552ab0f85ca6") ... iv=binascii.unhexlify("0000000000000000") ... >>> def _all_rc2_tests(): ... try: ... from scapy.layers.tls.crypto.cipher_block import Cipher_RC2_CBC ... res = True ... t = _rc2_128_cbc_test ... tmp = (Cipher_RC2_CBC(t.k, t.iv).encrypt(t.p) == t.c and ... Cipher_RC2_CBC(t.k, t.iv).decrypt(t.c) == t.p) ... res = res and tmp ... return res ... except ImportError: ... return True ... >>> _all_rc2_tests() True ###(016)=[passed] Crypto - DES cipher in CBC mode, check from FIPS PUB 81 >>> class _descbc_test: ... k= binascii.unhexlify("0123456789abcdef") ... p= binascii.unhexlify("4e6f77206973207468652074696d6520666f7220616c6c20") ... c= binascii.unhexlify("e5c7cdde872bf27c43e934008c389c0f683788499a7c05f6") ... iv=binascii.unhexlify("1234567890abcdef") ... >>> def _all_aes_cbc_tests(): ... from scapy.layers.tls.crypto.cipher_block import Cipher_DES_CBC ... res = True ... t = _descbc_test ... tmp = (Cipher_DES_CBC(t.k, t.iv).encrypt(t.p) == t.c and ... Cipher_DES_CBC(t.k, t.iv).decrypt(t.c) == t.p) ... res = res and tmp ... return res ... >>> _all_aes_cbc_tests() True ###(017)=[passed] Crypto - AES cipher in CBC mode, checks from RFC 3602 >>> class _aes128cbc_test_1: ... k= b"\x06\xa9\x21\x40\x36\xb8\xa1\x5b\x51\x2e\x03\xd5\x34\x12\x00\x06" ... p= b"Single block msg" ... c= b"\xe3\x53\x77\x9c\x10\x79\xae\xb8\x27\x08\x94\x2d\xbe\x77\x18\x1a" ... iv=b"\x3d\xaf\xba\x42\x9d\x9e\xb4\x30\xb4\x22\xda\x80\x2c\x9f\xac\x41" ... >>> class _aes128cbc_test_2: ... k= b"\x56\xe4\x7a\x38\xc5\x59\x89\x74\xbc\x46\x90\x3d\xba\x29\x03\x49" ... p=(b"\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf" + ... b"\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf" + ... b"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf" + ... b"\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf") ... c=(b"\xc3\x0e\x32\xff\xed\xc0\x77\x4e\x6a\xff\x6a\xf0\x86\x9f\x71\xaa" + ... b"\x0f\x3a\xf0\x7a\x9a\x31\xa9\xc6\x84\xdb\x20\x7e\xb0\xef\x8e\x4e" + ... b"\x35\x90\x7a\xa6\x32\xc3\xff\xdf\x86\x8b\xb7\xb2\x9d\x3d\x46\xad" + ... b"\x83\xce\x9f\x9a\x10\x2e\xe9\x9d\x49\xa5\x3e\x87\xf4\xc3\xda\x55") ... iv=b"\x8c\xe8\x2e\xef\xbe\xa0\xda\x3c\x44\x69\x9e\xd7\xdb\x51\xb7\xd9" ... >>> class _aes256cbc_test_1: ... k=(b"\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81" + ... b"\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4") ... p= b"\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a" ... c= b"\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6" ... iv=b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" ... >>> class _aes256cbc_test_2: ... k=(b"\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81" + ... b"\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4") ... p= b"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10" ... c= b"\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc\xda\x6c\x19\x07\x8c\x6a\x9d\x1b" ... iv=b"\x39\xF2\x33\x69\xA9\xD9\xBA\xCF\xA5\x30\xE2\x63\x04\x23\x14\x61" ... >>> def _all_aes_cbc_tests(): ... from scapy.layers.tls.crypto.cipher_block import (Cipher_AES_128_CBC, ... Cipher_AES_256_CBC) ... res = True ... for t in [_aes128cbc_test_1, _aes128cbc_test_2]: ... tmp = (Cipher_AES_128_CBC(t.k, t.iv).encrypt(t.p) == t.c and ... Cipher_AES_128_CBC(t.k, t.iv).decrypt(t.c) == t.p) ... res = res and tmp ... for t in [_aes256cbc_test_1, _aes256cbc_test_2]: ... tmp = (Cipher_AES_256_CBC(t.k, t.iv).encrypt(t.p) == t.c and ... Cipher_AES_256_CBC(t.k, t.iv).decrypt(t.c) == t.p) ... res = res and tmp ... return res ... >>> _all_aes_cbc_tests() True >>> >>> from scapy.layers.tls.crypto.pkcs1 import pkcs_os2ip, pkcs_i2osp ###(018)=[passed] Crypto - AES cipher in GCM mode, auth_encrypt() and auth_decrypt() checks >>> class _aes128gcm_test_1: ... k= b"\x4c\x80\xcd\xef\xbb\x5d\x10\xda\x90\x6a\xc7\x3c\x36\x13\xa6\x34" ... n= b"\x22\x43\x3c\x64\x48\x55\xec\x7d\x3a\x23\x4b\xfd" ... p=(b"\x08\x00\xc6\xcd\x02\x00\x07\x00\x61\x62\x63\x64\x65\x66\x67\x68" + ... b"\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x01\x02\x02\x01") ... a= b"\x00\x00\x43\x21\x87\x65\x43\x21\x00\x00\x00\x07" ... ct=(b"\x74\x75\x2e\x8a\xeb\x5d\x87\x3c\xd7\xc0\xf4\xac\xc3\x6c\x4b\xff" + ... b"\x84\xb7\xd7\xb9\x8f\x0c\xa8\xb6\xac\xda\x68\x94\xbc\x61\x90\x69" + ... b"\xef\x9c\xbc\x28\xfe\x1b\x56\xa7\xc4\xe0\xd5\x8c\x86\xcd\x2b\xc0") ... >>> class _aes128gcm_test_2: ... k= b"\x3d\xe0\x98\x74\xb3\x88\xe6\x49\x19\x88\xd0\xc3\x60\x7e\xae\x1f" ... n= b"\x57\x69\x0e\x43\x4e\x28\x00\x00\xa2\xfc\xa1\xa3" ... p=(b"\x45\x00\x00\x30\xda\x3a\x00\x00\x80\x01\xdf\x3b\xc0\xa8\x00\x05" + ... b"\xc0\xa8\x00\x01\x08\x00\xc6\xcd\x02\x00\x07\x00\x61\x62\x63\x64" + ... b"\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74" + ... b"\x01\x02\x02\x01") ... a= b"\x3f\x7e\xf6\x42\x10\x10\x10\x10\x10\x10\x10\x10" ... ct=(b"\xfb\xa2\xca\xa8\xc6\xc5\xf9\xf0\xf2\x2c\xa5\x4a\x06\x12\x10\xad" + ... b"\x3f\x6e\x57\x91\xcf\x1a\xca\x21\x0d\x11\x7c\xec\x9c\x35\x79\x17" + ... b"\x65\xac\xbd\x87\x01\xad\x79\x84\x5b\xf9\xfe\x3f\xba\x48\x7b\xc9" + ... b"\x63\x21\x93\x06\x84\xee\xca\xdb\x56\x91\x25\x46\xe7\xa9\x5c\x97" + ... b"\x40\xd7\xcb\x05") ... >>> class _aes256gcm_test_1: ... k=(b"\x6c\x65\x67\x61\x6c\x69\x7a\x65\x6d\x61\x72\x69\x6a\x75\x61\x6e" + ... b"\x61\x61\x6e\x64\x64\x6f\x69\x74\x62\x65\x66\x6f\x72\x65\x69\x61") ... n= b"\x74\x75\x72\x6e\x33\x30\x21\x69\x67\x65\x74\x6d" ... p=(b"\x45\x00\x00\x30\xda\x3a\x00\x00\x80\x01\xdf\x3b\xc0\xa8\x00\x05" + ... b"\xc0\xa8\x00\x01\x08\x00\xc6\xcd\x02\x00\x07\x00\x61\x62\x63\x64" + ... b"\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74" + ... b"\x01\x02\x02\x01") ... a= b"\x79\x6b\x69\x63\xff\xff\xff\xff\xff\xff\xff\xff" ... ct=(b"\xf9\x7a\xb2\xaa\x35\x6d\x8e\xdc\xe1\x76\x44\xac\x8c\x78\xe2\x5d" + ... b"\xd2\x4d\xed\xbb\x29\xeb\xf1\xb6\x4a\x27\x4b\x39\xb4\x9c\x3a\x86" + ... b"\x4c\xd3\xd7\x8c\xa4\xae\x68\xa3\x2b\x42\x45\x8f\xb5\x7d\xbe\x82" + ... b"\x1d\xcc\x63\xb9\xd0\x93\x7b\xa2\x94\x5f\x66\x93\x68\x66\x1a\x32" + ... b"\x9f\xb4\xc0\x53") ... >>> class _aes256gcm_test_2: ... # this funny plaintext is not our deed ... k=(b"\xab\xbc\xcd\xde\xf0\x01\x12\x23\x34\x45\x56\x67\x78\x89\x9a\xab" + ... b"\xab\xbc\xcd\xde\xf0\x01\x12\x23\x34\x45\x56\x67\x78\x89\x9a\xab") ... n= b"\x73\x61\x6c\x74\x61\x6e\x64\x01\x69\x76\x65\x63" ... p=(b"\x63\x69\x73\x63\x6f\x01\x72\x75\x6c\x65\x73\x01\x74\x68\x65\x01" + ... b"\x6e\x65\x74\x77\x65\x01\x64\x65\x66\x69\x6e\x65\x01\x74\x68\x65" + ... b"\x74\x65\x63\x68\x6e\x6f\x6c\x6f\x67\x69\x65\x73\x01\x74\x68\x61" + ... b"\x74\x77\x69\x6c\x6c\x01\x64\x65\x66\x69\x6e\x65\x74\x6f\x6d\x6f" + ... b"\x72\x72\x6f\x77\x01\x02\x02\x01") ... a= b"\x17\x40\x5e\x67\x15\x6f\x31\x26\xdd\x0d\xb9\x9b" ... ct=(b"\xd4\xb7\xed\x86\xa1\x77\x7f\x2e\xa1\x3d\x69\x73\xd3\x24\xc6\x9e" + ... b"\x7b\x43\xf8\x26\xfb\x56\x83\x12\x26\x50\x8b\xeb\xd2\xdc\xeb\x18" + ... b"\xd0\xa6\xdf\x10\xe5\x48\x7d\xf0\x74\x11\x3e\x14\xc6\x41\x02\x4e" + ... b"\x3e\x67\x73\xd9\x1a\x62\xee\x42\x9b\x04\x3a\x10\xe3\xef\xe6\xb0" + ... b"\x12\xa4\x93\x63\x41\x23\x64\xf8\xc0\xca\xc5\x87\xf2\x49\xe5\x6b" + ... b"\x11\xe2\x4f\x30\xe4\x4c\xcc\x76") ... >>> def _all_aes_gcm_tests(): ... from scapy.layers.tls.crypto.cipher_aead import (Cipher_AES_128_GCM, ... Cipher_AES_256_GCM) ... res = True ... ciphers = [] ... for t in [_aes128gcm_test_1, _aes128gcm_test_2]: ... c = Cipher_AES_128_GCM(key=t.k, fixed_iv=t.n[:4], ... nonce_explicit=pkcs_os2ip(t.n[4:])) ... ne = t.n[-c.nonce_explicit_len:] ... tup = ne, t.p, t.ct[-c.tag_len:] ... tmp1 = c.auth_decrypt(t.a, ne + t.ct, add_length=False) == tup ... tmp2 = c.auth_encrypt(t.p, t.a) == (ne + t.ct) ... res = res and tmp1 and tmp2 ... for t in [_aes256gcm_test_1, _aes256gcm_test_2]: ... c = Cipher_AES_256_GCM(key=t.k, fixed_iv=t.n[:4], ... nonce_explicit=pkcs_os2ip(t.n[4:])) ... ne = t.n[-c.nonce_explicit_len:] ... tup = ne, t.p, t.ct[-c.tag_len:] ... tmp1 = c.auth_decrypt(t.a, ne + t.ct, add_length=False) == tup ... tmp2 = c.auth_encrypt(t.p, t.a) == (ne + t.ct) ... res = res and tmp1 and tmp2 ... return res ... >>> _all_aes_gcm_tests() True ###(019)=[passed] Crypto - AES cipher in CCM mode, checks from IEEE P1619.1 >>> class _aes256ccm_test_1: ... k= b"\0"*32 ... n= b"\0"*12 ... p= b"\0"*16 ... a= b"" ... ct=(b"\xc1\x94\x40\x44\xc8\xe7\xaa\x95\xd2\xde\x95\x13\xc7\xf3\xdd\x8c" + ... b"\x4b\x0a\x3e\x5e\x51\xf1\x51\xeb\x0f\xfa\xe7\xc4\x3d\x01\x0f\xdb") ... >>> class _aes256ccm_test_2: ... k=(b"\xfb\x76\x15\xb2\x3d\x80\x89\x1d\xd4\x70\x98\x0b\xc7\x95\x84\xc8" + ... b"\xb2\xfb\x64\xce\x60\x97\x87\x8d\x17\xfc\xe4\x5a\x49\xe8\x30\xb7") ... n= b"\xdb\xd1\xa3\x63\x60\x24\xb7\xb4\x02\xda\x7d\x6f" ... p= b"\xa9" ... a= b"\x36" ... ct=b"\x9d\x32\x61\xb1\xcf\x93\x14\x31\xe9\x9a\x32\x80\x67\x38\xec\xbd\x2a" ... >>> class _aes256ccm_test_3: ... k=(b"\xfb\x76\x15\xb2\x3d\x80\x89\x1d\xd4\x70\x98\x0b\xc7\x95\x84\xc8" + ... b"\xb2\xfb\x64\xce\x60\x97\x8f\x4d\x17\xfc\xe4\x5a\x49\xe8\x30\xb7") ... n= b"\xdb\xd1\xa3\x63\x60\x24\xb7\xb4\x02\xda\x7d\x6f" ... p= b"\xa8\x45\x34\x8e\xc8\xc5\xb5\xf1\x26\xf5\x0e\x76\xfe\xfd\x1b\x1e" ... a= b"" ... ct=(b"\xcc\x88\x12\x61\xc6\xa7\xfa\x72\xb9\x6a\x17\x39\x17\x6b\x27\x7f" + ... b"\x34\x72\xe1\x14\x5f\x2c\x0c\xbe\x14\x63\x49\x06\x2c\xf0\xe4\x23") ... >>> class _aes256ccm_test_4: ... k=(b"\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f" + ... b"\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f") ... n= b"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b" ... p=(b"\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f" + ... b"\x30\x31\x32\x33\x34\x35\x36\x37") ... a=(b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" + ... b"\x10\x11\x12\x13") ... ct=(b"\x04\xf8\x83\xae\xb3\xbd\x07\x30\xea\xf5\x0b\xb6\xde\x4f\xa2\x21" + ... b"\x20\x34\xe4\xe4\x1b\x0e\x75\xe5\x9b\xba\x3f\x3a\x10\x7f\x32\x39" + ... b"\xbd\x63\x90\x29\x23\xf8\x03\x71") ... >>> def _all_aes_ccm_tests(): ... from scapy.layers.tls.crypto.cipher_aead import Cipher_AES_256_CCM ... res = True ... ciphers = [] ... for t in [_aes256ccm_test_1, _aes256ccm_test_2, ... _aes256ccm_test_3, _aes256ccm_test_4]: ... c = Cipher_AES_256_CCM(key=t.k, fixed_iv=t.n[:4], ... nonce_explicit=pkcs_os2ip(t.n[4:])) ... ne = t.n[-c.nonce_explicit_len:] ... tup = ne, t.p, t.ct[-c.tag_len:] ... tmp1 = c.auth_decrypt(t.a, ne + t.ct, add_length=False) == tup ... tmp2 = c.auth_encrypt(t.p, t.a) == (ne + t.ct) ... res = res and tmp1 and tmp2 ... return res ... >>> _all_aes_ccm_tests() True ###(020)=[passed] Crypto - ChaCha20POly1305 test (test vector A.5 from RFC 7539) >>> import binascii >>> def clean(s): ... return binascii.unhexlify(''.join(c for c in s if c.isalnum())) ... >>> class _chacha20poly1305_test_1: ... k= clean(""" ... 1c 92 40 a5 eb 55 d3 8a f3 33 88 86 04 f6 b5 f0 ... 47 39 17 c1 40 2b 80 09 9d ca 5c bc 20 70 75 c0 ... """) ... n= clean(""" ... 00 00 00 00 01 02 03 04 05 06 07 08 ... """) ... p= clean(""" ... 49 6e 74 65 72 6e 65 74 2d 44 72 61 66 74 73 20 ... 61 72 65 20 64 72 61 66 74 20 64 6f 63 75 6d 65 ... 6e 74 73 20 76 61 6c 69 64 20 66 6f 72 20 61 20 ... 6d 61 78 69 6d 75 6d 20 6f 66 20 73 69 78 20 6d ... 6f 6e 74 68 73 20 61 6e 64 20 6d 61 79 20 62 65 ... 20 75 70 64 61 74 65 64 2c 20 72 65 70 6c 61 63 ... 65 64 2c 20 6f 72 20 6f 62 73 6f 6c 65 74 65 64 ... 20 62 79 20 6f 74 68 65 72 20 64 6f 63 75 6d 65 ... 6e 74 73 20 61 74 20 61 6e 79 20 74 69 6d 65 2e ... 20 49 74 20 69 73 20 69 6e 61 70 70 72 6f 70 72 ... 69 61 74 65 20 74 6f 20 75 73 65 20 49 6e 74 65 ... 72 6e 65 74 2d 44 72 61 66 74 73 20 61 73 20 72 ... 65 66 65 72 65 6e 63 65 20 6d 61 74 65 72 69 61 ... 6c 20 6f 72 20 74 6f 20 63 69 74 65 20 74 68 65 ... 6d 20 6f 74 68 65 72 20 74 68 61 6e 20 61 73 20 ... 2f e2 80 9c 77 6f 72 6b 20 69 6e 20 70 72 6f 67 ... 72 65 73 73 2e 2f e2 80 9d ... """) ... a= clean(""" ... f3 33 88 86 00 00 00 00 00 00 4e 91 ... """) ... ct=clean(""" ... 64 a0 86 15 75 86 1a f4 60 f0 62 c7 9b e6 43 bd ... 5e 80 5c fd 34 5c f3 89 f1 08 67 0a c7 6c 8c b2 ... 4c 6c fc 18 75 5d 43 ee a0 9e e9 4e 38 2d 26 b0 ... bd b7 b7 3c 32 1b 01 00 d4 f0 3b 7f 35 58 94 cf ... 33 2f 83 0e 71 0b 97 ce 98 c8 a8 4a bd 0b 94 81 ... 14 ad 17 6e 00 8d 33 bd 60 f9 82 b1 ff 37 c8 55 ... 97 97 a0 6e f4 f0 ef 61 c1 86 32 4e 2b 35 06 38 ... 36 06 90 7b 6a 7c 02 b0 f9 f6 15 7b 53 c8 67 e4 ... b9 16 6c 76 7b 80 4d 46 a5 9b 52 16 cd e7 a4 e9 ... 90 40 c5 a4 04 33 22 5e e2 82 a1 b0 a0 6c 52 3e ... af 45 34 d7 f8 3f a1 15 5b 00 47 71 8c bc 54 6a ... 0d 07 2b 04 b3 56 4e ea 1b 42 22 73 f5 48 27 1a ... 0b b2 31 60 53 fa 76 99 19 55 eb d6 31 59 43 4e ... ce bb 4e 46 6d ae 5a 10 73 a6 72 76 27 09 7a 10 ... 49 e6 17 d9 1d 36 10 94 fa 68 f0 ff 77 98 71 30 ... 30 5b ea ba 2e da 04 df 99 7b 71 4d 6c 6f 2c 29 ... a6 ad 5c b4 02 2b 02 70 9b ... """) ... tag=clean(""" ... ee ad 9d 67 89 0c bb 22 39 23 36 fe a1 85 1f 38 ... """) ... >>> def _all_chacha20poly1305_tests(): ... from scapy.layers.tls.crypto.cipher_aead import Cipher_CHACHA20_POLY1305_TLS13 ... res = True ... ciphers = [] ... for t in [_chacha20poly1305_test_1]: ... c = Cipher_CHACHA20_POLY1305_TLS13(key=t.k, fixed_iv=t.n) ... tmp1 = c.auth_decrypt(t.a, t.ct + t.tag, b"\0"*8) == (t.p, t.tag) ... tmp2 = c.auth_encrypt(t.p, t.a, b"\0"*8) == t.ct + t.tag ... res = res and tmp1 and tmp2 ... return res ... >>> _all_chacha20poly1305_tests() True ###(021)=[passed] Crypto - Camellia cipher, encryption/decryption checks >>> class _Camellia128_test: ... k= b"\x01\x23\x45\x67\x89\xab\xcd\xef\xfe\xdc\xba\x98\x76\x54\x32\x10" ... p= b"\x01\x23\x45\x67\x89\xab\xcd\xef\xfe\xdc\xba\x98\x76\x54\x32\x10" ... c= b"\x67\x67\x31\x38\x54\x96\x69\x73\x08\x57\x06\x56\x48\xea\xbe\x43" ... iv=b"\0"*16 ... >>> class _Camellia256_test: ... k=(b"\x01\x23\x45\x67\x89\xab\xcd\xef\xfe\xdc\xba\x98\x76\x54\x32\x10" + ... b"\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff") ... p= b"\x01\x23\x45\x67\x89\xab\xcd\xef\xfe\xdc\xba\x98\x76\x54\x32\x10" ... c= b"\x9a\xcc\x23\x7d\xff\x16\xd7\x6c\x20\xef\x7c\x91\x9e\x3a\x75\x09" ... iv=b"\0"*16 ... >>> def _all_camellia_tests(): ... from scapy.layers.tls.crypto.cipher_block import (Cipher_CAMELLIA_128_CBC, ... Cipher_CAMELLIA_256_CBC) ... res = True ... t = _Camellia128_test ... tmp = (Cipher_CAMELLIA_128_CBC(t.k, t.iv).encrypt(t.p) == t.c and ... Cipher_CAMELLIA_128_CBC(t.k, t.iv).decrypt(t.c) == t.p) ... res = res and tmp ... t = _Camellia256_test ... tmp = (Cipher_CAMELLIA_256_CBC(t.k, t.iv).encrypt(t.p) == t.c and ... Cipher_CAMELLIA_256_CBC(t.k, t.iv).decrypt(t.c) == t.p) ... res = res and tmp ... return res ... >>> _all_camellia_tests() True ###### ## Read a protected TLS session ###### ###(022)=[passed] Reading test session - Loading unparsed TLS records >>> p1_ch = b'\x16\x03\x01\x00\xd5\x01\x00\x00\xd1\x03\x03\x17\xf2M\xc3|\x19\xdb\xc3<\xb5J\x0b\x8d5\x81\xc5\xce\t 2\x08\xd8\xec\xd1\xf8"B\x9cW\xd0\x16v\x00\x00\x16\xc0+\xc0/\xc0\n\xc0\t\xc0\x13\xc0\x14\x003\x009\x00/\x005\x00\n\x01\x00\x00\x92\x00\x00\x00\x1f\x00\x1d\x00\x00\x1acamo.githubusercontent.com\xff\x01\x00\x01\x00\x00\n\x00\x08\x00\x06\x00\x17\x00\x18\x00\x19\x00\x0b\x00\x02\x01\x00\x00#\x00\x003t\x00\x00\x00\x10\x00)\x00\'\x05h2-16\x05h2-15\x05h2-14\x02h2\x08spdy/3.1\x08http/1.1\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00\r\x00\x16\x00\x14\x04\x01\x05\x01\x06\x01\x02\x01\x04\x03\x05\x03\x06\x03\x02\x03\x04\x02\x02\x02' >>> p2_sh = b'\x16\x03\x03\x00T\x02\x00\x00P\x03\x03F\x07n\xe2\x0c\x97g\xb7o\xb6\x9b\x14\x19\xbd\xdd1\x80@\xaaQ+\xc2,\x19\x15"\x82\xe8\xc5,\xe8\x12\x00\xc0/\x00\x00(\x00\x00\x00\x00\xff\x01\x00\x01\x00\x00\x0b\x00\x04\x03\x00\x01\x02\x00#\x00\x00\x00\x05\x00\x00\x00\x10\x00\x0b\x00\t\x08http/1.1' >>> p3_cert = b'\x16\x03\x03\nu\x0b\x00\nq\x00\nn\x00\x05\xb30\x82\x05\xaf0\x82\x04\x97\xa0\x03\x02\x01\x02\x02\x10\x07z]\xc36#\x01\xf9\x89\xfeT\xf7\xf8o>d0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000p1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x150\x13\x06\x03U\x04\n\x13\x0cDigiCert Inc1\x190\x17\x06\x03U\x04\x0b\x13\x10www.digicert.com1/0-\x06\x03U\x04\x03\x13&DigiCert SHA2 High Assurance Server CA0\x1e\x17\r160120000000Z\x17\r170406120000Z0j1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\x08\x13\nCalifornia1\x160\x14\x06\x03U\x04\x07\x13\rSan Francisco1\x150\x13\x06\x03U\x04\n\x13\x0cFastly, Inc.1\x170\x15\x06\x03U\x04\x03\x13\x0ewww.github.com0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xfb\xd5\x94\n\n\xe0P\xdc\x0f\xfc\x90\xb7qG\x9f,\x05\xde\x0e\x9a\xbc*\x8f\xd4\xf2\x9f\x08F\xf9\xf2\xd1\x18\xb4#\xa5*\xd2\xdf\x91?\xf9\xc5\xd0\xb2@\xbd\xd6\xbc@v.\x8d\xd8\x1e\r7\x8fz\x90W\xef\xe3\xa2\xc0\x11a\x03F\x0e\xfa\xb37\x0bf|!\x16\x8d\xfe/^.Y\xfec\':\xf3\xeds\xf8Mt\xb3Q\x17u\x9a\xed\x0ck\xcd\xe8\xc1\xea\xca\x01\xacu\xf9\x17)\xf0KP\x9dAdHl\xf6\xc0g}\xc8\xea\xdeHy\x81\x97A\x02\xb7F\xf6^M\xa5\xd9\x90\x86\xd7\x1ehQ\xac>%\xae\'\x11\xb1G4\xb8\x8b\xdeoyA\xd6\x92\x13)\x11\x80\xc4\x10\x17\\\x0clj\x02\xbb\xd0\n\xfc\xd2\x96x\x1d\xb6\xd4\x02\x7f\x1f\x0eR@Sop@\xda\x89)O\x0c\t~\xa3\xec\xc5W\xad\x03\xaa\x91\xedC\\\xf9\xf5[\xe8\xa1\xf0\xbem\x1b\xce-\xabC|p\xdc?\xec\xc9\x11\xf0t\xc9)\xa1P\xd0<)8\xdc\x7fV\xb9\xf8\x1f\x04\xa4^\x9f\xce\xdd\x17\x02\x03\x01\x00\x01\xa3\x82\x02I0\x82\x02E0\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14Qh\xff\x90\xaf\x02\x07u<\xcc\xd9edb\xa2\x12\xb8Yr;0\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14d\xbfD\xb3F\t\x9b\xcfZ\x1dqI\xa2\x04r\x8b\x884\x84#0{\x06\x03U\x1d\x11\x04t0r\x82\x0ewww.github.com\x82\x0c*.github.com\x82\ngithub.com\x82\x0b*.github.io\x82\tgithub.io\x82\x17*.githubusercontent.com\x82\x15githubusercontent.com0\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x05\xa00\x1d\x06\x03U\x1d%\x04\x160\x14\x06\x08+\x06\x01\x05\x05\x07\x03\x01\x06\x08+\x06\x01\x05\x05\x07\x03\x020u\x06\x03U\x1d\x1f\x04n0l04\xa02\xa00\x86.http://crl3.digicert.com/sha2-ha-server-g5.crl04\xa02\xa00\x86.http://crl4.digicert.com/sha2-ha-server-g5.crl0L\x06\x03U\x1d \x04E0C07\x06\t`\x86H\x01\x86\xfdl\x01\x010*0(\x06\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1chttps://www.digicert.com/CPS0\x08\x06\x06g\x81\x0c\x01\x02\x020\x81\x83\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04w0u0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18http://ocsp.digicert.com0M\x06\x08+\x06\x01\x05\x05\x070\x02\x86Ahttp://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt0\x0c\x06\x03U\x1d\x13\x01\x01\xff\x04\x020\x000\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x00\x03\x82\x01\x01\x00O\x16\xd1t\xf8>\xa3\x8f~\xf7\xaf\xcf\xfa\xb6\xdd\xa7\x88\x9e\xf8!\xad|(\x14\xb9\xb4\xffg\xd0\xb9\xe2O\x81}\x03\xb4\x9d\xbcU\x80$\x8c\xe5fP\xb8\xb8(\xd9\x0f\xb4\x95\xccb\xb2\x87|\xcf\x16^SH\xf9\xc2\xf8\x90 \xdc\x0e\x96\x7f\xe27\xcfA\xc7uf\r\x1c\xa7M\xee\x02\xaa\x1b\x00\xc0\xea\x0e\xd4Df\x08\t\xac\x00\x90pc\xfa\xcd\xaf\x89\x8a\xdbj|z\xb0k\xa8\xc5\xb4\x9d\x85\xd8S\x93E\xcar>\xa4\xd4\xe3\xa28J\x0f\x82\x08\xf0\xf3U\xf0m\xb21l\x189\xbf\xee\xe3\xe5\x8f\xcd@\x07\x0b\xd0\xe9e\xda\xd6LA\xff[\xafB\xaf\xf2\xb1F\xa1\xacX\xfc)\x80\xcb\xf6Z\xa6\xaf\xf26\x93\xdf\x92q\xa95\xe3:XP\xab::|\xd9\xf7y\x83\x9e\t\xfe\x0f\x90,Y+\x07$Z<\xb5\xd2\xa0\xdaE\xb8\xe1\xc0\x03\x07\x00h\xf6L\xfa\xe2v[\xce\x8f\xfe\xd0\xcb%\xf9\x9b\xcb\xa9\xffU\x12\xf3=_En2\xa0$\x8e\xb7\xa5vo\x0b\x87\xe9\x00\x04\xb50\x82\x04\xb10\x82\x03\x99\xa0\x03\x02\x01\x02\x02\x10\x04\xe1\xe7\xa4\xdc\\\xf2\xf3m\xc0+B\xb8]\x15\x9f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000l1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x150\x13\x06\x03U\x04\n\x13\x0cDigiCert Inc1\x190\x17\x06\x03U\x04\x0b\x13\x10www.digicert.com1+0)\x06\x03U\x04\x03\x13"DigiCert High Assurance EV Root CA0\x1e\x17\r131022120000Z\x17\r281022120000Z0p1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x150\x13\x06\x03U\x04\n\x13\x0cDigiCert Inc1\x190\x17\x06\x03U\x04\x0b\x13\x10www.digicert.com1/0-\x06\x03U\x04\x03\x13&DigiCert SHA2 High Assurance Server CA0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xb6\xe0/\xc2$\x06\xc8m\x04_\xd7\xef\nd\x06\xb2}"&e\x16\xaeB@\x9b\xce\xdc\x9f\x9fv\x07>\xc30U\x87\x19\xb9O\x94\x0eZ\x94\x1fUV\xb4\xc2\x02*\xaf\xd0\x98\xee\x0b@\xd7\xc4\xd0;r\xc8\x14\x9e\xef\x90\xb1\x11\xa9\xae\xd2\xc8\xb8C:\xd9\x0b\x0b\xd5\xd5\x95\xf5@\xaf\xc8\x1d\xedM\x9c_W\xb7\x86Ph\x99\xf5\x8a\xda\xd2\xc7\x05\x1f\xa8\x97\xc9\xdc\xa4\xb1\x82\x84-\xc6\xad\xa5\x9c\xc7\x19\x82\xa6\x85\x0f^DX*7\x8f\xfd5\xf1\x0b\x08\'2Z\xf5\xbb\x8b\x9e\xa4\xbdQ\xd0\'\xe2\xdd;B3\xa3\x05(\xc4\xbb(\xcc\x9a\xac+#\rx\xc6{\xe6^q\xb7J>\x08\xfb\x81\xb7\x16\x16\xa1\x9d#\x12M\xe5\xd7\x92\x08\xacu\xa4\x9c\xba\xcd\x17\xb2\x1eD5e\x7fS%9\xd1\x1c\n\x9ac\x1b\x19\x92th\n7\xc2\xc2RH\xcb9Z\xa2\xb6\xe1]\xc1\xdd\xa0 \xb8!\xa2\x93&o\x14J!A\xc7\xedm\x9b\xf2H/\xf3\x03\xf5\xa2h\x92S/^\xe3\x02\x03\x01\x00\x01\xa3\x82\x01I0\x82\x01E0\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\x000\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x860\x1d\x06\x03U\x1d%\x04\x160\x14\x06\x08+\x06\x01\x05\x05\x07\x03\x01\x06\x08+\x06\x01\x05\x05\x07\x03\x0204\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04(0&0$\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x18http://ocsp.digicert.com0K\x06\x03U\x1d\x1f\x04D0B0@\xa0>\xa0<\x86:http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl0=\x06\x03U\x1d \x0460402\x06\x04U\x1d \x000*0(\x06\x08+\x06\x01\x05\x05\x07\x02\x01\x16\x1chttps://www.digicert.com/CPS0\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14Qh\xff\x90\xaf\x02\x07u<\xcc\xd9edb\xa2\x12\xb8Yr;0\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14\xb1>\xc3i\x03\xf8\xbfG\x01\xd4\x98&\x1a\x08\x02\xefcd+\xc30\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x00\x03\x82\x01\x01\x00\x18\x8a\x95\x89\x03\xe6m\xdf\\\xfc\x1dh\xeaJ\x8f\x83\xd6Q/\x8dkD\x16\x9e\xacc\xf5\xd2nl\x84\x99\x8b\xaa\x81q\x84[\xed4N\xb0\xb7y\x92)\xcc-\x80j\xf0\x8e \xe1y\xa4\xfe\x03G\x13\xea\xf5\x86\xcaYq}\xf4\x04\x96k\xd3YX=\xfe\xd31%\\\x188\x84\xa3\xe6\x9f\x82\xfd\x8c[\x981N\xcdx\x9e\x1a\xfd\x85\xcbI\xaa\xf2\'\x8b\x99r\xfc>\xaa\xd5A\x0b\xda\xd56\xa1\xbf\x1cnGI\x7f^\xd9H|\x03\xd9\xfd\x8bI\xa0\x98&B@\xeb\xd6\x92\x11\xa4d\nWT\xc4\xf5\x1d\xd6\x02^k\xac\xee\xc4\x80\x9a\x12r\xfaV\x93\xd7\xff\xbf0\x85\x060\xbf\x0b\x7fN\xffW\x05\x9d$\xed\x85\xc3+\xfb\xa6u\xa8\xac-\x16\xef}y\'\xb2\xeb\xc2\x9d\x0b\x07\xea\xaa\x85\xd3\x01\xa3 (AYC(\xd2\x81\xe3\xaa\xf6\xec{;w\xb6@b\x80\x05AE\x01\xef\x17\x06>\xde\xc03\x9bg\xd3a.r\x87\xe4i\xfc\x12\x00W@\x1ep\xf5\x1e\xc9\xb4' >>> p4_certstat_ske_shd = b'\x16\x03\x03\x01\xdf\x16\x00\x01\xdb\x01\x00\x01\xd70\x82\x01\xd3\n\x01\x00\xa0\x82\x01\xcc0\x82\x01\xc8\x06\t+\x06\x01\x05\x05\x070\x01\x01\x04\x82\x01\xb90\x82\x01\xb50\x81\x9e\xa2\x16\x04\x14Qh\xff\x90\xaf\x02\x07u<\xcc\xd9edb\xa2\x12\xb8Yr;\x18\x0f20160914121000Z0s0q0I0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14\xcf&\xf5\x18\xfa\xc9~\x8f\x8c\xb3B\xe0\x1c/j\x10\x9e\x8e_\n\x04\x14Qh\xff\x90\xaf\x02\x07u<\xcc\xd9edb\xa2\x12\xb8Yr;\x02\x10\x07z]\xc36#\x01\xf9\x89\xfeT\xf7\xf8o>d\x80\x00\x18\x0f20160914121000Z\xa0\x11\x18\x0f20160921112500Z0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x00\x03\x82\x01\x01\x00\x90\xef\xf9\x15U\x88\xac@l\xf6n\x04C/\x1a\xf5\xbc[Xi\xd9U\xbe\'\xd3\xb7\xf5\xbb\t\xd8\xb1Tw\x9c2\xac\x7f\x88\xba\x98\xe4\xa13\xf4\xdc\xea\xf3\xacX\xe4,E\xf5\xa9\xc3\xf4B-N\xe0\x89D[\xbe\n\xc2h\x9ar\xfd\'.\xc8,\xed\x83\xc2\xf0\x89_\x8c\xc3\xe7\x8a\xad\xa4\x14\x03\x96\x02\xc4\xa8\xc8\x90\x96%X\x80\x95\x02\x9d_\xc82;m\xe9\x15\x00\xa8\x00\xb9\x01\xe3aN&\xe4\xd5\x8a\xc4w7\x0b\xc3~\xc5\xb1M\x10~T\x9e\x1d\xf6\x06\xf8\x12sTg\x14b_\xe7\xc04\xb4\xa3\xd2\x8f\xe6\xa6\xc4\x01q\x03j\xc8\xd4\xc7\x89\xdde\x99\x1a\xd9\x02\xe7\x17\xd1\xf40P\xef\xf6$\xee\xfad\xf4\xeb\xc8\xf7\x0bRL\x8b\xa5x\xe4R2\xe9\xc2\xfcB\nh\x93\xf7\x0ep4h\xeb\x17\x83\xc8\x88!\xc3W\x94WG\xfe3\x15C0qE&A\x99\xa8}\x1a\xda"\xa9O\xba\x90W_W\xado\x1c\xf0`g7\xbb$\x91o\xec\xdd\xbd\x9e\x8bb\xfc\x16\x03\x03\x01M\x0c\x00\x01I\x03\x00\x17A\x04\xc3\x9d\x1cD\xcb\x85?dU\x9eg\xc9\x90\xd8\x80N|F\x98\x0cA\x07\xdfg\xa2\xfb_z\xe4\x9b\xf6\x06\xf3L\x82KJ8\x0e\x1a\x13\x97;:\x12\rdeu\xb5\x9f\x8d\xaa\xfc\x0f\xacb\x0e\xadVX\x19\x03u\x06\x01\x01\x00y\x8aQ\x11\x94\x91\x7f\xf7\xa3#o.\x11\x1d\xb3K\xede~0\xfb\xaf\x92\xfb\xfdY\x98n\x17$\xae\xf6\x16\x14\x13J;\x1cm7\xfa;\xc8G\xa6\x1a}{\xc2\xa5\x1b\xc5\x1c\xb5\x86\x18\x18Z\xa71\x86\x0b-\xa7/q\x89+\xc7$\xbb\xf2 \x17\xc8`\xbbt[j\x9f\x83\x88\xc0\x8d\xcf4fu1\xc3\xea:B\r\xc6\xc9\x12jP\x0c- \x17\x17t\x10\x17)e\xbe\xaao\xe5@\xd2\xcc\xa5\x89mRy\xfapc~\xa6\x84\x80\xbc4\xb4B\xcb\x92\x86\xad\xf6`9j\xf0\x8ee\xc0|\xfd\xdb\xde!\xceH\x0e\x9c\xfb\x85#\x9f\xb7\xccT\x96\xe0 \xfet-\xd8yUs\xe7m\x94\x07\xbc]~\x99\xd3\x93\xfb\\\xfc@B\x14w\xce\xe8n\x14\xd4\xcc\x07\xe5\xb5@j\x17IQ\xcfub\xcf\xa2\xde\xcaU\xb3 \x8b\xdb\x10Y\x0cS\xc7\x0b\xd8BP\xfeX!\x17\x94\x80\xedu\xf8M\xa7r\xc3\x04\xf4\xd6\xb7\x99\xd1=\x922\xf9\x0b\x9f\xe7\x1b\x932`15\xef\x16\x03\x03\x00\x04\x0e\x00\x00\x00' >>> p5_cke_ccs_fin = b"\x16\x03\x03\x00F\x10\x00\x00BA\x04\xd2\x07\xce\xa9v\xd8\x1d\x18\x9bN\xe1\x83U\x8c\x8f\xd5a\x0f\xe5_\x9d\x0f\x8c\x9dT\xf6\xa9\x18'a\x8fHH@\x0c\xd4D\x801\x92\x07\xf3\x95\xa9W\x18\xfc\xb7J\xe6j\xbb\xac\x0f\x86\xae\n+\xd5\xb9\xdc\x86[\xe7\x14\x03\x03\x00\x01\x01\x16\x03\x03\x00(\x00\x00\x00\x00\x00\x00\x00\x00\xd9\xcb,\x8cM\xfd\xbc9\xaa\x05\xf3\xd3\xf3Z\x8a-\xc7^\xc1\x8e\x81M\xff\x00\x0f}G\xf2\x8c\xab\n=" >>> p6_tick_ccs_fin = b"\x16\x03\x03\x00\xca\x04\x00\x00\xc6\x00\x00\x04\xb0\x00\xc0c\xccwJ\x00\xdb,B.\x8fv#\xdd\xa9\xaeS\x90S \xb7(^\x0c\xed\n\xaeM\x0bN\xba\xb4\x8a4d\x85\x88 iN\xc9\xd1\xbe\xac\xe2Wb\xc9N\xf3\x85\xbf\xb7j\xa4IB\x8a\x1b\xe4\x8d\x1f\x148%\xd7R3\x0f4\rh\x8f\xccBj\xb5\r\xfa\xc1f\r?f\xc4\x0f_q9\xe1\x07B\x038\xb4}\xbb\xb0\xfc\x0eG\xf2\t&\x13\x98\xcb\xfc\xf6\xf4\xeb\x99!\t]\xe2\xd9-J\xe4\xdbK\xa1\xe5\xf0\t\xdfX\x0c\xb3\r\xf9\x18\xfb}\xd9\nhW1\xfc\x1c\x08DJ,\xa6#\xb0\x15\x16(&\xfdP\x8a%\xeb\xc2\xdd\xd8\xa2/\xbd$\xc3\x14\xfb\xf3\x86\xa3\xceO\x18\x9f\xfdS|'\x11\x02\xc8\xa6eW\xbdo*y\xf3.\xcf\x04\x14\x03\x03\x00\x01\x01\x16\x03\x03\x00(\xd8m\x92\t5YZ:7\\)`\xaa`\x7ff\xcd\x10\xa9v\xa3*\x17\x1a\xecguD\xa8\x87$<7+\n\x94\x1e9\x96\xfa" >>> p7_data = b"\x17\x03\x03\x01\xf6\x00\x00\x00\x00\x00\x00\x00\x01?\x04iy\x00\x04 \\\xd0\xd4\x9eG\x1f\xbf\xa3k\xfe=\xee\xce\x15\xa0%%\x06c}\xf6\xd4\xfb\xa6\xf0\xf6\x0cO\x1c\x9c\x91\xa9\x0b\x88J\xe0z\x94\xcaT\xeb\xc7\xad\x02j\x10\r\xc6\x12\xb9\xb9\x7f<\x84V\xab\x1e\xfc\xe5\x01\xda\xd6G\xf5\xb7\xf2I6\x8b\xc9\xc4a\xd3\x19\xeat\xfc\x9b\xfa\x1e\xe7\x8c\xaa\xb3\xce\xd0\x86G\x9b\x90\xf7\xde\xb1\x8bwM\x93\xa2gS>\xf3\x97\xf1CB\xfb\x8fs\x1e\xff\x83\xf9\x8b\xc0]\xbd\x80Mn3\xff\xa9\xf3)'\xc3S\xc8\xcd:\xbe\xd72B~$\xb2;\xeb+\xa4\xbd\xa9A\xd9 \n\x87\xe9\xe2\xe9\x82\x83M\x19Q\xf2n\x0e\x15\xdf\xb3;0\xdd&R\xb7\x15\x89\xe9O\xd8G7\x7f\xc3\xb8f\xc7\xd3\xc90R\x83\xf3\xd4\x1cd\xe8\xc5\x8d\xe4N(k7\xf0\xb7\xbd\x01\xb3\x9b\x86\xbaC.\x17\x8d\xd0g\xc9\xb1\x01\xfa\x01\xbe\xdbt\xb1u/\x19V\xc6\x08@\xff\xa8n\xe8\xd0\xd6n,\x05\xc9\xc2\xd8g\x19\x03.l\xb4)\xa09\xf9\xe7\x83\x01-\xe8\xf8\xffy\xbf\xf7\xe6\x11\xc5\xf5\x9aG\xb3e \xd85\x0f\x8f\x85H\xea\xc2n\x1eR\xbe\x01\xef\xef\x93\xe7*>\xbd\x84\x8b9HDI\x90\xc4$\x9a\x9aK\x88Ki\n\xa3\xab\xed\x91\xcd\xe8\xb1\xd4\x8e\xbcE\x88\xe8\x05\x16\xd5\xed\x18\x16g>\x04\xd8\x1dB}\x91\x90\xd1\xda\x03\xe1\x972CxtD\x85\xafF|~7D9*U\xad\x0b\xc4#\x06}\xec\xd6\xd3?y\x96\xa4\xb5\xa3\x1d\x1c\xbd\xc9\xc9g\xb12\xc9\x0f\xa1\x03\x12N\x0b\xec\x14\xc9vJ\nM\xa7\xc8h\xd0|(1(\xa3\x98@nH\n\x0b\xa80\x00\x02\xb7\x06Z\xd4M\xdc!AV\xe2\xa7*\xc3\x90U\xee\xd0\xb2\x05\xa3w\xe1\xe2\xbe\x1e\xbe\xd4u\xb1\xa1z\x1e\x1c\x15%7\xdd\xf9\xb9~\x02\xf9s\x0c1\xfb;\xab\xf1\x1e\xaf\x06\x8c\xafe\x00\x15e5\xac\xd7]>\x1dLb5\x8e+\x01n\xcb\x19\xcc\x17Ey\xc8" ###(023)=[passed] Reading TLS test session - TLS parsing (no encryption) does not throw any error >>> from scapy.layers.tls.record import TLS >>> t1 = TLS(p1_ch) >>> t2 = TLS(p2_sh, tls_session=t1.tls_session.mirror()) >>> t3 = TLS(p3_cert, tls_session=t2.tls_session) >>> t4 = TLS(p4_certstat_ske_shd, tls_session=t3.tls_session) ###(024)=[passed] Reading TLS test session - TLS Record header >>> assert t1.type == 0x16 >>> assert t1.version == 0x0301 >>> assert t1.len == 213 >>> assert not t1.iv >>> assert not t1.mac >>> assert not t1.pad and not t1.padlen >>> len(t1.msg) == 1 True ###(025)=[passed] Reading TLS test session - TLS Record __getitem__ >>> from scapy.layers.tls.handshake import TLSClientHello >>> TLSClientHello in t1 True ###(026)=[passed] Reading TLS test session - ClientHello >>> ch = t1.msg[0] >>> assert isinstance(ch, TLSClientHello) >>> assert ch.msgtype == 1 >>> assert ch.msglen == 209 >>> assert ch.version == 0x0303 >>> assert ch.gmt_unix_time == 0x17f24dc3 >>> assert ch.random_bytes == b'|\x19\xdb\xc3<\xb5J\x0b\x8d5\x81\xc5\xce\t 2\x08\xd8\xec\xd1\xf8"B\x9cW\xd0\x16v' >>> assert ch.sidlen == 0 >>> assert not ch.sid >>> assert ch.cipherslen == 22 >>> assert ch.ciphers == [49195, 49199, 49162, 49161, 49171, 49172, 51, 57, 47, 53, 10] >>> assert ch.complen == 1 >>> assert ch.comp == [0] ###(027)=[passed] Reading TLS test session - ClientHello extensions >>> from scapy.layers.tls.extensions import (TLS_Ext_ServerName, ... TLS_Ext_RenegotiationInfo, TLS_Ext_SupportedGroups, ... TLS_Ext_SupportedPointFormat, TLS_Ext_SessionTicket, TLS_Ext_NPN, ... TLS_Ext_ALPN, TLS_Ext_SignatureAlgorithms, TLS_Ext_CSR, ... OCSPStatusRequest) >>> >>> assert ch.extlen == 146 >>> ext = ch.ext >>> assert len(ext) == 9 >>> assert isinstance(ext[0], TLS_Ext_ServerName) >>> assert ext[0].type == 0 >>> assert ext[0].len == 31 >>> assert ext[0].servernameslen == 29 >>> assert len(ext[0].servernames) == 1 >>> assert ext[0].servernames[0].nametype == 0 >>> assert ext[0].servernames[0].namelen == 26 >>> assert ext[0].servernames[0].servername == b"camo.githubusercontent.com" >>> assert isinstance(ext[1], TLS_Ext_RenegotiationInfo) >>> assert not ext[1].renegotiated_connection >>> assert isinstance(ext[2], TLS_Ext_SupportedGroups) >>> assert ext[2].groups == [0x17, 0x18, 0x19] >>> assert isinstance(ext[3], TLS_Ext_SupportedPointFormat) >>> assert ext[3].ecpl == [0] >>> assert isinstance(ext[4], TLS_Ext_SessionTicket) >>> assert not ext[4].ticket >>> assert isinstance(ext[5], TLS_Ext_NPN) >>> assert ext[5].protocols == [] >>> assert isinstance(ext[6], TLS_Ext_ALPN) >>> assert len(ext[6].protocols) == 6 >>> assert ext[6].protocols[-1].protocol == b"http/1.1" >>> assert isinstance(ext[7], TLS_Ext_CSR) >>> assert isinstance(ext[7].req[0], OCSPStatusRequest) >>> assert isinstance(ext[8], TLS_Ext_SignatureAlgorithms) >>> assert len(ext[8].sig_algs) == 10 >>> ext[8].sig_algs[-1] == 0x0202 True ###(028)=[passed] Reading TLS test session - ServerHello >>> from scapy.layers.tls.handshake import TLSServerHello >>> >>> assert TLSServerHello in t2 >>> sh = t2.msg[0] >>> assert isinstance(sh, TLSServerHello) >>> assert sh.gmt_unix_time == 0x46076ee2 >>> assert sh.random_bytes == b'\x0c\x97g\xb7o\xb6\x9b\x14\x19\xbd\xdd1\x80@\xaaQ+\xc2,\x19\x15"\x82\xe8\xc5,\xe8\x12' >>> assert sh.cipher == 0xc02f >>> assert len(sh.ext) == 6 >>> sh.ext[-1].protocols[-1].protocol == b"http/1.1" True ###(029)=[passed] Reading TLS test session - Certificate >>> from scapy.layers.tls.cert import Cert >>> cert = t3.msg[0] >>> assert cert.certslen == 2670 >>> assert len(cert.certs) == 2 >>> srv_cert = cert.certs[0][1] >>> assert isinstance(srv_cert, Cert) >>> assert srv_cert.serial == 0x077a5dc3362301f989fe54f7f86f3e64 >>> srv_cert.subject['commonName'] == 'www.github.com' True ###(030)=[passed] Reading TLS test session - Multiple TLS layers >>> cert_stat = t4.msg[0] >>> ske = t4.payload.msg[0] >>> shd = t4.payload.payload.msg[0] >>> isinstance(t4.payload.payload.payload, NoPayload) True ###(031)=[passed] Reading TLS test session - CertificateStatus >>> from scapy.layers.tls.handshake import TLSCertificateStatus >>> assert isinstance(cert_stat, TLSCertificateStatus) >>> assert cert_stat.responselen == 471 >>> cert_stat.response[0].responseStatus == 0 True ###(032)=[passed] Reading TLS test session - ServerKeyExchange >>> from scapy.layers.tls.handshake import TLSServerKeyExchange >>> from scapy.layers.tls.keyexchange import ServerECDHNamedCurveParams >>> assert isinstance(ske, TLSServerKeyExchange) >>> p = ske.params >>> assert isinstance(p, ServerECDHNamedCurveParams) >>> assert p.named_curve == 0x0017 >>> assert orb(p.point[0]) == 4 and p.point[1:5] == b'\xc3\x9d\x1cD' and p.point[-4:] == b'X\x19\x03u' >>> assert ske.sig.sig_alg == 0x0601 >>> ske.sig.sig_val[:4] == b'y\x8aQ\x11' and ske.sig.sig_val[-4:] == b'`15\xef' True ###(033)=[passed] Reading TLS test session - ServerHelloDone >>> from scapy.layers.tls.handshake import TLSServerHelloDone >>> assert isinstance(shd, TLSServerHelloDone) >>> shd.msglen == 0 True ###(034)=[passed] Reading TLS test session - Context checks after 1st RTT >>> t = shd.tls_session >>> assert len(t.handshake_messages) == 6 >>> assert t.handshake_messages_parsed[-1] is shd >>> assert t.tls_version == 0x0303 >>> assert t.client_kx_ffdh_params is None >>> assert t.client_kx_ecdh_params is not None >>> pn = t.server_kx_pubkey.public_numbers() >>> x = pkcs_i2osp(pn.x, pn.curve.key_size/8) >>> y = pkcs_i2osp(pn.y, pn.curve.key_size/8) >>> assert x[:4] == b'\xc3\x9d\x1cD' and y[-4:] == b'X\x19\x03u' >>> assert t.rcs.row == "read" >>> assert t.wcs.row == "write" >>> t.rcs.ciphersuite.val == 0 True ###(035)=[passed] Reading TLS test session - TLS parsing (with encryption) does not throw any error >>> t5 = TLS(p5_cke_ccs_fin, tls_session=t4.tls_session.mirror()) ###(036)=[passed] Reading TLS test session - ClientKeyExchange >>> from scapy.layers.tls.handshake import TLSClientKeyExchange >>> from scapy.layers.tls.keyexchange import ClientECDiffieHellmanPublic >>> cke = t5.msg[0] >>> ccs = t5.payload.msg[0] >>> rec_fin = t5.payload.payload >>> fin = t5.payload.payload.msg[0] >>> isinstance(t5.payload.payload.payload, NoPayload) True >>> assert isinstance(cke, TLSClientKeyExchange) >>> k = cke.exchkeys >>> assert isinstance(k, ClientECDiffieHellmanPublic) >>> assert k.ecdh_Yclen == 65 >>> assert k.ecdh_Yc[:4] == b'\x04\xd2\x07\xce' and k.ecdh_Yc[-4:] == b'\xdc\x86[\xe7' ###(037)=[passed] Reading TLS test session - ChangeCipherSpec >>> from scapy.layers.tls.record import TLSChangeCipherSpec >>> assert isinstance(ccs, TLSChangeCipherSpec) >>> ccs.msgtype == 1 True ###(038)=[passed] Reading TLS test session - Finished >>> assert rec_fin.version == 0x0303 >>> assert rec_fin.deciphered_len == 16 >>> assert rec_fin.len == 40 >>> assert rec_fin.iv == b'\x00\x00\x00\x00\x00\x00\x00\x00' >>> assert rec_fin.mac == b'\xc7^\xc1\x8e\x81M\xff\x00\x0f}G\xf2\x8c\xab\n=' >>> assert not rec_fin.pad and not rec_fin.padlen >>> from scapy.layers.tls.record import _TLSEncryptedContent >>> assert isinstance(fin, _TLSEncryptedContent) >>> fin.load == b'\xd9\xcb,\x8cM\xfd\xbc9\xaa\x05\xf3\xd3\xf3Z\x8a-' True ###(039)=[passed] Reading TLS test session - Ticket, CCS & Finished >>> from scapy.layers.tls.handshake import TLSNewSessionTicket >>> t6 = TLS(p6_tick_ccs_fin, tls_session=t5.tls_session.mirror()) >>> tick = t6.msg[0] >>> assert isinstance(tick, TLSNewSessionTicket) >>> assert tick.msgtype == 4 >>> assert tick.lifetime == 1200 >>> assert tick.ticketlen == 192 >>> assert tick.ticket[:4] == b'c\xccwJ' and tick.ticket[-4:] == b'\xf3.\xcf\x04' >>> ccs = t6.payload.msg[0] >>> assert isinstance(ccs, TLSChangeCipherSpec) >>> rec_fin = t6.getlayer(4) >>> assert rec_fin.iv == b'\xd8m\x92\t5YZ:' >>> assert rec_fin.mac == b'\xecguD\xa8\x87$<7+\n\x94\x1e9\x96\xfa' >>> assert isinstance(rec_fin.msg[0], _TLSEncryptedContent) >>> rec_fin.msg[0].load == b'7\\)`\xaa`\x7ff\xcd\x10\xa9v\xa3*\x17\x1a' True ###(040)=[passed] Building x25519 ecdh_Yc >>> from scapy.layers.tls.record import TLS >>> from scapy.layers.tls.handshake import TLSClientKeyExchange >>> >>> cli_hello = bytes.fromhex('160303008f0100008b0303000027104268d53e923ce05aa04cb21b8fe33aed93266c00bd1f13ea6a6dad24000018c02cc02bc030c02fc024c023c028c027c00ac009c014c0130100004a00000013001100000e7777772e676f6f676c652e636f6d000500050100000000000a00080006001d00170018000b00020100000d00140012040105010201040305030203020206010603') >>> ser_hello = bytes.fromhex('16030300520200004e03035f9b52e4206fdc2410d1d482905c9b45a204641d9d856afb444f574e4752440120c4d1479e11a26edf0dbcb07e7a5f7d41c3d7b500015ff8c1ceed473bf457b193c02b000006000b0002010016030309270b0009230009200004cc308204c8308203b0a003020102021100b2fe3f66ac447c9f02000000007d9a03300d06092a864886f70d01010b05003042310b3009060355040613025553311e301c060355040a1315476f6f676c65205472757374205365727669636573311330110603550403130a47545320434120314f31301e170d3230313030363036343132305a170d3230313232393036343132305a3068310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731133011060355040a130a476f6f676c65204c4c43311730150603550403130e7777772e676f6f676c652e636f6d3059301306072a8648ce3d020106082a8648ce3d030107034200046a7c4a9d35904b2b1b3f7c7326ff2adfb1bcb273b2a1a02003978dd1df8cecce5094e2309201fcd2294270ef359f4bdea177665d9e7321586682392ccc93ac89a382025c30820258300e0603551d0f0101ff04040302078030130603551d25040c300a06082b06010505070301300c0603551d130101ff04023000301d0603551d0e041604145d7ced1d850e92337bf7a0602ae3dd70668b895b301f0603551d2304183016801498d1f86e10ebcf9bec609f18901ba0eb7d09fd2b306806082b06010505070101045c305a302b06082b06010505073001861f687474703a2f2f6f6373702e706b692e676f6f672f677473316f31636f7265302b06082b06010505073002861f687474703a2f2f706b692e676f6f672f677372322f475453314f312e63727430190603551d1104123010820e7777772e676f6f676c652e636f6d30210603551d20041a30183008060667810c010202300c060a2b06010401d67902050330330603551d1f042c302a3028a026a0248622687474703a2f2f63726c2e706b692e676f6f672f475453314f31636f72652e63726c30820104060a2b06010401d6790204020481f50481f200f0007600b21e05cc8ba2cd8a204e8766f92bb98a2520676bdafa70e7b249532def8b905e00000174fcdb8af4000004030047304502207610c2e9b008b8ebf2f27a1e65631b8ae7534294c60f55a4c78c9e4927f56a23022100b61c72d94468cd6b4e376ea5d2ba7a6605a765c575f6a536b819a2d8031be4f7007600e712f2b0377e1a62fb8ec90c6184f1ea7b37cb561d11265bf3e0f34bf241546e00000174fcdb8af7000004030047304502204aae6373290fd01ad53e8ff9d6ef4f21d0badc0e65fef15c52c8f6af9468e12f022100c77dff6b266313b172ef8815beff3032d6058129baaa767361fe95e2c541ad81300d06092a864886f70d01010b05000382010100657bfcc7fd99ffed6f032bb056dc7712ec3ea437cf17750db8527ae0dcdd630f3ec4b2b95b7d482cc3a94082351117e45362319a842556954160d34c9019cc3cd312073ce540d031c4bf197b924a139b0e91bffc168a80c1641834445c509d6edf2daf8a247b72104b184968ef25cc260c75b28f470fc355477ac403da12701556e6e7550a38346f444238a154f1efb1a1a297eff39e35d76bc285599d19b0bd475d6f1daba94f1365dbc930041a79ca2df1bb724d53e4fb8831b8dc486522ee7d8eee0e1fea658352736fe949fcb233c08a3b9e14abc56a5556f9b469925cb5916ed058a4cf332c4c13a75ca83850773f9182ad95fadff51203c08e684df63b00044e3082044a30820332a003020102020d01e3b49aa18d8aa981256950b8300d06092a864886f70d01010b0500304c3120301e060355040b1317476c6f62616c5369676e20526f6f74204341202d205232311330110603') >>> ser_cert = bytes.fromhex('16030309270b0009230009200004cc308204c8308203b0a003020102021100b2fe3f66ac447c9f02000000007d9a03300d06092a864886f70d01010b05003042310b3009060355040613025553311e301c060355040a1315476f6f676c65205472757374205365727669636573311330110603550403130a47545320434120314f31301e170d3230313030363036343132305a170d3230313232393036343132305a3068310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731133011060355040a130a476f6f676c65204c4c43311730150603550403130e7777772e676f6f676c652e636f6d3059301306072a8648ce3d020106082a8648ce3d030107034200046a7c4a9d35904b2b1b3f7c7326ff2adfb1bcb273b2a1a02003978dd1df8cecce5094e2309201fcd2294270ef359f4bdea177665d9e7321586682392ccc93ac89a382025c30820258300e0603551d0f0101ff04040302078030130603551d25040c300a06082b06010505070301300c0603551d130101ff04023000301d0603551d0e041604145d7ced1d850e92337bf7a0602ae3dd70668b895b301f0603551d2304183016801498d1f86e10ebcf9bec609f18901ba0eb7d09fd2b306806082b06010505070101045c305a302b06082b06010505073001861f687474703a2f2f6f6373702e706b692e676f6f672f677473316f31636f7265302b06082b06010505073002861f687474703a2f2f706b692e676f6f672f677372322f475453314f312e63727430190603551d1104123010820e7777772e676f6f676c652e636f6d30210603551d20041a30183008060667810c010202300c060a2b06010401d67902050330330603551d1f042c302a3028a026a0248622687474703a2f2f63726c2e706b692e676f6f672f475453314f31636f72652e63726c30820104060a2b06010401d6790204020481f50481f200f0007600b21e05cc8ba2cd8a204e8766f92bb98a2520676bdafa70e7b249532def8b905e00000174fcdb8af4000004030047304502207610c2e9b008b8ebf2f27a1e65631b8ae7534294c60f55a4c78c9e4927f56a23022100b61c72d94468cd6b4e376ea5d2ba7a6605a765c575f6a536b819a2d8031be4f7007600e712f2b0377e1a62fb8ec90c6184f1ea7b37cb561d11265bf3e0f34bf241546e00000174fcdb8af7000004030047304502204aae6373290fd01ad53e8ff9d6ef4f21d0badc0e65fef15c52c8f6af9468e12f022100c77dff6b266313b172ef8815beff3032d6058129baaa767361fe95e2c541ad81300d06092a864886f70d01010b05000382010100657bfcc7fd99ffed6f032bb056dc7712ec3ea437cf17750db8527ae0dcdd630f3ec4b2b95b7d482cc3a94082351117e45362319a842556954160d34c9019cc3cd312073ce540d031c4bf197b924a139b0e91bffc168a80c1641834445c509d6edf2daf8a247b72104b184968ef25cc260c75b28f470fc355477ac403da12701556e6e7550a38346f444238a154f1efb1a1a297eff39e35d76bc285599d19b0bd475d6f1daba94f1365dbc930041a79ca2df1bb724d53e4fb8831b8dc486522ee7d8eee0e1fea658352736fe949fcb233c08a3b9e14abc56a5556f9b469925cb5916ed058a4cf332c4c13a75ca83850773f9182ad95fadff51203c08e684df63b00044e3082044a30820332a003020102020d01e3b49aa18d8aa981256950b8300d06092a864886f70d01010b0500304c3120301e060355040b1317476c6f62616c5369676e20526f6f74204341202d20523231133011060355040a130a476c6f62616c5369676e311330110603550403130a476c6f62616c5369676e301e170d3137303631353030303034325a170d3231313231353030303034325a3042310b3009060355040613025553311e301c060355040a1315476f6f676c65205472757374205365727669636573311330110603550403130a47545320434120314f3130820122300d06092a864886f70d01010105000382010f003082010a0282010100d018cf45d48bcdd39ce440ef7eb4dd69211bc9cf3c8e4c75b90f3119843d9e3c29ef500d10936f0580809f2aa0bd124b02e13d9f581624fe309f0b747755931d4bf74de1928210f651ac0cc3b222940f346b981049e70b9d8339dd20c61c2defd1186165e7238320a82312ffd2247fd42fe7446a5b4dd75066b0af9e426305fbe01cc46361af9f6a33ff6297bd48d9d37c1467dc75dc2e69e8f86d7869d0b71005b8f131c23b24fd1a3374f823e0ec6b198a16c6e3cda4cd0bdbb3a4596038883bad1db9c68ca7531bfcbcd9a4abbcdd3c61d7931598ee81bd8fe264472040064ed7ac97e8b9c05912a1492523e4ed70342ca5b4637cf9a33d83d1cd6d24ac070203010001a38201333082012f300e0603551d0f0101ff040403020186301d0603551d250416301406082b0601050507030106082b0601050507030230120603551d130101ff040830060101ff020100301d0603551d0e0416041498d1f86e10ebcf9bec609f18901ba0eb7d09fd2b301f0603551d230418301680149be20757671c1ec06a06de59b49a2ddfdc19862e303506082b0601050507010104293027302506082b060105050730018619687474703a2f2f6f6373702e706b692e676f6f672f6773723230320603551d1f042b30293027a025a0238621687474703a2f2f63726c2e706b692e676f6f672f677372322f677372322e63726c303f0603551d20043830363034060667810c010202302a302806082b06010505070201161c68747470733a2f2f706b692e676f6f672f7265706f7369746f72792f300d06092a864886f70d01010b050003820101001a803e3679fbf32ea946377d5e541635aec74e0899febdd13469265266073d0aba49cb62f4f11a8efc114f68964c742bd367deb2a3aa058d844d4c20650fa596da0d16f86c3bdb6f0423886b3a6cc160bd689f718eee2d583407f0d554e98659fd7b5e0d2194f58cc9a8f8d8f2adcc0f1af39aa7a90427f9a3c9b0ff02786b61bac7352be856fa4fc31c0cedb63cb44beaedcce13cecdc0d8cd63e9bca42588bcc16211740bca2d666efdac4155bcd89aa9b0926e732d20d6e6720025b10b090099c0c1f9eadd83beaa1fc6ce8105c085219512a71bbac7ab5dd15ed2bc9082a2c8ab4a621ab63ffd7524950d089b7adf2affb50ae2fe1950df346ad9d9cf5ca') >>> >>> r1 = TLS(cli_hello) >>> r2 = TLS(ser_hello, tls_session=r1.tls_session.mirror()) >>> r3 = TLS(ser_cert, tls_session=r2.tls_session) >>> >>> s = r3.tls_session.mirror() >>> s.client_kx_ecdh_params = 29 >>> pkt = TLSClientKeyExchange(tls_session=s) >>> bytes(pkt) b'\x10\x00\x00! \xb1bZ;\xc9\xe8s0\xc33\xd9\xb8\x0e\xe2\x82\xb0pM\x97\xc5W\xe2\xa7\xdc\xc4\x10(X\x15K\x9b+' >>> pkt.exchkeys.fill_missing() >>> assert len(pkt.exchkeys.ecdh_Yc) == 32 ###(041)=[passed] Reading TLS test session - Extended master secret >>> from scapy.layers.tls.cert import PrivKey >>> from scapy.layers.tls.handshake import TLSFinished >>> from scapy.layers.tls.record import TLS >>> >>> chello_extms = bytes.fromhex('1603010200010001fc0303f8b3dbcb70ed3804009c15af4a4298720619b70d1ad4f24d0e99de9e93ce3c3b201c3b2cf3266bcba19b29479ec66fe815f7db0a6b976111f70958395e7aeebaba003e130213031301c02cc030009fcca9cca8ccaac02bc02f009ec024c028006bc023c0270067c00ac0140039c009c0130033009d009c003d003c0035002f00ff01000175000b000403000102000a000c000a001d0017001e00190018337400000010000e000c02683208687474702f312e31001600000017000000310000000d002a0028040305030603080708080809080a080b080408050806040105010601030303010302040205020602002b00050403040303002d00020101003300260024001d0020e8410f5ab09d96b05f10183ccd9e93a057a73290b4c9e1c254cdfc299fc01d41001500d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000') >>> shello_extms = bytes.fromhex('160303005502000051030320a54032477ea3a963b8a700090459f11f1f4ad1896e1d75745b7e2bdc51dde0200600f552db6c51b97a309717ff847bb6e8fef1ce2601544413fda7b66075b887009d000009ff0100010000170000160303036e0b00036a0003670003643082036030820248a003020102020900eb73b71c3e2f9fdc300d06092a864886f70d01010b05003045310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c7464301e170d3139303231353135313430335a170d3239303231323135313430335a3045310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c746430820122300d06092a864886f70d01010105000382010f003082010a0282010100d2f7d36b233a5619368fc3a7db0f2364dc71986dd4eebcbee85b783e139cfeb0a80de50147c936aa84230e2fa2eb91ef1737410387b932440ac7cfda3c5966eef88f688bcbee6a5d0dfaa075b77dfe836f2cb318375ff5be2b35f6d62dd7c4b147224f67d53d95c7fcc11cda7bc622369b4d4a685655169fb28f66e511724f0c9af2f74ea4cdf09b92f917246a582f67fade3eff7eca2c794d713c13f80cd53f847aa196d0adc04494790a628e327f4b53d05b83025c3ea541195f953ce6fc37edcc68a8fd6eca621f38bc08bc2d8d72cfcdf85c68f9f4f4485b32133c63299f85ffd62bde5a9d585e5a896f08319448277f19e86d5d6878bc53768b2ef9b3210203010001a3533051301d0603551d0e041604148297fb8cf3d9ddf2f60ec90f92815c28e3f3ff35301f0603551d230418301680148297fb8cf3d9ddf2f60ec90f92815c28e3f3ff35300f0603551d130101ff040530030101ff300d06092a864886f70d01010b050003820101003c001f0f5d106072e0beedfa47895329d4623422080e66caa4beb4c3d9b6868fa107467d6160e512ede7cbbefdeb17c09b9f594f86f1a9922c982ccf9655d4d67eda061f667eeb25fe7203bea00e40f150a490a78ca963d87c185ade8b7c294f5052fb1e1edb3403831e33e4026c8e56717cb77bc32321858be37a77fe7f5511ef8c2013c86e2730c5b2366875131cae0c7616fdc7c8605696133e7a685f20203c0db8e0ff1d1a5991d2f058f48f20b10a5fb0df27a1f9874cc0fe8d6ebf77e9a7ba38490e9d63241a0fb3fd7701ff3b130c9aa7aa77770280b7003c1bb5e0784c34aacb74ce8114960e50eee04602a7ab20e5c878028e4292e90e40fd631fee16030300040e000000') >>> finished_extms = bytes.fromhex('160303010610000102010007534dd8642e57edd33d156d8002f70562864c1dfe5d721763e8e4ef2c03fb14b4e4eac1864c41fcce57367f95798f04954ef957deb934536b0ac39a72c14f772d0f64b7cc0d8260e2019748fc65fd6f382da6d4f873afe6fc1fa17e786cf6c72b6a46950d2030c7b42ed10f2c4dba37282001132ddb151a44f6face6b049338217784cf2a5ac6a054a2a1d205fb7657d7affa14113c43314b54b28164423455174f57eb50f6eea0836ba1c68616db720641bf18f0cdf7bb729c9cc0b4cfeee8aeed94e00573210eb5328cbcca4ccb1aa29a910c5b5f2c96cf3a431e9677980400d574244ff6bfdabf36ba9dda84703f5760d607e4b731d4f1dc16372b0feac11403030001011603030028269118aa98b35c71e35034f35c23c78d55c04662cdb71c11b1ef862e3b4ebf8ace2aff053257bb08') >>> key = base64.b64decode(b'LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRRFM5OU5ySXpwV0dUYVAKdzZmYkR5TmszSEdZYmRUdXZMN29XM2crRTV6K3NLZ041UUZIeVRhcWhDTU9MNkxya2U4WE4wRURoN2t5UkFySAp6OW84V1didStJOW9pOHZ1YWwwTitxQjF0MzMrZzI4c3N4ZzNYL1crS3pYMjFpM1h4TEZISWs5bjFUMlZ4L3pCCkhOcDd4aUkybTAxS2FGWlZGcCt5ajJibEVYSlBESnJ5OTA2a3pmQ2JrdmtYSkdwWUwyZjYzajcvZnNvc2VVMXgKUEJQNEROVS9oSHFobHRDdHdFU1VlUXBpampKL1MxUFFXNE1DWEQ2bFFSbGZsVHptL0RmdHpHaW8vVzdLWWg4NAp2QWk4TFkxeXo4MzRYR2o1OVBSSVd6SVRQR01wbjRYLzFpdmVXcDFZWGxxSmJ3Z3hsRWduZnhub2JWMW9lTHhUCmRvc3UrYk1oQWdNQkFBRUNnZ0VBSGQ5NTBISHNrTVNCTlZvL0tvVzZQVTM1eDl2Rml3aXUvN2YwRHRZNEpOaGUKODVpNTFiQm9UVHpvdWRtRStGWnh4SmZPWFBHYkI4TWF3N0JxOXFDeU1xUi9xZzRoa21EOVREMXcrenBBWFFtLwpkRlRuMk85OW5MQUJ0RElmeTYzT2JJUXZPa1MzczczZHpIcUpkWDFZMnVLaXp5WjNFeFZoQjZmR3Fpa09ScU1BCmNYbjJSRzN1UXFNWk4yUkVUK1hFYWdsa1dkbGphVTdaTC9CbklRT2xGS0h2ZzVSeGFwWGpJbTM2NnFUVStreGEKWDJFZnllOUJycWxWK0o4cnYzODVjRDBQc3RkSVFTQzMxZFBzUHMrSnJMVlBKQVpGZTBLVk1lYkk2ODU1cERYZApGd1ZGcC9BOXhFa3NwRW1jS0tnL1ZkZ3JQZUxMQmxhVm9mMVhPeUhWQVFLQmdRRHhPdXFGaXJvNTNQNGZQUGlMCkFnTTNvRnpmY2xwdDFMdnduelprUmVMU1NvVFBvZSt1R2xMdTBpS3lMUHBjWm1DTCt0bldsSXBheHRYOU1CRmUKOWNvMlJpSU9WM2JZM0ZpOTBLYjlvN3NyZURhaWE5NElHNGlBYktyWjJJdktBZmFkWnBqb1hBTXZpWnBEYWxGYgprZWVCd29nV0sreTdic2EwU1RYTGVMdjF5d0tCZ1FEZjRwT2lUZ3RBNFdtMXo2WFB4Z0ZCa3A3OWVjaWhINTlICnF1cVJNNkhtQ2YzSnZqZzJCZnYyb2hYNTlTU2VnZTI5ek0yZEhmVGhSeW1vZlg5VkpyMnRYY2FhVWpkRnp1Ui8Kcm1EblJMTjVDTUFnUWNCU3M5UXFCaXdTM0hqVmpML1REcFMvblJwY2VCQnNZTFYvR1YvQkpvWDkxTlVodVRXcwpjQ0VvRmNVOVF3S0JnUUNjbCtGTHhTMTBpSGZTY1hMcVVla2l3QS9wNFVMQWoxdGRMUTFTOUdiMG1ma3pDKzBaCitPNmpKM2ZzYi9RcDdTOTVUdU1BUDdhOGpOeTJtZkI4MDFOci9nVDNpR0dYRHhyd1JUVlI2MnFDSW14YzdXYloKbm4zeTJCZmtpSVRlSW40ajJVa2pkUytBT1hRUmxUK3hFTHJXNmlBTFBJSlZmZWl4ZWVEWTc4d2NGd0tCZ0Z5aQoxcTFvbDNWd0Q1cGY0ZDdYc2Z0YzNKWkxCcjNNWk01MXBQc1JueUtjN2JyRkQyTWpGTDlYRDdyT09TbXczeHNTCm05MHY0UHc1d3IzcHQzOFhPWko3WThyRXpBUUJlRUJ3ZWI0WGloOUJoS1dVTHl6SkpiZUJ1RWpSbXRuWmxDR1QKUGU4TzVUSnZwM1FBaS9pY0dpZkVkZHF5YnNHMmJjUDgzV3RGbnNnYkFvR0FMOHF4VUx3bGlMck1ML3c3aEJNegpXSHdKM21PK0NXbzFWR3p4bi9lK3I2ejVTUW03M0VuYzlSZnVkN3RBWmU1QUhXYXVSR3RNaVNoY0J1bkl5Q0g1CnU2Q2laZU5UOTBRdElLRmVCS09QSk5WNDR1QzJtK0xKQkNGa0hzU085MHp0dHZzcmVyU0tiNG5oZ2tiZDhxQ24KbDVFZFBpZEx2NXdiY0tyc3dIVzZYSm89Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0=') >>> ssl_key = PrivKey(key) >>> >>> r1 = TLS(chello_extms) >>> r1.tls_session.server_rsa_key = ssl_key >>> r2 = TLS(shello_extms, tls_session=r1.tls_session.mirror()) >>> r3 = TLS(finished_extms, tls_session=r2.tls_session.mirror()) >>> >>> r3 |>] mac=b'' pad=b'' padlen=None |] mac=b'' pad=b'' padlen=None |] mac=b'\xb1\xef\x86.;N\xbf\x8a\xce*\xff\x052W\xbb\x08' pad=b'' padlen=None |>>> >>> >>> assert r3.tls_session.extms >>> assert r3.tls_session.session_hash == b'\n\x8b\xe0\x08S\xb9f|\xd4\x1f\xc5\x8f\xdb\xfaj\xc6\xb4Aj\\j~B)Ep\x07\x90\xc6/\x18\x1e\x99\x1e\x8d.\xe2,B\xe1\x10ZJ\x10^\xect(' >>> >>> l3 = r3.getlayer(TLS, 3) >>> assert isinstance(l3.msg[0], TLSFinished) >>> assert l3.msg[0][TLSFinished].vdata == b'\x00\x1fG\xd8VD@\x0ctK\xeee' >>> >>> >>> chello_extms = bytes.fromhex('160301008501000081030360037703ac90bb5e29ae0fca71b68dd8133b17b7060c13779d34f69d5c3255110000060005000400ff01000052337400000010000e000c02683208687474702f312e310016000000170000000d0030002e040305030603080708080809080a080b080408050806040105010601030302030301020103020202040205020602') >>> shello_extms = bytes.fromhex('1603030055020000510303c985430a03add71566a952a16249e471cd3226c0792ba42c444f574e4752440120e835d66cd3293b9fcb157d5c477848d654a2d3a42fc92bcf9c472171188f69610005000009ff0100010000170000160303036e0b00036a0003670003643082036030820248a003020102020900eb73b71c3e2f9fdc300d06092a864886f70d01010b05003045310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c7464301e170d3139303231353135313430335a170d3239303231323135313430335a3045310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c746430820122300d06092a864886f70d01010105000382010f003082010a0282010100d2f7d36b233a5619368fc3a7db0f2364dc71986dd4eebcbee85b783e139cfeb0a80de50147c936aa84230e2fa2eb91ef1737410387b932440ac7cfda3c5966eef88f688bcbee6a5d0dfaa075b77dfe836f2cb318375ff5be2b35f6d62dd7c4b147224f67d53d95c7fcc11cda7bc622369b4d4a685655169fb28f66e511724f0c9af2f74ea4cdf09b92f917246a582f67fade3eff7eca2c794d713c13f80cd53f847aa196d0adc04494790a628e327f4b53d05b83025c3ea541195f953ce6fc37edcc68a8fd6eca621f38bc08bc2d8d72cfcdf85c68f9f4f4485b32133c63299f85ffd62bde5a9d585e5a896f08319448277f19e86d5d6878bc53768b2ef9b3210203010001a3533051301d0603551d0e041604148297fb8cf3d9ddf2f60ec90f92815c28e3f3ff35301f0603551d230418301680148297fb8cf3d9ddf2f60ec90f92815c28e3f3ff35300f0603551d130101ff040530030101ff300d06092a864886f70d01010b050003820101003c001f0f5d106072e0beedfa47895329d4623422080e66caa4beb4c3d9b6868fa107467d6160e512ede7cbbefdeb17c09b9f594f86f1a9922c982ccf9655d4d67eda061f667eeb25fe7203bea00e40f150a490a78ca963d87c185ade8b7c294f5052fb1e1edb3403831e33e4026c8e56717cb77bc32321858be37a77fe7f5511ef8c2013c86e2730c5b2366875131cae0c7616fdc7c8605696133e7a685f20203c0db8e0ff1d1a5991d2f058f48f20b10a5fb0df27a1f9874cc0fe8d6ebf77e9a7ba38490e9d63241a0fb3fd7701ff3b130c9aa7aa77770280b7003c1bb5e0784c34aacb74ce8114960e50eee04602a7ab20e5c878028e4292e90e40fd631fee16030300040e000000') >>> finished_extms = bytes.fromhex('16030301061000010201004971b89ae4355a001c49ccb49ed0664a9090a2dc0c14c97563b6dd98f13004ac5327c97abf10617b1f5d19b1f6e1091ccf159693497ebda262aedba2f3b76ae217d56477cad45e2ea129c324083701c2e99e65b6d63f916f963de8d98c5357d22272c032a30acccd673d1556d01e22e206186bcda3a5845d6dacee260ab66f47ea86a4c0081faa082b398f2c65da35264428f320c354b97cd96c986da43c8510e914ffb7f8bb73baee2530c4533ae2d6a922771af689c15b42c53428978510a3e3e90a3806f77fc1cb35c2c3f34dd7e3f831a79bc59b333f0c9e8be49390cd2a8e1c88dafbb9e3e24d1e0530703dbff7cd1c516fcc21a7d484f2111f985f03f8140303000101160303002457ed5c62171e4720a5890cf9ef09323f6e2db063aeebea776a54b879ffb6a69182d15cae') >>> >>> r1 = TLS(chello_extms) >>> r1.tls_session.server_rsa_key = ssl_key >>> r2 = TLS(shello_extms, tls_session=r1.tls_session.mirror()) >>> r3 = TLS(finished_extms, tls_session=r2.tls_session.mirror()) >>> >>> assert r3.tls_session.extms >>> assert r3.tls_session.pwcs.prf.hash_name == "SHA256" >>> assert r3.tls_session.session_hash == b'2\xdc\xf5\xcb\xbc\x99\xc6IV\xba\x0f.\x0bdq\x1f=\xef\xdaW\xfc*A\x9b\xe2?b\xccKW\xe9\xb7' >>> >>> l3 = r3.getlayer(TLS, 3) >>> assert isinstance(l3.msg[0], TLSFinished) >>> assert l3.msg[0][TLSFinished].vdata == b'\x15\xd6\xd5\xea\x84\xee\xb3\xdd\xd6\x10\xd8\x11' ###(042)=[passed] Reading TLS test session - Encrypt-then-MAC extension >>> from scapy.layers.tls.cert import PrivKey >>> from scapy.layers.tls.handshake import TLSFinished >>> from scapy.layers.tls.record import TLS >>> >>> client_hello = bytes.fromhex('16030100c9010000c50303611a2f42b70345cfbc5c5c4da1929bea8a2cb8b1fd10ab1341e43ffaa8856a63000038c02cc030009fcca9cca8ccaac02bc02f009ec024c028006bc023c0270067c00ac0140039c009c0130033009d009c003d003c0035002f00ff01000064000b000403000102000a000c000a001d0017001e00190018337400000010000e000c02683208687474702f312e310016000000170000000d002a0028040305030603080708080809080a080b080408050806040105010601030303010302040205020602') >>> server_hello = bytes.fromhex('1603030059020000550303a22c975875df69bea936cbd28b083cde754693b4f34a15a036e5e57b7f4755cf20226e6386f90e3751723beea9196640d5bbe6c7c9f314568fa3645cb7218e9159003d00000dff010001000016000000170000160303036e0b00036a0003670003643082036030820248a003020102020900eb73b71c3e2f9fdc300d06092a864886f70d01010b05003045310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c7464301e170d3139303231353135313430335a170d3239303231323135313430335a3045310b30090603550406130241553113301106035504080c0a536f6d652d53746174653121301f060355040a0c18496e7465726e6574205769646769747320507479204c746430820122300d06092a864886f70d01010105000382010f003082010a0282010100d2f7d36b233a5619368fc3a7db0f2364dc71986dd4eebcbee85b783e139cfeb0a80de50147c936aa84230e2fa2eb91ef1737410387b932440ac7cfda3c5966eef88f688bcbee6a5d0dfaa075b77dfe836f2cb318375ff5be2b35f6d62dd7c4b147224f67d53d95c7fcc11cda7bc622369b4d4a685655169fb28f66e511724f0c9af2f74ea4cdf09b92f917246a582f67fade3eff7eca2c794d713c13f80cd53f847aa196d0adc04494790a628e327f4b53d05b83025c3ea541195f953ce6fc37edcc68a8fd6eca621f38bc08bc2d8d72cfcdf85c68f9f4f4485b32133c63299f85ffd62bde5a9d585e5a896f08319448277f19e86d5d6878bc53768b2ef9b3210203010001a3533051301d0603551d0e041604148297fb8cf3d9ddf2f60ec90f92815c28e3f3ff35301f0603551d230418301680148297fb8cf3d9ddf2f60ec90f92815c28e3f3ff35300f0603551d130101ff040530030101ff300d06092a864886f70d01010b050003820101003c001f0f5d106072e0beedfa47895329d4623422080e66caa4beb4c3d9b6868fa107467d6160e512ede7cbbefdeb17c09b9f594f86f1a9922c982ccf9655d4d67eda061f667eeb25fe7203bea00e40f150a490a78ca963d87c185ade8b7c294f5052fb1e1edb3403831e33e4026c8e56717cb77bc32321858be37a77fe7f5511ef8c2013c86e2730c5b2366875131cae0c7616fdc7c8605696133e7a685f20203c0db8e0ff1d1a5991d2f058f48f20b10a5fb0df27a1f9874cc0fe8d6ebf77e9a7ba38490e9d63241a0fb3fd7701ff3b130c9aa7aa77770280b7003c1bb5e0784c34aacb74ce8114960e50eee04602a7ab20e5c878028e4292e90e40fd631fee16030300040e000000') >>> client_finished = bytes.fromhex('1603030106100001020100482bf86fa7047c767ecc5f46e971f2349232d57d4c40b04856b6ea2b5645b5b233c0cd2ad7b05101d6a3fcbd2698b25064501ba4f0cde40c8189abc29aebfffcb87413d4590cae7cf3589fa371ad5e0d161da9c275a4b8ca1aa9a400a3d76021f92b872403a72a22bad6368276010209ca1344971adf7d7a9cdeefd534cd933ec3d2852ea1dfff217f7cd55eac7d2b18f7c5600c56f28746389d1d6c33cd2ac24817632fc0fbd81ffcf528b1c2a5b328a0105e88513e6b2f95b51ca3adf390146662115a721bfd718eae3033388aaa5cb37e2c16428a6f7c994f961137f6a7f933327ed300f15621500d427d261f39970bbf40f4ba303963609439007d34e6bc1403030001011603030050f4b7962d5455e9244efe886bbd4156ca20936e4b8868d80c82b06ceac7cff6d69f130a610f2aa4c4fd8cb2681f84e3ebecad1b563bcd258255aa509ba2b6388f90ac5f1c1f84f1569dc3809667b86ba4') >>> server_finished = bytes.fromhex('14030300010116030300509e8e5fd6aebaa98263e98266fffcf7fd21eb50fb0510b8598660afb65c57a025374c1e63aff3e260dd5d027180e8aa0d85d43e0c0b54e8783e4ce51a71ef0ae555ab81404020342ca1a34643ce713688') >>> >>> r1 = TLS(client_hello) >>> r1.tls_session.server_rsa_key = ssl_key >>> r2 = TLS(server_hello, tls_session=r1.tls_session.mirror()) >>> r3 = TLS(client_finished, tls_session=r2.tls_session.mirror()) >>> r4 = TLS(server_finished, tls_session=r3.tls_session.mirror()) >>> >>> client_finished = r3.getlayer(TLS, 3).msg[0] >>> server_finished = r4.getlayer(TLS, 2).msg[0] >>> >>> assert r4.tls_session.encrypt_then_mac >>> assert isinstance(client_finished, TLSFinished) >>> assert isinstance(server_finished, TLSFinished) >>> assert client_finished.vdata == bytes.fromhex('771049b4ff714ac71253f84f') >>> assert server_finished.vdata == bytes.fromhex('42c9765e833997b6714fec75') ###(043)=[passed] Reading TLS test session - Full TLSNewSessionTicket captured >>> import os >>> filename = scapy_path("/test/pcaps/tls_new-session-ticket.pcap") >>> a = rdpcap(filename) >>> pkt = a[4] >>> assert isinstance(pkt[TLS].msg[0], TLSNewSessionTicket) >>> assert pkt[TLS].msg[0].ticket == b'6k\x8b{\xa8\xaf\xf0\x8aG*\xdd\xc2\xf6\t\xde\xc9y\t\x1d\xdb\xd55!\x91\x1f+\x1a\xa1@\xfe/\x90\xba\x98\xc5\xb3\xe8>y\xae\xda\xc3@\x184\xf6\x1f\xbc{|\xe87\xfe>\xba\\\x1d\x11\x00\xe6\xb9\xf6[,X\x0e\xe0jY\xa8\xfa\x07!1\xb8\x82\xbe\xa6aK\xa7\xad;(\x91^\xb9\xd3a\xa5\xfb%\xda\x10f\xfe\xf9\xc8\xf4\xc6z\xa7d\xa5\x89\x82IZ\xdc3\xa0{\x8c\x1c"\xd5w\x8e\x07\xa0G\xc6\xa7\x0c\xf3<:\x82c\x8a\xeb\x14("\xc4\x9bLS\xc1\x9f\xd7\xa09\xe8,\xe4*i\xf3\x9b\xbb\xb5\x98\xc9*EQ\x1e\xf4\xf7\xb05\xbaby\xa0\xceW\x87\x903\x193\xe3\xfb\xaf\xe82U\xbd\xe7t\xd0\xa4T\xe4\xd8\xe6\xdbd!\xf9' >>> assert pkt[TLS].msg[0].lifetime == 3600 ###(044)=[passed] Reading TLS test session - ApplicationData >>> t7 = TLS(p7_data, tls_session=t6.tls_session.mirror()) >>> assert t7.iv == b'\x00\x00\x00\x00\x00\x00\x00\x01' >>> assert t7.mac == b'>\x1dLb5\x8e+\x01n\xcb\x19\xcc\x17Ey\xc8' >>> assert not t7.pad and not t7.padlen >>> assert isinstance(t7.msg[0], _TLSEncryptedContent) >>> len(t7.msg[0].load) == 478 True ###(045)=[passed] Reading TLS msg dissect - Packet too small >>> assert isinstance(TLS(b"\x00"), Raw) ###(046)=[passed] Reading TLS msg dissect - Wrong data >>> from scapy.layers.tls.record import _TLSMsgListField >>> assert isinstance(_TLSMsgListField.m2i(_TLSMsgListField("", []), TLS(type=0), b'\x00\x03\x03\x00\x03abc'), Raw) >>> >>> with no_debug_dissector(): ... # not even bytes to make it crash ... assert isinstance(_TLSMsgListField.m2i(_TLSMsgListField("", []), TLS(type=20), 1), Raw) ... ###(047)=[passed] Test x25519 dissection in ServerKeyExchange >>> import binascii >>> from scapy.layers.tls.session import tlsSession >>> >>> session = tlsSession(connection_end="client") >>> hex_data = "160303012c0c00012803001d202f19b3f5defbd65cfdcbb3583d4760ef74dde4144e01049a43d8a036df38ca15080401008e4e4afc21f612d2f024bb489940a733ea606ed36cba9c60b8479264dcb5f4a0f839d85fa02f0a4be087243e69e575af48917ba6dfda9b485311cd8fe0d7616ece9b216b7b878588c03d3ab90b9dc981f758588905307541c7d3ccb6655baf7bfb0628f3a0ac181729da6b7fcba3efdd43f5bbaec53cfa4dd512941ee1204a42cba8a989e724bd42ac2cb1373ddb54acba29ae45fd58047176e4cb623a9b301711b926d15103f5251f6a0288b04a644834a9843752bbe2f8554beffdbf412983456fcc38b9caabdf7cf9ea2c30bd72dc00cf2cf48f22cd7f17b2d22fb651facb772507cc2fb83301c0c8dd1c3b4f24f38f0c4c82d21d0fa5d1e0b260d545e701" >>> packet = TLS(binascii.unhexlify(hex_data), tls_session=session) >>> >>> assert isinstance(packet.msg[0], TLSServerKeyExchange) >>> assert packet.msg[0].params[0].sprintf("%named_curve%") == "x25519" >>> assert packet.msg[0].params[0].point == b'/\x19\xb3\xf5\xde\xfb\xd6\\\xfd\xcb\xb3X=G`\xeft\xdd\xe4\x14N\x01\x04\x9aC\xd8\xa06\xdf8\xca\x15' ###### ## Read handshake with NULL Cipher ###### ###(048)=[passed] Reading test session - Loading unparsed TLS records >>> p1_ch = b'\x16\x03\x01\x00{\x01\x00\x00w\x03\x03\x86C\xf2\xe4x\xbaL\x9a`\xc3\x9aR\xa8\xb4\xac\xd0\r\xe2\xa3N\xe6\xa8]g5z$j\xb1(%\xe3\x00\x00\x08\xc0\x06\xc0#\xc0$\x00\xff\x01\x00\x00F\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x00\n\x00\x08\x00\x1d\x00\x17\x00\x19\x00\x18\x00#\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00\r\x00 \x00\x1e\x06\x01\x06\x02\x06\x03\x05\x01\x05\x02\x05\x03\x04\x01\x04\x02\x04\x03\x03\x01\x03\x02\x03\x03\x02\x01\x02\x02\x02\x03' >>> p2_sh = b'\x16\x03\x03\x006\x02\x00\x002\x03\x03C\nm.s\x07W\xef\x91\xf0\xc7\xd8\xaa\xc3NL}\xb0tw?\xd8\n\x8f\x8d\xc4\xee,fhY\x85\x00\xc0\x06\x00\x00\n\x00\x0b\x00\x02\x01\x00\x00\x17\x00\x00' >>> p3_cert = b'\x16\x03\x03\x02\xca\x0b\x00\x02\xc6\x00\x02\xc3\x00\x02\xc00\x82\x02\xbc0\x82\x02\x1d\xa0\x03\x02\x01\x02\x02\x02\x04\xd20\n\x06\x08*\x86H\xce=\x04\x03\x020v1\x0b0\t\x06\x03U\x04\x06\x13\x02PL1\x0b0\t\x06\x03U\x04\x08\x0c\x02PL1\x0c0\n\x06\x03U\x04\x07\x0c\x03KTW1\x0c0\n\x06\x03U\x04\n\x0c\x03ORG1\x0e0\x0c\x06\x03U\x04\x0b\x0c\x05OUNIT1\x110\x0f\x06\x03U\x04\x03\x0c\x08SomeName1\x1b0\x19\x06\t*\x86H\x86\xf7\r\x01\t\x01\x16\x0cemail@adress0\x1e\x17\r190404065502Z\x17\r270621065502Z0\x81\x881\x0b0\t\x06\x03U\x04\x06\x13\x02PL1\x0b0\t\x06\x03U\x04\x08\x0c\x02PL1\x0c0\n\x06\x03U\x04\x07\x0c\x03KTW1\x0c0\n\x06\x03U\x04\n\x0c\x03ORG1\x110\x0f\x06\x03U\x04\x0b\x0c\x08SomeUnit1\x110\x0f\x06\x03U\x04\x03\x0c\x08SomeName1\r0\x0b\x06\x03U\x04\x05\x0c\x0412341\x1b0\x19\x06\t*\x86H\x86\xf7\r\x01\t\x01\x16\x0cemail@adress0Y0\x13\x06\x07*\x86H\xce=\x02\x01\x06\x08*\x86H\xce=\x03\x01\x07\x03B\x00\x04\x97\xfcij\xa2\xeeZh>\x94\n\xad\x1f\x16\x91\x80\x89\xc5\xb3\xc4\xb7\xd1A\xf0(\x96\x93UJ\xca\x98Y\xdec\xad\xa0\xbb\xd9\xebl\x15\xc7\xf2\xa9\xcfl\xbf\x0f\xed"\x08%\x8f\xaf\xd7\xf1K\x98\xf1\xf9\x04.\x05\x81\xa3\x81\x870\x81\x840\t\x06\x03U\x1d\x13\x04\x020\x000\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x03\xa80\'\x06\x03U\x1d%\x04 0\x1e\x06\x08+\x06\x01\x05\x05\x07\x03\x04\x06\x08+\x06\x01\x05\x05\x07\x03\x02\x06\x08+\x06\x01\x05\x05\x07\x03\x010\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\xb2\x12\x8c\xe4\x16\x17XjZ%+4G\xa0\xfd\x0b!\x91\xc7\xec0\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14\xe2\x17\xb1\xb1\xe1\xca3\xe8\xed\xfd\x86\x13\x10\xe7x5H\xdf1\xf50\n\x06\x08*\x86H\xce=\x04\x03\x02\x03\x81\x8c\x000\x81\x88\x02B\x01\xeb\xc9\xbe\xa1^\x12\x85\x10\x03\x9f$\xc6(\xce\xd7x\xc3w\x00\xd2\x8an\\r\xe8\xb3\xb9\x92Q\x8f\x9f\x81v\xa7*\xa0\xb2\xd8\x17\x12\xbe\xef\x04c\x97T\x8c;&B[\xda\xf8\x81c7\xd25\xfb\xae\x19\x81A\x9b\xc6\x02B\x012\xe9G\xd9;9\x97\x9c\xed_\xa19K\xef\x1b\xf1\x8f\x01\x86icw\r\xa1\x19\xb7\xa6\xe6\xc7\xef\xd6\x1bTr\xb1~\x8ae:4\xdb\xdb\x07\xcf&\xd4\xc0,\xf7\xf5\xa7\'m\xe1a\x06\xb5>\xec\xf1kDB\xf7\\' >>> p4_ske = b'\x16\x03\x03\x00\x93\x0c\x00\x00\x8f\x03\x00\x17A\x04\xb4\xd4\xf6^\x87(\x97\xc4\xe5)\x19E\xe1\x9e\xfdPOf\x91\xa1PTdk\xdcU\n\xb9\x07\x93\xc8\xd1\xb0\tA\xce\xf9\xcd\x0e\xb6\xd7\xf0\r\xc7\xba\xaa\xd9zA\xe8\x8f(\xe1\x0fE[+&9\x90\xd4\n`O\x06\x03\x00F0D\x02 -\x04\xe5.g\x92\xca\xbe\xe4\x87\x9a\x88\x80~<\x10Q&v\xfa~\xf4h\x7f\xd0\xa1\x16\xf2\xfdN\x8b\xdf\x02 eI\xf0{E6mU0bRt\xb9\xc4\xcff\xf9\x87\xfdL\xdd\xa3d\xcf1\xab| ~"<\xcd' >>> p5_shd = b'\x16\x03\x03\x00\x04\x0e\x00\x00\x00' >>> p6_cke_ccs_cfin = b'\x16\x03\x03\x00F\x10\x00\x00BA\x04w_\xba\x8cX9\xab\x1f\x1drw\xaa\x08"\xe6\x05\x8eS\x8637\xb75\xe4\x1f\xc3H-\x12\xf4\xbb\x10\xf8\xb8.[?\x11sG\x0b\x18\x03}\x16n\n\xdb\x7f\x92\xear\xd1\x1a\x07.e;\xfc\xcer\x1f\xebA\x14\x03\x03\x00\x01\x01\x16\x03\x03\x00$\x14\x00\x00\x0cYX\xacX\xb81\x1fX\x8f\xbe\x1dJ\x10\xce\xca2\xb4\xc3m\xf1\x16c\xdb\xfc\x08\x16\x1d\x82\x83U\x8c\xe1' >>> p7_ccs = b'\x14\x03\x03\x00\x01\x01' >>> p8_sfin = b'\x17\x03\x03\x00$\x14\x00\x00\x0c8\x1f\x18\xb6f\x98\xe3\xc0\xa4\xe2\xf8\xba\n\xd7\xd0\xb93y]\x1a\n\xeb\xc39nd\xa5\xd7\x8c\xe5\xf9\x91' ###(049)=[passed] Reading TLS test session >>> t1 = TLS(p1_ch) >>> t2 = TLS(p2_sh, tls_session=t1.tls_session.mirror()) >>> t3 = TLS(p3_cert, tls_session=t2.tls_session) >>> t4 = TLS(p4_ske, tls_session=t3.tls_session) >>> t5 = TLS(p5_shd, tls_session=t4.tls_session) >>> t6 = TLS(p6_cke_ccs_cfin, tls_session=t5.tls_session.mirror()) TLS: record integrity check failed [TLS None:None > None:None / TLS / TLS Handshake - Client Key Exchange] ###(050)=[passed] Verify TLSClientKeyExchange >>> cke = t6.msg[0] >>> assert isinstance(cke, TLSClientKeyExchange) ###(051)=[passed] Verify TLSChangeCipherSpec >>> ccs = t6.payload.msg[0] >>> assert isinstance(ccs, TLSChangeCipherSpec) ###(052)=[passed] Verify TLSFinished >>> from scapy.layers.tls.handshake import TLSFinished >>> cfin = t6.payload.payload.msg[0] >>> assert isinstance(cfin, TLSFinished) ###(053)=[passed] Verify MAC - TLSFinished record >>> assert (t6.payload.payload.mac == b'\x10\xce\xca2\xb4\xc3m\xf1\x16c\xdb\xfc\x08\x16\x1d\x82\x83U\x8c\xe1') ###### ## Read a vulnerable TLS session ###### ###(054)=[passed] Reading TLS vulnerable session - Decrypt data from using a compromised server key >>> load_layer("tls") >>> >>> from scapy.layers.tls.cert import PrivKeyRSA >>> from scapy.layers.tls.record import TLSApplicationData >>> import os >>> filename = scapy_path("/test/scapy/layers/tls/pki/srv_key.pem") >>> key = PrivKeyRSA(filename) >>> ch = b'\x16\x03\x01\x005\x01\x00\x001\x03\x01X\xac\x0e\x8c\xe46\xe9\xedo\xda\x085$M\xae$\x90\xd9\xa93\xb7(\x13J\xf9\xc5?\xef\xf4\x96\xa1\xfa\x00\x00\x04\x00/\x00\xff\x01\x00\x00\x04\x00#\x00\x00' >>> sh = b'\x16\x03\x01\x005\x02\x00\x001\x03\x01\x88\xac\xd4\xaf\x93~\xb5\x1b8c\xe7)\xa6\x9b\xa9\xed\xf3\xf3*\xdb\x00\x8bB\xf6\n\xcbz\x8eP\x83`G\x00\x00/\x00\x00\t\xff\x01\x00\x01\x00\x00#\x00\x00\x16\x03\x01\x03\xac\x0b\x00\x03\xa8\x00\x03\xa5\x00\x03\xa20\x82\x03\x9e0\x82\x02\x86\xa0\x03\x02\x01\x02\x02\t\x00\xfe\x04W\r\xc7\'\xe9\xf60\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000T1\x0b0\t\x06\x03U\x04\x06\x13\x02MN1\x140\x12\x06\x03U\x04\x07\x0c\x0bUlaanbaatar1\x170\x15\x06\x03U\x04\x0b\x0c\x0eScapy Test PKI1\x160\x14\x06\x03U\x04\x03\x0c\rScapy Test CA0\x1e\x17\r160916102811Z\x17\r260915102811Z0X1\x0b0\t\x06\x03U\x04\x06\x13\x02MN1\x140\x12\x06\x03U\x04\x07\x0c\x0bUlaanbaatar1\x170\x15\x06\x03U\x04\x0b\x0c\x0eScapy Test PKI1\x1a0\x18\x06\x03U\x04\x03\x0c\x11Scapy Test Server0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xcc\xf1\xf1\x9b`-`\xae\xf2\x98\r\')\xd9\xc0\tYL\x0fJ0\xa8R\xdf\xe5\xb1!\x9fO\xc3=V\x93\xdd_\xc6\xf7\xb3\xf6U\x8b\xe7\x92\xe2\xde\xf2\x85I\xb4\xa1,\xf4\xfdv\xa8g\xca\x04 `\x11\x18\xa6\xf2\xa9\xb6\xa6\x1d\xd9\xaa\xe5\xd9\xdb\xaf\xe6\xafUW\x9f\xffR\x89e\xe6\x80b\x80!\x94\xbc\xcf\x81\x1b\xcbg\xc2\x9d\xb5\x05w\x04\xa6\xc7\x88\x18\x80xh\x956\xde\x97\x1b\xb6a\x87B\x1au\x98E\x82\xeb>2\x11\xc8\x9b\x86B9\x8dM\x12\xb7X\x1b\x19\xf3\x9d+\xa1\x98\x82\xca\xd7;$\xfb\t9\xb0\xbc\xc2\x95\xcf\x82)u\x16)?B \x17+M@\x8cVl\xad\xba\x0f4\x85\xb1\x7f@yqx\xb7\xa5\x04\xbb\x94\xf7\xb5A\x95\xee|\xeb\x8d\x0cyhY\xef\xcb\xb3\xfa>x\x1e\xeegLz\xdd\xe0\x99\xef\xda\xe7\xef\xb2\t]\xbe\x80 !\x05\x83,D\xdb]*v)\xa5\xb0#\x88t\x07T"\xd6)z\x92\xf5o-\x9e\xe7\xf8&+\x9cXe\x02\x03\x01\x00\x01\xa3o0m0\t\x06\x03U\x1d\x13\x04\x020\x000\x0b\x06\x03U\x1d\x0f\x04\x04\x03\x02\x05\xe00\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\xa1+ p\xd2k\x80\xe5e\xbc\xeb\x03\x0f\x88\x9ft\xad\xdd\xf6\x130\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14fS\x94\xf4\x15\xd1\xbdgh\xb0Q725\xe1\xa4\xaa\xde\x07|0\x13\x06\x03U\x1d%\x04\x0c0\n\x06\x08+\x06\x01\x05\x05\x07\x03\x010\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x00\x03\x82\x01\x01\x00\x81\x88\x92sk\x93\xe7\x95\xd6\xddA\xee\x8e\x1e\xbd\xa3HX\xa7A5?{}\xd07\x98\x0e\xb8,\x94w\xc8Q6@\xadY\t(\xc8V\xd6\xea[\xac\xb4\xd8?h\xb7f\xca\xe1V7\xa9\x00e\xeaQ\xc9\xec\xb2iI]\xf9\xe3\xc0\xedaT\xc9\x12\x9f\xc6\xb0\nsU\xe8U5`\xef\x1c6\xf0\xda\xd1\x90wV\x04\xb8\xab8\xee\xf7\t\xc5\xa5\x98\x90#\xea\x1f\xdb\x15\x7f2(\x81\xab\x9b\x85\x02K\x95\xe77Q{\x1bH.\xfb>R\xa3\r\xb4F\xa9\x92:\x1c\x1f\xd7\n\x1eXJ\xfa.Q\x8f)\xc6\x1e\xb8\x0e1\x0es\xf1\'\x88\x17\xca\xc8i\x0c\xfa\x83\xcd\xb3y\x0e\x14\xb0\xb8\x9b/:-\t\xe3\xfc\x06\xf0:n\xfd6;+\x1a\t*\xe8\xab_\x8c@\xe4\x81\xb2\xbc\xf7\x83g\x11nN\x93\xea"\xaf\xff\xa3\x9awWv\xd0\x0b8\xac\xf8\x8a\x945\x8e\xd7\xd4a\xcc\x01\xff$\xb4\x8fa#\xba\x88\xd7Y\xe4\xe9\xba*N\xb5\x15\x0f\x9c\xd0\xea\x06\x91\xd9\xde\xab\x16\x03\x01\x00\x04\x0e\x00\x00\x00' >>> ck = b"\x16\x03\x01\x01\x06\x10\x00\x01\x02\x01\x00w\x93\xec\xfa\xf3\xdf[\x9a4\xa7\x9e\xcd\x06=\x8dH\xf1\x069\x8c\x06\x01S\xf7\xb5\x16h\xf6\xd5 I\xd7\xf0\xc5Z\xf6\xe0f7\x95\x91\xddNC\xe7$\xf5\xdaZ\xcdG\xd8\x14\xcaV\x98\xc4\xb2\x8cm\xe51@\x9b\x9c\xb8\xadul\xd0\xdf\xf2\xd7@Q\xe4\x05J\xf31[\xdf\xc8'(\x8f#\xf0\xc4\x1c\xc6\x07G\xb327\x85\xad\xa2\xa6\xa2E\x18\x85rP\xb8\x86uL\\7\x82\x18\xceh\xc6\xd1\xf4\xcc\xb9VN\x85\x7f9c\x92\t\x96\x8e\x80\x06\xe4\r\xbfu<\xabgP^z\xc7\xfd\x8e\x12t^\xb7\xc7Lr\xdc5\xf8\xa7\xdb\x9c\xbd\xd5\xad\xabP<\xe7\x9f%f\xb4\xd8\xf4\xf0~\x99\xbeZ\xe9\xbc\x0c9\r\xb2Uq\xfcd\xa4\xda\x89\x90\xd1\x15\x05\xcc\x00\xb1\xcd\xa9c\xb4\xe8\x7fRH\xbd\xe1\xd2\xd8\x9c\xb6\xd2\x8dq9\xe5\t\xeb\xfc\x1b\x06\xac\xab\x96\xa7\xfd{\xdf\xf2\x16\r\xd6'\xb8\xd3\xa5L\xc8\x08 \xb9\xccN\xe5\xf0\xa0S\xf3\xc3\xc9\xdf\xee\xd0\r\xd8[\x14\x03\x01\x00\x01\x01\x16\x03\x01\x000~\x01\xe1!2\x90\xba\xc8 \xb6\x8c\xb7\xd9\xf5\x80\x1d$Z^\xc8\xa3\x9f\xb3\xf1M\x0c\xd1\xedd\xb1'\x0f\xe4ER\xc9\xf7L\xf3;\xc1\xbaz\xfa\xb76\xe3q" >>> fin = b"\x16\x03\x01\x00\xaa\x04\x00\x00\xa6\x00\x00\x1c \x00\xa0*\xf5.4:\xe4;t\xf0v\xed\xeaLX\xa5\xce*@\xe7\x83\rWx\xadWkM-\x95\xe7\x98\xcb6x\xeb\xca\xfe8\xf5\x84*\x9bAmZ/o9\xb03\xea\x1e\x99\xfdQ\xbfe\r\xe8W\xd5\xdb\xdd\x83\x90\x14\xc6\xef\x10s\x15\xff\xc2U\xce\xb0\x00\x11\x02|\xed\x99\xbac\xfb\x03M\xce\xd3\x92\xbe\x98\x95\x1c\xef\x9b\xb1\xd6,\x0c6Td\xc9j*\x17\xb9\xde\x13\x8f\xba[\xbcD\x1b\x9a~\xe9\xa2\xf3\xa4V3\xfe\xd6'\xc8i+\xb0m\xf8&\x86\x83\xaa\xe5\x1d\x06\x07lOx\x06 \x02\xbe\xfe\xda\x93-\x9fk\xeaHu\x8a\xec_\x14\x03\x01\x00\x01\x01\x16\x03\x01\x000Pc\xe0T+\x17\\>\xd0\xbc\xe6Xx}\xe5\xa26\xea\x0b\xad\x1bY\x1b\x05,\x7f\xeeQ\xd6\xea!\x9d.\xe0\xf3\x88\xe6'jV\xfdz]M'\xcejJ" >>> data = b'\x17\x03\x01\x00 \xe8\x91\'mRT\x17\xa1\xd6}+\x80\x02\xda\xadw.\x82TA\'\xdep\xa4\xe1\xb1H\xa9\xb1\x81gw\x17\x03\x01\x00P\xddD\x18\xdb\x82pz\xb75>\x1c\xd7\xa9=\x18C\xbd\xf0F\xa1k\x0c\xe5&\xf2\xdf\x97\xf0\xab5\xf41W\x85 \xcf\xd9\x98\xa4\xe8\xcc\xff \x1c\xbc\xb3U\xc8\x9c>\xc4$\xa5U\xc6\xd4\x1f"\xce\xf0\x98\xf0D\xd2\x1d\r*\x99*\xdcd4?\xc9\x0b\xa6\xb2\x81%\xfc' >>> t = TLS(ch) >>> t = TLS(sh, tls_session=t.tls_session.mirror()) >>> t.tls_session.server_rsa_key = key >>> t = TLS(ck, tls_session=t.tls_session.mirror()) >>> t = TLS(fin, tls_session=t.tls_session.mirror()) >>> t = TLS(data, tls_session=t.tls_session.mirror()) >>> assert len(t.msg) == 1 >>> assert isinstance(t.msg[0], TLSApplicationData) >>> assert t.msg[0].data == b"" >>> t.getlayer(TLS, 2).msg[0].data == b"To boldly go where no man has gone before...\n" True ###(055)=[passed] Auto-provide the session: use TCPSession with conf.tls_session_enable >>> conf.debug_dissector = 2 >>> >>> conf.tls_session_enable = True >>> conf.tls_sessions.server_rsa_key = key >>> >>> client = "192.168.0.1" >>> server = "1.2.3.4" >>> bc = Ether()/IP(src=client, dst=server)/TCP(sport=51478, dport=443, seq=RandShort()) >>> bs = Ether()/IP(src=server, dst=client)/TCP(sport=443, dport=51478, seq=RandShort()) >>> >>> pcap = [ ... bc/ch, ... bs/sh, ... bc/ck, ... bs/fin, ... bc/data ... ] >>> res = sniff(offline=pcap, session=TCPSession) getmacbyip failed on [Errno 1] Operation not permitted MAC address to reach destination not found. Using broadcast. getmacbyip failed on [Errno 1] Operation not permitted MAC address to reach destination not found. Using broadcast. more getmacbyip failed on [Errno 1] Operation not permitted more MAC address to reach destination not found. Using broadcast. >>> >>> res[4].show() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = 52:54:00:a3:0b:7c type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = tcp chksum = None src = 192.168.0.1 dst = 1.2.3.4 \options \ ###[ TCP ]### sport = 51478 dport = https seq = 16845 ack = 0 dataofs = 5 reserved = 0 flags = S window = 8192 chksum = 0x94d3 urgptr = 0 options = [] ###[ TLS ]### type = application_data version = TLS 1.0 len = 32 iv = b'' \msg \ |###[ TLS Application Data ]### | data = b'' mac = b"\xc4\x1c\xde+'\xed0n0\xcfg\xf4\xb2j/\xd0\xda\xc8$q" pad = b'\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b' padlen = 11 ###[ TLS ]### type = application_data version = TLS 1.0 len = 80 iv = b'' \msg \ |###[ TLS Application Data ]### | data = b'To boldly go where no man has gone before...\n' mac = b'\xdb\xe5\x00\x0b\x14\x0c\x1b\x9c\x19F\xdf\x12L\xbdO\xed\x0e\xae\xbf\x92' pad = b'\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e' padlen = 14 >>> assert res[4].getlayer(TLS, 2).msg[0].data == b"To boldly go where no man has gone before...\n" >>> >>> conf.tls_session_enable = False ###### ## Build TLS packets ###### ###(056)=[passed] Building packets - Various default records >>> from scapy.layers.tls.handshake import TLSCertificate >>> from scapy.layers.tls.record import TLSAlert >>> raw(TLS()) b'\x00\x03\x03\x00\x00' >>> raw(TLSClientHello()) b"\x01\x00\x00o\x03\x03\x00\x00\x00\x004D\x91\x97\xb7\xa8\x9a\x96\x00P\x01[\xc8\xb5u\x9c\xbb\x15RIx\xca\xd2\xa1\x00\xb3\xf5}\x00\x00\x1a\xc0+\xc0#\xc0/\xc0'\x00\x9e\x00g\x00\x9c\x00<\xc0\t\xc0\x13\x003\x00/\x00\n\x01\x00\x00,\xff\x01\x00\x01\x00\x00\x00\x00\x0f\x00\r\x00\x00\nsecdev.org\x00\r\x00\x08\x00\x06\x04\x03\x04\x01\x02\x01\x00\n\x00\x04\x00\x02\x00\x17" >>> raw(TLSServerHello()) b'\x02\x00\x00&\x03\x03\x00\x00\x00\x00\xdbU\xeaH\xcb\n\x8c_\xe3\xa9\xdbS\xab\x07\x11c\x95\xa7\x1eh\xea\x8a\xa0\xd9\xdc\x08+\x84\x00\x00\x00\x00' >>> raw(TLSCertificate()) b'\x0b\x00\x00\x03\x00\x00\x00' >>> raw(TLSServerKeyExchange()) b'\x0c\x00\x00\x00' >>> raw(TLSClientKeyExchange()) b'\x10\x00\x00\x00' >>> raw(TLSAlert()) b'\x00\x00' >>> raw(TLSChangeCipherSpec()) b'\x01' >>> raw(TLSApplicationData()) == b"" True ###(057)=[passed] Building packets - ClientHello with automatic length computation >>> from scapy.layers.tls.crypto.suites import (TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, ... TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, ... TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, ... TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, ... TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, ... TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_3DES_EDE_CBC_SHA) >>> >>> from scapy.layers.tls.extensions import (ServerName, TLS_Ext_SupportedEllipticCurves, ... ProtocolName) >>> >>> ch = TLSClientHello() >>> ch.msgtype = 'client_hello' >>> ch.version = 'TLS 1.2' >>> ch.gmt_unix_time = 0x26ee2ddd >>> ch.random_bytes = b'X\xe1\xb1T\xaa\xb1\x0b\xa0zlg\xf8\xd14]%\xa9\x91d\x08\xc7t\xcd6\xd4"\x9f\xcf' >>> ch.ciphers = [TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_3DES_EDE_CBC_SHA] >>> ch.comp = 'null' >>> ext1 = TLS_Ext_ServerName(servernames=ServerName(servername='mn.scapy.wtv')) >>> ext2 = TLS_Ext_RenegotiationInfo() >>> ext3 = TLS_Ext_SupportedEllipticCurves(groups=['secp256r1', 'secp384r1', 'secp521r1']) >>> ext4 = TLS_Ext_SupportedPointFormat(ecpl='uncompressed') >>> ext5 = TLS_Ext_SessionTicket() >>> ext6 = TLS_Ext_NPN() >>> ext7 = TLS_Ext_ALPN(protocols=[ProtocolName(protocol='h2-16'), ProtocolName(protocol='h2-15'), ProtocolName(protocol='h2-14'), ProtocolName(protocol='h2'), ProtocolName(protocol='spdy/3.1'), ProtocolName(protocol='http/1.1')]) >>> ext8 = TLS_Ext_CSR(stype='ocsp', req=OCSPStatusRequest()) >>> ext9 = TLS_Ext_SignatureAlgorithms(sig_algs=['sha256+rsa', 'sha384+rsa', 'sha512+rsa', 'sha1+rsa', 'sha256+ecdsa', 'sha384+ecdsa', 'sha512+ecdsa', 'sha1+ecdsa', 'sha256+dsa', 'sha1+dsa']) >>> ch.ext = [ext1, ext2, ext3, ext4, ext5, ext6, ext7, ext8, ext9] >>> t = TLS(type='handshake', version='TLS 1.0', msg=ch) >>> raw(t) == b'\x16\x03\x01\x00\xc7\x01\x00\x00\xc3\x03\x03&\xee-\xddX\xe1\xb1T\xaa\xb1\x0b\xa0zlg\xf8\xd14]%\xa9\x91d\x08\xc7t\xcd6\xd4"\x9f\xcf\x00\x00\x16\xc0+\xc0/\xc0\n\xc0\t\xc0\x13\xc0\x14\x003\x009\x00/\x005\x00\n\x01\x00\x00\x84\x00\x00\x00\x11\x00\x0f\x00\x00\x0cmn.scapy.wtv\xff\x01\x00\x01\x00\x00\n\x00\x08\x00\x06\x00\x17\x00\x18\x00\x19\x00\x0b\x00\x02\x01\x00\x00#\x00\x003t\x00\x00\x00\x10\x00)\x00\'\x05h2-16\x05h2-15\x05h2-14\x02h2\x08spdy/3.1\x08http/1.1\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00\r\x00\x16\x00\x14\x04\x01\x05\x01\x06\x01\x02\x01\x04\x03\x05\x03\x06\x03\x02\x03\x04\x02\x02\x02' True ###(058)=[passed] Building packets - application data with Encrypt-then-MAC >>> session = tlsSession( ... rcs=connState(ciphersuite=TLS_RSA_WITH_AES_256_CBC_SHA256), ... wcs=connState(ciphersuite=TLS_RSA_WITH_AES_256_CBC_SHA256), ... ) >>> session.encrypt_then_mac = True >>> session.tls_version = 0x0303 >>> session.rcs.cipher.key = b'A' * 32 >>> session.wcs.cipher.key = b'A' * 32 >>> payload = b'PAYLOAD' >>> tlsdata = TLS(msg=TLSApplicationData(data=payload), tls_session=session) >>> t = TLS(raw(tlsdata), tls_session=session.mirror()) TLS: record integrity check failed [TLS None:None > None:None / TLS] >>> assert t[0].msg[0].data == payload ###(059)=[passed] Building packets - ServerHello context linking >>> from scapy.layers.tls.crypto.kx_algs import KX_ECDHE_RSA >>> from scapy.layers.tls.crypto.cipher_block import Cipher_AES_256_CBC >>> sh = TLSServerHello(gmt_unix_time=0x41414141, random_bytes='B'*28, cipher=0xc014) >>> t = TLS(msg=sh) >>> t.raw_stateful() b'\x16\x03\x03\x00*\x02\x00\x00&\x03\x03AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBB\x00\xc0\x14\x00' >>> assert isinstance(t.tls_session.pwcs.ciphersuite, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA) >>> assert isinstance(t.tls_session.pwcs.key_exchange, KX_ECDHE_RSA) >>> assert isinstance(t.tls_session.pwcs.cipher, Cipher_AES_256_CBC) >>> assert isinstance(t.tls_session.pwcs.hmac, Hmac_SHA) >>> t.tls_session.server_random == b'A'*4+b'B'*28 True ###(060)=[passed] Building packets - ChangeCipherSpec with forged, forbidden field values >>> t = TLS(msg=TLSChangeCipherSpec()) >>> assert raw(t) == b'\x14\x03\x03\x00\x01\x01' >>> t.len = 0 >>> assert raw(t) == b'\x14\x03\x03\x00\x00\x01' >>> t.type = 0xde >>> t.version = 0xadbe >>> t.len = 0xefff >>> raw(t) == b'\xde\xad\xbe\xef\xff\x01' True ###(061)=[passed] Building packets - TLS record with bad data >>> a = TLS(b'\x17\x03\x03\x00\x03data') >>> assert a[Raw] ###(062)=[passed] Building packets - _CipherSuitesField with no cipher >>> from scapy.layers.tls.handshake import _CipherSuitesField >>> a = _CipherSuitesField("test", None, {}) >>> assert a.i2repr(None, None) == "None" >>> assert isinstance(a.randval(), RandBin) ###(063)=[passed] Building packets - TLSClientKeyExchange with bad data >>> a = TLSClientKeyExchange(raw(TLSClientKeyExchange(exchkeys="baddata"))) >>> assert a.haslayer(Raw) ###(064)=[passed] Building packets - Perform dummy session update >>> from scapy.layers.tls.handshake import TLSHelloRequest >>> assert not TLSHelloRequest().tls_session_update(None) ###(065)=[passed] Cryptography module is unavailable >>> from unittest import mock >>> >>> @mock.patch("scapy.layers.tls.crypto.suites.get_algs_from_ciphersuite_name") ... def test_tls_without_cryptography(get_algs_from_ciphersuite_name_mock): ... get_algs_from_ciphersuite_name_mock.return_value = (scapy.layers.tls.crypto.kx_algs.KX_ECDHE_RSA, None, None, scapy.layers.tls.crypto.hash.Hash_SHA256, False) ... sh = IP()/TCP()/TLS(msg=TLSServerHello(cipher=0xc02f)) ... assert raw(sh) ... sh2 = Ether(b"\xaa\xaa\xaa\xaa\xaa\xaa\xbb\xbb\xbb\xbb\xbb\xbb\x86\xdd`\x04Z\xd8\x02\x19\x06@\xcfm\xack|z\xae\xac\x9d\x8d'\xba\xa2Cs\xcc\x07\x8f\x91\xbdk\x0e\x1e\xdb\xf6\xbe\xc3\xa1\xfc\xa5\x15\xca\xd6#\x01\xbb\xeeC\xc0H\xea\xa2\x9a,P\x18\x00\xffu\xf0\x00\x00\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03\x03W`\xb4|\n5E\x11\xe8\xb5\xa3\x9c\xea\xa6I\x99N\xcd\xe9j\x8d\xfe\xa8%\x8b\xceC\xf8w\x94gV \x13\x0b\xdf}\xad\xbf\xbe67\xba\xcf\x9c\xfa\x92\xc2\xeeS\xf6DL\x19\xb3\xe4`H\x84\xcb]h\xb4\xbb\xba\x00\x1cZZ\xc0+\xc0/\xc0,\xc00\xcc\xa9\xcc\xa8\xc0\x13\xc0\x14\x00\x9c\x00\x9d\x00/\x005\x00\n\x01\x00\x01\x97\xba\xba\x00\x00\xff\x01\x00\x01\x00\x00\x00\x00\x11\x00\x0f\x00\x00\x0cfacebook.com\x00\x17\x00\x00\x00#\x00\xc0\x8a`K^\x7fF\x05K\x95\x85\x1c\xec\x9f\xff\x9b\x85T\x85=<\xbc\xfb\xe4n4\xe9W+\xfanM\xa7\x8c.\x95\x9e\xf0\xfb\x93\x91\xa9\x87\x12o\xc8\x99\xe8\x94_\xca\xceH(\xcai\xdf\xe8\xcf7\x05v\xd4\x9e\x85\x86\x19\xe4\xb6\xf9K\n\xb2\xfd\xa1\xa3r\x9f\xec\x05\xd4\xbc\x1bU\x9a\x89\x1d)\xc5\x85(?@x\r\x12Ep\xb7\xf8\x0c\xe7\x17Y<\xbd-\xd7\x9a\x9f^\xb1k\x0b\xcb\xfd\xf4\xb1z\x06\xe9Mna\x9a\xc8\xc8\xdd\x95\xa1`N\xbd/\x9d\xd6\xd9\x93\xf4$\xefq\x80R\xc3|\x9f\xe1'\x19\xf2I\xf8\xdbV\x0b/\xaex8q\xb2ZGU\xf7^\xa9\x80\xf9\r\xbfo\xee\t\x01(\x93\x12g\x1frXUa\xdc\x8d*F\xb8\xc6\xe2\xb6\x00\r\x00\x14\x00\x12\x04\x03\x08\x04\x04\x01\x05\x03\x08\x05\x05\x01\x08\x06\x06\x01\x02\x01\x00\x05\x00\x05\x01\x00\x00\x00\x00\x00\x12\x00\x00\x00\x10\x00\x0e\x00\x0c\x02h2\x08http/1.1uP\x00\x00\x00\x0b\x00\x02\x01\x00\x00\n\x00\n\x00\x08jj\x00\x1d\x00\x17\x00\x18zz\x00\x01\x00\x00\x15\x00Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") ... assert TLS in sh2 ... assert isinstance(sh2.msg[0], TLSClientHello) ... >>> test_tls_without_cryptography() ###(066)=[passed] Truncated TCP segment >>> with no_debug_dissector(): ... pkt = Ether(bytes.fromhex('00155dfb587a00155dfb58430800450005dc54d3400070065564400410d40a00000d01bb044e8b86744e16063ac45010faf06ba9000016030317c30200005503035cb336a067d53a5d2cedbdfec666ac740afbd0637ddd13eddeab768c3c63abee20981a0000d245f1c905b329323ad67127cd4b907a49f775c331d0794149aca7cdc02800000d0005000000170000ff010001000b000ec6000ec300090530820901308206e9a00302010202132000036e72aded906765595fae000000036e72300d06092a864886f70d01010b050030818b310b30090603550406130255533113')) ... assert conf.padding_layer in pkt ... ###(067)=[passed] Test tlsSession >>> from scapy.layers.tls.session import tlsSession >>> s = tlsSession(ipsrc="216.58.201.227", ipdst="127.0.0.1", sport=443, dport=443, sid=1) >>> assert s.__repr__() == "216.58.201.227:443 > 127.0.0.1:443" >>> assert s == s >>> assert hash(s) == hash(s) >>> assert not s.consider_write_padding() ###(068)=[passed] Test connState >>> assert s.wcs.__repr__() == 'Connection end : SERVER\nCipher suite : TLS_NULL_WITH_NULL_NULL (0x0000)\nCompression : null (0x00)\n' ###(069)=[passed] Test tls.tools >>> def test_tls_tools(): ... from scapy.layers.tls.crypto.compression import Comp_Deflate ... from scapy.layers.tls.crypto.common import CipherError ... from scapy.layers.tls.crypto.cipher_stream import Cipher_RC4_40 ... from scapy.layers.tls.crypto.cipher_aead import (Cipher_AES_128_GCM, ... Cipher_AES_128_GCM_TLS13) ... from scapy.layers.tls.crypto.hash import Hash_SHA256 ... from scapy.layers.tls.crypto.pkcs1 import pkcs_i2osp, pkcs_os2ip ... from scapy.layers.tls.tools import TLSPlaintext, TLSCompressed, TLSCiphertext ... from scapy.layers.tls.tools import _tls_compress, _tls_decompress ... from scapy.layers.tls.tools import _tls_mac_add, _tls_mac_verify ... from scapy.layers.tls.tools import _tls_add_pad, _tls_del_pad ... from scapy.layers.tls.tools import _tls_encrypt, _tls_decrypt ... from scapy.layers.tls.tools import _tls_aead_auth_encrypt, _tls_aead_auth_decrypt ... plain = TLSPlaintext() ... plain.type = 'application_data' ... plain.version = 'TLS 1.2' ... plain.data = b'X\xe1\xb1T\xaa\xb1\x0b\xa0zlg\xf8\xd14]%\xa9\x91d\x08\xc7t\xcd6\xd4"\x9f\xcf' ... plain.len = len(plain.data) ... # Compress/decompress test ... alg = Comp_Deflate() ... comp = _tls_compress(alg, plain) ... assert isinstance(comp, TLSCompressed) ... assert comp != plain ... dcomp = _tls_decompress(alg, comp) ... assert isinstance(dcomp, TLSPlaintext) ... assert dcomp == plain ... # Encrypt/decrypt test ... ch = Cipher_RC4_40(_rc4_40_test.k) ... encr = _tls_encrypt(ch, plain) ... assert isinstance(encr, TLSCiphertext) ... assert encr != plain ... decr = _tls_decrypt(ch, encr) ... assert isinstance(decr, TLSPlaintext) ... assert decr == plain ... encr = _tls_encrypt(ch, comp) ... assert isinstance(encr, TLSCiphertext) ... assert encr != comp ... decr = _tls_decrypt(ch, encr) ... assert isinstance(decr, TLSPlaintext) ... assert (decr.version == comp.version and decr.type == comp.type ... and decr.len == comp.len and decr.data == comp.data) ... # MAC add/verify test ... mac = Hash_SHA256() ... save_encr = encr.copy() ... assert save_encr is not encr ... _tls_mac_add(mac, encr, 1) ... assert isinstance(encr, TLSCiphertext) ... had_mac = _tls_mac_verify(mac, encr, 1) ... assert had_mac ... assert encr == save_encr ... # Pad add/delete test ... save_comp = comp.copy() ... assert save_comp is not comp ... block_size = 8 ... _tls_add_pad(comp, block_size) ... assert isinstance(comp, TLSCompressed) ... assert comp.len == save_comp.len + -save_comp.len % block_size + 1 ... had_pad = _tls_del_pad(comp) ... assert had_pad ... assert comp == save_comp ... block_size = save_comp.len // 2 ... _tls_add_pad(comp, block_size) ... assert isinstance(comp, TLSCompressed) ... assert comp.len == save_comp.len + -save_comp.len % block_size + 1 ... had_pad = _tls_del_pad(comp) ... assert had_pad ... assert comp == save_comp ... # AEAD auth encrypt/decrypt test ... ch_auth = Cipher_AES_128_GCM(key=_aes128gcm_test_1.k, ... fixed_iv=_aes128gcm_test_1.n[:4], ... nonce_explicit=pkcs_os2ip(_aes128gcm_test_1.n[4:])) ... auth_encr = _tls_aead_auth_encrypt(ch_auth, comp, 1) ... assert isinstance(auth_encr, TLSCiphertext) ... assert auth_encr != comp ... # auth_decr = _tls_aead_auth_decrypt(ch_auth, auth_encr, 1) ... # assert isinstance(auth_decr, TLSCompressed) ... # assert auth_decr == comp ... ch_auth = Cipher_AES_128_GCM_TLS13(key=_aes128gcm_test_1.k, ... fixed_iv=_aes128gcm_test_1.n) ... auth_encr = _tls_aead_auth_encrypt(ch_auth, comp, 1) ... assert isinstance(auth_encr, TLSCiphertext) ... assert auth_encr != comp ... # auth_decr = _tls_aead_auth_decrypt(ch_auth, auth_encr, 1) ... # assert isinstance(auth_decr, TLSCompressed) ... # assert auth_decr == comp ... >>> test_tls_tools() ###(070)=[passed] Dissect TLSCertificateVerify >>> from scapy.layers.tls.handshake import TLSCertificateVerify >>> >>> t = TLS(b'\x16\x03\x03\x00P\x0f\x00\x00L\x04\x03\x00H0F\x02!\x00\xcf\xf1\xd0:1\xb8\xe4JCU\x00\x8c\xcdg\xf9=g\x84\xa3h;V@\xfd\xd1\\\xf0\xc4f\xfa\x18\xdc\x02!\x00\x82\x1dF\xc1\xd1\xab\x86\xaa\xb9"\x0eA\xf2\xc3Rj\xd7\xf1\xe9\xaf\x9b\xa5?R\n\xca\x15\xfe)\xa9j\x84') >>> assert TLSCertificateVerify in t >>> assert t[TLSCertificateVerify].sig.sig_len == 72 ###(071)=[passed] Test complex TLSServerKeyExchange dissection & build >>> a = b'\x16\x03\x03\x0e4\x02\x00\x00M\x03\x03^\xfa\xb5~\x88\xdf\xdc#}\'\xa0\xff\xa2\xe2\xb5\xec\x0e\x93\xa8\xe0\xde\x01[\x13[F\x151 x\xc6\xcc `)\x00\x00\x8aZ\x90l\xda\x0b\xe1\xec[i\x13\xa7\x8e\xb9a\x98"\x8a7L\x9d\x90\xe0\x01\x06c$9\xc0\'\x00\x00\x05\xff\x01\x00\x01\x00\x0b\x00\x0c\x8e\x00\x0c\x8b\x00\x06n0\x82\x06j0\x82\x05R\xa0\x03\x02\x01\x02\x02\x10EY\xe8\x1c\x1e\x9a\xe0?X\xaa\xc3\xbc\xcd`jh0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000\x81\x8f1\x0b0\t\x06\x03U\x04\x06\x13\x02GB1\x1b0\x19\x06\x03U\x04\x08\x13\x12Greater Manchester1\x100\x0e\x06\x03U\x04\x07\x13\x07Salford1\x180\x16\x06\x03U\x04\n\x13\x0fSectigo Limited1705\x06\x03U\x04\x03\x13.Sectigo RSA Domain Validation Secure Server CA0\x1e\x17\r190309000000Z\x17\r210308235959Z0W1!0\x1f\x06\x03U\x04\x0b\x13\x18Domain Control Validated1\x1d0\x1b\x06\x03U\x04\x0b\x13\x14PositiveSSL Wildcard1\x130\x11\x06\x03U\x04\x03\x0c\n*.mql5.net0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xcb\xbcn=\xbaGd\xe1XB\x07\xc9\xb1\xc8/\x86\xaa4Z\xbdNk\xfb\xffR\x8f\xe4\x1c^\x91m8\xb9^\x97\xa5\xd3N\xfb\x80\x92\x8ap\xda\x15\x9f\xee\xe7\xb3\xc8?\xb0>~\xaa\x07\x91\xb1\x99q\xe2\xe5\xc8\x9b\x1d5\xa0\x96,\x98\xdaW\x93\x95\x8e%\xe8\xd4L\xeb\xcbSg\x15"\xba\xb7\xc7\x1f\xe9\xd6\x1a\xe6E\x1d\xc8\x1e%\xd36\xe0/r\xd1\xce1C\xce\x91&\xa1\x08*R\xbf\x8cu\xb0\xda\x0e\x1e2\xd66\x1df&3\x9b\x03\x0b\xcam:\xf7\x12\xd9ud(\xae\xdc\xbci\x85\xbd\xcf\xeb{\x15:\xbd\x0e\x11\x1bi\xd8\xff]y~E\x15\x95\xee\xe9\xea\xc6Cr!=~y0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x00\x03\x82\x01\x01\x00\x17\x7f\x18\x82[\t\x18@R@\xa6\xb7\xc5[\xf1su\xc7\x8cG?\xf7\x91\xe2E]\x1b\x7f\xc3su\x88\xb6\x17t\xc3\x8b\xb1g\xd2\x06\xfc\x82\x84\x8d\xbb\x13\xc1\x8c\xf71\xc0>(?\xa3\xf0P\x14Z\x8a\x97\x9c\xa3\xb1!ddy\xa3 .\xdb\xd3\xfb\xa6\x0b\xf7k\xdbP\xb48\xeb\xc7\x90\x00\xa9\x90\xa4\x9d\xbf\x9c\xa7\n\x8e\x90\xfe\x8f\xa3\x95Th\xe6,\xdd\xde\xde\x06\x0b\x8e+\xf5\xca\x85>n\xbf\xd87\xff\xe3\xd2|*\xc0\x89\x07\x95\xbeV\x90:lG[\xf0\xadUF\xa1\x88nmj\xbb\xa9\x16\x90\xdd\x84\xe4\xbf\xe7\xe8\xe3"\xd4+0\xa0d\xdc.\x8e\x85+\xbd\x99\xd8\x02\xa7K}\xb1\xc4\xed;\xe2\xaf\x81R\xceJ\xb9iZ\xec\xda\x8f`\x8eI\xf6]\x83-\x9e\xa7{]\x02\x9d\x1fh\xf4\xef\x14\xf4\xb3\x0e\r\xe6\x9b\x9d\x96\xb4\x90iWA\xe0\xf4\x1d_\xbeRD\x15a;?\t\x8c\x8f6\xea!\xf2\xd6/Yg\x82e/5\xe1\xb4\xa1\x94\xef\xd7\x94\x82\x04\x00\x06\x170\x82\x06\x130\x82\x03\xfb\xa0\x03\x02\x01\x02\x02\x10}[Q&\xb4v\xba\x11\xdbt\x16\x0b\xbcS\r\xa70\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0c\x05\x000\x81\x881\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\x08\x13\nNew Jersey1\x140\x12\x06\x03U\x04\x07\x13\x0bJersey City1\x1e0\x1c\x06\x03U\x04\n\x13\x15The USERTRUST Network1.0,\x06\x03U\x04\x03\x13%USERTrust RSA Certification Authority0\x1e\x17\r181102000000Z\x17\r301231235959Z0\x81\x8f1\x0b0\t\x06\x03U\x04\x06\x13\x02GB1\x1b0\x19\x06\x03U\x04\x08\x13\x12Greater Manchester1\x100\x0e\x06\x03U\x04\x07\x13\x07Salford1\x180\x16\x06\x03U\x04\n\x13\x0fSectigo Limited1705\x06\x03U\x04\x03\x13.Sectigo RSA Domain Validation Secure Server CA0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xd6s3\xd6\xd7< \xd0\x00\xd2\x17E\xb8\xd6>\x07\xa2?\xc7A\xee20\xc9\xb0l\xfd\xf4\x9f\xcb\x12\x98\x0f-?\x8dM\x01\x0c\x82\x0f\x17\x7fb.\xe9\xb8Hy\xfb\x16\x83N\xad\xd72%\x93\xb7\x07\xbf\xb9P?\xa9L\xc3@*\xe99\xff\xd9\x81\xca\x1f\x162A\xda\x80&\xb9#z\x87 \x1e\xe3\xff \x9a<\x95Do\x87u\x06\x90@\xb42\x93\x16\t\x10\x08#>\xd2\xdd\x87\x0fo]Q\x14j\ni\xc5O\x01ri\xcf\xd3\x93Lm\x04\xa0\xa3\x1b\x82~\xb1\x9a\xb9\xed\xc5\x9e\xc57x\x9f\x9a\x084\xfbV.X\xc4\t\x0e\x06d[\xbc7\xdc\xf1\x9f(h\xa8V\xb0\x92\xa3\\\x9f\xbb\x88\x98\x08\x1b$\x1d\xab0\x85\xae\xaf\xb0.\x9ez\x9d\xc1\xc0B\x1c\xe2\x02\xf0\xea\xe0J\xd2\xef\x90\x0e\xb4\xc1@\x16\xf0o\x85BJd\xf7\xa40\xa0\xfe\xbf.\xa3\'Z\x8e\x8bX\xb8\xad\xc3\x19\x17\x84c\xedoV\xfd\x83\xcb`4\xc4t\xbe\xe6\x9d\xdb\xe1\xe4\xe5\xca\x0c_\x15\x02\x03\x01\x00\x01\xa3\x82\x01n0\x82\x01j0\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14Sy\xbfZ\xaa+J\xcfT\x80\xe1\xd8\x9b\xc0\x9d\xf2\xb2\x03f\xcb0\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\x8d\x8c^\xc4T\xad\x8a\xe1w\xe9\x9b\xf9\x9b\x05\xe1\xb8\x01\x8da\xe10\x0e\x06\x03U\x1d\x0f\x01\x01\xff\x04\x04\x03\x02\x01\x860\x12\x06\x03U\x1d\x13\x01\x01\xff\x04\x080\x06\x01\x01\xff\x02\x01\x000\x1d\x06\x03U\x1d%\x04\x160\x14\x06\x08+\x06\x01\x05\x05\x07\x03\x01\x06\x08+\x06\x01\x05\x05\x07\x03\x020\x1b\x06\x03U\x1d \x04\x140\x120\x06\x06\x04U\x1d \x000\x08\x06\x06g\x81\x0c\x01\x02\x010P\x06\x03U\x1d\x1f\x04I0G0E\xa0C\xa0A\x86?http://crl.usertrust.com/USERTrustRSACertificationAuthority.crl0v\x06\x08+\x06\x01\x05\x05\x07\x01\x01\x04j0h0?\x06\x08+\x06\x01\x05\x05\x070\x02\x863http://crt.usertrust.com/USERTrustRSAAddTrustCA.crt0%\x06\x08+\x06\x01\x05\x05\x070\x01\x86\x19http://ocsp.usertrust.com0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0c\x05\x00\x03\x82\x02\x01\x002\xbfa\xbd\x0eH\xc3O\xc7\xbaGM\xf8\x9cx\x19\x01\xdc\x13\x1d\x80o\xfc\xc3p\xb4R\x9a13\x9aWR\xfb1\x9ek\xa4\xefT\xaa\x89\x8d@\x17h\xf8\x11\x10|\xd2\xca\xb1\xf1U\x86\xc7\xee\xb36\x91\x86\xf69Q\xbfF\xbf\x0f\xa0\xba\xb4\xf7~I\xc4*6\x17\x9e\xe4h9z\xaf\x94NVo\xb2{;\xbf\n\x86\xbd\xcd\xc5w\x1c\x03\xb88\xb1\xa2\x1f_~\xdb\x8a\xdcFH\xb6h\n\xcf\xb2\xb5\xb4\xe24\xe4g\xa98f\t^\xd2\xb8\xfc\x9d(:\x17@\'\xc2rN)\xfd!<|\xcf\x13\xfb\x96,\xc51D\xfd\x13\xed\xd5\x9b\xa9ihw|\xee\xe1\xff\xa4\xf968\x08S9\xa2\x844\x9c\x19\xf3\xbe\x0e\xac\xd5$7\xeb#\xa8x\xd0\xd3\xe7\xef\x92Gdb9"\xef\xc6\xf7\x11\xbe"\x85\xc6fD$&\x8e\x102\x8d\xc8\x93\xae\x07\x9e\x83>/\xd9\xf9\xf5F\x8ec\xbe\xc1\xe6\xb4\xdc\xa6\xcd!\xa8\x86\n\x95\xd9.\x85&\x1a\xfd\xfc\xb1\xb6WBm\x95\xd13\xf69\x14\x06\x82A8\xf5\x8fX\xdc\x80[\xa4\xd5}\x95x\xfd\xa7\x9b\xff\xfd\xc5\xa8i\xab&\xe7\xa7\xa4\x05\x87[\xa9\xb7\xb8\xa3 \x0b\x97\xa9E\x85\xdd\xb3\x8b\xe5\x897\x8e)\r\xfc\x06\x17\xf68@\x0eB\xe4\x12\x06\xfb{\xf3\xc6\x11hb\xdf\xe3\x98\xf4\x13\xd8\x15O\x8b\xb1i\xd9\x10`\xbcd*\xea1\xb7\xe4\xb5\xa3:\x14\x9b&\xe3\x0b{\xfd\x02\x8e\xb6\x99\xc18\x97Y6\xf6\xa8t\xa2\x86\xb6^\xeb\xc6d\xea\xcf\xa0\xa3\xf9n\x9e\xba-\x11\xb6\x86\x98\x08X-\xc9\xac%d\xf2^u\xb48\xc1\xae\x7fZF\x83\xeaQ\xca\xb6\xf1\x99\x115k\xa5j{\xc6\x00\xb0\xe7\xf8\xbed\xb2\xad\xc8\xc2\xf1\xac\xe3Q\xea\xa4\x93\xe0y\xc8\xe1\x81@\xc9\n[\xe1\x12<\xc1`*\xe3\x97\xc0\x89B\xca\x94\xcfF\x98\x12i\xbb\x98\xd0\xc2\xd3\rrKGn\xe5\x93\xc42(c\x87C\xe4\xb02>\n\xd3K\xbf#\x9b\x14)A+\x9a\x04\x1f\x93-\xf1\xc79H<\xadZ\x12\x7f\x0c\x00\x01I\x03\x00\x17A\x04\x13\x1c\x02q\xd4m\x97\x01\x99\xcf\xf2\x80G\xa8\xe1\xdf\x1ak\xbf\x1fJ\xf9\x9e\xd0\x02\x01W\x9d\xb8\xbc*\xf9S\xb6\xbf\xb8\xf1\xc1\x89\xcd\x96C(\xa8|\x189\x13\xcd\xc5\xf7Q\x1e\xe17h~\x8c`\x1f8\x8e\xacq\x04\x01\x01\x00\xc1R`\xb8\x14!\xed\xb9\xbca\x9d0{\xb7\x95\x94\x80\x06\t.A\xcc\x82\x99\x89N_\xa1\x08M%#\x1fg\xb6\xa2\xfe\x00\xd6\xa8\xe9\x9fd\x91O\xdbzw\xbfS\x88?\xeb[2\x7f\xa1\xeb\xd1vmi_\x95\xd0A\x04`\x01+\x02\\\x99\xa0\xe9\n\xb5\xb5j\x85\x89J\x82\xf8\x00\xbb\xa3%\x14\x15D\xbf9\x12{\x9e\xca\x0e\x92\xdf\xbb\xfd\xd3\xc8\x0ez\x04n \x12\x01\xd2|\xc6t\xc36\xce>:J\xc3\x81+d\xbc\xb1\x1d\x8d\x00o\x00\xc9\xd4%\xb6\x90\x1f\xe1\xc5\x14\xb5Qk\x06\x1e\xf6{\xbdJ\xb2H\xcbf\xe9_mQ(\x9e4\x10U#\xcd4\x88\x1c\xfb\x03\x80(Q:\x9c\x0f\x16\xed\xad\xb4\x18k\t\xc5$\x97}~s\xc1\xca\xae\x9d\xd1q\x94\x9fi+Pj\x80:v\xc1z#\xf6\xee]ou~\xa3\xd9I\xce\xb8Z|\x1b\x8ep\xc6\x19\xb4A\x03\x92\x1bp\x16\x10\x0f\x84\xa9\x9f\xb7\xc9\x01\xc8^\x93\xaat\r\x87\x96\x86\xf6\xc5\xfe\x88\x13\xc3N\x0e\x00\x00\x00' >>> p = TLS(a) >>> p.clear_cache() >>> assert raw(p) == a ###(072)=[passed] Issue 2763 >>> with no_debug_dissector(): ... p = Ether(b'RU\x10\x00\x02\x02RT\x00\x124V\x08\x00E\x00\x05\xc8\r\xd8\x00\x00@\x06\x96\x9d\x9c&\xce\x12\xc0\xa8\xa5\xd9\x01\xbb\xc0\x1f\x00w$\x02\x03\xbe\xc5#P\x10#(\x0b\x9e\x00\x00\x16\x03\x03\x0e4\x02\x00\x00M\x03\x03^\xfa\xb5~\x88\xdf\xdc#}\'\xa0\xff\xa2\xe2\xb5\xec\x0e\x93\xa8\xe0\xde\x01[\x13[F\x151 x\xc6\xcc `)\x00\x00\x8aZ\x90l\xda\x0b\xe1\xec[i\x13\xa7\x8e\xb9a\x98"\x8a7L\x9d\x90\xe0\x01\x06c$9\xc0\'\x00\x00\x05\xff\x01\x00\x01\x00\x0b\x00\x0c\x8e\x00\x0c\x8b\x00\x06n0\x82\x06j0\x82\x05R\xa0\x03\x02\x01\x02\x02\x10EY\xe8\x1c\x1e\x9a\xe0?X\xaa\xc3\xbc\xcd`jh0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000\x81\x8f1\x0b0\t\x06\x03U\x04\x06\x13\x02GB1\x1b0\x19\x06\x03U\x04\x08\x13\x12Greater Manchester1\x100\x0e\x06\x03U\x04\x07\x13\x07Salford1\x180\x16\x06\x03U\x04\n\x13\x0fSectigo Limited1705\x06\x03U\x04\x03\x13.Sectigo RSA Domain Validation Secure Server CA0\x1e\x17\r190309000000Z\x17\r210308235959Z0W1!0\x1f\x06\x03U\x04\x0b\x13\x18Domain Control Validated1\x1d0\x1b\x06\x03U\x04\x0b\x13\x14PositiveSSL Wildcard1\x130\x11\x06\x03U\x04\x03\x0c\n*.mql5.net0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xcb\xbcn=\xbaGd\xe1XB\x07\xc9\xb1\xc8/\x86\xaa4Z\xbdNk\xfb\xffR\x8f\xe4\x1c^\x91m8\xb9^\x97\xa5\xd3N\xfb\x80\x92\x8ap\xda\x15\x9f\xee\xe7\xb3\xc8?\xb0>~\xaa\x07\x91\xb1\x99q\xe2\xe5\xc8\x9b\x1d5\xa0\x96,\x98\xdaW\x93\x95\x8e%\xe8\xd4L\xeb\xcbSg\x15"\xba\xb7\xc7\x1f\xe9\xd6\x1a\xe6E\x1d\xc8\x1e%\xd36\xe0/r\xd1\xce1C\xce\x91&\xa1\x08*R\xbf\x8cu\xb0\xda\x0e\x1e2\xd66\x1df&3\x9b\x03\x0b\xcam:\xf7\x12\xd9ud(\xae\xdc\xbci\x85\xbd\xcf\xeb{\x15:\xbd\x0e\x11\x1bi\xd8\xff]y~E\x15\x95\xee\xe9\xea\xc6Cr~\xaa\x07\x91\xb1\x99q\xe2\xe5\xc8\x9b\x1d5\xa0\x96,\x98\xdaW\x93\x95\x8e%\xe8\xd4L\xeb\xcbSg\x15"\xba\xb7\xc7\x1f\xe9\xd6\x1a\xe6E\x1d\xc8\x1e%\xd36\xe0/r\xd1\xce1C\xce\x91&\xa1\x08*R\xbf\x8cu\xb0\xda\x0e\x1e2\xd66\x1df&3\x9b\x03\x0b\xcam:\xf7\x12\xd9ud(\xae\xdc\xbci\x85\xbd\xcf\xeb{\x15:\xbd\x0e\x11\x1bi\xd8\xff]y~E\x15\x95\xee\xe9\xea\xc6Cr>> import os >>> >>> filename = scapy_path("/test/pcaps/tls_tcp_frag.pcap.gz") >>> >>> with no_debug_dissector(): ... a = sniff(offline=filename, session=TCPSession)[0] ... >>> assert len(a.msg) == 4 >>> assert isinstance(a.msg[0], TLSServerHello) >>> assert isinstance(a.msg[1], TLSCertificate) >>> assert isinstance(a.msg[2], TLSServerKeyExchange) >>> assert isinstance(a.msg[3], TLSServerHelloDone) >>> >>> assert a.wirelen is None >>> assert a[TCP].seq == 7808002 ###(074)=[passed] Issue 2527 >>> p = TLS(b'\x16\x03\x00\x05\'\x02\x00\x00&\x03\x00\x00\x00\x00\x00\x7fk77\n\xe2\x1d\xdf\x82e\x06p$\xbaV7_\xa9\xb1\x03\x01\x0c\x0c\x18\x90\x00H\x01\x00\x00\x03\x00\x0b\x00\x03\xa8\x00\x03\xa5\x00\x03\xa20\x82\x03\x9e0\x82\x02\x86\xa0\x03\x02\x01\x02\x02\t\x00\xfe\x04W\r\xc7\'\xe9\xf60\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000T1\x0b0\t\x06\x03U\x04\x06\x13\x02MN1\x140\x12\x06\x03U\x04\x07\x0c\x0bUlaanbaatar1\x170\x15\x06\x03U\x04\x0b\x0c\x0eScapy Test PKI1\x160\x14\x06\x03U\x04\x03\x0c\rScapy Test CA0\x1e\x17\r160916102811Z\x17\r260915102811Z0X1\x0b0\t\x06\x03U\x04\x06\x13\x02MN1\x140\x12\x06\x03U\x04\x07\x0c\x0bUlaanbaatar1\x170\x15\x06\x03U\x04\x0b\x0c\x0eScapy Test PKI1\x1a0\x18\x06\x03U\x04\x03\x0c\x11Scapy Test Server0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xcc\xf1\xf1\x9b`-`\xae\xf2\x98\r\')\xd9\xc0\tYL\x0fJ0\xa8R\xdf\xe5\xb1!\x9fO\xc3=V\x93\xdd_\xc6\xf7\xb3\xf6U\x8b\xe7\x92\xe2\xde\xf2\x85I\xb4\xa1,\xf4\xfdv\xa8g\xca\x04 `\x11\x18\xa6\xf2\xa9\xb6\xa6\x1d\xd9\xaa\xe5\xd9\xdb\xaf\xe6\xafUW\x9f\xffR\x89e\xe6\x80b\x80!\x94\xbc\xcf\x81\x1b\xcbg\xc2\x9d\xb5\x05w\x04\xa6\xc7\x88\x18\x80xh\x956\xde\x97\x1b\xb6a\x87B\x1au\x98E\x82\xeb>2\x11\xc8\x9b\x86B9\x8dM\x12\xb7X\x1b\x19\xf3\x9d+\xa1\x98\x82\xca\xd7;$\xfb\t9\xb0\xbc\xc2\x95\xcf\x82)u\x16)?B \x17+M@\x8cVl\xad\xba\x0f4\x85\xb1\x7f@yqx\xb7\xa5\x04\xbb\x94\xf7\xb5A\x95\xee|\xeb\x8d\x0cyhY\xef\xcb\xb3\xfa>x\x1e\xeegLz\xdd\xe0\x99\xef\xda\xe7\xef\xb2\t]\xbe\x80 !\x05\x83,D\xdb]*v)\xa5\xb0#\x88t\x07T"\xd6)z\x92\xf5o-\x9e\xe7\xf8&+\x9cXe\x02\x03\x01\x00\x01\xa3o0m0\t\x06\x03U\x1d\x13\x04\x020\x000\x0b\x06\x03U\x1d\x0f\x04\x04\x03\x02\x05\xe00\x1d\x06\x03U\x1d\x0e\x04\x16\x04\x14\xa1+ p\xd2k\x80\xe5e\xbc\xeb\x03\x0f\x88\x9ft\xad\xdd\xf6\x130\x1f\x06\x03U\x1d#\x04\x180\x16\x80\x14fS\x94\xf4\x15\xd1\xbdgh\xb0Q725\xe1\xa4\xaa\xde\x07|0\x13\x06\x03U\x1d%\x04\x0c0\n\x06\x08+\x06\x01\x05\x05\x07\x03\x010\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x00\x03\x82\x01\x01\x00\x81\x88\x92sk\x93\xe7\x95\xd6\xddA\xee\x8e\x1e\xbd\xa3HX\xa7A5?{}\xd07\x98\x0e\xb8,\x94w\xc8Q6@\xadY\t(\xc8V\xd6\xea[\xac\xb4\xd8?h\xb7f\xca\xe1V7\xa9\x00e\xeaQ\xc9\xec\xb2iI]\xf9\xe3\xc0\xedaT\xc9\x12\x9f\xc6\xb0\nsU\xe8U5`\xef\x1c6\xf0\xda\xd1\x90wV\x04\xb8\xab8\xee\xf7\t\xc5\xa5\x98\x90#\xea\x1f\xdb\x15\x7f2(\x81\xab\x9b\x85\x02K\x95\xe77Q{\x1bH.\xfb>R\xa3\r\xb4F\xa9\x92:\x1c\x1f\xd7\n\x1eXJ\xfa.Q\x8f)\xc6\x1e\xb8\x0e1\x0es\xf1\'\x88\x17\xca\xc8i\x0c\xfa\x83\xcd\xb3y\x0e\x14\xb0\xb8\x9b/:-\t\xe3\xfc\x06\xf0:n\xfd6;+\x1a\t*\xe8\xab_\x8c@\xe4\x81\xb2\xbc\xf7\x83g\x11nN\x93\xea"\xaf\xff\xa3\x9awWv\xd0\x0b8\xac\xf8\x8a\x945\x8e\xd7\xd4a\xcc\x01\xff$\xb4\x8fa#\xba\x88\xd7Y\xe4\xe9\xba*N\xb5\x15\x0f\x9c\xd0\xea\x06\x91\xd9\xde\xab\x0c\x00\x01I\x00@\xd1L\xf3\xe7\x8b\xdd\x98\xff\xb2\xf5Rd\xd6\x85\x0f\r{\x9f\xc2\xc0\x8aY\xbf.\xfb\xf0o\x96\xa5\xba;\x877qet\xe8\xe4K\xd7\xcb\xb8\xecAk>S\xe0\xa5\xc3\xfc\xe8\xde\xf1\xb0\xe5\x15s|\xb7\xe6D\x15+\x00\x03\x01\x00\x01\x01\x00H\xf1\x08\x88\xe9\xf8\xe6\xb2y\\\xf9\xf64\x95r\xf9\x8c]\x0b\x88%s\xee{\xd4\xa3{|Jd>\xfb\x01\x0b\xfdAf\xea\x13%\x1f\xcc\xba\xf8H\xed\xeb?u\x00\xc46\xe4\x9f!r\x99\xec\'!\xa1+\xe9\xcd;\xfa\x00a\xd1ME7\x9a\xc3C\xb2\xb0>\xec\x07\xff>\xb3\xa3\xbd\x8db\xa2\x17\x0b\xce\xe1H\xaf\xba_\xdc\x18\x83Fr^\xf6\xfd\x8f\xbd\xc1\xdf\xc3\xf9T\xc2RC\xfa1\xe1\x16\x94RgZ\xb1\xe8rycp\xaeEa@\xe2\xb7T\xe4\xaa7\x02\x1e\xb3\x0c_P\x14\xd9\x023]\xc9)\x1b\xd7]\xba\x8aS\x18\xe5\x88\x1e08W\xc7\xd5\xc0\x7f\xf6n\n>\x83_\r\t\x1f\x01\x99\xda\x88(\xbc\xd9\xb8!=\xb6%\x15wh\xacl)\xde\xb3-\x81M\xc6(,\xceom\x15W7\xcc\xd3\xe3\xc2e\xb4\x96\xf1\xfc\x1e\xa5?\xe1B\xbd\x00\x89\xc1\xd0t\xd6\xaa\xf8\xa7\x1f\xa1z}\x91M\x8egg\xa1}\x93\xaal\xec\x16@\xf3\xd7\x0b\x91\n\xcc\x0e\x00\x00\x00') >>> >>> assert p.msg[0].extlen is None >>> assert p.msg[0].ext == [] >>> assert [type(x) for x in a.msg] == [TLSServerHello, TLSCertificate, TLSServerKeyExchange, TLSServerHelloDone] ###(075)=[passed] Issue 2778 >>> r1 = TLS(b"\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03\x03\xf8\xb3\xdb\xcbp\xed8\x04\x00\x9c\x15\xafJB\x98r\x06\x19\xb7\r\x1a\xd4\xf2M\x0e\x99\xde\x9e\x93\xce<; \x1c;,\xf3&k\xcb\xa1\x9b)G\x9e\xc6o\xe8\x15\xf7\xdb\nk\x97a\x11\xf7\tX9^z\xee\xba\xba\x00>\x13\x02\x13\x03\x13\x01\xc0,\xc00\x00\x9f\xcc\xa9\xcc\xa8\xcc\xaa\xc0+\xc0/\x00\x9e\xc0$\xc0(\x00k\xc0#\xc0'\x00g\xc0\n\xc0\x14\x009\xc0\t\xc0\x13\x003\x00\x9d\x00\x9c\x00=\x00<\x005\x00/\x00\xff\x01\x00\x01u\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x00\x0c\x00\n\x00\x1d\x00\x17\x00\x1e\x00\x19\x00\x183t\x00\x00\x00\x10\x00\x0e\x00\x0c\x02h2\x08http/1.1\x00\x16\x00\x00\x00\x17\x00\x00\x001\x00\x00\x00\r\x00*\x00(\x04\x03\x05\x03\x06\x03\x08\x07\x08\x08\x08\t\x08\n\x08\x0b\x08\x04\x08\x05\x08\x06\x04\x01\x05\x01\x06\x01\x03\x03\x03\x01\x03\x02\x04\x02\x05\x02\x06\x02\x00+\x00\x05\x04\x03\x04\x03\x03\x00-\x00\x02\x01\x01\x003\x00&\x00$\x00\x1d\x00 \xe8A\x0fZ\xb0\x9d\x96\xb0_\x10\x18<\xcd\x9e\x93\xa0W\xa72\x90\xb4\xc9\xe1\xc2T\xcd\xfc)\x9f\xc0\x1dA\x00\x15\x00\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") >>> r2 = TLS(b'\x16\x03\x03\x00U\x02\x00\x00Q\x03\x03 \xa5@2G~\xa3\xa9c\xb8\xa7\x00\t\x04Y\xf1\x1f\x1fJ\xd1\x89n\x1dut[~+\xdcQ\xdd\xe0 \x06\x00\xf5R\xdblQ\xb9z0\x97\x17\xff\x84{\xb6\xe8\xfe\xf1\xce&\x01TD\x13\xfd\xa7\xb6`u\xb8\x87\x00\x9d\x00\x00\t\xff\x01\x00\x01\x00\x00\x17\x00\x00\x16\x03\x03\x03n\x0b\x00\x03j\x00\x03g\x00\x03d0\x82\x03`0\x82\x02H\xa0\x03\x02\x01\x02\x02\t\x00\xebs\xb7\x1c>/\x9f\xdc0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000E1\x0b0\t\x06\x03U\x04\x06\x13\x02AU1\x130\x11\x06\x03U\x04\x08\x0c\nSome-State1!0\x1f\x06\x03U\x04\n\x0c\x18Internet Widgits Pty Ltd0\x1e\x17\r190215151403Z\x17\r290212151403Z0E1\x0b0\t\x06\x03U\x04\x06\x13\x02AU1\x130\x11\x06\x03U\x04\x08\x0c\nSome-State1!0\x1f\x06\x03U\x04\n\x0c\x18Internet Widgits Pty Ltd0\x82\x01"0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x000\x82\x01\n\x02\x82\x01\x01\x00\xd2\xf7\xd3k#:V\x196\x8f\xc3\xa7\xdb\x0f#d\xdcq\x98m\xd4\xee\xbc\xbe\xe8[x>\x13\x9c\xfe\xb0\xa8\r\xe5\x01G\xc96\xaa\x84#\x0e/\xa2\xeb\x91\xef\x177A\x03\x87\xb92D\n\xc7\xcf\xda\xff~\xca,yMq<\x13\xf8\x0c\xd5?\x84z\xa1\x96\xd0\xad\xc0D\x94y\nb\x8e2\x7fKS\xd0[\x83\x02\\>\xa5A\x19_\x95<\xe6\xfc7\xed\xcch\xa8\xfdn\xcab\x1f8\xbc\x08\xbc-\x8dr\xcf\xcd\xf8\\h\xf9\xf4\xf4H[2\x13zh_ <\r\xb8\xe0\xff\x1d\x1aY\x91\xd2\xf0X\xf4\x8f \xb1\n_\xb0\xdf\'\xa1\xf9\x87L\xc0\xfe\x8dn\xbfw\xe9\xa7\xba8I\x0e\x9dc$\x1a\x0f\xb3\xfdw\x01\xff;\x13\x0c\x9a\xa7\xaaww\x02\x80\xb7\x00<\x1b\xb5\xe0xL4\xaa\xcbt\xce\x81\x14\x96\x0eP\xee\xe0F\x02\xa7\xab \xe5\xc8x\x02\x8eB\x92\xe9\x0e@\xfdc\x1f\xee\x16\x03\x03\x00\x04\x0e\x00\x00\x00', tls_session=r1.tls_session.mirror()) >>> assert r2.tls_session.tls_version == 0x303 ###(076)=[passed] PR/Issue 3295 >>> pkt = TLSServerHello(b"\x02\x00\x00\x28\x03\x03ABCDEFGHIJKLMNOPQRSTUVWXYZ012345\x00\x00\x39\x00\x00\x00") >>> assert pkt.extlen == 0 >>> assert pkt.ext == [] ###(077)=[passed] Issue 3324 - FFDH support >>> hex_data = "16030102a8010002a4030330cc71861d50119dbe2b9c3a5207b7eff49aff19408096b32926d6fe8a4878e520c03832cba05660b5facc4b9991f3b006d326325ab1e0a9463287271952f4235f0004130200ff0100025700000020001e00001b6578616d706c653132333435362e6d79636f6d70616e792e636f6d000a000400020102002300000016000000170000000d000400020403002b0003020304002d00020101003302060204010202003476f00e12d8c768be0bd6db6af9e539441edd84b87178e8843bb2febc4b2097ac9619e65ed61837550e51834c32c7cb007b9b9a2f129d7127ee9f8bcbc2ba2141677300bc660d080d32257731d8d795bda7467df240cf07e8f1cde33bfc1f168385babee0f5834269f3c1070f7d89b3b9607b474edd306af54638d14e58cdc524b8972035a762dc446ef95b30a8c5e06876804ec9fb180f0255ea93b1438336e414761e1e1e2772909ce3fadc5282674337267f9697204b81a0b3ded2a3ecb03b46c1a4113e44b23a67d349b0406903b6acfdce0595e16b4f41dee9351f16e1267f9bdc6abbd897332552cb9b139f1556fc207fb8dee337d185acbe6b1b42c09751339e7d441933bec3cc4b24740b1640a2af73eadf700e0bee5065c38886f6a5983e1029f67085590f95f9546057725c004804cd97ed2c1c5ca0383751e77c087449719e65d9a39adad84e1bab92c0f9b7b472e58f60d4f81e3b622d7f62fd61c747e5951b54e9ef7b1a65b07e25c94baa7c19284ecf855a5cff7dae958359f3bd5d6184f11a3785026f8479d25595948160de89e8af62f306783c79b0bf28fb18da512737b52ede9f826ed95ed1ce8386e3ff3e74ba0b7ad82bef0c046223986475de12c9654f0fc3cb162d24ab02fe51120566bc993583e10149c16d953640357785e88748739cf84a3f0930fe5b4732f17f32e7e7fdf00023643a798cf7" >>> >>> key = "3476f00e12d8c768be0bd6db6af9e539441edd84b87178e8843bb2febc4b2097ac9619e65ed61837550e51834c32c7cb007b9b9a2f129d7127ee9f8bcbc2ba2141677300bc660d080d32257731d8d795bda7467df240cf07e8f1cde33bfc1f168385babee0f5834269f3c1070f7d89b3b9607b474edd306af54638d14e58cdc524b8972035a762dc446ef95b30a8c5e06876804ec9fb180f0255ea93b1438336e414761e1e1e2772909ce3fadc5282674337267f9697204b81a0b3ded2a3ecb03b46c1a4113e44b23a67d349b0406903b6acfdce0595e16b4f41dee9351f16e1267f9bdc6abbd897332552cb9b139f1556fc207fb8dee337d185acbe6b1b42c09751339e7d441933bec3cc4b24740b1640a2af73eadf700e0bee5065c38886f6a5983e1029f67085590f95f9546057725c004804cd97ed2c1c5ca0383751e77c087449719e65d9a39adad84e1bab92c0f9b7b472e58f60d4f81e3b622d7f62fd61c747e5951b54e9ef7b1a65b07e25c94baa7c19284ecf855a5cff7dae958359f3bd5d6184f11a3785026f8479d25595948160de89e8af62f306783c79b0bf28fb18da512737b52ede9f826ed95ed1ce8386e3ff3e74ba0b7ad82bef0c046223986475de12c9654f0fc3cb162d24ab02fe51120566bc993583e10149c16d953640357785e88748739cf84a3f0930fe5b4732f17f32e7e7fdf00023643a798cf7" >>> >>> tls_packet = TLS(bytes.fromhex(hex_data)) >>> assert tls_packet.msg[0].ext[8].client_shares[0].sprintf("%group%") == 'ffdhe4096' >>> assert tls_packet.msg[0].ext[8].client_shares[0].key_exchange == bytes.fromhex(key) >>> assert tls_packet.tls_session.tls13_client_pubshares['ffdhe4096'].key_size == 4096 >>> >>> >>> tls_packet = TLS(msg=[TLSClientHello(ext=[TLS_Ext_KeyShare_CH(client_shares=[KeyShareEntry(group="ffdhe4096")])])]) >>> tls_packet.raw_stateful() b'\x16\x03\x03\x02Q\x01\x00\x02M\x03\x03\x00\x00\x00\x00\x87\xfaq\xba\xe3\xf1-)q\xces!,\xe8\xbaf],\xfc\xc1\xed\xa2\xe2\x96-\xfc\xccm\x00\x00\x1a\xc0+\xc0#\xc0/\xc0\'\x00\x9e\x00g\x00\x9c\x00<\xc0\t\xc0\x13\x003\x00/\x00\n\x01\x00\x02\n\x003\x02\x06\x02\x04\x01\x02\x02\x00b\xb5\xf8\xca\xf0\x86<\xa8\x1d\x80)j\x03\x8fr\x01\xd3uK\xb9\xcb\x1e\xeb\xdcX\x81\x0c\xacb"\xfa\xfb\x1f\x81\x0c{=`\x87\xc8\xe1\xe9\x89\xc0\x8ck\xb8\x93\xff\x1c\x93\xb3\x90\xb0\xd7\xdd\xab\x11\xe1\xd9\xf7\x8a\r\xff@\xde\xa3X\x8ac\x89U|\r\x13\xef\x87\xf0F{\xdb\xb8\x01\xd6-\xd1*.\x8d\x14\xb8\xfd{|\xb5};\xf4\x06M\x9eQ=\x94\xb9xu\x9a\xcb\xa0&_T\xbdS\x7f3\xcb\xe1\xc2\xfe\x18\x18\xe4(\xac/\t<\x19\xbdBL\xe4\xe2>\xd8\xe7\xeb\xe2\xb8J\xeb\x02\xdd.\x0b;\xe9y\xd5\x0e\xd2K:d\x91\xba$\x84\xfc\xa6\xfc\x86\xf1\xa6\xa6M\xc0\xef\x89\xc86\x80\xa01\xab\xd5\'U6\x0c\x93\xf3\xf4\xf2\xb6\r\x18\t\x14\xa6\xf0$\xe83\x91a\x1a\xe8\x07\xec\x7f\x83\xd0\xd3VS\x92\x17l\x8c\xeb\xf6Zn\x98\x16d\x02\xa6\xdbnY\xb4.\xae\xb3\xd2Q\xe0\x86^w\x95\x06\x9b\x9bjl\xce\r7\xaa\x08N\xfc\xaa>\x80\xe8\x8a\x82\x9e\x00\xee\xfe\xe8\xfb\xdc\xe7\xd1\xbe\xb5\x05\xbd\x8f\x85\x92Eg\xae\n\'\x8b\x1d\x0f\xca\xd48\xe9\xf4\x18\xfc\xdb\x92r`=l\xdb/q\x01h{>\x8a{R\x1c5\xca\xda\xe0\x90E\xe6+\xa2\xd0\xaa\x8bg\rk3\xd1\x1c\xd8M\xc4cx\xaa\x97WB\x13V\x1d\x8d<\xae\x12\xb5\xd9\x98\x11e\xdb\xf4^\xe6\xec\xd3m\xd69\x7f\xa7<\xd4\xce\t\xa25\x03\x98\xc0|\xdafQ\xd20\xd9\x92\x84\x04\xe7kd\x05d\xd9\xb7\xc3\xb6\xd2\x1a\xbb\xc2\x10#\xaeQ{q\xefR\xfdH\xa2q)\xb4\x04\n\x9d\xe3\xb0\x88z\xd2\x94\xc7\xa5\x7f>\x03\xf1y6\x14*\x1c\xd0\xc2f\xdd\xc6kAevd\xfb\x8c\xe0\xa5\x87^\xe5V\x1b\xb8\x06\xaf\x8cM`\xdb_y\xed\xf6\xb0\xc9lQ\xca\x0f\x80\xe1\xb90f!\xf5\t\xc2\xad\xbb' >>> assert tls_packet.tls_session.tls13_client_privshares['ffdhe4096'].key_size == 4096 ###(078)=[passed] Issue 4418 - TLSFinished >>> tls_packet = TLSFinished(bytes.fromhex('1400000c72793a9d2f946a0455bf1995')) >>> assert tls_packet.vdata == b'ry:\x9d/\x94j\x04U\xbf\x19\x95' ###(079)=[passed] OCSP: payload after OCSP - GH3291 >>> data = '1603031616020000660303602161b58e22f4966f18f9aa6afd5759f343935ed437cf09c554dd27691a1eb420a13c0000eaad0a6cd4f11bfc59788daec98422be4f3810c19669207e509aaa11c03000001e000500000023000000100005000302683200170000ff01000100000000000b000d5d000d5a0007f6308207f2308205daa00302010202136b000006c55514d0a6c4891be20000000006c5300d06092a864886f70d01010b0500304f310b3009060355040613025553311e301c060355040a13154d6963726f736f667420436f72706f726174696f6e3120301e060355040313174d6963726f736f66742052534120544c53204341203031301e170d3230303930393231343530355a170d3231303930393231343530355a30223120301e060355040313177074692e73746f72652e6d6963726f736f66742e636f6d30820122300d06092a864886f70d01010105000382010f003082010a028201010094876b9572b7c3d7fbb2d569ffff6b8f716245a2d9b413c9e8238ee88d98b1002cec8c2198b52f3b7f0a679ceb1aeb2c1467d2eda3c71b4bb0756ba42354a956b8d40bd422921793b3dec0aab3f5e0b023bcb7dfdf48bd4b064c1a62255e9b58c16ad482087fd1505b01aad9474f06925f3821fbe92f680e87db3f0aa150e2066848f88ebe08d8280185bbba697b39d12e03eae6d4e481319432f2752793fcd125f2714cd92b37e3d9b8fcec7fd7b3c121fdedc42b50ff65f73352cbc1202ac59c846df2a9168c00fc4754f5e19c3b0503dbe4f58b0f8b3e0fa411d4dcb8e1acdef9a2ca7db52e282a14119e1ef3a867a3b7d8fdaccc27d3d2033bb5082a1b510203010001a38203f2308203ee30820105060a2b06010401d6790204020481f60481f300f10076007d3ef2f88fff88556824c2c0ca9e5289792bc50e78097f2e6a9768997e22f0d70000017474dd866500000403004730450221008886de3960d7fe8cbaa9bcf91f961d920af99ec72adaf07fb6f6e2759d6d045b02201f90de8ad6dc333cbf920fe6cd66b41d97a01397831b2ea39f618c1505ecc7e70077004494652eb0eeceafc44007d8a8fe28c0dae682bed8cb31b53fd33396b5b681a80000017474dd86d200000403004830460221008f66e7ce568540722b5a09d96bc08d78a1cc98dda6c7c2cda1daaa7ea49d75f302210099ccca061b9b31f938988f2e4182fcb39035f6e90d5dee8c928582bd4e5fb693302706092b060104018237150a041a3018300a06082b06010505070301300a06082b06010505070302303e06092b06010401823715070431302f06272b060104018237150887da867583eed90182c9851b81b59e6185f4eb60815d85868e4187c2985002016402012530818706082b06010505070101047b3079305306082b060105050730028647687474703a2f2f7777772e6d6963726f736f66742e636f6d2f706b692f6d73636f72702f4d6963726f736f6674253230525341253230544c53253230434125323030312e637274302206082b060105050730018616687474703a2f2f6f6373702e6d736f6373702e636f6d301d0603551d0e041604142746d09d123c3c91382ef590e0aab2a901f0d0c3300b0603551d0f0404030204b030780603551d110471306f821b7074692d696e742e73746f72652e6d6963726f736f66742e636f6d82177074692e73746f72652e6d6963726f736f66742e636f6d821a7074692d696e742e747261666669636d616e616765722e6e6574821b7074692d70726f642e747261666669636d616e616765722e6e65743081b00603551d1f0481a83081a53081a2a0819fa0819c864d687474703a2f2f6d7363726c2e6d6963726f736f66742e636f6d2f706b692f6d73636f72702f63726c2f4d6963726f736f6674253230525341253230544c53253230434125323030312e63726c864b687474703a2f2f63726c2e6d6963726f736f66742e636f6d2f706b692f6d73636f72702f63726c2f4d6963726f736f6674253230525341253230544c53253230434125323030312e63726c30570603551d200450304e304206092b0601040182372a013035303306082b060105050702011627687474703a2f2f7777772e6d6963726f736f66742e636f6d2f706b692f6d73636f72702f6370733008060667810c010201301f0603551d23041830168014b5760c3011cec792424d4cc75c2cc8a90ce80b64301d0603551d250416301406082b0601050507030106082b06010505070302300d06092a864886f70d01010b0500038202010086dd00ab90b01c8f5c87d59c2cc45e2cb81998699e5e97aeceea13670bbf2b76e9add7cd11bc4ef347dbab7ea7c28300223bd43e5d2904db1516c55572181534f4efc11eccf4d10a9c08ddfbff53cad870856e0e3377b7639cfc3de5d3c7ca8294cc6e7ac0cac0e1a3cd4b0b81cdcb2fa1dbf6ebc2659d6f1947e8047be27c02fba8b6a991837781cea269246353e5441aa33c8494d4591ee482f448bef23460578f96c5c1e92f5a7cd7c81815b40a7cc00aeee6976a708c1d236c7fe64a4a45f7fd83707c0e621ff7e78fe089dd3ff539148a0acba6a99a8ca630ef2e2c83529596bbb3fb1c9ea7f371158d70b36120217154003e791db16390877c83dd27543c15e73c1af5f22b4c7c73347a9b97de633abdd9413363877a8a428f18cd624e310e2ea17aa4740a167aabecfb5f5c244ef8ada6638f90592df625885b9a57ec478acca5ec2c35e6c66b597be4570057d6769f3e5c2487ea70f84ecabc0f4064bb0e7be746d652f3861b931eb0e75846253e7eeae987cf7d4193bd1dc85044ee798d821536944c7ade7e269b13e4ece47093c641e7fc8d31dc0e3d211d94e8b450cfed2733ad78fac2eae225acd505117c39243a8e24feebd47ff875643d1ef777dd2a1a18f370dd83fdf85ca2eadf3c46711aedc68fc13b1db8bf71e015c77f69882613ea096c216e759553ea475a48db8ac4e92b8b184b7dbc9d458758e85200055e3082055a30820442a00302010202100f14965f202069994fd5c7ac788941e2300d06092a864886f70d01010b0500305a310b300906035504061302494531123010060355040a130942616c74696d6f726531133011060355040b130a43796265725472757374312230200603550403131942616c74696d6f7265204379626572547275737420526f6f74301e170d3230303732313233303030305a170d3234313030383037303030305a304f310b3009060355040613025553311e301c060355040a13154d6963726f736f667420436f72706f726174696f6e3120301e060355040313174d6963726f736f66742052534120544c5320434120303130820222300d06092a864886f70d01010105000382020f003082020a0282020100aa6277cf9a63b20684f39036f499f31451abea950a3b4606fd11411ffe5b0658c9386e08fc4f4448cd3aa4f7bd1ea2e295b8be5120c5bfb270635d780c43c029cd64490996daafcefd055f2b2a91e8016e2e189b2c9cd0017f69f5ee3f53885cba056cbe2215671482f22cd2be5b6337ccaf6085e8966b6b8008a86ebe009c6b9570fce41812b11d1bb2c11331673334e625c9625b58827576f2fef23f3b16dfaa4283e3326d9b8e4326f0bd0e1fa1a73aaf2cc88ae6ea3ff9a5d2258f92aa1a08129cfeac4ac7c3eb8094ab8716d12349e7a4bbc791dfe679343f414aa73a26d2ea6f46e33873e6e5d491ae0b789e78a5ef96e373d8f79565e905bf4f5cff52a7f9cf08afa74d0999c071a3527aa53bd79b015403e3b662b05a279c30268eb64d56a117177a7b95a107ac5331b6d62e0fcd4174ecf101b2fd45bffc31e146423136431eb9aa055f847f91b18bae0fd754c3fdf064086ad39c8eea7934ec033d73e01b36d46811c75970b0877cc0dc6e45ca36ce43267702a9700de8b857544442c3fbac1b632608c2d2231f7f930b7c6f08549a2b4e5dce9fa53ed2985bd102dbf183ce3052483863f1b1fbed23d33e92b5278dd04273d79d236871ba595e0752a6964dbf7c4e6f742205c0538016d8604e97314f894e4863d8edf9e5c2d90eb20bf6694cbd4b01c9cbdd06bf3a02eb1cdd308b0d4a1460f9d5644f4344a1ed0203010001a382012530820121301d0603551d0e04160414b5760c3011cec792424d4cc75c2cc8a90ce80b64301f0603551d23041830168014e59d5930824758ccacfa085436867b3ab5044df0300e0603551d0f0101ff040403020186301d0603551d250416301406082b0601050507030106082b0601050507030230120603551d130101ff040830060101ff020100303406082b0601050507010104283026302406082b060105050730018618687474703a2f2f6f6373702e64696769636572742e636f6d303a0603551d1f04333031302fa02da02b8629687474703a2f2f63726c332e64696769636572742e636f6d2f4f6d6e69726f6f74323032352e63726c302a0603551d20042330213008060667810c0102013008060667810c010202300b06092b0601040182372a01300d06092a864886f70d01010b050003820101009f2bbe92675bda7b8aade8ff9d4d050eedb60d1541d1e615dc0360f9f422569c48f99daeda2b3ca8c0abd0ba95b8c8c1fd7c6371b6c87a889b3046a38e7d9602e3f82204efe036c06fc2bf2e0d6eedd676280d81873e9be7a7108cda661f4051eae7bebf4e6798bb5459636f42e30f31601964000f260c97d184c0a67a193b70de4526dc96463d9c663fe13a8238e53603042857a4e94b64a218886d60898d7abe10918bace63f3130bfeb64d79e8de9c192566e388d343faecd6c6b4252623cd46989e0a057590b839fc6722442f5080384ce1663f334f105763719b206de133e137061d304f2b8476f05e38a88302b47455e7954c5f9ddebfa3f785175d25b160006d6010006d2308206ce0a0100a08206c7308206c306092b0601050507300101048206b4308206b03081a5a21604149a0190a5b9942f43bc62113fcd3d404bead25250180f32303231303230383036303930325a307a3078304c300906052b0e03021a05000414521ee36c478119a9cb03fab74e57e1197af1818b0414b5760c3011cec792424d4cc75c2cc8a90ce80b6402136b000006c55514d0a6c4891be20000000006c58000180f32303231303230383036303930325aa011180f32303231303231323036303930325aa1023000300d06092a864886f70d01010b05000382010100784c3cee7765bf5cb164c0cf465462c37e97d11041443dcd9052e413747a71f8c37a051a29cdba11ea15cac3c252eeab533c7e9141431649a3a57a7dacc1fa697fdd360c139a35af181b7154574e7b87ade8da951d1894362082f80eb56d3775e729e930a097e72a7339e6e63719acc8166fd9c77c068cc75240a3b2149da8bcc24187addcfcc7330ad057b1d7a215380ea8e060b2a85330bc262c58e119672d846b87be7edf535d68a4bc2a643516df1c134401d96f0944d4d7ebe7a769ecdcfa90418486c9d62a9a4c46e232fa94221392f59a9c8df520b19e1214ed4ac70f54367b640924c48d2d3596056ff7424fc1734b98edc02dc67d8d72f6d10f44e8a08204f0308204ec308204e8308202d0a00302010202136b00086694d48d4b29943630f5000000086694300d06092a864886f70d01010b0500304f310b3009060355040613025553311e301c060355040a13154d6963726f736f667420436f72706f726174696f6e3120301e060355040313174d6963726f736f66742052534120544c53204341203031301e170d3231303230323139353831335a170d3232303230323139353831335a30353133303106035504030c2a4d6963726f736f66745f5253415f544c535f49737375696e675f43415f30315f4b657942696e64696e6730820122300d06092a864886f70d01010105000382010f003082010a0282010100b65a936febea1694e5de2b8dfc1997d265f3582b94f9be1fb56bb96e2191c5df170bb52d276c30c8fdc876f1e5b3d9b900571e17fd505534f56db0ab7953261a34911e9fb0340aac76c1baede9a580ee86eba49f0e3d7cddcc60d973c69afc157aaa5d2d6ede3cd7d9a265098ee932fde13049e0f1490b2bb88bd56b6e26033ad99f49f6b7366eb275e6550c6b74f1823ac6dcf86a843825ade03f670a7ce895c840a7cfca247bc94d608ee30feefa8346470bc69f0f2e847b5896b377d70fa20e99d3af06b2d8c286b512fad8070cdc33f3302f48ad02014a21de13d1a04fbdf6fca54cc7364e303a1b458d2093fb8e98f686c2d8da374e757f8ac25b2210e70203010001a381d63081d3301d0603551d0e041604149a0190a5b9942f43bc62113fcd3d404bead25250300e0603551d0f0101ff04040302078030130603551d25040c300a06082b06010505070309300f06092b060105050730010504020500301f0603551d23041830168014b5760c3011cec792424d4cc75c2cc8a90ce80b64303e06092b06010401823715070431302f06272b060104018237150887da867583eed90182c9851b81b59e6185f4eb60815d81cc9b4781c8e916020164020107301b06092b060104018237150a040e300c300a06082b06010505070309300d06092a864886f70d01010b0500038202010012d83b821ff2afc4d67c63cee2d9a1045c1a1f0628274e1da3ef03fcdc720d420423478090afe6cbbaf4c753fdcad04aef5ca919c96ab9b540a64cc23d24181e7016391e780ae56a0897a372ea9a93a959c0d713ae0cbd5e6ca420724a110ac0901d671ea8c57ba31db062a7df4bbc8cb78d820262f9ba12e4313edb85155f69c47a05fa6171958e6577b61910357a5940a3c3f186eb07a37968c7f17b5614603aae4e71cb2d5f122bbea187888452239cb9c0d338d913604034e4eb3be2639a15836d08b4b4f38287414e5cd144a23aa95edb59236205397263ead5b0ef1a2239f54149f9b5992a2964a28373652a1bb31a772a04c5d4eef2fd0e5853094590ccc5b1bcb9fc1910d31652cc8f2e72c685665834f3826613dd456655ae9c9f21283a1684123fa144bc3276f50ead086fd9c149b670b27804057472602a984a3de016f65bf0980baa8a0cbadd53b061800347fec63d80b0b68d164e295e682a890ae433c439ae04a31dd8b9260c81692a110e8583038e767ceab2b87db2067eeb1973aa5bbcd5f3b4fca071ca60361d9815e87c76c44e9791c7aa25defaaaa28d72c709ad434b44974ed50546b685e215c7a70065503f0014d5f9f1fdf851930af51e7c425d0ea0d966377f44d60bf6345a05d750d2de25ebb1957bdac56b1d9a3a4e556bf398e063062ea7e1400a279abb085c1fadb9e517231b5fdcb0d868c10c00016903001861040089499a5bf709647d1cd5e41d381c15ab96100c86f0d66d0ba53a224b2adb7897f63de0368a080e17e80da5f70505d58c5317cb047dfeeecc1c7e160fdbf4747c78fb2641b233ad509c12de3a83c3d9cab174c8ca3a748d43766a11eeaa3e8c080401006f041a8741e47e744c7b6b83abf44bc722ae7f1ca19e12989106c2a78a37c8713cac664d1d1dbff6a566b05f478f15123fb155850cafeb36120e9fb24ae4fc5f4c6e4614ebcaf1dab4a79405325d4774cef1c85facffdf57c182c7e22d29facb2ee7460b716aaa6b5e3235036d21a6212414f2d75fc85caa91317fcd0318c651f8459f32bfbda3f3b2e04c1f0c2f8982ea16d2df599133881106b27d53276703bc43230f0fdcadb8b1fe13101d1055a14d6cc6af8fa48d6dd23a0a36fb5d6ebb8f5021e3e20900b5de2442da9853d2446d75b1c2198d24cdc2a5a3d07a9aab451e196c6c49fce20bdb71a7190de2964afd934a7f14afb7872a49ab6a7a5cf2d30e000000' >>> >>> pkt = TLS(bytes.fromhex(data)) >>> assert [type(x) for x in pkt.msg] == [TLSServerHello, TLSCertificate, TLSCertificateStatus, TLSServerKeyExchange, TLSServerHelloDone] ###(080)=[passed] Issue 3853 >>> data = hex_bytes("16030300360200002e030342615f0b32366c85b5de265ec99fd68c59079d9783dc2f547592fe12f4ab3fde00c02c000015ff01000100000e000000") >>> tls_packet = TLS(data) >>> assert raw(tls_packet) == data ###### ## Decrypt packets from a pcap ###### ###(081)=[passed] pcap file & external TLS Key Log file >>> bck_conf = conf >>> conf.tls_session_enable = True >>> conf.tls_nss_filename = scapy_path("doc/notebooks/tls/raw_data/tls_nss_example.keys.txt") >>> >>> packets = rdpcap(scapy_path("doc/notebooks/tls/raw_data/tls_nss_example.pcap")) >>> assert b"GET /secret.txt HTTP/1.0\n" in packets[11].msg[0].data >>> assert b"z2|gxarIKOxt,G1d>.Q2MzGY[k@" in packets[13].msg[0].data >>> >>> conf = bck_conf ###(082)=[passed] pcapng file with a Decryption Secrets Block >>> import shutil >>> if shutil.which("editcap"): ... bck_conf = conf ... key_log_path = scapy_path("doc/notebooks/tls/raw_data/tls_nss_example.keys.txt") ... pcap_path = scapy_path("doc/notebooks/tls/raw_data/tls_nss_example.pcap") ... pcapng_path = get_temp_file() ... exit_status = os.system("editcap --inject-secrets tls,%s %s %s" % (key_log_path, pcap_path, pcapng_path)) ... assert exit_status == 0 ... packets = rdpcap(pcapng_path) ... assert b"GET /secret.txt HTTP/1.0\n" in packets[11].msg[0].data ... assert b"z2|gxarIKOxt,G1d>.Q2MzGY[k@" in packets[13].msg[0].data ... conf = bck_conf ... TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] TLS: record integrity check failed [00:00:00:00:00:00 > 00:00:00:00:00:00 (IPv6)] ###(083)=[passed] pcapng file with a non-UTF-8 Decryption Secrets Block >>> hdump = """ ... 00000000 0a 0d 0d 0a c4 00 00 00 4d 3c 2b 1a 01 00 00 00 |........M<+.....| ... 00000010 ff ff ff ff ff ff ff ff 02 00 37 00 49 6e 74 65 |..........7.Inte| ... 00000020 6c 28 52 29 20 43 6f 72 65 28 54 4d 29 20 69 37 |l(R) Core(TM) i7| ... 00000030 2d 36 37 30 30 48 51 20 43 50 55 20 40 20 32 2e |-6700HQ CPU @ 2.| ... 00000040 36 30 47 48 7a 20 28 77 69 74 68 20 53 53 45 34 |60GHz (with SSE4| ... 00000050 2e 32 29 00 03 00 2a 00 4c 69 6e 75 78 20 34 2e |.2)...*.Linux 4.| ... 00000060 32 30 2e 31 32 2d 67 65 6e 74 6f 6f 2d 61 6e 64 |20.12-gentoo-and| ... 00000070 72 6f 6d 65 64 61 2d 32 30 31 39 30 33 30 35 2d |romeda-20190305-| ... 00000080 76 31 00 00 04 00 33 00 44 75 6d 70 63 61 70 20 |v1....3.Dumpcap | ... 00000090 28 57 69 72 65 73 68 61 72 6b 29 20 33 2e 31 2e |(Wireshark) 3.1.| ... 000000a0 30 20 28 76 33 2e 31 2e 30 72 63 30 2d 34 36 38 |0 (v3.1.0rc0-468| ... 000000b0 2d 67 65 33 65 34 32 32 32 62 29 00 00 00 00 00 |-ge3e4222b).....| ... 000000c0 c4 00 00 00 0a 00 00 00 c4 00 00 00 4b 53 4c 54 |............KSLT| ... 000000d0 b0 00 00 00 43 4c 49 45 4e 54 5f 52 41 4e 44 4f |....CLIENT_RANDO| ... 000000e0 4d 20 41 36 39 39 35 43 37 44 35 41 35 31 35 42 |M A6995C7D5A515B| ... 000000f0 30 44 34 39 41 31 42 38 31 33 33 39 33 34 32 37 |0D49A1B813393427| ... 00000100 43 43 35 43 39 44 42 37 36 36 37 38 45 34 38 44 |CC5C9DB76678E48D| ... 00000110 31 41 43 35 39 31 44 37 44 37 44 35 42 38 30 31 |1AC591D7D7D5B801| ... 00000120 44 43 20 34 30 33 37 35 37 34 30 31 42 30 30 37 |DC 403757401B007| ... 00000130 34 35 33 38 33 41 46 36 41 36 30 38 31 39 42 43 |45383AF6A60819BC| ... 00000140 37 46 38 42 36 33 39 33 42 37 32 45 44 45 39 46 |7F8B6393B72EDE9F| ... 00000150 45 42 32 30 44 33 31 33 46 38 31 42 39 c0 bd bb |EB20D313F81B9...| ... 00000160 c6 36 46 36 41 43 37 34 32 46 46 46 35 45 43 31 |.6F6AC742FFF5EC1| ... 00000170 44 31 41 32 44 39 39 41 46 34 39 35 33 45 31 33 |D1A2D99AF4953E13| ... 00000180 33 34 41 0a c4 00 00 00 |34A.....| ... 00000188 ... """.strip() >>> >>> assert len(rdpcap(io.BytesIO(import_hexcap(hdump)))) == 0 Cannot read NSS Key Log: /tmp/scapy_guf5r4h 'utf-8' codec can't decode byte 0xc0 in position 137: invalid start byte PcapNg: invalid TLS Key Log in DSB! ###(084)=[passed] pcap file & external TLS Key Log file with TCPSession (without extms) GH3722 >>> temp_sslkeylog = get_temp_file() >>> with open(temp_sslkeylog, "w") as fd: ... fd.write("CLIENT_RANDOM 09F91DA01B1FEB50B691C932959111E5E1D676437F7A42DE47EA881F6295D4E7 EE119869B732F0F9561FFDD95E50A2ACBF268EE0C7C33B409E68C1972E0B280944F7345E845E82F909CCFEB61C456E1F\n") ... 176 >>> bck_conf = conf >>> conf.tls_session_enable = True >>> conf.tls_nss_filename = temp_sslkeylog >>> >>> packets = sniff(offline=scapy_path("test/pcaps/tls_tcp_frag_withnss.pcap.gz"), session=TCPSession) >>> packets.show() 0000 Ether / IP / TCP 10.211.55.3:51933 > 52.87.105.151:https S 0001 Ether / IP / TCP 52.87.105.151:https > 10.211.55.3:51933 SA 0002 Ether / IP / TCP 10.211.55.3:51933 > 52.87.105.151:https A 0003 Ether / IP / TCP / TLS 10.211.55.3:51933 > 52.87.105.151:443 / TLS / TLS Handshake - Client Hello 0004 Ether / IP / TCP 52.87.105.151:https > 10.211.55.3:51933 A 0005 Ether / IP / TCP / TLS 52.87.105.151:443 > 10.211.55.3:51933 / TLS / TLS 1.3 Handshake - Server Hello 0006 Ether / IP / TCP / TLS 52.87.105.151:443 > 10.211.55.3:51933 / TLS / TLS Handshake - Certificate / TLS / TLS Handshake - Server Key Exchange / TLS / TLS Handshake - Server Hello Done 0007 Ether / IP / TCP 10.211.55.3:51933 > 52.87.105.151:https A 0008 Ether / IP / TCP / TLS 10.211.55.3:51933 > 52.87.105.151:443 / TLS / TLS Handshake - Client Key Exchange / TLS / TLS ChangeCipherSpec / TLS / TLS Handshake - Finished 0009 Ether / IP / TCP 52.87.105.151:https > 10.211.55.3:51933 A 0010 Ether / IP / TCP / TLS 52.87.105.151:443 > 10.211.55.3:51933 / TLS / TLS Handshake - New Session Ticket / TLS / TLS ChangeCipherSpec / TLS / TLS Handshake - Finished 0011 Ether / IP / TCP / TLS 10.211.55.3:51933 > 52.87.105.151:443 / TLS / TLS Application Data 0012 Ether / IP / TCP 52.87.105.151:https > 10.211.55.3:51933 A 0013 Ether / IP / TCP / TLS 52.87.105.151:443 > 10.211.55.3:51933 / TLS / TLS Application Data 0014 Ether / IP / TCP 10.211.55.3:51933 > 52.87.105.151:https A >>> >>> assert packets[8].getlayer(TLS, 3).msg[0].msgtype == 20 >>> assert packets[8].getlayer(TLS, 3).msg[0].vdata == b'\n\xd4`\xf0\xd9X\x02\x10Z\x81\xf4l' >>> assert packets[10].getlayer(TLS, 3).msg[0].msgtype == 20 >>> assert packets[10].getlayer(TLS, 3).msg[0].vdata == b'\xa6>f\xd8\xacf\x99| \xbd<\xa1' >>> assert packets[11].msg[0].data == b'GET /uuid HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) WindowsPowerShell/5.1.22000.832\r\nHost: httpbin.org\r\nConnection: Keep-Alive\r\n\r\n' >>> assert packets[13].msg[0].data == b'HTTP/1.1 200 OK\r\nDate: Sat, 20 Aug 2022 22:32:24 GMT\r\nContent-Type: application/json\r\nContent-Length: 53\r\nConnection: keep-alive\r\nServer: gunicorn/19.9.0\r\nAccess-Control-Allow-Origin: *\r\nAccess-Control-Allow-Credentials: true\r\n\r\n{\n "uuid": "5bad226d-504a-4416-a11a-8a5f8edbdbbd"\n}\n' >>> >>> assert packets[6].summary() == 'Ether / IP / TCP / TLS 52.87.105.151:443 > 10.211.55.3:51933 / TLS / TLS Handshake - Certificate / TLS / TLS Handshake - Server Key Exchange / TLS / TLS Handshake - Server Hello Done' >>> assert packets[8].summary() == 'Ether / IP / TCP / TLS 10.211.55.3:51933 > 52.87.105.151:443 / TLS / TLS Handshake - Client Key Exchange / TLS / TLS ChangeCipherSpec / TLS / TLS Handshake - Finished' >>> conf = bck_conf Tests for TLS 1.3 ━ Run at 01:42:31 from [test/scapy/layers/tls/tls13.uts] by UTscapy in 0.17995858192443848 └ Passed=47 └ Failed=0 ###### ## Read a protected TLS 1.3 session ###### ###(000)=[passed] Reading test session - Loading unparsed TLS 1.3 records >>> import binascii >>> def clean(s): ... return binascii.unhexlify(''.join(c for c in s if c.isalnum())) ... >>> clientHello = clean(""" ... 16 03 01 00 c4 01 00 00 c0 03 03 cb ... 34 ec b1 e7 81 63 ba 1c 38 c6 da cb 19 6a 6d ff a2 1a 8d 99 12 ... ec 18 a2 ef 62 83 02 4d ec e7 00 00 06 13 01 13 03 13 02 01 00 ... 00 91 00 00 00 0b 00 09 00 00 06 73 65 72 76 65 72 ff 01 00 01 ... 00 00 0a 00 14 00 12 00 1d 00 17 00 18 00 19 01 00 01 01 01 02 ... 01 03 01 04 00 23 00 00 00 33 00 26 00 24 00 1d 00 20 99 38 1d ... e5 60 e4 bd 43 d2 3d 8e 43 5a 7d ba fe b3 c0 6e 51 c1 3c ae 4d ... 54 13 69 1e 52 9a af 2c 00 2b 00 03 02 03 04 00 0d 00 20 00 1e ... 04 03 05 03 06 03 02 03 08 04 08 05 08 06 04 01 05 01 06 01 02 ... 01 04 02 05 02 06 02 02 02 00 2d 00 02 01 01 00 1c 00 02 40 01 ... """) >>> >>> >>> serverHello = clean(""" ... 16 03 03 00 5a 02 00 00 56 03 03 a6 ... af 06 a4 12 18 60 dc 5e 6e 60 24 9c d3 4c 95 93 0c 8a c5 cb 14 ... 34 da c1 55 77 2e d3 e2 69 28 00 13 01 00 00 2e 00 33 00 24 00 ... 1d 00 20 c9 82 88 76 11 20 95 fe 66 76 2b db f7 c6 72 e1 56 d6 ... cc 25 3b 83 3d f1 dd 69 b1 b0 4e 75 1f 0f 00 2b 00 02 03 04 ... """) >>> >>> serverEncHS = clean(""" ... 17 03 03 02 a2 d1 ff 33 4a 56 f5 bf ... f6 59 4a 07 cc 87 b5 80 23 3f 50 0f 45 e4 89 e7 f3 3a f3 5e df ... 78 69 fc f4 0a a4 0a a2 b8 ea 73 f8 48 a7 ca 07 61 2e f9 f9 45 ... cb 96 0b 40 68 90 51 23 ea 78 b1 11 b4 29 ba 91 91 cd 05 d2 a3 ... 89 28 0f 52 61 34 aa dc 7f c7 8c 4b 72 9d f8 28 b5 ec f7 b1 3b ... d9 ae fb 0e 57 f2 71 58 5b 8e a9 bb 35 5c 7c 79 02 07 16 cf b9 ... b1 18 3e f3 ab 20 e3 7d 57 a6 b9 d7 47 76 09 ae e6 e1 22 a4 cf ... 51 42 73 25 25 0c 7d 0e 50 92 89 44 4c 9b 3a 64 8f 1d 71 03 5d ... 2e d6 5b 0e 3c dd 0c ba e8 bf 2d 0b 22 78 12 cb b3 60 98 72 55 ... cc 74 41 10 c4 53 ba a4 fc d6 10 92 8d 80 98 10 e4 b7 ed 1a 8f ... d9 91 f0 6a a6 24 82 04 79 7e 36 a6 a7 3b 70 a2 55 9c 09 ea d6 ... 86 94 5b a2 46 ab 66 e5 ed d8 04 4b 4c 6d e3 fc f2 a8 94 41 ac ... 66 27 2f d8 fb 33 0e f8 19 05 79 b3 68 45 96 c9 60 bd 59 6e ea ... 52 0a 56 a8 d6 50 f5 63 aa d2 74 09 96 0d ca 63 d3 e6 88 61 1e ... a5 e2 2f 44 15 cf 95 38 d5 1a 20 0c 27 03 42 72 96 8a 26 4e d6 ... 54 0c 84 83 8d 89 f7 2c 24 46 1a ad 6d 26 f5 9e ca ba 9a cb bb ... 31 7b 66 d9 02 f4 f2 92 a3 6a c1 b6 39 c6 37 ce 34 31 17 b6 59 ... 62 22 45 31 7b 49 ee da 0c 62 58 f1 00 d7 d9 61 ff b1 38 64 7e ... 92 ea 33 0f ae ea 6d fa 31 c7 a8 4d c3 bd 7e 1b 7a 6c 71 78 af ... 36 87 90 18 e3 f2 52 10 7f 24 3d 24 3d c7 33 9d 56 84 c8 b0 37 ... 8b f3 02 44 da 8c 87 c8 43 f5 e5 6e b4 c5 e8 28 0a 2b 48 05 2c ... f9 3b 16 49 9a 66 db 7c ca 71 e4 59 94 26 f7 d4 61 e6 6f 99 88 ... 2b d8 9f c5 08 00 be cc a6 2d 6c 74 11 6d bd 29 72 fd a1 fa 80 ... f8 5d f8 81 ed be 5a 37 66 89 36 b3 35 58 3b 59 91 86 dc 5c 69 ... 18 a3 96 fa 48 a1 81 d6 b6 fa 4f 9d 62 d5 13 af bb 99 2f 2b 99 ... 2f 67 f8 af e6 7f 76 91 3f a3 88 cb 56 30 c8 ca 01 e0 c6 5d 11 ... c6 6a 1e 2a c4 c8 59 77 b7 c7 a6 99 9b bf 10 dc 35 ae 69 f5 51 ... 56 14 63 6c 0b 9b 68 c1 9e d2 e3 1c 0b 3b 66 76 30 38 eb ba 42 ... f3 b3 8e dc 03 99 f3 a9 f2 3f aa 63 97 8c 31 7f c9 fa 66 a7 3f ... 60 f0 50 4d e9 3b 5b 84 5e 27 55 92 c1 23 35 ee 34 0b bc 4f dd ... d5 02 78 40 16 e4 b3 be 7e f0 4d da 49 f4 b4 40 a3 0c b5 d2 af ... 93 98 28 fd 4a e3 79 4e 44 f9 4d f5 a6 31 ed e4 2c 17 19 bf da ... bf 02 53 fe 51 75 be 89 8e 75 0e dc 53 37 0d 2b ... """) >>> >>> clientEncHS = clean(""" ... 17 03 03 00 35 75 ec 4d c2 38 cc e6 ... 0b 29 80 44 a7 1e 21 9c 56 cc 77 b0 51 7f e9 b9 3c 7a 4b fc 44 ... d8 7f 38 f8 03 38 ac 98 fc 46 de b3 84 bd 1c ae ac ab 68 67 d7 ... 26 c4 05 46 ... """) ###(001)=[passed] Reading TLS 1.3 session - TLS parsing (no encryption) does not throw any error >>> from scapy.layers.tls.record import TLS >>> t1 = TLS(clientHello) >>> t2 = TLS(serverHello, tls_session=t1.tls_session.mirror()) ###(002)=[passed] Reading TLS 1.3 session - TLS Record header >>> assert t1.type == 0x16 >>> assert t1.version == 0x0301 >>> assert t1.len == 196 >>> assert not t1.iv >>> assert not t1.mac >>> assert not t1.pad and not t1.padlen >>> len(t1.msg) == 1 True ###(003)=[passed] Reading TLS 1.3 session - TLS Record __getitem__ >>> from scapy.layers.tls.handshake import TLSClientHello >>> TLSClientHello in t1 True ###(004)=[passed] Reading TLS 1.3 session - ClientHello >>> ch = t1.msg[0] >>> assert isinstance(ch, TLSClientHello) >>> assert ch.msgtype == 1 >>> assert ch.msglen == 192 >>> assert ch.version == 0x0303 >>> assert ch.gmt_unix_time == 0xcb34ecb1 >>> assert ch.random_bytes == b'\xe7\x81c\xba\x1c8\xc6\xda\xcb\x19jm\xff\xa2\x1a\x8d\x99\x12\xec\x18\xa2\xefb\x83\x02M\xec\xe7' >>> assert ch.sidlen == 0 >>> assert not ch.sid >>> assert ch.cipherslen == 6 >>> assert ch.ciphers == [4865, 4867, 4866] >>> assert ch.complen == 1 >>> assert ch.comp == [0] ###(005)=[passed] Reading TLS 1.3 session - ClientHello extensions >>> from scapy.layers.tls.extensions import (TLS_Ext_ServerName, ... TLS_Ext_RenegotiationInfo, TLS_Ext_SupportedGroups, ... TLS_Ext_SessionTicket, TLS_Ext_SupportedVersion_CH, ... TLS_Ext_SignatureAlgorithms, TLS_Ext_PSKKeyExchangeModes, ... TLS_Ext_RecordSizeLimit) >>> >>> from scapy.layers.tls.keyexchange_tls13 import TLS_Ext_KeyShare_CH >>> >>> assert ch.extlen == 145 >>> ext = ch.ext >>> assert len(ext) == 9 >>> assert isinstance(ext[0], TLS_Ext_ServerName) >>> assert ext[0].type == 0 >>> assert ext[0].len == 11 >>> assert ext[0].servernameslen == 9 >>> assert len(ext[0].servernames) == 1 >>> assert ext[0].servernames[0].nametype == 0 >>> assert ext[0].servernames[0].namelen == 6 >>> assert ext[0].servernames[0].servername == b"server" >>> assert isinstance(ext[1], TLS_Ext_RenegotiationInfo) >>> assert not ext[1].renegotiated_connection >>> assert isinstance(ext[2], TLS_Ext_SupportedGroups) >>> assert ext[2].groups == [29, 23, 24, 25, 256, 257, 258, 259, 260] >>> assert isinstance(ext[3], TLS_Ext_SessionTicket) >>> assert not ext[3].ticket >>> assert isinstance(ext[4], TLS_Ext_KeyShare_CH) >>> assert ext[4].client_shares_len == 36 >>> assert len(ext[4].client_shares) == 1 >>> assert ext[4].client_shares[0].group == 29 >>> assert ext[4].client_shares[0].kxlen == 32 >>> assert ext[4].client_shares[0].key_exchange == b'\x998\x1d\xe5`\xe4\xbdC\xd2=\x8eCZ}\xba\xfe\xb3\xc0nQ\xc1<\xaeMT\x13i\x1eR\x9a\xaf,' >>> assert isinstance(ext[5],TLS_Ext_SupportedVersion_CH) >>> assert ext[5].len == 3 >>> assert ext[5].versionslen == 2 >>> assert ext[5].versions == [772] >>> assert isinstance(ext[6], TLS_Ext_SignatureAlgorithms) >>> assert ext[6].sig_algs_len == 30 >>> assert len(ext[6].sig_algs) == 15 >>> assert ext[6].sig_algs[0] == 1027 >>> assert ext[6].sig_algs[-1] == 514 >>> assert isinstance(ext[7], TLS_Ext_PSKKeyExchangeModes) >>> assert ext[7].kxmodeslen == 1 >>> assert ext[7].kxmodes[0] == 1 >>> assert isinstance(ext[8], TLS_Ext_RecordSizeLimit) >>> assert ext[8].record_size_limit == 16385 ###(006)=[passed] Reading TLS 1.3 session - ServerHello >>> from scapy.layers.tls.handshake import TLS13ServerHello >>> from scapy.layers.tls.extensions import TLS_Ext_SupportedVersion_SH >>> from scapy.layers.tls.keyexchange_tls13 import TLS_Ext_KeyShare_SH >>> >>> assert TLS13ServerHello in t2 >>> sh = t2.msg[0] >>> ext = sh.ext >>> assert isinstance(sh, TLS13ServerHello) >>> assert sh.random_bytes == b'\xa6\xaf\x06\xa4\x12\x18`\xdc^n`$\x9c\xd3L\x95\x93\x0c\x8a\xc5\xcb\x144\xda\xc1Uw.\xd3\xe2i(' >>> assert sh.cipher == 0x1301 >>> assert len(sh.ext) == 2 >>> assert isinstance(ext[0], TLS_Ext_KeyShare_SH) >>> assert ext[0].len == 36 >>> assert ext[0].server_share.group == 29 >>> assert ext[0].server_share.key_exchange == b'\xc9\x82\x88v\x11 \x95\xfefv+\xdb\xf7\xc6r\xe1V\xd6\xcc%;\x83=\xf1\xddi\xb1\xb0Nu\x1f\x0f' >>> assert isinstance(ext[1], TLS_Ext_SupportedVersion_SH) >>> assert ext[1].version == 0x0304 ###(007)=[passed] Reading TLS 1.3 session - TLS parsing (with encryption) does not throw any error >>> from scapy.layers.tls.record_tls13 import TLS13 >>> t3 = TLS13(serverEncHS, tls_session=t2.tls_session) TLS 1.3: record integrity check failed [TLS None:None > None:None / TLS 1.3] ###(008)=[passed] Reading TLS 1.3 session - TLS13 Record header >>> assert t3.type == 0x17 >>> assert t3.version == 0x0303 >>> assert t3.len == 674 ###(009)=[passed] Reading TLS 1.3 session - TLS13 Record __getitem__ >>> TLS13 in t3 True ###(010)=[passed] Reading TLS 1.3 session - TLS13 ApplicationData >>> from scapy.layers.tls.record_tls13 import TLSInnerPlaintext >>> TLSInnerPlaintext in t3 True >>> assert len(t3.auth_tag) == 16 >>> assert t3.auth_tag == b'\xbf\x02S\xfeQu\xbe\x89\x8eu\x0e\xdcS7\r+' ###### ## Decrypt a TLS 1.3 session ###### ###(011)=[passed] Decrypt a TLS 1.3 session - Parse client Hello >>> from scapy.layers.tls.extensions import TLS_Ext_SessionTicket >>> x25519_clt_priv = clean(""" ... 49 af 42 ba 7f 79 94 85 2d 71 3e f2 78 ... 4b cb ca a7 91 1d e2 6a dc 56 42 cb 63 45 40 e7 ea 50 05 ... """) >>> >>> x25519_clt_pub = clean(""" ... 99 38 1d e5 60 e4 bd 43 d2 3d 8e 43 5a 7d ... ba fe b3 c0 6e 51 c1 3c ae 4d 54 13 69 1e 52 9a af 2c ... """) >>> >>> t = TLS(clientHello) >>> assert len(t.msg) == 1 >>> assert t.msg[0].msgtype == 1 >>> assert t.msg[0].extlen == 145 >>> assert len(t.msg[0].ext) == 9 >>> e = t.msg[0].ext >>> assert isinstance(e[0], TLS_Ext_ServerName) >>> assert isinstance(e[1], TLS_Ext_RenegotiationInfo) >>> assert isinstance(e[2], TLS_Ext_SupportedGroups) >>> assert isinstance(e[3],TLS_Ext_SessionTicket) >>> assert e[3].len == 0 >>> assert isinstance(e[4], TLS_Ext_KeyShare_CH) >>> assert len(e[4].client_shares) == 1 >>> assert e[4].client_shares[0].group == 29 >>> assert e[4].client_shares[0].key_exchange == x25519_clt_pub >>> assert isinstance(e[5], TLS_Ext_SupportedVersion_CH) >>> assert isinstance(e[6], TLS_Ext_SignatureAlgorithms) >>> assert isinstance(e[7], TLS_Ext_PSKKeyExchangeModes) >>> assert e[7].kxmodeslen == 1 >>> assert len(e[7].kxmodes) == 1 >>> assert e[7].kxmodes[0] == 1 >>> assert isinstance(e[8], TLS_Ext_RecordSizeLimit) ###(012)=[passed] Decrypt a TLS 1.3 session - Parse server Hello >>> from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey >>> from scapy.layers.tls.crypto.pkcs1 import pkcs_os2ip >>> >>> x25519_srv_priv = clean(""" ... b1 58 0e ea df 6d d5 89 b8 ef 4f 2d 56 ... 52 57 8c c8 10 e9 98 01 91 ec 8d 05 83 08 ce a2 16 a2 1e ... """) >>> >>> x25519_srv_pub = clean(""" ... c9 82 88 76 11 20 95 fe 66 76 2b db f7 c6 ... 72 e1 56 d6 cc 25 3b 83 3d f1 dd 69 b1 b0 4e 75 1f 0f ... """) >>> >>> privkey = X25519PrivateKey.from_private_bytes(x25519_clt_priv) >>> t.tls_session.tls13_client_privshares["x25519"] = privkey >>> >>> t = TLS(serverHello, tls_session=t.tls_session.mirror()) >>> >>> assert len(t.msg) == 1 >>> assert isinstance(t.msg[0], TLS13ServerHello) >>> assert len(t.msg[0].ext) == 2 >>> e = t.msg[0].ext >>> assert isinstance(e[0], TLS_Ext_KeyShare_SH) >>> assert e[0].server_share.group == 29 >>> assert e[0].server_share.key_exchange == x25519_srv_pub >>> assert isinstance(e[1], TLS_Ext_SupportedVersion_SH) ###(013)=[passed] Decrypt a TLS 1.3 session - Handshake traffic secret derivation >>> early_secret = clean(""" ... 33 ad 0a 1c 60 7e c0 3b 09 e6 cd 98 93 68 0c ... e2 10 ad f3 00 aa 1f 26 60 e1 b2 2e 10 f1 70 f9 2a ... """) >>> >>> ecdhe_secret = clean(""" ... 8b d4 05 4f b5 5b 9d 63 fd fb ac f9 f0 4b 9f 0d ... 35 e6 d6 3f 53 75 63 ef d4 62 72 90 0f 89 49 2d ... """) >>> >>> handshake_secret = clean(""" ... 1d c8 26 e9 36 06 aa 6f dc 0a ad c1 2f 74 1b ... 01 04 6a a6 b9 9f 69 1e d2 21 a9 f0 ca 04 3f be ac ... """) >>> >>> client_handshake_traffic_secret = clean(""" ... b3 ed db 12 6e 06 7f 35 a7 80 b3 ab f4 5e ... 2d 8f 3b 1a 95 07 38 f5 2e 96 00 74 6a 0e 27 a5 5a 21 ... """) >>> >>> server_handshake_traffic_secret = clean(""" ... b6 7b 7d 69 0c c1 6c 4e 75 e5 42 13 cb 2d ... 37 b4 e9 c9 12 bc de d9 10 5d 42 be fd 59 d3 91 ad 38 ... """) >>> >>> assert len(t.tls_session.tls13_derived_secrets) == 5 >>> assert t.tls_session.tls13_early_secret is not None >>> assert t.tls_session.tls13_early_secret == early_secret >>> assert t.tls_session.tls13_dhe_secret == ecdhe_secret >>> assert t.tls_session.tls13_handshake_secret is not None >>> assert t.tls_session.tls13_handshake_secret == handshake_secret >>> assert 'client_handshake_traffic_secret' in t.tls_session.tls13_derived_secrets >>> assert t.tls_session.tls13_derived_secrets['client_handshake_traffic_secret'] == client_handshake_traffic_secret >>> assert 'server_handshake_traffic_secret' in t.tls_session.tls13_derived_secrets >>> assert t.tls_session.tls13_derived_secrets['server_handshake_traffic_secret'] == server_handshake_traffic_secret ###(014)=[passed] Decrypt a TLS 1.3 session - Server handshake traffic key calculation >>> server_hs_traffic_key = clean(""" ... 3f ce 51 60 09 c2 17 27 d0 f2 e4 e8 6e ... e4 03 bc ... """) >>> >>> server_hs_traffic_iv = clean(""" ... 5d 31 3e b2 67 12 76 ee 13 00 0b 30 ... """) >>> >>> assert t.tls_session.prcs.cipher.key == server_hs_traffic_key >>> assert t.tls_session.prcs.cipher.fixed_iv == server_hs_traffic_iv ###(015)=[passed] Decrypt a TLS 1.3 session - Decrypt and parse server encrypted handshake >>> server_finished = clean(""" ... 88 63 e6 bf b0 42 0a 92 7f a2 7f 34 33 6a ... 70 ae 42 6e 96 8e 3e b8 84 94 5b 96 85 6d ba 39 76 d1 ... """) >>> >>> t = TLS13(serverEncHS, tls_session=t.tls_session) >>> assert t.deciphered_len == 658 >>> assert t.inner.type == 22 >>> assert len(t.inner.msg) == 4 >>> assert t.auth_tag == b'\xbf\x02S\xfeQu\xbe\x89\x8eu\x0e\xdcS7\r+' >>> >>> m = t.inner.msg ###(016)=[passed] Decrypt a TLS 1.3 session - Parse decrypted EncryptedExtension >>> from scapy.layers.tls.handshake import TLSEncryptedExtensions >>> assert isinstance(m[0], TLSEncryptedExtensions) >>> assert m[0].msgtype == 8 >>> assert m[0].msglen == 36 >>> assert m[0].extlen == 34 >>> assert len(m[0].ext) == 3 >>> assert isinstance(m[0].ext[0], TLS_Ext_SupportedGroups) >>> assert m[0].ext[0].groupslen == 18 >>> assert m[0].ext[0].groups == [29, 23, 24, 25, 256, 257, 258, 259, 260] >>> assert isinstance(m[0].ext[1], TLS_Ext_RecordSizeLimit) >>> assert m[0].ext[1].record_size_limit == 16385 >>> assert isinstance(m[0].ext[2], TLS_Ext_ServerName) >>> assert m[0].ext[2].len == 0 ###(017)=[passed] Decrypt a TLS 1.3 session - Parse decrypted TLS13Certificate >>> from scapy.layers.tls.cert import Cert >>> from scapy.layers.tls.handshake import (_ASN1CertAndExt, TLS13Certificate) >>> >>> assert isinstance(m[1], TLS13Certificate) >>> assert m[1].msgtype == 11 >>> assert m[1].msglen == 441 >>> assert m[1].cert_req_ctxt_len == 0 >>> assert m[1].cert_req_ctxt == b'' >>> assert m[1].certslen == 437 >>> assert len(m[1].certs) == 1 >>> assert isinstance(m[1].certs[0], _ASN1CertAndExt) >>> assert m[1].certs[0].cert[0] == 432 >>> assert isinstance(m[1].certs[0].cert[1], Cert) >>> assert m[1].certs[0].cert[1].cA == False >>> assert m[1].certs[0].cert[1].isSelfSigned() == True >>> assert m[1].certs[0].cert[1].issuer['commonName'] == 'rsa' >>> assert m[1].certs[0].cert[1].keyUsage == ['digitalSignature', 'keyEncipherment'] >>> assert m[1].certs[0].cert[1].notAfter_str == '2026-07-30 01:23:59 UTC' >>> assert m[1].certs[0].cert[1].notBefore_str == '2016-07-30 01:23:59 UTC' >>> assert m[1].certs[0].cert[1].serial == 2 >>> assert m[1].certs[0].cert[1].sigAlg == 'sha256WithRSAEncryption' >>> assert m[1].certs[0].cert[1].signatureLen == 128 >>> assert m[1].certs[0].cert[1].subject['commonName'] == 'rsa' >>> assert m[1].certs[0].cert[1].version == 3 ###(018)=[passed] Decrypt a TLS 1.3 session - Parse decrypted TLSCertificateVerify >>> from scapy.layers.tls.handshake import TLSCertificateVerify >>> from scapy.layers.tls.keyexchange import _TLSSignature >>> assert isinstance(m[2], TLSCertificateVerify) >>> assert isinstance(m[2], TLSCertificateVerify) >>> assert m[2].msgtype == 15 >>> assert m[2].msglen == 132 >>> assert isinstance(m[2].sig, _TLSSignature) >>> assert m[2].sig.sig_alg == 2052 >>> assert m[2].sig.sig_len == 128 >>> assert m[2].sig.sig_val == b"Zt|]\x88\xfa\x9b\xd2\xe5Z\xb0\x85\xa6\x10\x15\xb7!\x1f\x82L\xd4\x84\x14Z\xb3\xffR\xf1\xfd\xa8G{\x0bz\xbc\x90\xdbx\xe2\xd3:\\\x14\x1a\x07\x86S\xfak\xefx\x0c^\xa2H\xee\xaa\xa7\x85\xc4\xf3\x94\xca\xb6\xd3\x0b\xbe\x8dHY\xeeQ\x1f`)W\xb1T\x11\xac\x02vqE\x9eFD\\\x9e\xa5\x8c\x18\x1e\x81\x8e\x95\xb8\xc3\xfb\x0b\xf3'\x84\t\xd3\xbe\x15*=\xa5\x04>\x06=\xdae\xcd\xf5\xae\xa2\rS\xdf\xac\xd4/t\xf3" ###(019)=[passed] Decrypt a TLS 1.3 session - Parse decrypted TLSFinished >>> from scapy.layers.tls.handshake import TLSFinished >>> server_finished = clean(""" ... 9b 9b 14 1d 90 63 37 fb d2 cb dc e7 1d f4 ... de da 4a b4 2c 30 95 72 cb 7f ff ee 54 54 b7 8f 07 18 ... """) >>> assert isinstance(m[3], TLSFinished) >>> assert m[3].msgtype == 20 >>> assert m[3].msglen == 32 >>> assert m[3].vdata == server_finished ###(020)=[passed] Decrypt a TLS 1.3 session - Client handshake traffic key calculation >>> client_hs_traffic_key = clean(""" ... db fa a6 93 d1 76 2c 5b 66 6a f5 d9 50 ... 25 8d 01 ... """) >>> client_hs_traffic_iv = clean(""" ... 5b d3 c7 1b 83 6e 0b 76 bb 73 26 5f ... """) >>> >>> assert t.tls_session.pwcs.cipher.key == client_hs_traffic_key >>> assert t.tls_session.pwcs.cipher.fixed_iv == client_hs_traffic_iv ###(021)=[passed] Decrypt a TLS 1.3 session - Decrypt and parse client encrypted handshake >>> client_finished = clean(""" ... a8 ec 43 6d 67 76 34 ae 52 5a c1 fc eb e1 ... 1a 03 9e c1 76 94 fa c6 e9 85 27 b6 42 f2 ed d5 ce 61 ... """) >>> >>> t = TLS13(clientEncHS, tls_session=t.tls_session.mirror()) >>> assert t.deciphered_len == 37 >>> assert t.inner.type == 22 >>> assert len(t.inner.msg) == 1 >>> m = t.inner.msg >>> assert isinstance(m[0], TLSFinished) >>> assert m[0].vdata == client_finished ###(022)=[passed] Decrypt a TLS 1.3 session - Application traffic secret derivation >>> master_secret = clean(""" ... 18 df 06 84 3d 13 a0 8b f2 a4 49 84 4c 5f 8a ... 47 80 01 bc 4d 4c 62 79 84 d5 a4 1d a8 d0 40 29 19 ... """) >>> >>> client_application_traffic_secret_0 = clean(""" ... 9e 40 64 6c e7 9a 7f 9d c0 5a f8 88 9b ce ... 65 52 87 5a fa 0b 06 df 00 87 f7 92 eb b7 c1 75 04 a5 ... """) >>> >>> server_application_traffic_secret_0 = clean(""" ... a1 1a f9 f0 55 31 f8 56 ad 47 11 6b 45 a9 ... 50 32 82 04 b4 f4 4b fb 6b 3a 4b 4f 1f 3f cb 63 16 43 ... """) >>> >>> >>> exporter_master_secret = clean(""" ... fe 22 f8 81 17 6e da 18 eb 8f 44 52 9e 67 ... 92 c5 0c 9a 3f 89 45 2f 68 d8 ae 31 1b 43 09 d3 cf 50 ... """) >>> >>> resumption_master_secret = clean(""" ... 7d f2 35 f2 03 1d 2a 05 12 87 d0 2b 02 41 ... b0 bf da f8 6c c8 56 23 1f 2d 5a ba 46 c4 34 ec 19 6c ... """) >>> >>> >>> assert t.tls_session.tls13_master_secret is not None >>> assert t.tls_session.tls13_master_secret == master_secret >>> >>> assert len(t.tls_session.tls13_derived_secrets) == 9 >>> assert 'client_traffic_secrets' in t.tls_session.tls13_derived_secrets >>> assert len(t.tls_session.tls13_derived_secrets['client_traffic_secrets']) == 1 >>> assert t.tls_session.tls13_derived_secrets['client_traffic_secrets'][0] == client_application_traffic_secret_0 >>> >>> assert 'server_traffic_secrets' in t.tls_session.tls13_derived_secrets >>> assert len(t.tls_session.tls13_derived_secrets['server_traffic_secrets']) == 1 >>> assert t.tls_session.tls13_derived_secrets['server_traffic_secrets'][0] == server_application_traffic_secret_0 >>> >>> assert 'exporter_secret' in t.tls_session.tls13_derived_secrets >>> assert t.tls_session.tls13_derived_secrets['exporter_secret'] == exporter_master_secret >>> >>> assert 'resumption_secret' in t.tls_session.tls13_derived_secrets >>> assert t.tls_session.tls13_derived_secrets['resumption_secret'] == resumption_master_secret ###(023)=[passed] Decrypt a TLS 1.3 session - Application traffic keys calculation >>> client_ap_traffic_key = clean(""" ... 17 42 2d da 59 6e d5 d9 ac d8 90 e3 c6 ... 3f 50 51 ... """) >>> >>> client_ap_traffic_iv = clean(""" ... 5b 78 92 3d ee 08 57 90 33 e5 23 d9 ... """) >>> >>> server_ap_traffic_key = clean(""" ... 9f 02 28 3b 6c 9c 07 ef c2 6b b9 f2 ac ... 92 e3 56 ... """) >>> >>> server_ap_traffic_iv = clean(""" ... cf 78 2b 88 dd 83 54 9a ad f1 e9 84 ... """) >>> >>> assert t.tls_session.rcs.cipher.key == client_ap_traffic_key >>> assert t.tls_session.rcs.cipher.fixed_iv == client_ap_traffic_iv >>> assert t.tls_session.wcs.cipher.key == server_ap_traffic_key >>> assert t.tls_session.wcs.cipher.fixed_iv == server_ap_traffic_iv ###(024)=[passed] Decrypt a TLS 1.3 session - Decrypt and parse server NewSessionTicket >>> from scapy.layers.tls.extensions import TLS_Ext_EarlyDataIndicationTicket >>> serverEncTicket = clean(""" ... 17 03 03 00 de 3a 6b 8f 90 41 4a 97 ... d6 95 9c 34 87 68 0d e5 13 4a 2b 24 0e 6c ff ac 11 6e 95 d4 1d ... 6a f8 f6 b5 80 dc f3 d1 1d 63 c7 58 db 28 9a 01 59 40 25 2f 55 ... 71 3e 06 1d c1 3e 07 88 91 a3 8e fb cf 57 53 ad 8e f1 70 ad 3c ... 73 53 d1 6d 9d a7 73 b9 ca 7f 2b 9f a1 b6 c0 d4 a3 d0 3f 75 e0 ... 9c 30 ba 1e 62 97 2a c4 6f 75 f7 b9 81 be 63 43 9b 29 99 ce 13 ... 06 46 15 13 98 91 d5 e4 c5 b4 06 f1 6e 3f c1 81 a7 7c a4 75 84 ... 00 25 db 2f 0a 77 f8 1b 5a b0 5b 94 c0 13 46 75 5f 69 23 2c 86 ... 51 9d 86 cb ee ac 87 aa c3 47 d1 43 f9 60 5d 64 f6 50 db 4d 02 ... 3e 70 e9 52 ca 49 fe 51 37 12 1c 74 bc 26 97 68 7e 24 87 46 d6 ... df 35 30 05 f3 bc e1 86 96 12 9c 81 53 55 6b 3b 6c 67 79 b3 7b ... f1 59 85 68 4f ... """) >>> t = TLS13(serverEncTicket, tls_session=t.tls_session.mirror()) >>> >>> assert t.deciphered_len == 206 >>> assert t.inner.type == 22 >>> assert t.auth_tag == b'\x9c\x81SUk;lgy\xb3{\xf1Y\x85hO' >>> assert len(t.inner.msg) == 1 >>> m = t.inner.msg[0] >>> assert m.msgtype == 4 >>> assert m.ticket_lifetime == 30 >>> assert m.ticket_age_add == 4208372421 >>> assert m.noncelen == 2 >>> assert len(m.ticket_nonce) == 2 >>> assert m.ticket_nonce == b'\x00\x00' >>> assert m.ticket == b',\x03]\x82\x93Y\xee_\xf7\xafN\xc9\x00\x00\x00\x00&*d\x94\xdcHm,\x8a4\xcb3\xfa\x90\xbf\x1b\x00p\xad=\xa2g\x7f\xa5\x90l[?}\x8f\x92\xf2(\xbd\xa4\r\xdar\x14p\xf9\xfb\xf2\x97\xb5\xae\xa6\x17do\xac\\\x03\'.\x97\x07\'\xc6!\xa7\x91A\xef_}\xe6P^[\xfb\xc3\x88\xe93Ci@\x93\x93J\xe4\xd3W' >>> assert len(m.ext) == 1 >>> assert isinstance(m.ext[0], TLS_Ext_EarlyDataIndicationTicket) >>> assert m.ext[0].max_early_data_size == 1024 ###(025)=[passed] Decrypt a TLS 1.3 session - Compute the PSK associated with the ticket >>> from scapy.layers.tls.crypto.hkdf import TLS13_HKDF >>> hash_len = t.tls_session.rcs.ciphersuite.hash_alg.hash_len >>> hkdf = TLS13_HKDF(t.tls_session.rcs.ciphersuite.hash_alg.name.lower()) >>> tls13_psk_secret = hkdf.expand_label(t.tls_session.tls13_derived_secrets['resumption_secret'], ... b"resumption", ... m.ticket_nonce, ... hash_len) >>> >>> psk_resumption = clean(""" ... 4e cd 0e b6 ec 3b 4d 87 f5 d6 02 8f 92 2c ... a4 c5 85 1a 27 7f d4 13 11 c9 e6 2d 2c 94 92 e1 c4 f3 ... """) >>> >>> assert hash_len == 32 >>> assert tls13_psk_secret == psk_resumption ###(026)=[passed] Decrypt a TLS 1.3 session - Decrypt and parse client Application Data >>> from scapy.layers.tls.record import TLSApplicationData >>> payload = clean(""" ... 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e ... 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 ... 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 ... """) >>> >>> >>> clientEncAppData = clean(""" ... 17 03 03 00 43 a2 3f 70 54 b6 2c 94 ... d0 af fa fe 82 28 ba 55 cb ef ac ea 42 f9 14 aa 66 bc ab 3f 2b ... 98 19 a8 a5 b4 6b 39 5b d5 4a 9a 20 44 1e 2b 62 97 4e 1f 5a 62 ... 92 a2 97 70 14 bd 1e 3d ea e6 3a ee bb 21 69 49 15 e4 ... """) >>> t = TLS13(clientEncAppData, tls_session=t.tls_session.mirror()) >>> >>> assert t.deciphered_len == 51 >>> assert len(t.inner.msg) == 1 >>> assert t.inner.type == 23 >>> m = t.inner.msg[0] >>> assert isinstance(m, TLSApplicationData) >>> assert m.data == payload ###(027)=[passed] Decrypt a TLS 1.3 session - Decrypt and parse server Application Data >>> payload = clean(""" ... 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e ... 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 ... 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 ... """) >>> >>> serverEncAppData = clean(""" ... 17 03 03 00 43 2e 93 7e 11 ef 4a c7 ... 40 e5 38 ad 36 00 5f c4 a4 69 32 fc 32 25 d0 5f 82 aa 1b 36 e3 ... 0e fa f9 7d 90 e6 df fc 60 2d cb 50 1a 59 a8 fc c4 9c 4b f2 e5 ... f0 a2 1c 00 47 c2 ab f3 32 54 0d d0 32 e1 67 c2 95 5d ... """) >>> >>> t = TLS13(serverEncAppData, tls_session=t.tls_session.mirror()) >>> assert t.deciphered_len == 51 >>> assert len(t.inner.msg) == 1 >>> assert t.inner.type == 23 >>> m = t.inner.msg[0] >>> assert isinstance(m, TLSApplicationData) >>> assert m.data == payload ###(028)=[passed] Decrypt a TLS 1.3 session - Decrypt client Alert >>> from scapy.layers.tls.record import TLSAlert >>> clientEncAlert = clean(""" ... 17 03 03 00 13 c9 87 27 60 65 56 66 ... b7 4d 7f f1 15 3e fd 6d b6 d0 b0 e3 ... """) >>> >>> t = TLS13(clientEncAlert, tls_session=t.tls_session.mirror()) >>> assert t.deciphered_len == 3 >>> assert len(t.inner.msg) == 1 >>> assert t.inner.type == 21 >>> m = t.inner.msg[0] >>> assert isinstance(m, TLSAlert) >>> assert m.level == 1 >>> assert m.descr == 0 ###(029)=[passed] Decrypt a TLS 1.3 session - Decrypt server Alert >>> serverEncAlert = clean(""" ... 17 03 03 00 13 b5 8f d6 71 66 eb f5 ... 99 d2 47 20 cf be 7e fa 7a 88 64 a9 ... """) >>> t = TLS13(serverEncAlert, tls_session=t.tls_session.mirror()) >>> assert t.deciphered_len == 3 >>> assert len(t.inner.msg) == 1 >>> assert t.inner.type == 21 >>> m = t.inner.msg[0] >>> assert isinstance(m, TLSAlert) >>> assert m.level == 1 >>> assert m.descr == 0 ###### ## Decrypt a TLS 1.3 session with a retry ###### ###(030)=[passed] Decrypt a TLS 1.3 session with a retry - Parse first ClientHello >>> x25519_clt_priv = clean(""" ... 0e d0 2f 8e 81 17 ef c7 5c a7 ac 32 aa ... 7e 34 ed a6 4c dc 0d da d1 54 a5 e8 52 89 f9 59 f6 32 04 ... """) >>> >>> x25519_clt_pub = clean(""" ... e8 e8 e3 f3 b9 3a 25 ed 97 a1 4a 7d ca cb ... 8a 27 2c 62 88 e5 85 c6 48 4d 05 26 2f ca d0 62 ad 1f ... """) >>> >>> clientHello1 = clean(""" ... 16 03 01 00 b4 01 00 00 b0 03 03 b0 ... b1 c5 a5 aa 37 c5 91 9f 2e d1 d5 c6 ff f7 fc b7 84 97 16 94 5a ... 2b 8c ee 92 58 a3 46 67 7b 6f 00 00 06 13 01 13 03 13 02 01 00 ... 00 81 00 00 00 0b 00 09 00 00 06 73 65 72 76 65 72 ff 01 00 01 ... 00 00 0a 00 08 00 06 00 1d 00 17 00 18 00 33 00 26 00 24 00 1d ... 00 20 e8 e8 e3 f3 b9 3a 25 ed 97 a1 4a 7d ca cb 8a 27 2c 62 88 ... e5 85 c6 48 4d 05 26 2f ca d0 62 ad 1f 00 2b 00 03 02 03 04 00 ... 0d 00 20 00 1e 04 03 05 03 06 03 02 03 08 04 08 05 08 06 04 01 ... 05 01 06 01 02 01 04 02 05 02 06 02 02 02 00 2d 00 02 01 01 00 ... 1c 00 02 40 01 ... """) >>> >>> t = TLS(clientHello1) >>> assert len(t.msg) == 1 >>> assert t.msg[0].msgtype == 1 >>> assert t.msg[0].extlen == 129 >>> assert len(t.msg[0].ext) == 8 >>> e = t.msg[0].ext >>> assert isinstance(e[0], TLS_Ext_ServerName) >>> assert isinstance(e[1], TLS_Ext_RenegotiationInfo) >>> assert isinstance(e[2], TLS_Ext_SupportedGroups) >>> assert isinstance(e[3],TLS_Ext_KeyShare_CH) >>> assert len(e[3].client_shares) == 1 >>> assert e[3].client_shares[0].group == 29 >>> assert e[3].client_shares[0].key_exchange == x25519_clt_pub >>> assert isinstance(e[4], TLS_Ext_SupportedVersion_CH) >>> assert isinstance(e[5], TLS_Ext_SignatureAlgorithms) >>> assert isinstance(e[6], TLS_Ext_PSKKeyExchangeModes) >>> assert e[6].kxmodeslen == 1 >>> assert len(e[6].kxmodes) == 1 >>> assert e[6].kxmodes[0] == 1 >>> assert isinstance(e[7], TLS_Ext_RecordSizeLimit) >>> >>> >>> >>> secp256_srv_pub = clean(""" ... 8c 51 06 01 f9 76 5b fb 8e d6 93 44 9a ... 48 98 98 59 b5 cf a8 79 cb 9f 54 43 c4 1c 5f f1 06 34 ed ... """) >>> >>> secp256_srv_pub = clean(""" ... 04 58 3e 05 4b 7a 66 67 2a e0 20 ad 9d 26 ... 86 fc c8 5b 5a d4 1a 13 4a 0f 03 ee 72 b8 93 05 2b d8 5b 4c 8d ... e6 77 6f 5b 04 ac 07 d8 35 40 ea b3 e3 d9 c5 47 bc 65 28 c4 31 ... 7d 29 46 86 09 3a 6c ad 7d ... """) ###(031)=[passed] Decrypt a TLS 1.3 session with a retry - Parse ServerHelloRetryRequest >>> from scapy.layers.tls.keyexchange_tls13 import TLS_Ext_KeyShare_HRR >>> from scapy.layers.tls.extensions import TLS_Ext_Cookie >>> from cryptography.hazmat.backends import default_backend >>> from cryptography.hazmat.primitives import hashes >>> helloRetryRequest = clean(""" ... 16 03 03 00 b0 02 00 00 ac 03 03 cf ... 21 ad 74 e5 9a 61 11 be 1d 8c 02 1e 65 b8 91 c2 a2 11 16 7a bb ... 8c 5e 07 9e 09 e2 c8 a8 33 9c 00 13 01 00 00 84 00 33 00 02 00 ... 17 00 2c 00 74 00 72 71 dc d0 4b b8 8b c3 18 91 19 39 8a 00 00 ... 00 00 ee fa fc 76 c1 46 b8 23 b0 96 f8 aa ca d3 65 dd 00 30 95 ... 3f 4e df 62 56 36 e5 f2 1b b2 e2 3f cc 65 4b 1b 5b 40 31 8d 10 ... d1 37 ab cb b8 75 74 e3 6e 8a 1f 02 5f 7d fa 5d 6e 50 78 1b 5e ... da 4a a1 5b 0c 8b e7 78 25 7d 16 aa 30 30 e9 e7 84 1d d9 e4 c0 ... 34 22 67 e8 ca 0c af 57 1f b2 b7 cf f0 f9 34 b0 00 2b 00 02 03 ... 04 ... """) >>> >>> t = TLS(helloRetryRequest, tls_session=t.tls_session.mirror()) >>> assert len(t.msg) == 1 >>> assert t.msg[0].msgtype == 2 >>> digest = hashes.Hash(hashes.SHA256(), backend=default_backend()) >>> digest.update(b"HelloRetryRequest") >>> assert t.msg[0].random_bytes == digest.finalize() >>> assert t.msg[0].extlen == 132 >>> assert len(t.msg[0].ext) == 3 >>> e = t.msg[0].ext >>> assert isinstance(e[0], TLS_Ext_KeyShare_HRR) >>> assert e[0].type == 51 >>> assert e[0].len == 2 >>> assert e[0].selected_group == 23 >>> assert isinstance(e[1], TLS_Ext_Cookie) >>> assert e[1].type == 44 >>> assert e[1].len == 116 >>> assert e[1].cookielen == 114 >>> assert e[1].cookie == b'q\xdc\xd0K\xb8\x8b\xc3\x18\x91\x199\x8a\x00\x00\x00\x00\xee\xfa\xfcv\xc1F\xb8#\xb0\x96\xf8\xaa\xca\xd3e\xdd\x000\x95?N\xdfbV6\xe5\xf2\x1b\xb2\xe2?\xcceK\x1b[@1\x8d\x10\xd17\xab\xcb\xb8ut\xe3n\x8a\x1f\x02_}\xfa]nPx\x1b^\xdaJ\xa1[\x0c\x8b\xe7x%}\x16\xaa00\xe9\xe7\x84\x1d\xd9\xe4\xc04"g\xe8\xca\x0c\xafW\x1f\xb2\xb7\xcf\xf0\xf94\xb0' >>> assert isinstance(e[2], TLS_Ext_SupportedVersion_SH) ###(032)=[passed] Decrypt a TLS 1.3 session with a retry - Parse second ClientHello >>> from scapy.layers.tls.extensions import TLS_Ext_Padding >>> secp256_clt_pub = clean(""" ... 04 a6 da 73 92 ec 59 1e 17 ab fd 53 59 64 ... b9 98 94 d1 3b ef b2 21 b3 de f2 eb e3 83 0e ac 8f 01 51 81 26 ... 77 c4 d6 d2 23 7e 85 cf 01 d6 91 0c fb 83 95 4e 76 ba 73 52 83 ... 05 34 15 98 97 e8 06 57 80 ... """) >>> >>> secp256_clt_priv = clean(""" ... ab 54 73 46 7e 19 34 6c eb 0a 04 14 e4 ... 1d a2 1d 4d 24 45 bc 30 25 af e9 7c 4e 8d c8 d5 13 da 39 ... """) >>> >>> clientHello2 = clean(""" ... 16 03 03 02 00 01 00 01 fc 03 03 b0 ... b1 c5 a5 aa 37 c5 91 9f 2e d1 d5 c6 ff f7 fc b7 84 97 16 94 5a ... 2b 8c ee 92 58 a3 46 67 7b 6f 00 00 06 13 01 13 03 13 02 01 00 ... 01 cd 00 00 00 0b 00 09 00 00 06 73 65 72 76 65 72 ff 01 00 01 ... 00 00 0a 00 08 00 06 00 1d 00 17 00 18 00 33 00 47 00 45 00 17 ... 00 41 04 a6 da 73 92 ec 59 1e 17 ab fd 53 59 64 b9 98 94 d1 3b ... ef b2 21 b3 de f2 eb e3 83 0e ac 8f 01 51 81 26 77 c4 d6 d2 23 ... 7e 85 cf 01 d6 91 0c fb 83 95 4e 76 ba 73 52 83 05 34 15 98 97 ... e8 06 57 80 00 2b 00 03 02 03 04 00 0d 00 20 00 1e 04 03 05 03 ... 06 03 02 03 08 04 08 05 08 06 04 01 05 01 06 01 02 01 04 02 05 ... 02 06 02 02 02 00 2c 00 74 00 72 71 dc d0 4b b8 8b c3 18 91 19 ... 39 8a 00 00 00 00 ee fa fc 76 c1 46 b8 23 b0 96 f8 aa ca d3 65 ... dd 00 30 95 3f 4e df 62 56 36 e5 f2 1b b2 e2 3f cc 65 4b 1b 5b ... 40 31 8d 10 d1 37 ab cb b8 75 74 e3 6e 8a 1f 02 5f 7d fa 5d 6e ... 50 78 1b 5e da 4a a1 5b 0c 8b e7 78 25 7d 16 aa 30 30 e9 e7 84 ... 1d d9 e4 c0 34 22 67 e8 ca 0c af 57 1f b2 b7 cf f0 f9 34 b0 00 ... 2d 00 02 01 01 00 1c 00 02 40 01 00 15 00 af 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 00 ... """) >>> >>> t = TLS(clientHello2, tls_session=t.tls_session.mirror()) >>> assert len(t.msg) == 1 >>> assert t.msg[0].msgtype == 1 >>> assert t.msg[0].extlen == 461 >>> assert len(t.msg[0].ext) == 10 >>> e = t.msg[0].ext >>> assert isinstance(e[0], TLS_Ext_ServerName) >>> assert isinstance(e[1], TLS_Ext_RenegotiationInfo) >>> assert isinstance(e[2], TLS_Ext_SupportedGroups) >>> assert isinstance(e[3],TLS_Ext_KeyShare_CH) >>> assert len(e[3].client_shares) == 1 >>> assert e[3].client_shares[0].group == 23 >>> assert e[3].client_shares[0].key_exchange == secp256_clt_pub >>> assert isinstance(e[4], TLS_Ext_SupportedVersion_CH) >>> assert isinstance(e[5], TLS_Ext_SignatureAlgorithms) >>> assert isinstance(e[6], TLS_Ext_Cookie) >>> assert e[6].cookie == b'q\xdc\xd0K\xb8\x8b\xc3\x18\x91\x199\x8a\x00\x00\x00\x00\xee\xfa\xfcv\xc1F\xb8#\xb0\x96\xf8\xaa\xca\xd3e\xdd\x000\x95?N\xdfbV6\xe5\xf2\x1b\xb2\xe2?\xcceK\x1b[@1\x8d\x10\xd17\xab\xcb\xb8ut\xe3n\x8a\x1f\x02_}\xfa]nPx\x1b^\xdaJ\xa1[\x0c\x8b\xe7x%}\x16\xaa00\xe9\xe7\x84\x1d\xd9\xe4\xc04"g\xe8\xca\x0c\xafW\x1f\xb2\xb7\xcf\xf0\xf94\xb0' >>> assert isinstance(e[7], TLS_Ext_PSKKeyExchangeModes) >>> assert e[7].kxmodeslen == 1 >>> assert len(e[7].kxmodes) == 1 >>> assert e[7].kxmodes[0] == 1 >>> assert isinstance(e[8], TLS_Ext_RecordSizeLimit) >>> assert isinstance(e[9], TLS_Ext_Padding) >>> assert e[9].len == 175 >>> assert e[9].padding == 175*b'\x00' ###(033)=[passed] Decrypt a TLS 1.3 session with a retry - Parse ServerHello >>> from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePrivateNumbers >>> pubnum = t.tls_session.tls13_client_pubshares["secp256r1"].public_numbers() >>> privnum = EllipticCurvePrivateNumbers(pkcs_os2ip(secp256_clt_priv), pubnum) >>> privkey = privnum.private_key(default_backend()) >>> t.tls_session.tls13_client_privshares["secp256r1"] = privkey >>> >>> serverHello = clean(""" ... 16 03 03 00 7b 02 00 00 77 03 03 bb ... 34 1d 84 7f d7 89 c4 7c 38 71 72 dc 0c 9b f1 47 fc ca cb 50 43 ... d8 6c a4 c5 98 d3 ff 57 1b 98 00 13 01 00 00 4f 00 33 00 45 00 ... 17 00 41 04 58 3e 05 4b 7a 66 67 2a e0 20 ad 9d 26 86 fc c8 5b ... 5a d4 1a 13 4a 0f 03 ee 72 b8 93 05 2b d8 5b 4c 8d e6 77 6f 5b ... 04 ac 07 d8 35 40 ea b3 e3 d9 c5 47 bc 65 28 c4 31 7d 29 46 86 ... 09 3a 6c ad 7d 00 2b 00 02 03 04 ... """) >>> >>> t = TLS(serverHello, tls_session=t.tls_session.mirror()) >>> assert len(t.msg) == 1 >>> assert isinstance(t.msg[0], TLS13ServerHello) >>> assert len(t.msg[0].ext) == 2 >>> e = t.msg[0].ext >>> assert isinstance(e[0], TLS_Ext_KeyShare_SH) >>> assert e[0].server_share.group == 23 >>> assert e[0].server_share.key_exchange == secp256_srv_pub >>> assert isinstance(e[1], TLS_Ext_SupportedVersion_SH) ###(034)=[passed] Decrypt a TLS 1.3 session with a retry - Handshake traffic secret derivation >>> early_secret = clean(""" ... 33 ad 0a 1c 60 7e c0 3b 09 e6 cd 98 93 68 0c ... e2 10 ad f3 00 aa 1f 26 60 e1 b2 2e 10 f1 70 f9 2a ... """) >>> >>> ecdhe_secret = clean(""" ... c1 42 ce 13 ca 11 b5 c2 23 36 52 e6 3a d3 d9 78 ... 44 f1 62 1f bf b9 de 69 d5 47 dc 8f ed ea be b4 ... """) >>> >>> handshake_secret = clean(""" ... ce 02 2e 5e 6e 81 e5 07 36 d7 73 f2 d3 ad fc ... e8 22 0d 04 9b f5 10 f0 db fa c9 27 ef 42 43 b1 48 ... """) >>> >>> client_handshake_traffic_secret = clean(""" ... 15 8a a7 ab 88 55 07 35 82 b4 1d 67 4b 40 ... 55 ca bc c5 34 72 8f 65 93 14 86 1b 4e 08 e2 01 15 66 ... """) >>> >>> server_handshake_traffic_secret = clean(""" ... 34 03 e7 81 e2 af 7b 65 08 da 28 57 4f 6e ... 95 a1 ab f1 62 de 83 a9 79 27 c3 76 72 a4 a0 ce f8 a1 ... """) >>> >>> assert len(t.tls_session.tls13_derived_secrets) == 5 >>> assert t.tls_session.tls13_early_secret is not None >>> assert t.tls_session.tls13_early_secret == early_secret >>> assert t.tls_session.tls13_dhe_secret == ecdhe_secret >>> assert t.tls_session.tls13_handshake_secret is not None >>> assert t.tls_session.tls13_handshake_secret == handshake_secret >>> assert 'client_handshake_traffic_secret' in t.tls_session.tls13_derived_secrets >>> assert t.tls_session.tls13_derived_secrets['client_handshake_traffic_secret'] == client_handshake_traffic_secret >>> assert 'server_handshake_traffic_secret' in t.tls_session.tls13_derived_secrets >>> assert t.tls_session.tls13_derived_secrets['server_handshake_traffic_secret'] == server_handshake_traffic_secret ###(035)=[passed] Decrypt a TLS 1.3 session with a retry - Server handshake traffic key calculation >>> server_hs_traffic_key = clean(""" ... 46 46 bf ac 17 12 c4 26 cd 78 d8 a2 4a ... 8a 6f 6b ... """) >>> server_hs_traffic_iv = clean(""" ... c7 d3 95 c0 8d 62 f2 97 d1 37 68 ea ... """) >>> >>> assert t.tls_session.prcs.cipher.key == server_hs_traffic_key >>> assert t.tls_session.prcs.cipher.fixed_iv == server_hs_traffic_iv ###(036)=[passed] Decrypt a TLS 1.3 session with a retry - Decrypt and parse server handshake >>> serverEncHS = clean(""" ... 17 03 03 02 96 99 be e2 0b af 5b 7f ... c7 27 bf ab 62 23 92 8a 38 1e 6d 0c f9 c4 da 65 3f 9d 2a 7b 23 ... f7 de 11 cc e8 42 d5 cf 75 63 17 63 45 0f fb 8b 0c c1 d2 38 e6 ... 58 af 7a 12 ad c8 62 43 11 4a b1 4a 1d a2 fa e4 26 21 ce 48 3f ... b6 24 2e ab fa ad 52 56 6b 02 b3 1d 2e dd ed ef eb 80 e6 6a 99 ... 00 d5 f9 73 b4 0c 4f df 74 71 9e cf 1b 68 d7 f9 c3 b6 ce b9 03 ... ca 13 dd 1b b8 f8 18 7a e3 34 17 e1 d1 52 52 2c 58 22 a1 a0 3a ... d5 2c 83 8c 55 95 3d 61 02 22 87 4c ce 8e 17 90 b2 29 a2 aa 0b ... 53 c8 d3 77 ee 72 01 82 95 1d c6 18 1d c5 d9 0b d1 f0 10 5e d1 ... e8 4a a5 f7 59 57 c6 66 18 97 07 9e 5e a5 00 74 49 e3 19 7b dc ... 7c 9b ee ed dd ea fd d8 44 af a5 c3 15 ec fe 65 e5 76 af e9 09 ... 81 28 80 62 0e c7 04 8b 42 d7 f5 c7 8d 76 f2 99 d6 d8 25 34 bd ... d8 f5 12 fe bc 0e d3 81 4a ca 47 0c d8 00 0d 3e 1c b9 96 2b 05 ... 2f bb 95 0d f6 83 a5 2c 2b a7 7e d3 71 3b 12 29 37 a6 e5 17 09 ... 64 e2 ab 79 69 dc d9 80 b3 db 9b 45 8d a7 60 31 24 d6 dc 00 5e ... 4d 6e 04 b4 d0 c4 ba f3 27 5d b8 27 db ba 0a 6d b0 96 72 17 1f ... c0 57 b3 85 1d 7e 02 68 41 e2 97 8f bd 23 46 bb ef dd 03 76 bb ... 11 08 fe 9a cc 92 18 9f 56 50 aa 5e 85 d8 e8 c7 b6 7a c5 10 db ... a0 03 d3 d7 e1 63 50 bb 66 d4 50 13 ef d4 4c 9b 60 7c 0d 31 8c ... 4c 7d 1a 1f 5c bc 57 e2 06 11 80 4e 37 87 d7 b4 a4 b5 f0 8e d8 ... fd 70 bd ae ad e0 22 60 b1 2a b8 42 ef 69 0b 4a 3e e7 91 1e 84 ... 1b 37 4e cd 5e bb bc 2a 54 d0 47 b6 00 33 6d d7 d0 c8 8b 4b c1 ... 0e 58 ee 6c b6 56 de 72 47 fa 20 d8 e9 1d eb 84 62 86 08 cf 80 ... 61 5b 62 e9 6c 14 91 c7 ac 37 55 eb 69 01 40 5d 34 74 fe 1a c7 ... 9d 10 6a 0c ee 56 c2 57 7f c8 84 80 f9 6c b6 b8 c6 81 b7 b6 8b ... 53 c1 46 09 39 08 f3 50 88 81 75 bd fb 0b 1e 31 ad 61 e3 0b a0 ... ad fe 6d 22 3a a0 3c 07 83 b5 00 1a 57 58 7c 32 8a 9a fc fc fb ... 97 8d 1c d4 32 8f 7d 9d 60 53 0e 63 0b ef d9 6c 0c 81 6e e2 0b ... 01 00 76 8a e2 a6 df 51 fc 68 f1 72 74 0a 79 af 11 39 8e e3 be ... 12 52 49 1f a9 c6 93 47 9e 87 7f 94 ab 7c 5f 8c ad 48 02 03 e6 ... ab 7b 87 dd 71 e8 a0 72 91 13 df 17 f5 ee e8 6c e1 08 d1 d7 20 ... 07 ec 1c d1 3c 85 a6 c1 49 62 1e 77 b7 d7 8d 80 5a 30 f0 be 03 ... 0c 31 5e 54 ... """) >>> >>> server_finished = clean(""" ... 88 63 e6 bf b0 42 0a 92 7f a2 7f 34 33 6a ... 70 ae 42 6e 96 8e 3e b8 84 94 5b 96 85 6d ba 39 76 d1 ... """) >>> >>> t = TLS13(serverEncHS, tls_session=t.tls_session) >>> assert t.deciphered_len == 646 >>> assert len(t.inner.msg) == 4 >>> m = t.inner.msg >>> assert isinstance(m[0], TLSEncryptedExtensions) >>> assert len(m[0].ext) == 3 >>> assert isinstance(m[0].ext[0], TLS_Ext_SupportedGroups) >>> assert isinstance(m[0].ext[1], TLS_Ext_RecordSizeLimit) >>> assert isinstance(m[0].ext[2], TLS_Ext_ServerName) >>> assert isinstance(m[1], TLS13Certificate) >>> assert isinstance(m[2], TLSCertificateVerify) >>> assert isinstance(m[3], TLSFinished) >>> assert m[3].vdata == server_finished ###(037)=[passed] Decrypt a TLS 1.3 session with a retry - Client handshake traffic key calculation >>> client_hs_traffic_key = clean(""" ... 2f 1f 91 86 63 d5 90 e7 42 11 49 a2 9d ... 94 b0 b6 ... """) >>> client_hs_traffic_iv = clean(""" ... 41 4d 54 85 23 5e 1a 68 87 93 bd 74 ... """) >>> >>> assert t.tls_session.pwcs.cipher.key == client_hs_traffic_key >>> assert t.tls_session.pwcs.cipher.fixed_iv == client_hs_traffic_iv ###(038)=[passed] Decrypt a TLS 1.3 session with a retry - Decrypt and parse client finished >>> clientFinished = clean(""" ... 23 f5 2f db 07 09 a5 5b d7 f7 9b 99 1f 25 ... 48 40 87 bc fd 4d 43 80 b1 23 26 a5 2a 28 b2 e3 68 e1 ... """) >>> >>> clientEncHS = clean(""" ... 17 03 03 00 35 d7 4f 19 23 c6 62 fd ... 34 13 7c 6f 50 2f 3d d2 b9 3d 95 1d 1b 3b c9 7e 42 af e2 3c 31 ... ab ea 92 fe 91 b4 74 99 9e 85 e3 b7 91 ce 25 2f e8 c3 e9 f9 39 ... a4 12 0c b2 ... """) >>> >>> t = TLS13(clientEncHS, tls_session=t.tls_session.mirror()) >>> assert t.deciphered_len == 37 >>> assert len(t.inner.msg) == 1 >>> assert isinstance(t.inner.msg[0], TLSFinished) >>> assert t.inner.msg[0].vdata == clientFinished >>> assert t.inner.type == 22 ###(039)=[passed] Decrypt a TLS 1.3 session with a retry - Application traffic secret derivation >>> master_secret = clean(""" ... 11 31 54 5d 0b af 79 dd ce 9b 87 f0 69 45 78 ... 1a 57 dd 18 ef 37 8d cd 20 60 f8 f9 a5 69 02 7e d8 ... """) >>> >>> client_application_traffic_secret_0 = clean(""" ... 75 ec f4 b9 72 52 5a a0 dc d0 57 c9 94 4d ... 4c d5 d8 26 71 d8 84 31 41 d7 dc 2a 4f f1 5a 21 dc 51 ... """) >>> >>> server_application_traffic_secret_0 = clean(""" ... 5c 74 f8 7d f0 42 25 db 0f 82 09 c9 de 64 ... 29 e4 94 35 fd ef a7 ca d6 18 64 87 4d 12 f3 1c fc 8d ... """) >>> >>> exporter_master_secret = clean(""" ... 7c 06 d3 ae 10 6a 3a 37 4a ce 48 37 b3 98 ... 5c ac 67 78 0a 6e 2c 5c 04 b5 83 19 d5 84 df 09 d2 23 ... """) >>> >>> resumption_master_secret = clean(""" ... 09 17 0c 6d 47 27 21 56 6f 9c f9 9b 08 69 ... 9d af f5 61 ec 8f b2 2d 5a 32 c3 f9 4c e0 09 b6 99 75 ... """) >>> >>> >>> assert t.tls_session.tls13_master_secret is not None >>> assert t.tls_session.tls13_master_secret == master_secret >>> >>> assert len(t.tls_session.tls13_derived_secrets) == 9 >>> assert 'client_traffic_secrets' in t.tls_session.tls13_derived_secrets >>> assert len(t.tls_session.tls13_derived_secrets['client_traffic_secrets']) == 1 >>> assert t.tls_session.tls13_derived_secrets['client_traffic_secrets'][0] == client_application_traffic_secret_0 >>> >>> assert 'server_traffic_secrets' in t.tls_session.tls13_derived_secrets >>> assert len(t.tls_session.tls13_derived_secrets['server_traffic_secrets']) == 1 >>> assert t.tls_session.tls13_derived_secrets['server_traffic_secrets'][0] == server_application_traffic_secret_0 >>> >>> assert 'exporter_secret' in t.tls_session.tls13_derived_secrets >>> assert t.tls_session.tls13_derived_secrets['exporter_secret'] == exporter_master_secret >>> >>> assert 'resumption_secret' in t.tls_session.tls13_derived_secrets >>> assert t.tls_session.tls13_derived_secrets['resumption_secret'] == resumption_master_secret ###(040)=[passed] Decrypt a TLS 1.3 session with a retry - Application traffic keys calculation >>> client_ap_traffic_key = clean(""" ... a7 eb 2a 05 25 eb 43 31 d5 8f cb f9 f7 ... ca 2e 9c ... """) >>> >>> client_ap_traffic_iv = clean(""" ... 86 e8 be 22 7c 1b d2 b3 e3 9c b4 44 ... """) >>> >>> server_ap_traffic_key = clean(""" ... f2 7a 5d 97 bd 25 55 0c 48 23 b0 f3 e5 ... d2 93 88 ... """) >>> >>> server_ap_traffic_iv = clean(""" ... 0d d6 31 f7 b7 1c bb c7 97 c3 5f e7 ... """) >>> >>> assert t.tls_session.rcs.cipher.key == client_ap_traffic_key >>> assert t.tls_session.rcs.cipher.fixed_iv == client_ap_traffic_iv >>> assert t.tls_session.wcs.cipher.key == server_ap_traffic_key >>> assert t.tls_session.wcs.cipher.fixed_iv == server_ap_traffic_iv ###(041)=[passed] Decrypt a TLS 1.3 session with a retry - Decrypt and parse client Alert >>> clientEncAlert = clean(""" ... 17 03 03 00 13 2e a6 cd f7 49 19 60 ... 23 e2 b3 a4 94 91 69 55 36 42 60 47 ... """) >>> >>> t = TLS13(clientEncAlert, tls_session = t.tls_session) >>> assert t.deciphered_len == 3 >>> assert len(t.inner.msg) == 1 >>> assert t.inner.type == 21 >>> m = t.inner.msg[0] >>> assert isinstance(m, TLSAlert) >>> assert m.level == 1 >>> assert m.descr == 0 ###(042)=[passed] Decrypt a TLS 1.3 session with a retry - Decrypt and parse server Alert >>> serverEncAlert = clean(""" ... 17 03 03 00 13 51 9f c5 07 5c b0 88 ... 43 49 75 9f f9 ef 6f 01 1b b4 c6 f2 ... """) >>> >>> t = TLS13(serverEncAlert, tls_session = t.tls_session.mirror()) >>> assert t.deciphered_len == 3 >>> assert len(t.inner.msg) == 1 >>> assert t.inner.type == 21 >>> m = t.inner.msg[0] >>> assert isinstance(m, TLSAlert) >>> assert m.level == 1 >>> assert m.descr == 0 ###(043)=[passed] TLS_Ext_EncryptedServerName(), dissect >>> from scapy.layers.tls.extensions import TLS_Ext_EncryptedServerName >>> >>> clientHello3 = clean(""" ... 16030102c4010002c003034b1 40e7d15fc8db422cec056fbaf 0285d306df4eedad1bc6ea57d 5114e6bd52a20a5b9c7445955 e296b886469c974648cda0a68 ... 5d3c06d884e388f6475c32e03 2d0024130113031302c02bc02 fcca9cca8c02cc030c00ac009 c013c01400330039002f00350 00a0100025300170000ff0100 ... 0100000a000e000c001d00170 018001901000101000b000201 00002300000010000b0009086 87474702f312e310005000501 000000000033006b0069001d0 ... 02037adee0aacc37b08d47222 caf6a5097a800fcf8406ae118 38f6348294d2dde1200170041 048b127c905d6d487a40b8b19 c99c56aa1a8c208218c178dae ... 02568547b2ce8f538a530b858 a7a2f608d66e148baa5693d03 c519b45017c63f48c5a4c1238 707bc002b0009080304030303 020301000d001800160403050 ... 3060308040805080604010501 060102030201002d00020101f fce016e1301001d0020912e86 b776ee552a6bb1e2c70d7b467 770b190432237cc743a93091d ... ce24623500208bc16fdcbbc7c 8756808c94f70464d68297975 f33be90e1a200633f5eb2d4c6 101249e073bff833782e57e88 2519a53ef8bde4c94a7878a2f ... 8461aec57802440007c7b2dab 986d9bc79257ce00ca6a998b1 fadb0114161069d364ccebae8 dab6c88151f297daeaecfd2e1 a598a486e2efc9561298f8dd5 ... f35d184f0e87768777d253e68 952b730a24b342fde10df4f8e 82afdc2f10c2481634d92015d 9d5e6a9566494735d9c079115 bdeb0cd019098d1cf847c53ef ... 4aac41560cacdc7ce166399df 5b0c0af91d5be3f7d8224755a aa6046de52875f9ef9ac15372 7ce08019bc2648beb4b1418cb 4979ff7eaeedaec2b15695508 ... 4d5a480cb939fdc7f00e6cc6f c0f9675276a9d607686c4d779 d4bb7544fb60c7f3079afbc74 61ed67fd55a78c44d6f8d4eaf 386acc17dea11e37a09f63da3 ... d059243b35f449e891255ac7b 4f631509d7060f001c0002400 1 ... """) >>> t = TLS(clientHello3) >>> clientESNI = t.msg[0].ext[11] >>> assert isinstance(clientESNI, TLS_Ext_EncryptedServerName) and clientESNI.cipher == 4865 ###(044)=[passed] TLS_Ext_EncryptedServerName(), basic instantiation >>> esni = TLS_Ext_EncryptedServerName(key_exchange_group=29,encrypted_sni=clean(""" ... ffce016e1301001d00209 12e86b776ee552a6bb1e2 c70d7b467770b19043223 7cc743a93091dce246235 ... 00208bc16fdcbbc7c8756 808c94f70464d68297975 f33be90e1a200633f5eb2 d4c6101249e073bff8337 ... 82e57e882519a53ef8bde 4c94a7878a2f8461aec57 802440007c7b2dab986d9 bc79257ce00ca6a998b1f ... adb0114161069d364cceb ae8dab6c88151f297daea ecfd2e1a598a486e2efc9 561298f8dd5f35d184f0e ... 87768777d253e68952b73 0a24b342fde10df4f8e82 afdc2f10c2481634d9201 5d9d5e6a9566494735d9c ... 079115bdeb0cd019098d1 cf847c53ef4aac41560ca cdc7ce166399df5b0c0af 91d5be3f7d8224755aaa6 ... 046de52875f9ef9ac1537 27ce08019bc2648beb4b1 418cb4979ff7eaeedaec2 b156955084d5a480cb939 ... fdc7f00e6cc6fc0f96752 76a9d607686c4d779d4bb 7544fb60c7f3079afbc74 61ed67fd55a78c44d6f8d ... 4eaf386acc17dea11e37a 09f63da3d059243b35f44 9e891255ac7b4f631509d 7060f ... """)) >>> assert esni.key_exchange_group == 29 and esni.encrypted_sni==clean(""" ... ffce016e1301001d00209 12e86b776ee552a6bb1e2 c70d7b467770b19043223 7cc743a93091dce246235 ... 00208bc16fdcbbc7c8756 808c94f70464d68297975 f33be90e1a200633f5eb2 d4c6101249e073bff8337 ... 82e57e882519a53ef8bde 4c94a7878a2f8461aec57 802440007c7b2dab986d9 bc79257ce00ca6a998b1f ... adb0114161069d364cceb ae8dab6c88151f297daea ecfd2e1a598a486e2efc9 561298f8dd5f35d184f0e ... 87768777d253e68952b73 0a24b342fde10df4f8e82 afdc2f10c2481634d9201 5d9d5e6a9566494735d9c ... 079115bdeb0cd019098d1 cf847c53ef4aac41560ca cdc7ce166399df5b0c0af 91d5be3f7d8224755aaa6 ... 046de52875f9ef9ac1537 27ce08019bc2648beb4b1 418cb4979ff7eaeedaec2 b156955084d5a480cb939 ... fdc7f00e6cc6fc0f96752 76a9d607686c4d779d4bb 7544fb60c7f3079afbc74 61ed67fd55a78c44d6f8d ... 4eaf386acc17dea11e37a 09f63da3d059243b35f44 9e891255ac7b4f631509d 7060f ... """) ###(045)=[passed] Create TLS_Ext_KeyShare_CH: compute several algorithms >>> from scapy.layers.tls.keyexchange_tls13 import TLS_Ext_KeyShare_CH, KeyShareEntry >>> >>> ch = TLS_Ext_KeyShare_CH(client_shares=[KeyShareEntry(group="x25519")]) >>> ch = TLS_Ext_KeyShare_CH(bytes(ch)) >>> >>> assert ch.len == 38 >>> assert ch.client_shares[0].kxlen == 32 >>> assert len(ch.client_shares[0].key_exchange) == 32 >>> >>> ch = TLS_Ext_KeyShare_CH(client_shares=[KeyShareEntry(group="ffdhe2048")]) >>> ch = TLS_Ext_KeyShare_CH(bytes(ch)) >>> >>> assert ch.len == 262 >>> assert ch.client_shares[0].kxlen == 256 >>> assert len(ch.client_shares[0].key_exchange) == 256 >>> >>> ch = TLS_Ext_KeyShare_CH(client_shares=[KeyShareEntry(group="secp384r1")]) >>> ch = TLS_Ext_KeyShare_CH(bytes(ch)) >>> >>> assert ch.len == 103 >>> assert ch.client_shares[0].kxlen == 97 >>> assert len(ch.client_shares[0].key_exchange) == 97 ###(046)=[passed] Parse TLS 1.3 Client Hello with non-rfc 5077 ticket >>> from scapy.layers.tls.keyexchange_tls13 import TLS_Ext_PreSharedKey_CH >>> >>> ch = TLS(b'\x16\x03\x01\x01\x1a\x01\x00\x01\x16\x03\x03\xec\x9c>\xb2\x9e|B\x05\x17f\x86\xc8\x18\x0421\x87\x87\x12\xf6\xec\xa2J\x95\x84[\xf8\xab\xe9gK> \xc6%\xff&wn)\xb2\xf5\xe8_x\x96\xe9\nEsK\xda\x86o\x82f\xa5\xbadk\xf4Ar~}\x00\x08\x13\x02\x13\x03\x13\x01\x00\xff\x01\x00\x00\xc5\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x00\x16\x00\x14\x00\x1d\x00\x17\x00\x1e\x00\x19\x00\x18\x01\x00\x01\x01\x01\x02\x01\x03\x01\x04\x00#\x00\x00\x00\x16\x00\x00\x00\x17\x00\x00\x00\r\x00\x1e\x00\x1c\x04\x03\x05\x03\x06\x03\x08\x07\x08\x08\x08\t\x08\n\x08\x0b\x08\x04\x08\x05\x08\x06\x04\x01\x05\x01\x06\x01\x00+\x00\x03\x02\x03\x04\x00-\x00\x02\x01\x01\x003\x00&\x00$\x00\x1d\x00 l\x19\xe1f1 )6\xbf\x91\x9e\xab\xd2\x06\x16\x0b|\x88\xf7,\xf1\x88\x99Z\xb6\xb3\x93\xe4\x08z\x8a\t\x00)\x00:\x00\x15\x00\x0fClient_identity\x00\x00\x00\x00\x00! m\xf3^\xc1l\xac5\xf2\xe3=\xeb\xe3\x81\xd3\xb3\xdd\xbd\xbd\x01\xc9\xdd\x01i\x8c1\xa0ye\xcd\x04\x9e\x9c') >>> >>> assert isinstance(ch.msg[0].ext[9], TLS_Ext_PreSharedKey_CH) >>> assert ch.msg[0].ext[9].identities[0].identity.load == b'Client_identity' >>> assert ch.msg[0].ext[9].identities[0].obfuscated_ticket_age == 0 TLS session establishment tests ━ Run at 01:42:36 from [test/scapy/layers/tls/tlsclientserver.uts] by UTscapy in 4.431796550750732 └ Passed=23 └ Failed=0 ###### ## Common util functions ###### ###(000)=[passed] Load server util functions >>> import sys, os, re, time, subprocess >>> from queue import Queue >>> import threading >>> >>> from ast import literal_eval >>> import os >>> import sys >>> from contextlib import contextmanager >>> from scapy.autorun import StringWriter >>> >>> from scapy.config import conf >>> from scapy.layers.tls.automaton_srv import TLSServerAutomaton >>> >>> conf.verb = 4 >>> conf.debug_tls = True >>> conf.debug_dissector = 2 >>> load_layer("tls") >>> >>> @contextmanager ... def captured_output(): ... old_out, old_err = sys.stdout, sys.stderr ... new_out, new_err = StringWriter(debug=old_out), StringWriter(debug=old_out) ... try: ... sys.stdout, sys.stderr = new_out, new_err ... yield sys.stdout, sys.stderr ... finally: ... sys.stdout, sys.stderr = old_out, old_err ... >>> def check_output_for_data(out, err, expected_data): ... errored = err.s.strip() ... if errored: ... return (False, errored) ... output = out.s.strip() ... if expected_data: ... expected_data = plain_str(expected_data) ... print("Testing for output: '%s'" % expected_data) ... p = re.compile(r"> Received: b?'([^']*)'") ... for s in p.finditer(output): ... if s: ... data = s.group(1) ... print("Found: %s" % data) ... if expected_data in data: ... return (True, data) ... return (False, output) ... else: ... return (False, None) ... >>> >>> def run_tls_test_server(expected_data, q, curve=None, cookie=False, client_auth=False, ... psk=None, handle_session_ticket=False, sigalgo="rsa"): ... correct = False ... print("Server started !") ... with captured_output() as (out, err): ... # Prepare automaton ... if sigalgo == "rsa": ... mycert = scapy_path("/test/scapy/layers/tls/pki/srv_cert.pem") ... mykey = scapy_path("/test/scapy/layers/tls/pki/srv_key.pem") ... elif sigalgo == "ed25519": ... mycert = scapy_path("/test/scapy/layers/tls/pki/srv_cert_ed25519.pem") ... mykey = scapy_path("/test/scapy/layers/tls/pki/srv_key_ed25519.pem") ... else: ... raise ValueError ... print(mykey) ... print(mycert) ... assert os.path.exists(mycert) ... assert os.path.exists(mykey) ... kwargs = dict() ... if psk: ... kwargs["psk"] = psk ... kwargs["psk_mode"] = "psk_dhe_ke" ... t = TLSServerAutomaton(mycert=mycert, ... mykey=mykey, ... curve=curve, ... cookie=cookie, ... client_auth=client_auth, ... handle_session_ticket=handle_session_ticket, ... debug=4, ... **kwargs) ... # Sync threads ... q.put(t) ... # Run server automaton ... t.run() ... # Return correct answer ... res = check_output_for_data(out, err, expected_data) ... # Return data ... q.put(res) ... >>> >>> def wait_tls_test_server_online(): ... t = time.time() ... while True: ... if time.time() - t > 1: ... raise RuntimeError("Server socket failed to start in time") ... try: ... s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ... s.settimeout(1) ... s.connect(("127.0.0.1", 4433)) ... s.shutdown(socket.SHUT_RDWR) ... s.close() ... return ... except IOError: ... try: ... s.close() ... except: ... pass ... continue ... >>> >>> def run_openssl_client(msg, suite="", version="", tls13=False, client_auth=False, ... psk=None, sess_out=None): ... # Run client ... CA_f = scapy_path("/test/scapy/layers/tls/pki/ca_cert.pem") ... mycert = scapy_path("/test/scapy/layers/tls/pki/cli_cert.pem") ... mykey = scapy_path("/test/scapy/layers/tls/pki/cli_key.pem") ... args = [ ... "openssl", "s_client", ... "-connect", "127.0.0.1:4433", "-debug", ... "-ciphersuites" if tls13 else "-cipher", suite, ... version, ... "-CAfile", CA_f ... ] ... if client_auth: ... args.extend(["-cert", mycert, "-key", mykey]) ... if psk: ... args.extend(["-psk", str(psk)]) ... if sess_out: ... args.extend(["-sess_out", sess_out]) ... p = subprocess.Popen( ... " ".join(args), ... shell=True, ... stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ... ) ... msg += b"\nstop_server\n" ... out = p.communicate(input=msg)[0] ... print(plain_str(out)) ... if p.returncode != 0: ... raise RuntimeError("OpenSSL returned with error code %s" % p.returncode) ... else: ... p = re.compile(br'verify return:(\d+)') ... _failed = False ... _one_success = False ... for match in p.finditer(out): ... if match.group(1).strip() != b"1": ... _failed = True ... break ... else: ... _one_success = True ... break ... if _failed or not _one_success: ... raise RuntimeError("OpenSSL returned unexpected values") ... >>> def test_tls_server(suite="", version="", tls13=False, client_auth=False, psk=None, curve=None, sigalgo="rsa"): ... msg = ("TestS_%s_data" % suite).encode() ... # Run server ... q_ = Queue() ... th_ = threading.Thread(target=run_tls_test_server, args=(msg, q_), ... kwargs={"curve": curve, "cookie": False, "client_auth": client_auth, ... "psk": psk, "sigalgo": sigalgo}, ... name="test_tls_server %s %s" % (suite, version), daemon=True) ... th_.start() ... # Synchronise threads ... print("Synchronising...") ... atmtsrv = q_.get(timeout=5) ... if not atmtsrv: ... raise RuntimeError("Server hanged on startup") ... wait_tls_test_server_online() ... print("Thread synchronised") ... # Run openssl client ... run_openssl_client(msg, suite=suite, version=version, tls13=tls13, client_auth=client_auth, psk=psk) ... # Wait for server ... ret = q_.get(timeout=5) ... if not ret: ... raise RuntimeError("Test timed out") ... atmtsrv.stop() ... print(ret) ... assert ret[0] ... ###### ## TLS client automaton tests ###### ###(010)=[passed] Load client utils functions >>> import sys, os, time, threading >>> >>> from scapy.layers.tls.automaton_cli import TLSClientAutomaton >>> from scapy.layers.tls.handshake import TLSClientHello, TLS13ClientHello >>> >>> from queue import Queue >>> >>> send_data = cipher_suite_code = version = None >>> >>> def run_tls_test_client(send_data=None, cipher_suite_code=None, version=None, ... client_auth=False, key_update=False, stop_server=True, ... session_ticket_file_out=None, session_ticket_file_in=None): ... print("Loading client...") ... mycert = scapy_path("/test/scapy/layers/tls/pki/cli_cert.pem") if client_auth else None ... mykey = scapy_path("/test/scapy/layers/tls/pki/cli_key.pem") if client_auth else None ... commands = [send_data] ... if key_update: ... commands.append(b"key_update") ... if stop_server: ... commands.append(b"stop_server") ... if session_ticket_file_out: ... commands.append(b"wait") ... commands.append(b"quit") ... if version == "0002": ... t = TLSClientAutomaton(data=commands, version="sslv2", debug=4, mycert=mycert, mykey=mykey, ... session_ticket_file_in=session_ticket_file_in, ... session_ticket_file_out=session_ticket_file_out) ... elif version == "0304": ... ch = TLS13ClientHello(ciphers=int(cipher_suite_code, 16)) ... t = TLSClientAutomaton(client_hello=ch, data=commands, version="tls13", debug=4, mycert=mycert, mykey=mykey, ... session_ticket_file_in=session_ticket_file_in, ... session_ticket_file_out=session_ticket_file_out) ... else: ... ch = TLSClientHello(version=int(version, 16), ciphers=int(cipher_suite_code, 16)) ... t = TLSClientAutomaton(client_hello=ch, data=commands, debug=4, mycert=mycert, mykey=mykey, ... session_ticket_file_in=session_ticket_file_in, ... session_ticket_file_out=session_ticket_file_out) ... print("Running client...") ... t.run() ... >>> def test_tls_client(suite, version, curve=None, cookie=False, client_auth=False, ... key_update=False, sess_in_out=False, sigalgo="rsa"): ... msg = ("TestC_%s_data" % suite).encode() ... # Run server ... q_ = Queue() ... print("Starting server...") ... th_ = threading.Thread(target=run_tls_test_server, args=(msg, q_), ... kwargs={"curve": None, "cookie": False, "client_auth": client_auth, ... "handle_session_ticket": sess_in_out, "sigalgo": sigalgo}, ... name="test_tls_client %s %s" % (suite, version), daemon=True) ... th_.start() ... # Synchronise threads ... print("Synchronising...") ... atmtsrv = q_.get(timeout=5) ... if not atmtsrv: ... raise RuntimeError("Server hanged on startup") ... wait_tls_test_server_online() ... print("Thread synchronised") ... # Run client ... if sess_in_out: ... file_sess = scapy_path("/test/session") ... run_tls_test_client(msg, suite, version, client_auth, key_update, session_ticket_file_out=file_sess, ... stop_server=False) ... run_tls_test_client(msg, suite, version, client_auth, key_update, session_ticket_file_in=file_sess, ... stop_server=True) ... else: ... run_tls_test_client(msg, suite, version, client_auth, key_update) ... # Wait for server ... print("Client running, waiting...") ... ret = q_.get(timeout=5) ... if not ret: ... raise RuntimeError("Test timed out") ... atmtsrv.stop() ... print(ret) ... assert ret[0] ... ###(011)=[passed] Testing TLS server and client with SSLv2 and SSL_CK_DES_192_EDE3_CBC_WITH_MD5 >>> test_tls_client("0700c0", "0002") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735793721600] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... > Accepted connection from 127.0.0.1:51406 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] Starting control thread [tid=140735802175744] Running client... switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [SSLv2_PREPARE_CLIENTHELLO] ## state=[SSLv2_PREPARE_CLIENTHELLO] Condition [sslv2_should_add_ClientHello] taken to state [SSLv2_ADDED_CLIENTHELLO] switching from [SSLv2_PREPARE_CLIENTHELLO] to [SSLv2_ADDED_CLIENTHELLO] ## state=[SSLv2_ADDED_CLIENTHELLO] > Accepted connection from 127.0.0.1:51420 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] not taken Condition [should_handle_ClientHello] not taken Condition [sslv2_should_handle_ClientHello] taken to state [SSLv2_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [SSLv2_HANDLED_CLIENTHELLO] ## state=[SSLv2_HANDLED_CLIENTHELLO] Condition [sslv2_should_add_ServerHello] taken to state [SSLv2_ADDED_SERVERHELLO] switching from [SSLv2_HANDLED_CLIENTHELLO] to [SSLv2_ADDED_SERVERHELLO] ## state=[SSLv2_ADDED_SERVERHELLO] Condition [sslv2_should_send_ServerHello] taken to state [SSLv2_SENT_SERVERHELLO] switching from [SSLv2_ADDED_SERVERHELLO] to [SSLv2_SENT_SERVERHELLO] ## state=[SSLv2_SENT_SERVERHELLO] switching from [SSLv2_SENT_SERVERHELLO] to [SSLv2_WAITING_CLIENTMASTERKEY] ## state=[SSLv2_WAITING_CLIENTMASTERKEY] Condition [sslv2_should_send_ClientHello] taken to state [SSLv2_SENT_CLIENTHELLO] switching from [SSLv2_ADDED_CLIENTHELLO] to [SSLv2_SENT_CLIENTHELLO] ## state=[SSLv2_SENT_CLIENTHELLO] switching from [SSLv2_SENT_CLIENTHELLO] to [SSLv2_WAITING_SERVERHELLO] ## state=[SSLv2_WAITING_SERVERHELLO] switching from [SSLv2_WAITING_SERVERHELLO] to [SSLv2_RECEIVED_SERVERHELLO] ## state=[SSLv2_RECEIVED_SERVERHELLO] Condition [sslv2_should_handle_ServerHello] taken to state [SSLv2_HANDLED_SERVERHELLO] switching from [SSLv2_RECEIVED_SERVERHELLO] to [SSLv2_HANDLED_SERVERHELLO] ## state=[SSLv2_HANDLED_SERVERHELLO] Condition [sslv2_should_add_ClientMasterKey] taken to state [SSLv2_ADDED_CLIENTMASTERKEY] switching from [SSLv2_HANDLED_SERVERHELLO] to [SSLv2_ADDED_CLIENTMASTERKEY] ## state=[SSLv2_ADDED_CLIENTMASTERKEY] TLS: master secret: 1e84a3605483a3a2f3b19db205f1580430399189dcdb5f78 TLS: key material: 93a32354c3b2884a33769978de6c7ade0b168b28c6b09851a5b2869f296b3378e091c2a1368dbd7244166ad3997979c7 TLS: client read cipher_secret: 93a32354c3b2884a33769978de6c7ade0b168b28c6b09851 TLS: client write cipher_secret: a5b2869f296b3378e091c2a1368dbd7244166ad3997979c7 Condition [sslv2_should_send_ClientMasterKey] taken to state [SSLv2_SENT_CLIENTMASTERKEY] switching from [SSLv2_ADDED_CLIENTMASTERKEY] to [SSLv2_SENT_CLIENTMASTERKEY] ## state=[SSLv2_SENT_CLIENTMASTERKEY] switching from [SSLv2_SENT_CLIENTMASTERKEY] to [SSLv2_WAITING_SERVERVERIFY] ## state=[SSLv2_WAITING_SERVERVERIFY] switching from [SSLv2_WAITING_SERVERVERIFY] to [SSLv2_RECEIVED_SERVERVERIFY] ## state=[SSLv2_RECEIVED_SERVERVERIFY] Condition [sslv2_should_handle_ServerVerify] not taken Condition [sslv2_should_add_ClientFinished_from_NoServerVerify] taken to state [SSLv2_ADDED_CLIENTFINISHED] switching from [SSLv2_RECEIVED_SERVERVERIFY] to [SSLv2_ADDED_CLIENTFINISHED] ## state=[SSLv2_ADDED_CLIENTFINISHED] Condition [sslv2_should_send_ClientFinished] taken to state [SSLv2_SENT_CLIENTFINISHED] switching from [SSLv2_ADDED_CLIENTFINISHED] to [SSLv2_SENT_CLIENTFINISHED] ## state=[SSLv2_SENT_CLIENTFINISHED] TLS: master secret: 1e84a3605483a3a2f3b19db205f1580430399189dcdb5f78 TLS: key material: 93a32354c3b2884a33769978de6c7ade0b168b28c6b09851a5b2869f296b3378e091c2a1368dbd7244166ad3997979c7 TLS: server read cipher_secret: a5b2869f296b3378e091c2a1368dbd7244166ad3997979c7 TLS: server write cipher_secret: 93a32354c3b2884a33769978de6c7ade0b168b28c6b09851 switching from [SSLv2_WAITING_CLIENTMASTERKEY] to [SSLv2_RECEIVED_CLIENTMASTERKEY] ## state=[SSLv2_RECEIVED_CLIENTMASTERKEY] Condition [sslv2_should_handle_ClientMasterKey] taken to state [SSLv2_HANDLED_CLIENTMASTERKEY] switching from [SSLv2_RECEIVED_CLIENTMASTERKEY] to [SSLv2_HANDLED_CLIENTMASTERKEY] ## state=[SSLv2_HANDLED_CLIENTMASTERKEY] switching from [SSLv2_HANDLED_CLIENTMASTERKEY] to [SSLv2_RECEIVED_CLIENTFINISHED] ## state=[SSLv2_RECEIVED_CLIENTFINISHED] Condition [sslv2_should_handle_ClientFinished] taken to state [SSLv2_HANDLED_CLIENTFINISHED] switching from [SSLv2_RECEIVED_CLIENTFINISHED] to [SSLv2_HANDLED_CLIENTFINISHED] ## state=[SSLv2_HANDLED_CLIENTFINISHED] Condition [sslv2_should_add_ServerVerify_from_ClientFinished] taken to state [SSLv2_ADDED_SERVERVERIFY] switching from [SSLv2_HANDLED_CLIENTFINISHED] to [SSLv2_ADDED_SERVERVERIFY] ## state=[SSLv2_ADDED_SERVERVERIFY] Condition [sslv2_should_send_ServerVerify] taken to state [SSLv2_SENT_SERVERVERIFY] switching from [SSLv2_ADDED_SERVERVERIFY] to [SSLv2_SENT_SERVERVERIFY] ## state=[SSLv2_SENT_SERVERVERIFY] switching from [SSLv2_SENT_SERVERVERIFY] to [SSLv2_HANDLED_CLIENTFINISHED] ## state=[SSLv2_HANDLED_CLIENTFINISHED] Condition [sslv2_should_add_ServerVerify_from_ClientFinished] not taken Condition [sslv2_should_add_RequestCertificate] not taken Condition [sslv2_should_add_ServerFinished] taken to state [SSLv2_ADDED_SERVERFINISHED] switching from [SSLv2_HANDLED_CLIENTFINISHED] to [SSLv2_ADDED_SERVERFINISHED] ## state=[SSLv2_ADDED_SERVERFINISHED] Condition [sslv2_should_send_ServerFinished] taken to state [SSLv2_SENT_SERVERFINISHED] switching from [SSLv2_ADDED_SERVERFINISHED] to [SSLv2_SENT_SERVERFINISHED] ## state=[SSLv2_SENT_SERVERFINISHED] > SSLv2 handshake completed! > Version : SSLv2 > Cipher suite : SSL_CK_DES_192_EDE3_CBC_WITH_MD5 > Server temp key : None > Master secret : 1e84a3605483a3a2f3b19db205f1580430399189dcdb5f78 > > Will now act as a simple echo server. switching from [SSLv2_SENT_SERVERFINISHED] to [SSLv2_WAITING_CLIENTDATA] ## state=[SSLv2_WAITING_CLIENTDATA] switching from [SSLv2_SENT_CLIENTFINISHED] to [SSLv2_RECEIVED_SERVERVERIFY] ## state=[SSLv2_RECEIVED_SERVERVERIFY] Condition [sslv2_should_handle_ServerVerify] taken to state [SSLv2_HANDLED_SERVERVERIFY] switching from [SSLv2_RECEIVED_SERVERVERIFY] to [SSLv2_HANDLED_SERVERVERIFY] ## state=[SSLv2_HANDLED_SERVERVERIFY] Condition [sslv2_should_add_ClientFinished_from_ServerVerify] not taken Condition [sslv2_should_wait_ServerFinished_from_ServerVerify] taken to state [SSLv2_WAITING_SERVERFINISHED] switching from [SSLv2_HANDLED_SERVERVERIFY] to [SSLv2_WAITING_SERVERFINISHED] ## state=[SSLv2_WAITING_SERVERFINISHED] switching from [SSLv2_WAITING_SERVERFINISHED] to [SSLv2_RECEIVED_SERVERFINISHED] ## state=[SSLv2_RECEIVED_SERVERFINISHED] Condition [sslv2_should_handle_ServerFinished] taken to state [SSLv2_HANDLED_SERVERFINISHED] switching from [SSLv2_RECEIVED_SERVERFINISHED] to [SSLv2_HANDLED_SERVERFINISHED] ## state=[SSLv2_HANDLED_SERVERFINISHED] > SSLv2 handshake completed! > Version : SSLv2 > Cipher suite : SSL_CK_DES_192_EDE3_CBC_WITH_MD5 > Server temp key : None > Master secret : 1e84a3605483a3a2f3b19db205f1580430399189dcdb5f78 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > > You may send data or use 'quit'. Condition [sslv2_should_wait_ClientData] taken to state [SSLv2_WAITING_CLIENTDATA] switching from [SSLv2_HANDLED_SERVERFINISHED] to [SSLv2_WAITING_CLIENTDATA] ## state=[SSLv2_WAITING_CLIENTDATA] > Read from list: b'TestC_0700c0_data' Condition [sslv2_add_ClientData] taken to state [SSLv2_ADDED_CLIENTDATA] switching from [SSLv2_WAITING_CLIENTDATA] to [SSLv2_ADDED_CLIENTDATA] ## state=[SSLv2_ADDED_CLIENTDATA] Condition [sslv2_should_send_ClientData] taken to state [SSLv2_SENT_CLIENTDATA] switching from [SSLv2_ADDED_CLIENTDATA] to [SSLv2_SENT_CLIENTDATA] ## state=[SSLv2_SENT_CLIENTDATA] switching from [SSLv2_SENT_CLIENTDATA] to [SSLv2_WAITING_SERVERDATA] ## state=[SSLv2_WAITING_SERVERDATA] switching from [SSLv2_WAITING_CLIENTDATA] to [SSLv2_RECEIVED_CLIENTDATA] ## state=[SSLv2_RECEIVED_CLIENTDATA] > Received: b'TestC_0700c0_data' Condition [sslv2_should_handle_ClientData] taken to state [SSLv2_ADDED_SERVERDATA] switching from [SSLv2_RECEIVED_CLIENTDATA] to [SSLv2_ADDED_SERVERDATA] ## state=[SSLv2_ADDED_SERVERDATA] Condition [sslv2_should_send_ServerData] taken to state [SSLv2_SENT_SERVERDATA] switching from [SSLv2_ADDED_SERVERDATA] to [SSLv2_SENT_SERVERDATA] ## state=[SSLv2_SENT_SERVERDATA] switching from [SSLv2_SENT_SERVERDATA] to [SSLv2_WAITING_CLIENTDATA] ## state=[SSLv2_WAITING_CLIENTDATA] switching from [SSLv2_WAITING_SERVERDATA] to [SSLv2_RECEIVED_SERVERDATA] ## state=[SSLv2_RECEIVED_SERVERDATA] > Received: b'TestC_0700c0_data' Condition [sslv2_should_handle_ServerData] taken to state [SSLv2_HANDLED_SERVERDATA] switching from [SSLv2_RECEIVED_SERVERDATA] to [SSLv2_HANDLED_SERVERDATA] ## state=[SSLv2_HANDLED_SERVERDATA] switching from [SSLv2_HANDLED_SERVERDATA] to [SSLv2_WAITING_CLIENTDATA] ## state=[SSLv2_WAITING_CLIENTDATA] > Read from list: b'stop_server' Condition [sslv2_add_ClientData] taken to state [SSLv2_ADDED_CLIENTDATA] switching from [SSLv2_WAITING_CLIENTDATA] to [SSLv2_ADDED_CLIENTDATA] ## state=[SSLv2_ADDED_CLIENTDATA] Condition [sslv2_should_send_ClientData] taken to state [SSLv2_SENT_CLIENTDATA] switching from [SSLv2_ADDED_CLIENTDATA] to [SSLv2_SENT_CLIENTDATA] ## state=[SSLv2_SENT_CLIENTDATA] switching from [SSLv2_SENT_CLIENTDATA] to [SSLv2_WAITING_SERVERDATA] ## state=[SSLv2_WAITING_SERVERDATA] switching from [SSLv2_WAITING_CLIENTDATA] to [SSLv2_RECEIVED_CLIENTDATA] ## state=[SSLv2_RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [sslv2_should_handle_ClientData] taken to state [SSLv2_CLOSE_NOTIFY_FINAL] switching from [SSLv2_RECEIVED_CLIENTDATA] to [SSLv2_CLOSE_NOTIFY_FINAL] ## state=[SSLv2_CLOSE_NOTIFY_FINAL] > > Trying to send 'goodbye' to the client... Condition [sslv2_close_session_final] taken to state [FINAL] switching from [SSLv2_CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735793721600) Testing for output: 'TestC_0700c0_data' Found: TestC_0700c0_data switching from [SSLv2_WAITING_SERVERDATA] to [SSLv2_RECEIVED_SERVERDATA] ## state=[SSLv2_RECEIVED_SERVERDATA] > Received: b'goodbye' Condition [sslv2_should_handle_ServerData] taken to state [SSLv2_CLOSE_NOTIFY] switching from [SSLv2_RECEIVED_SERVERDATA] to [SSLv2_CLOSE_NOTIFY] ## state=[SSLv2_CLOSE_NOTIFY] > > Trying to send a 'goodbye' to the server... Condition [sslv2_close_session] taken to state [FINAL] switching from [SSLv2_CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735802175744) Client running, waiting... (True, 'TestC_0700c0_data') ###(012)=[passed] Testing TLS server and client with SSLv2 and SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5 >>> test_tls_client("040080", "0002") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735974207744] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... > Accepted connection from 127.0.0.1:51428 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Starting control thread [tid=140735957299456] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [SSLv2_PREPARE_CLIENTHELLO] ## state=[SSLv2_PREPARE_CLIENTHELLO] Condition [sslv2_should_add_ClientHello] taken to state [SSLv2_ADDED_CLIENTHELLO] switching from [SSLv2_PREPARE_CLIENTHELLO] to [SSLv2_ADDED_CLIENTHELLO] ## state=[SSLv2_ADDED_CLIENTHELLO] Condition [sslv2_should_send_ClientHello] taken to state [SSLv2_SENT_CLIENTHELLO] switching from [SSLv2_ADDED_CLIENTHELLO] to [SSLv2_SENT_CLIENTHELLO] ## state=[SSLv2_SENT_CLIENTHELLO] switching from [SSLv2_SENT_CLIENTHELLO] to [SSLv2_WAITING_SERVERHELLO] ## state=[SSLv2_WAITING_SERVERHELLO] > Accepted connection from 127.0.0.1:51434 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] not taken Condition [should_handle_ClientHello] not taken Condition [sslv2_should_handle_ClientHello] taken to state [SSLv2_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [SSLv2_HANDLED_CLIENTHELLO] ## state=[SSLv2_HANDLED_CLIENTHELLO] Condition [sslv2_should_add_ServerHello] taken to state [SSLv2_ADDED_SERVERHELLO] switching from [SSLv2_HANDLED_CLIENTHELLO] to [SSLv2_ADDED_SERVERHELLO] ## state=[SSLv2_ADDED_SERVERHELLO] Condition [sslv2_should_send_ServerHello] taken to state [SSLv2_SENT_SERVERHELLO] switching from [SSLv2_ADDED_SERVERHELLO] to [SSLv2_SENT_SERVERHELLO] ## state=[SSLv2_SENT_SERVERHELLO] switching from [SSLv2_SENT_SERVERHELLO] to [SSLv2_WAITING_CLIENTMASTERKEY] ## state=[SSLv2_WAITING_CLIENTMASTERKEY] switching from [SSLv2_WAITING_SERVERHELLO] to [SSLv2_RECEIVED_SERVERHELLO] ## state=[SSLv2_RECEIVED_SERVERHELLO] Condition [sslv2_should_handle_ServerHello] taken to state [SSLv2_HANDLED_SERVERHELLO] switching from [SSLv2_RECEIVED_SERVERHELLO] to [SSLv2_HANDLED_SERVERHELLO] ## state=[SSLv2_HANDLED_SERVERHELLO] Condition [sslv2_should_add_ClientMasterKey] taken to state [SSLv2_ADDED_CLIENTMASTERKEY] switching from [SSLv2_HANDLED_SERVERHELLO] to [SSLv2_ADDED_CLIENTMASTERKEY] ## state=[SSLv2_ADDED_CLIENTMASTERKEY] TLS: master secret: e94ad55d703e6fca903e7e7ef75cea67073b45c14cde2ef0 TLS: key material: 58f610b5f4afeaabcbc02e4ce2c297b9cebc570210d43f5b93781e59d3a83a4fa79ffe3a92096aea93a9ea73776cce6a TLS: client read cipher_secret: 58f610b5f4afeaabcbc02e4ce2c297b9cebc570210d43f5b TLS: client write cipher_secret: 93781e59d3a83a4fa79ffe3a92096aea93a9ea73776cce6a Condition [sslv2_should_send_ClientMasterKey] taken to state [SSLv2_SENT_CLIENTMASTERKEY] switching from [SSLv2_ADDED_CLIENTMASTERKEY] to [SSLv2_SENT_CLIENTMASTERKEY] ## state=[SSLv2_SENT_CLIENTMASTERKEY] switching from [SSLv2_SENT_CLIENTMASTERKEY] to [SSLv2_WAITING_SERVERVERIFY] ## state=[SSLv2_WAITING_SERVERVERIFY] switching from [SSLv2_WAITING_SERVERVERIFY] to [SSLv2_RECEIVED_SERVERVERIFY] ## state=[SSLv2_RECEIVED_SERVERVERIFY] Condition [sslv2_should_handle_ServerVerify] not taken Condition [sslv2_should_add_ClientFinished_from_NoServerVerify] taken to state [SSLv2_ADDED_CLIENTFINISHED] switching from [SSLv2_RECEIVED_SERVERVERIFY] to [SSLv2_ADDED_CLIENTFINISHED] ## state=[SSLv2_ADDED_CLIENTFINISHED] Condition [sslv2_should_send_ClientFinished] taken to state [SSLv2_SENT_CLIENTFINISHED] switching from [SSLv2_ADDED_CLIENTFINISHED] to [SSLv2_SENT_CLIENTFINISHED] ## state=[SSLv2_SENT_CLIENTFINISHED] TLS: master secret: e94ad55d703e6fca903e7e7ef75cea67073b45c14cde2ef0 TLS: key material: 58f610b5f4afeaabcbc02e4ce2c297b9cebc570210d43f5b93781e59d3a83a4fa79ffe3a92096aea93a9ea73776cce6a TLS: server read cipher_secret: 93781e59d3a83a4fa79ffe3a92096aea93a9ea73776cce6a TLS: server write cipher_secret: 58f610b5f4afeaabcbc02e4ce2c297b9cebc570210d43f5b switching from [SSLv2_WAITING_CLIENTMASTERKEY] to [SSLv2_RECEIVED_CLIENTMASTERKEY] ## state=[SSLv2_RECEIVED_CLIENTMASTERKEY] Condition [sslv2_should_handle_ClientMasterKey] taken to state [SSLv2_HANDLED_CLIENTMASTERKEY] switching from [SSLv2_RECEIVED_CLIENTMASTERKEY] to [SSLv2_HANDLED_CLIENTMASTERKEY] ## state=[SSLv2_HANDLED_CLIENTMASTERKEY] switching from [SSLv2_HANDLED_CLIENTMASTERKEY] to [SSLv2_RECEIVED_CLIENTFINISHED] ## state=[SSLv2_RECEIVED_CLIENTFINISHED] Condition [sslv2_should_handle_ClientFinished] taken to state [SSLv2_HANDLED_CLIENTFINISHED] switching from [SSLv2_RECEIVED_CLIENTFINISHED] to [SSLv2_HANDLED_CLIENTFINISHED] ## state=[SSLv2_HANDLED_CLIENTFINISHED] Condition [sslv2_should_add_ServerVerify_from_ClientFinished] taken to state [SSLv2_ADDED_SERVERVERIFY] switching from [SSLv2_HANDLED_CLIENTFINISHED] to [SSLv2_ADDED_SERVERVERIFY] ## state=[SSLv2_ADDED_SERVERVERIFY] Condition [sslv2_should_send_ServerVerify] taken to state [SSLv2_SENT_SERVERVERIFY] switching from [SSLv2_ADDED_SERVERVERIFY] to [SSLv2_SENT_SERVERVERIFY] ## state=[SSLv2_SENT_SERVERVERIFY] switching from [SSLv2_SENT_SERVERVERIFY] to [SSLv2_HANDLED_CLIENTFINISHED] ## state=[SSLv2_HANDLED_CLIENTFINISHED] Condition [sslv2_should_add_ServerVerify_from_ClientFinished] not taken Condition [sslv2_should_add_RequestCertificate] not taken Condition [sslv2_should_add_ServerFinished] taken to state [SSLv2_ADDED_SERVERFINISHED] switching from [SSLv2_HANDLED_CLIENTFINISHED] to [SSLv2_ADDED_SERVERFINISHED] ## state=[SSLv2_ADDED_SERVERFINISHED] Condition [sslv2_should_send_ServerFinished] taken to state [SSLv2_SENT_SERVERFINISHED] switching from [SSLv2_ADDED_SERVERFINISHED] to [SSLv2_SENT_SERVERFINISHED] ## state=[SSLv2_SENT_SERVERFINISHED] > SSLv2 handshake completed! > Version : SSLv2 > Cipher suite : SSL_CK_DES_192_EDE3_CBC_WITH_MD5 > Server temp key : None > Master secret : e94ad55d703e6fca903e7e7ef75cea67073b45c14cde2ef0 > > Will now act as a simple echo server. switching from [SSLv2_SENT_SERVERFINISHED] to [SSLv2_WAITING_CLIENTDATA] ## state=[SSLv2_WAITING_CLIENTDATA] switching from [SSLv2_SENT_CLIENTFINISHED] to [SSLv2_RECEIVED_SERVERVERIFY] ## state=[SSLv2_RECEIVED_SERVERVERIFY] Condition [sslv2_should_handle_ServerVerify] taken to state [SSLv2_HANDLED_SERVERVERIFY] switching from [SSLv2_RECEIVED_SERVERVERIFY] to [SSLv2_HANDLED_SERVERVERIFY] ## state=[SSLv2_HANDLED_SERVERVERIFY] Condition [sslv2_should_add_ClientFinished_from_ServerVerify] not taken Condition [sslv2_should_wait_ServerFinished_from_ServerVerify] taken to state [SSLv2_WAITING_SERVERFINISHED] switching from [SSLv2_HANDLED_SERVERVERIFY] to [SSLv2_WAITING_SERVERFINISHED] ## state=[SSLv2_WAITING_SERVERFINISHED] switching from [SSLv2_WAITING_SERVERFINISHED] to [SSLv2_RECEIVED_SERVERFINISHED] ## state=[SSLv2_RECEIVED_SERVERFINISHED] Condition [sslv2_should_handle_ServerFinished] taken to state [SSLv2_HANDLED_SERVERFINISHED] switching from [SSLv2_RECEIVED_SERVERFINISHED] to [SSLv2_HANDLED_SERVERFINISHED] ## state=[SSLv2_HANDLED_SERVERFINISHED] > SSLv2 handshake completed! > Version : SSLv2 > Cipher suite : SSL_CK_DES_192_EDE3_CBC_WITH_MD5 > Server temp key : None > Master secret : e94ad55d703e6fca903e7e7ef75cea67073b45c14cde2ef0 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > > You may send data or use 'quit'. Condition [sslv2_should_wait_ClientData] taken to state [SSLv2_WAITING_CLIENTDATA] switching from [SSLv2_HANDLED_SERVERFINISHED] to [SSLv2_WAITING_CLIENTDATA] ## state=[SSLv2_WAITING_CLIENTDATA] > Read from list: b'TestC_040080_data' Condition [sslv2_add_ClientData] taken to state [SSLv2_ADDED_CLIENTDATA] switching from [SSLv2_WAITING_CLIENTDATA] to [SSLv2_ADDED_CLIENTDATA] ## state=[SSLv2_ADDED_CLIENTDATA] Condition [sslv2_should_send_ClientData] taken to state [SSLv2_SENT_CLIENTDATA] switching from [SSLv2_ADDED_CLIENTDATA] to [SSLv2_SENT_CLIENTDATA] ## state=[SSLv2_SENT_CLIENTDATA] switching from [SSLv2_SENT_CLIENTDATA] to [SSLv2_WAITING_SERVERDATA] ## state=[SSLv2_WAITING_SERVERDATA] switching from [SSLv2_WAITING_CLIENTDATA] to [SSLv2_RECEIVED_CLIENTDATA] ## state=[SSLv2_RECEIVED_CLIENTDATA] > Received: b'TestC_040080_data' Condition [sslv2_should_handle_ClientData] taken to state [SSLv2_ADDED_SERVERDATA] switching from [SSLv2_RECEIVED_CLIENTDATA] to [SSLv2_ADDED_SERVERDATA] ## state=[SSLv2_ADDED_SERVERDATA] Condition [sslv2_should_send_ServerData] taken to state [SSLv2_SENT_SERVERDATA] switching from [SSLv2_ADDED_SERVERDATA] to [SSLv2_SENT_SERVERDATA] ## state=[SSLv2_SENT_SERVERDATA] switching from [SSLv2_SENT_SERVERDATA] to [SSLv2_WAITING_CLIENTDATA] ## state=[SSLv2_WAITING_CLIENTDATA] switching from [SSLv2_WAITING_SERVERDATA] to [SSLv2_RECEIVED_SERVERDATA] ## state=[SSLv2_RECEIVED_SERVERDATA] > Received: b'TestC_040080_data' Condition [sslv2_should_handle_ServerData] taken to state [SSLv2_HANDLED_SERVERDATA] switching from [SSLv2_RECEIVED_SERVERDATA] to [SSLv2_HANDLED_SERVERDATA] ## state=[SSLv2_HANDLED_SERVERDATA] switching from [SSLv2_HANDLED_SERVERDATA] to [SSLv2_WAITING_CLIENTDATA] ## state=[SSLv2_WAITING_CLIENTDATA] > Read from list: b'stop_server' Condition [sslv2_add_ClientData] taken to state [SSLv2_ADDED_CLIENTDATA] switching from [SSLv2_WAITING_CLIENTDATA] to [SSLv2_ADDED_CLIENTDATA] ## state=[SSLv2_ADDED_CLIENTDATA] Condition [sslv2_should_send_ClientData] taken to state [SSLv2_SENT_CLIENTDATA] switching from [SSLv2_ADDED_CLIENTDATA] to [SSLv2_SENT_CLIENTDATA] ## state=[SSLv2_SENT_CLIENTDATA] switching from [SSLv2_SENT_CLIENTDATA] to [SSLv2_WAITING_SERVERDATA] ## state=[SSLv2_WAITING_SERVERDATA] switching from [SSLv2_WAITING_CLIENTDATA] to [SSLv2_RECEIVED_CLIENTDATA] ## state=[SSLv2_RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [sslv2_should_handle_ClientData] taken to state [SSLv2_CLOSE_NOTIFY_FINAL] switching from [SSLv2_RECEIVED_CLIENTDATA] to [SSLv2_CLOSE_NOTIFY_FINAL] ## state=[SSLv2_CLOSE_NOTIFY_FINAL] > > Trying to send 'goodbye' to the client... Condition [sslv2_close_session_final] taken to state [FINAL] switching from [SSLv2_CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735974207744) Testing for output: 'TestC_040080_data' Found: TestC_040080_data switching from [SSLv2_WAITING_SERVERDATA] to [SSLv2_RECEIVED_SERVERDATA] ## state=[SSLv2_RECEIVED_SERVERDATA] > Received: b'goodbye' Condition [sslv2_should_handle_ServerData] taken to state [SSLv2_CLOSE_NOTIFY] switching from [SSLv2_RECEIVED_SERVERDATA] to [SSLv2_CLOSE_NOTIFY] ## state=[SSLv2_CLOSE_NOTIFY] > > Trying to send a 'goodbye' to the server... Condition [sslv2_close_session] taken to state [FINAL] switching from [SSLv2_CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735957299456) Client running, waiting... (True, 'TestC_040080_data') ###(013)=[passed] Testing TLS client with SSLv3 and TLS_RSA_EXPORT_WITH_RC4_40_MD5 >>> test_tls_client("0003", "0300") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735770784000] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... Starting control thread [tid=140735762329856] Running client... > Accepted connection from 127.0.0.1:51438 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [PREPARE_CLIENTFLIGHT1] ## state=[PREPARE_CLIENTFLIGHT1] Condition [should_add_ClientHello] taken to state [ADDED_CLIENTHELLO] switching from [PREPARE_CLIENTFLIGHT1] to [ADDED_CLIENTHELLO] ## state=[ADDED_CLIENTHELLO] Condition [should_send_ClientFlight1] taken to state [SENT_CLIENTFLIGHT1] switching from [ADDED_CLIENTHELLO] to [SENT_CLIENTFLIGHT1] ## state=[SENT_CLIENTFLIGHT1] switching from [SENT_CLIENTFLIGHT1] to [WAITING_SERVERFLIGHT1] ## state=[WAITING_SERVERFLIGHT1] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 > Accepted connection from 127.0.0.1:51440 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] not taken Condition [should_handle_ClientHello] taken to state [HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [HANDLED_CLIENTHELLO] ## state=[HANDLED_CLIENTHELLO] switching from [HANDLED_CLIENTHELLO] to [PREPARE_SERVERFLIGHT1] ## state=[PREPARE_SERVERFLIGHT1] Condition [should_add_ServerHello] taken to state [ADDED_SERVERHELLO] switching from [PREPARE_SERVERFLIGHT1] to [ADDED_SERVERHELLO] ## state=[ADDED_SERVERHELLO] Condition [should_add_Certificate] taken to state [ADDED_CERTIFICATE] switching from [ADDED_SERVERHELLO] to [ADDED_CERTIFICATE] ## state=[ADDED_CERTIFICATE] Condition [should_add_ServerKeyExchange] taken to state [ADDED_SERVERKEYEXCHANGE] switching from [ADDED_CERTIFICATE] to [ADDED_SERVERKEYEXCHANGE] ## state=[ADDED_SERVERKEYEXCHANGE] Condition [should_add_CertificateRequest] taken to state [ADDED_CERTIFICATEREQUEST] switching from [ADDED_SERVERKEYEXCHANGE] to [ADDED_CERTIFICATEREQUEST] ## state=[ADDED_CERTIFICATEREQUEST] Condition [should_add_ServerHelloDone] taken to state [ADDED_SERVERHELLODONE] switching from [ADDED_CERTIFICATEREQUEST] to [ADDED_SERVERHELLODONE] ## state=[ADDED_SERVERHELLODONE] Condition [should_send_ServerFlight1] taken to state [WAITING_CLIENTFLIGHT2] switching from [ADDED_SERVERHELLODONE] to [WAITING_CLIENTFLIGHT2] ## state=[WAITING_CLIENTFLIGHT2] switching from [WAITING_SERVERFLIGHT1] to [RECEIVED_SERVERFLIGHT1] ## state=[RECEIVED_SERVERFLIGHT1] Condition [should_handle_ServerHello] taken to state [HANDLED_SERVERHELLO] switching from [RECEIVED_SERVERFLIGHT1] to [HANDLED_SERVERHELLO] ## state=[HANDLED_SERVERHELLO] Condition [should_handle_ServerCertificate] taken to state [HANDLED_SERVERCERTIFICATE] switching from [HANDLED_SERVERHELLO] to [HANDLED_SERVERCERTIFICATE] ## state=[HANDLED_SERVERCERTIFICATE] Condition [should_handle_ServerKeyExchange_from_ServerCertificate] taken to state [HANDLED_SERVERKEYEXCHANGE] switching from [HANDLED_SERVERCERTIFICATE] to [HANDLED_SERVERKEYEXCHANGE] ## state=[HANDLED_SERVERKEYEXCHANGE] Condition [should_handle_ServerHelloDone_from_ServerKeyExchange] taken to state [HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERKEYEXCHANGE] to [HANDLED_SERVERHELLODONE] ## state=[HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERHELLODONE] to [PREPARE_CLIENTFLIGHT2] ## state=[PREPARE_CLIENTFLIGHT2] Condition [should_add_ClientCertificate] not taken Condition [should_add_ClientKeyExchange_from_ClientFlight2] taken to state [ADDED_CLIENTKEYEXCHANGE] switching from [PREPARE_CLIENTFLIGHT2] to [ADDED_CLIENTKEYEXCHANGE] ## state=[ADDED_CLIENTKEYEXCHANGE] Condition [should_add_ClientVerify] not taken Condition [should_add_ChangeCipherSpec_from_ClientKeyExchange] taken to state [ADDED_CHANGECIPHERSPEC] switching from [ADDED_CLIENTKEYEXCHANGE] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ClientFinished] taken to state [ADDED_CLIENTFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_CLIENTFINISHED] ## state=[ADDED_CLIENTFINISHED] TLS: master secret: 210585827d416db17ea561d7f282988ecf5fa19ca080f3db9b0c493ed8f45e45983b344d70ad32dfeb23a49d70c0d235 TLS: client read mac_secret: 241057acc2b8f25c2fd22c83607463a9 TLS: client read cipher_secret: 7711b7acbca67e7b240719977de3ca57 TLS: client write mac_secret: 69eda8353e4909394e3deaabe22a84e6 TLS: client write cipher_secret: 22edecd9071b5a539d864a72eb1512da Condition [should_send_ClientFlight2] taken to state [SENT_CLIENTFLIGHT2] switching from [ADDED_CLIENTFINISHED] to [SENT_CLIENTFLIGHT2] ## state=[SENT_CLIENTFLIGHT2] switching from [SENT_CLIENTFLIGHT2] to [WAITING_SERVERFLIGHT2] ## state=[WAITING_SERVERFLIGHT2] TLS: master secret: 210585827d416db17ea561d7f282988ecf5fa19ca080f3db9b0c493ed8f45e45983b344d70ad32dfeb23a49d70c0d235 TLS: server read mac_secret: 69eda8353e4909394e3deaabe22a84e6 TLS: server read cipher_secret: 22edecd9071b5a539d864a72eb1512da TLS: server write mac_secret: 241057acc2b8f25c2fd22c83607463a9 TLS: server write cipher_secret: 7711b7acbca67e7b240719977de3ca57 switching from [WAITING_CLIENTFLIGHT2] to [RECEIVED_CLIENTFLIGHT2] ## state=[RECEIVED_CLIENTFLIGHT2] Condition [should_handle_ClientCertificate] not taken Condition [no_ClientCertificate] taken to state [HANDLED_CLIENTCERTIFICATE] switching from [RECEIVED_CLIENTFLIGHT2] to [HANDLED_CLIENTCERTIFICATE] ## state=[HANDLED_CLIENTCERTIFICATE] Condition [should_handle_ClientKeyExchange] taken to state [HANDLED_CLIENTKEYEXCHANGE] switching from [HANDLED_CLIENTCERTIFICATE] to [HANDLED_CLIENTKEYEXCHANGE] ## state=[HANDLED_CLIENTKEYEXCHANGE] Condition [should_handle_CertificateVerify] not taken Condition [no_CertificateVerify] taken to state [HANDLED_CERTIFICATEVERIFY] switching from [HANDLED_CLIENTKEYEXCHANGE] to [HANDLED_CERTIFICATEVERIFY] ## state=[HANDLED_CERTIFICATEVERIFY] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [HANDLED_CERTIFICATEVERIFY] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_ClientFinished] taken to state [HANDLED_CLIENTFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_CLIENTFINISHED] ## state=[HANDLED_CLIENTFINISHED] switching from [HANDLED_CLIENTFINISHED] to [PREPARE_SERVERFLIGHT2] ## state=[PREPARE_SERVERFLIGHT2] Condition [should_add_ChangeCipherSpec] taken to state [ADDED_CHANGECIPHERSPEC] switching from [PREPARE_SERVERFLIGHT2] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ServerFinished] taken to state [ADDED_SERVERFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_SERVERFINISHED] ## state=[ADDED_SERVERFINISHED] Condition [should_send_ServerFlight2] taken to state [SENT_SERVERFLIGHT2] switching from [ADDED_SERVERFINISHED] to [SENT_SERVERFLIGHT2] ## state=[SENT_SERVERFLIGHT2] > TLS handshake completed! > Version : SSLv3 > Cipher suite : TLS_RSA_EXPORT_WITH_RC4_40_MD5 > Server temp key : rsa64 > Master secret : 210585827d416db17ea561d7f282988ecf5fa19ca080f3db9b0c493ed8f45e45983b344d70ad32dfeb23a49d70c0d235 > > Will now act as a simple echo server. switching from [SENT_SERVERFLIGHT2] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERFLIGHT2] to [RECEIVED_SERVERFLIGHT2] ## state=[RECEIVED_SERVERFLIGHT2] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [RECEIVED_SERVERFLIGHT2] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_Finished] taken to state [HANDLED_SERVERFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_SERVERFINISHED] ## state=[HANDLED_SERVERFINISHED] > TLS handshake completed! > Version : SSLv3 > Cipher suite : TLS_RSA_EXPORT_WITH_RC4_40_MD5 > Server temp key : rsa64 > Master secret : 210585827d416db17ea561d7f282988ecf5fa19ca080f3db9b0c493ed8f45e45983b344d70ad32dfeb23a49d70c0d235 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > > You may send data or use 'quit'. Condition [should_wait_ClientData] taken to state [WAIT_CLIENTDATA] switching from [HANDLED_SERVERFINISHED] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_0003_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_0003_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735770784000) switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Testing for output: 'TestC_0003_data' Found: TestC_0003_data Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735762329856) Client running, waiting... (True, 'TestC_0003_data') ###(014)=[passed] Testing TLS client with TLS 1.0 and TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA >>> test_tls_client("0088", "0301") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735753875712] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 > Accepted connection from 127.0.0.1:51454 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... Starting control thread [tid=140735609303296] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [PREPARE_CLIENTFLIGHT1] ## state=[PREPARE_CLIENTFLIGHT1] Condition [should_add_ClientHello] taken to state [ADDED_CLIENTHELLO] switching from [PREPARE_CLIENTFLIGHT1] to [ADDED_CLIENTHELLO] ## state=[ADDED_CLIENTHELLO] > Accepted connection from 127.0.0.1:51464 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] not taken Condition [should_handle_ClientHello] taken to state [HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [HANDLED_CLIENTHELLO] ## state=[HANDLED_CLIENTHELLO] switching from [HANDLED_CLIENTHELLO] to [PREPARE_SERVERFLIGHT1] ## state=[PREPARE_SERVERFLIGHT1] Condition [should_add_ServerHello] taken to state [ADDED_SERVERHELLO] switching from [PREPARE_SERVERFLIGHT1] to [ADDED_SERVERHELLO] ## state=[ADDED_SERVERHELLO] Condition [should_add_Certificate] taken to state [ADDED_CERTIFICATE] switching from [ADDED_SERVERHELLO] to [ADDED_CERTIFICATE] ## state=[ADDED_CERTIFICATE] Condition [should_add_ServerKeyExchange] taken to state [ADDED_SERVERKEYEXCHANGE] switching from [ADDED_CERTIFICATE] to [ADDED_SERVERKEYEXCHANGE] ## state=[ADDED_SERVERKEYEXCHANGE] Condition [should_add_CertificateRequest] taken to state [ADDED_CERTIFICATEREQUEST] switching from [ADDED_SERVERKEYEXCHANGE] to [ADDED_CERTIFICATEREQUEST] ## state=[ADDED_CERTIFICATEREQUEST] Condition [should_add_ServerHelloDone] taken to state [ADDED_SERVERHELLODONE] switching from [ADDED_CERTIFICATEREQUEST] to [ADDED_SERVERHELLODONE] ## state=[ADDED_SERVERHELLODONE] Condition [should_send_ServerFlight1] taken to state [WAITING_CLIENTFLIGHT2] switching from [ADDED_SERVERHELLODONE] to [WAITING_CLIENTFLIGHT2] ## state=[WAITING_CLIENTFLIGHT2] Condition [should_send_ClientFlight1] taken to state [SENT_CLIENTFLIGHT1] switching from [ADDED_CLIENTHELLO] to [SENT_CLIENTFLIGHT1] ## state=[SENT_CLIENTFLIGHT1] switching from [SENT_CLIENTFLIGHT1] to [WAITING_SERVERFLIGHT1] ## state=[WAITING_SERVERFLIGHT1] switching from [WAITING_SERVERFLIGHT1] to [RECEIVED_SERVERFLIGHT1] ## state=[RECEIVED_SERVERFLIGHT1] Condition [should_handle_ServerHello] taken to state [HANDLED_SERVERHELLO] switching from [RECEIVED_SERVERFLIGHT1] to [HANDLED_SERVERHELLO] ## state=[HANDLED_SERVERHELLO] Condition [should_handle_ServerCertificate] taken to state [HANDLED_SERVERCERTIFICATE] switching from [HANDLED_SERVERHELLO] to [HANDLED_SERVERCERTIFICATE] ## state=[HANDLED_SERVERCERTIFICATE] Condition [should_handle_ServerKeyExchange_from_ServerCertificate] taken to state [HANDLED_SERVERKEYEXCHANGE] switching from [HANDLED_SERVERCERTIFICATE] to [HANDLED_SERVERKEYEXCHANGE] ## state=[HANDLED_SERVERKEYEXCHANGE] Condition [should_handle_ServerHelloDone_from_ServerKeyExchange] taken to state [HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERKEYEXCHANGE] to [HANDLED_SERVERHELLODONE] ## state=[HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERHELLODONE] to [PREPARE_CLIENTFLIGHT2] ## state=[PREPARE_CLIENTFLIGHT2] Condition [should_add_ClientCertificate] not taken Condition [should_add_ClientKeyExchange_from_ClientFlight2] taken to state [ADDED_CLIENTKEYEXCHANGE] switching from [PREPARE_CLIENTFLIGHT2] to [ADDED_CLIENTKEYEXCHANGE] ## state=[ADDED_CLIENTKEYEXCHANGE] Condition [should_add_ClientVerify] not taken Condition [should_add_ChangeCipherSpec_from_ClientKeyExchange] taken to state [ADDED_CHANGECIPHERSPEC] switching from [ADDED_CLIENTKEYEXCHANGE] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ClientFinished] taken to state [ADDED_CLIENTFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_CLIENTFINISHED] ## state=[ADDED_CLIENTFINISHED] TLS: master secret: b63e14251c2b2f7ad55123e7fccbc48446c623aab18a22f5d7f3b288a3a1fbb4a57405e4bcc288f1bf1c4d5b28eb43ec TLS: client read mac_secret: 96c0ba5a756603f8d03d154573d2c2cf1ffac60f TLS: client read cipher_secret: 298a9b09d14677a00e8be52915d2b58e82a57a1d1cddcd74a1c91f165b7e0aad TLS: client read block iv: cdb4efcefd6a5f1dbf71ea072a90c949 TLS: client write mac_secret: f043db64c24acb428f051d2649bb6fa051104087 TLS: client write cipher_secret: 52d5b3cf865a5a6274f87b96156b5bb4ff990c732a247390b91b53ad9c8ac576 TLS: client write block iv: 71b625842ecd255914f5c7044b58a31f Condition [should_send_ClientFlight2] taken to state [SENT_CLIENTFLIGHT2] switching from [ADDED_CLIENTFINISHED] to [SENT_CLIENTFLIGHT2] ## state=[SENT_CLIENTFLIGHT2] switching from [SENT_CLIENTFLIGHT2] to [WAITING_SERVERFLIGHT2] ## state=[WAITING_SERVERFLIGHT2] TLS: master secret: b63e14251c2b2f7ad55123e7fccbc48446c623aab18a22f5d7f3b288a3a1fbb4a57405e4bcc288f1bf1c4d5b28eb43ec TLS: server read mac_secret: f043db64c24acb428f051d2649bb6fa051104087 TLS: server read cipher_secret: 52d5b3cf865a5a6274f87b96156b5bb4ff990c732a247390b91b53ad9c8ac576 TLS: server read block iv: 71b625842ecd255914f5c7044b58a31f TLS: server write mac_secret: 96c0ba5a756603f8d03d154573d2c2cf1ffac60f TLS: server write cipher_secret: 298a9b09d14677a00e8be52915d2b58e82a57a1d1cddcd74a1c91f165b7e0aad TLS: server write block iv: cdb4efcefd6a5f1dbf71ea072a90c949 switching from [WAITING_CLIENTFLIGHT2] to [RECEIVED_CLIENTFLIGHT2] ## state=[RECEIVED_CLIENTFLIGHT2] Condition [should_handle_ClientCertificate] not taken Condition [no_ClientCertificate] taken to state [HANDLED_CLIENTCERTIFICATE] switching from [RECEIVED_CLIENTFLIGHT2] to [HANDLED_CLIENTCERTIFICATE] ## state=[HANDLED_CLIENTCERTIFICATE] Condition [should_handle_ClientKeyExchange] taken to state [HANDLED_CLIENTKEYEXCHANGE] switching from [HANDLED_CLIENTCERTIFICATE] to [HANDLED_CLIENTKEYEXCHANGE] ## state=[HANDLED_CLIENTKEYEXCHANGE] Condition [should_handle_CertificateVerify] not taken Condition [no_CertificateVerify] taken to state [HANDLED_CERTIFICATEVERIFY] switching from [HANDLED_CLIENTKEYEXCHANGE] to [HANDLED_CERTIFICATEVERIFY] ## state=[HANDLED_CERTIFICATEVERIFY] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [HANDLED_CERTIFICATEVERIFY] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_ClientFinished] taken to state [HANDLED_CLIENTFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_CLIENTFINISHED] ## state=[HANDLED_CLIENTFINISHED] switching from [HANDLED_CLIENTFINISHED] to [PREPARE_SERVERFLIGHT2] ## state=[PREPARE_SERVERFLIGHT2] Condition [should_add_ChangeCipherSpec] taken to state [ADDED_CHANGECIPHERSPEC] switching from [PREPARE_SERVERFLIGHT2] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ServerFinished] taken to state [ADDED_SERVERFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_SERVERFINISHED] ## state=[ADDED_SERVERFINISHED] Condition [should_send_ServerFlight2] taken to state [SENT_SERVERFLIGHT2] switching from [ADDED_SERVERFINISHED] to [SENT_SERVERFLIGHT2] ## state=[SENT_SERVERFLIGHT2] > TLS handshake completed! > Version : TLS 1.0 > Cipher suite : TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA > Server temp key : ffdhe2048 > Master secret : b63e14251c2b2f7ad55123e7fccbc48446c623aab18a22f5d7f3b288a3a1fbb4a57405e4bcc288f1bf1c4d5b28eb43ec > > Will now act as a simple echo server. switching from [SENT_SERVERFLIGHT2] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERFLIGHT2] to [RECEIVED_SERVERFLIGHT2] ## state=[RECEIVED_SERVERFLIGHT2] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [RECEIVED_SERVERFLIGHT2] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_Finished] taken to state [HANDLED_SERVERFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_SERVERFINISHED] ## state=[HANDLED_SERVERFINISHED] > TLS handshake completed! > Version : TLS 1.0 > Cipher suite : TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA > Server temp key : ffdhe2048 > Master secret : b63e14251c2b2f7ad55123e7fccbc48446c623aab18a22f5d7f3b288a3a1fbb4a57405e4bcc288f1bf1c4d5b28eb43ec > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > > You may send data or use 'quit'. Condition [should_wait_ClientData] taken to state [WAIT_CLIENTDATA] switching from [HANDLED_SERVERFINISHED] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_0088_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_0088_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735753875712) switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735609303296) Client running, waiting... Testing for output: 'TestC_0088_data' Found: TestC_0088_data (True, 'TestC_0088_data') ###(015)=[passed] Testing TLS client with TLS 1.0 and TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 >>> test_tls_client("0006", "0301") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735600849152] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... > Accepted connection from 127.0.0.1:51466 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Starting control thread [tid=140735609303296] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [PREPARE_CLIENTFLIGHT1] ## state=[PREPARE_CLIENTFLIGHT1] Condition [should_add_ClientHello] taken to state [ADDED_CLIENTHELLO] switching from [PREPARE_CLIENTFLIGHT1] to [ADDED_CLIENTHELLO] ## state=[ADDED_CLIENTHELLO] > Accepted connection from 127.0.0.1:51474 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] not taken Condition [should_handle_ClientHello] taken to state [HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [HANDLED_CLIENTHELLO] ## state=[HANDLED_CLIENTHELLO] switching from [HANDLED_CLIENTHELLO] to [PREPARE_SERVERFLIGHT1] ## state=[PREPARE_SERVERFLIGHT1] Condition [should_add_ServerHello] taken to state [ADDED_SERVERHELLO] switching from [PREPARE_SERVERFLIGHT1] to [ADDED_SERVERHELLO] ## state=[ADDED_SERVERHELLO] Condition [should_add_Certificate] taken to state [ADDED_CERTIFICATE] switching from [ADDED_SERVERHELLO] to [ADDED_CERTIFICATE] ## state=[ADDED_CERTIFICATE] Condition [should_add_ServerKeyExchange] taken to state [ADDED_SERVERKEYEXCHANGE] switching from [ADDED_CERTIFICATE] to [ADDED_SERVERKEYEXCHANGE] ## state=[ADDED_SERVERKEYEXCHANGE] Condition [should_add_CertificateRequest] taken to state [ADDED_CERTIFICATEREQUEST] switching from [ADDED_SERVERKEYEXCHANGE] to [ADDED_CERTIFICATEREQUEST] ## state=[ADDED_CERTIFICATEREQUEST] Condition [should_add_ServerHelloDone] taken to state [ADDED_SERVERHELLODONE] switching from [ADDED_CERTIFICATEREQUEST] to [ADDED_SERVERHELLODONE] ## state=[ADDED_SERVERHELLODONE] Condition [should_send_ClientFlight1] taken to state [SENT_CLIENTFLIGHT1] switching from [ADDED_CLIENTHELLO] to [SENT_CLIENTFLIGHT1] ## state=[SENT_CLIENTFLIGHT1] switching from [SENT_CLIENTFLIGHT1] to [WAITING_SERVERFLIGHT1] ## state=[WAITING_SERVERFLIGHT1] Condition [should_send_ServerFlight1] taken to state [WAITING_CLIENTFLIGHT2] switching from [ADDED_SERVERHELLODONE] to [WAITING_CLIENTFLIGHT2] ## state=[WAITING_CLIENTFLIGHT2] switching from [WAITING_SERVERFLIGHT1] to [RECEIVED_SERVERFLIGHT1] ## state=[RECEIVED_SERVERFLIGHT1] Condition [should_handle_ServerHello] taken to state [HANDLED_SERVERHELLO] switching from [RECEIVED_SERVERFLIGHT1] to [HANDLED_SERVERHELLO] ## state=[HANDLED_SERVERHELLO] Condition [should_handle_ServerCertificate] taken to state [HANDLED_SERVERCERTIFICATE] switching from [HANDLED_SERVERHELLO] to [HANDLED_SERVERCERTIFICATE] ## state=[HANDLED_SERVERCERTIFICATE] Condition [should_handle_ServerKeyExchange_from_ServerCertificate] taken to state [HANDLED_SERVERKEYEXCHANGE] switching from [HANDLED_SERVERCERTIFICATE] to [HANDLED_SERVERKEYEXCHANGE] ## state=[HANDLED_SERVERKEYEXCHANGE] Condition [should_handle_ServerHelloDone_from_ServerKeyExchange] taken to state [HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERKEYEXCHANGE] to [HANDLED_SERVERHELLODONE] ## state=[HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERHELLODONE] to [PREPARE_CLIENTFLIGHT2] ## state=[PREPARE_CLIENTFLIGHT2] Condition [should_add_ClientCertificate] not taken Condition [should_add_ClientKeyExchange_from_ClientFlight2] taken to state [ADDED_CLIENTKEYEXCHANGE] switching from [PREPARE_CLIENTFLIGHT2] to [ADDED_CLIENTKEYEXCHANGE] ## state=[ADDED_CLIENTKEYEXCHANGE] Condition [should_add_ClientVerify] not taken Condition [should_add_ChangeCipherSpec_from_ClientKeyExchange] taken to state [ADDED_CHANGECIPHERSPEC] switching from [ADDED_CLIENTKEYEXCHANGE] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ClientFinished] taken to state [ADDED_CLIENTFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_CLIENTFINISHED] ## state=[ADDED_CLIENTFINISHED] TLS: master secret: 791e6f01e3e26824a534ba562bc5cb98417d64acc008dcd70e22b4856d9c45454fa302904ed4ad2ffdaa998536ac5032 TLS: client read mac_secret: 8a551e1ddfc2d275828f0100f7169995 TLS: client read cipher_secret: c743664681bfb1af9a1a82d59f50fdd3 TLS: client read block iv: 70c1eae7f776c912 TLS: client write mac_secret: 10ded56ef4e01b767895f8cf17d636e7 TLS: client write cipher_secret: b90478ae89dae80c0a6cf6a8aabda342 TLS: client write block iv: 3eb955c36482fb8f Condition [should_send_ClientFlight2] taken to state [SENT_CLIENTFLIGHT2] switching from [ADDED_CLIENTFINISHED] to [SENT_CLIENTFLIGHT2] ## state=[SENT_CLIENTFLIGHT2] switching from [SENT_CLIENTFLIGHT2] to [WAITING_SERVERFLIGHT2] ## state=[WAITING_SERVERFLIGHT2] TLS: master secret: 791e6f01e3e26824a534ba562bc5cb98417d64acc008dcd70e22b4856d9c45454fa302904ed4ad2ffdaa998536ac5032 TLS: server read mac_secret: 10ded56ef4e01b767895f8cf17d636e7 TLS: server read cipher_secret: b90478ae89dae80c0a6cf6a8aabda342 TLS: server read block iv: 3eb955c36482fb8f TLS: server write mac_secret: 8a551e1ddfc2d275828f0100f7169995 TLS: server write cipher_secret: c743664681bfb1af9a1a82d59f50fdd3 TLS: server write block iv: 70c1eae7f776c912 switching from [WAITING_CLIENTFLIGHT2] to [RECEIVED_CLIENTFLIGHT2] ## state=[RECEIVED_CLIENTFLIGHT2] Condition [should_handle_ClientCertificate] not taken Condition [no_ClientCertificate] taken to state [HANDLED_CLIENTCERTIFICATE] switching from [RECEIVED_CLIENTFLIGHT2] to [HANDLED_CLIENTCERTIFICATE] ## state=[HANDLED_CLIENTCERTIFICATE] Condition [should_handle_ClientKeyExchange] taken to state [HANDLED_CLIENTKEYEXCHANGE] switching from [HANDLED_CLIENTCERTIFICATE] to [HANDLED_CLIENTKEYEXCHANGE] ## state=[HANDLED_CLIENTKEYEXCHANGE] Condition [should_handle_CertificateVerify] not taken Condition [no_CertificateVerify] taken to state [HANDLED_CERTIFICATEVERIFY] switching from [HANDLED_CLIENTKEYEXCHANGE] to [HANDLED_CERTIFICATEVERIFY] ## state=[HANDLED_CERTIFICATEVERIFY] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [HANDLED_CERTIFICATEVERIFY] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_ClientFinished] taken to state [HANDLED_CLIENTFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_CLIENTFINISHED] ## state=[HANDLED_CLIENTFINISHED] switching from [HANDLED_CLIENTFINISHED] to [PREPARE_SERVERFLIGHT2] ## state=[PREPARE_SERVERFLIGHT2] Condition [should_add_ChangeCipherSpec] taken to state [ADDED_CHANGECIPHERSPEC] switching from [PREPARE_SERVERFLIGHT2] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ServerFinished] taken to state [ADDED_SERVERFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_SERVERFINISHED] ## state=[ADDED_SERVERFINISHED] Condition [should_send_ServerFlight2] taken to state [SENT_SERVERFLIGHT2] switching from [ADDED_SERVERFINISHED] to [SENT_SERVERFLIGHT2] ## state=[SENT_SERVERFLIGHT2] > TLS handshake completed! > Version : TLS 1.0 > Cipher suite : TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 > Server temp key : rsa64 > Master secret : 791e6f01e3e26824a534ba562bc5cb98417d64acc008dcd70e22b4856d9c45454fa302904ed4ad2ffdaa998536ac5032 > > Will now act as a simple echo server. switching from [SENT_SERVERFLIGHT2] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERFLIGHT2] to [RECEIVED_SERVERFLIGHT2] ## state=[RECEIVED_SERVERFLIGHT2] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [RECEIVED_SERVERFLIGHT2] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_Finished] taken to state [HANDLED_SERVERFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_SERVERFINISHED] ## state=[HANDLED_SERVERFINISHED] > TLS handshake completed! > Version : TLS 1.0 > Cipher suite : TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 > Server temp key : rsa64 > Master secret : 791e6f01e3e26824a534ba562bc5cb98417d64acc008dcd70e22b4856d9c45454fa302904ed4ad2ffdaa998536ac5032 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > > You may send data or use 'quit'. Condition [should_wait_ClientData] taken to state [WAIT_CLIENTDATA] switching from [HANDLED_SERVERFINISHED] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_0006_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_0006_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735600849152) switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Testing for output: 'TestC_0006_data' Found: TestC_0006_data Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735609303296) Client running, waiting... (True, 'TestC_0006_data') ###(016)=[passed] Testing TLS client with TLS 1.1 and TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA >>> test_tls_client("c013", "0302") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735753875712] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 > Accepted connection from 127.0.0.1:51488 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] Thread synchronised Loading client... > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Starting control thread [tid=140735762329856] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [PREPARE_CLIENTFLIGHT1] ## state=[PREPARE_CLIENTFLIGHT1] Condition [should_add_ClientHello] taken to state [ADDED_CLIENTHELLO] switching from [PREPARE_CLIENTFLIGHT1] to [ADDED_CLIENTHELLO] ## state=[ADDED_CLIENTHELLO] > Accepted connection from 127.0.0.1:51494 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] not taken Condition [should_handle_ClientHello] taken to state [HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [HANDLED_CLIENTHELLO] ## state=[HANDLED_CLIENTHELLO] switching from [HANDLED_CLIENTHELLO] to [PREPARE_SERVERFLIGHT1] ## state=[PREPARE_SERVERFLIGHT1] Condition [should_add_ServerHello] taken to state [ADDED_SERVERHELLO] switching from [PREPARE_SERVERFLIGHT1] to [ADDED_SERVERHELLO] ## state=[ADDED_SERVERHELLO] Condition [should_add_Certificate] taken to state [ADDED_CERTIFICATE] switching from [ADDED_SERVERHELLO] to [ADDED_CERTIFICATE] ## state=[ADDED_CERTIFICATE] Condition [should_add_ServerKeyExchange] taken to state [ADDED_SERVERKEYEXCHANGE] switching from [ADDED_CERTIFICATE] to [ADDED_SERVERKEYEXCHANGE] ## state=[ADDED_SERVERKEYEXCHANGE] Condition [should_add_CertificateRequest] taken to state [ADDED_CERTIFICATEREQUEST] switching from [ADDED_SERVERKEYEXCHANGE] to [ADDED_CERTIFICATEREQUEST] ## state=[ADDED_CERTIFICATEREQUEST] Condition [should_add_ServerHelloDone] taken to state [ADDED_SERVERHELLODONE] switching from [ADDED_CERTIFICATEREQUEST] to [ADDED_SERVERHELLODONE] ## state=[ADDED_SERVERHELLODONE] Condition [should_send_ServerFlight1] taken to state [WAITING_CLIENTFLIGHT2] switching from [ADDED_SERVERHELLODONE] to [WAITING_CLIENTFLIGHT2] ## state=[WAITING_CLIENTFLIGHT2] Condition [should_send_ClientFlight1] taken to state [SENT_CLIENTFLIGHT1] switching from [ADDED_CLIENTHELLO] to [SENT_CLIENTFLIGHT1] ## state=[SENT_CLIENTFLIGHT1] switching from [SENT_CLIENTFLIGHT1] to [WAITING_SERVERFLIGHT1] ## state=[WAITING_SERVERFLIGHT1] switching from [WAITING_SERVERFLIGHT1] to [RECEIVED_SERVERFLIGHT1] ## state=[RECEIVED_SERVERFLIGHT1] Condition [should_handle_ServerHello] taken to state [HANDLED_SERVERHELLO] switching from [RECEIVED_SERVERFLIGHT1] to [HANDLED_SERVERHELLO] ## state=[HANDLED_SERVERHELLO] Condition [should_handle_ServerCertificate] taken to state [HANDLED_SERVERCERTIFICATE] switching from [HANDLED_SERVERHELLO] to [HANDLED_SERVERCERTIFICATE] ## state=[HANDLED_SERVERCERTIFICATE] Condition [should_handle_ServerKeyExchange_from_ServerCertificate] taken to state [HANDLED_SERVERKEYEXCHANGE] switching from [HANDLED_SERVERCERTIFICATE] to [HANDLED_SERVERKEYEXCHANGE] ## state=[HANDLED_SERVERKEYEXCHANGE] Condition [should_handle_ServerHelloDone_from_ServerKeyExchange] taken to state [HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERKEYEXCHANGE] to [HANDLED_SERVERHELLODONE] ## state=[HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERHELLODONE] to [PREPARE_CLIENTFLIGHT2] ## state=[PREPARE_CLIENTFLIGHT2] Condition [should_add_ClientCertificate] not taken Condition [should_add_ClientKeyExchange_from_ClientFlight2] taken to state [ADDED_CLIENTKEYEXCHANGE] switching from [PREPARE_CLIENTFLIGHT2] to [ADDED_CLIENTKEYEXCHANGE] ## state=[ADDED_CLIENTKEYEXCHANGE] Condition [should_add_ClientVerify] not taken Condition [should_add_ChangeCipherSpec_from_ClientKeyExchange] taken to state [ADDED_CHANGECIPHERSPEC] switching from [ADDED_CLIENTKEYEXCHANGE] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ClientFinished] taken to state [ADDED_CLIENTFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_CLIENTFINISHED] ## state=[ADDED_CLIENTFINISHED] TLS: master secret: a16f1687911f759ef9ac2725ec4e9b6cde372c36ed1b2055721e4d9afc2734f205cdedc02052100ed931802b1281bd85 TLS: client read mac_secret: 6074d0e16f388ffb81da26381363c2e24762cb06 TLS: client read cipher_secret: a600702de574d2afe13ada0071ab5e33 TLS: client write mac_secret: 0674010662a1ceacc65c0e73c2dec56fc5ba7a77 TLS: client write cipher_secret: f34e9fb4b94127eb0a1439baa13ddeac Condition [should_send_ClientFlight2] taken to state [SENT_CLIENTFLIGHT2] switching from [ADDED_CLIENTFINISHED] to [SENT_CLIENTFLIGHT2] ## state=[SENT_CLIENTFLIGHT2] switching from [SENT_CLIENTFLIGHT2] to [WAITING_SERVERFLIGHT2] ## state=[WAITING_SERVERFLIGHT2] TLS: master secret: a16f1687911f759ef9ac2725ec4e9b6cde372c36ed1b2055721e4d9afc2734f205cdedc02052100ed931802b1281bd85 TLS: server read mac_secret: 0674010662a1ceacc65c0e73c2dec56fc5ba7a77 TLS: server read cipher_secret: f34e9fb4b94127eb0a1439baa13ddeac TLS: server write mac_secret: 6074d0e16f388ffb81da26381363c2e24762cb06 TLS: server write cipher_secret: a600702de574d2afe13ada0071ab5e33 switching from [WAITING_CLIENTFLIGHT2] to [RECEIVED_CLIENTFLIGHT2] ## state=[RECEIVED_CLIENTFLIGHT2] Condition [should_handle_ClientCertificate] not taken Condition [no_ClientCertificate] taken to state [HANDLED_CLIENTCERTIFICATE] switching from [RECEIVED_CLIENTFLIGHT2] to [HANDLED_CLIENTCERTIFICATE] ## state=[HANDLED_CLIENTCERTIFICATE] Condition [should_handle_ClientKeyExchange] taken to state [HANDLED_CLIENTKEYEXCHANGE] switching from [HANDLED_CLIENTCERTIFICATE] to [HANDLED_CLIENTKEYEXCHANGE] ## state=[HANDLED_CLIENTKEYEXCHANGE] Condition [should_handle_CertificateVerify] not taken Condition [no_CertificateVerify] taken to state [HANDLED_CERTIFICATEVERIFY] switching from [HANDLED_CLIENTKEYEXCHANGE] to [HANDLED_CERTIFICATEVERIFY] ## state=[HANDLED_CERTIFICATEVERIFY] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [HANDLED_CERTIFICATEVERIFY] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_ClientFinished] taken to state [HANDLED_CLIENTFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_CLIENTFINISHED] ## state=[HANDLED_CLIENTFINISHED] switching from [HANDLED_CLIENTFINISHED] to [PREPARE_SERVERFLIGHT2] ## state=[PREPARE_SERVERFLIGHT2] Condition [should_add_ChangeCipherSpec] taken to state [ADDED_CHANGECIPHERSPEC] switching from [PREPARE_SERVERFLIGHT2] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ServerFinished] taken to state [ADDED_SERVERFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_SERVERFINISHED] ## state=[ADDED_SERVERFINISHED] Condition [should_send_ServerFlight2] taken to state [SENT_SERVERFLIGHT2] switching from [ADDED_SERVERFINISHED] to [SENT_SERVERFLIGHT2] ## state=[SENT_SERVERFLIGHT2] > TLS handshake completed! > Version : TLS 1.1 > Cipher suite : TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA > Server temp key : secp256r1 > Master secret : a16f1687911f759ef9ac2725ec4e9b6cde372c36ed1b2055721e4d9afc2734f205cdedc02052100ed931802b1281bd85 > > Will now act as a simple echo server. switching from [SENT_SERVERFLIGHT2] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERFLIGHT2] to [RECEIVED_SERVERFLIGHT2] ## state=[RECEIVED_SERVERFLIGHT2] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [RECEIVED_SERVERFLIGHT2] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_Finished] taken to state [HANDLED_SERVERFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_SERVERFINISHED] ## state=[HANDLED_SERVERFINISHED] > TLS handshake completed! > Version : TLS 1.1 > Cipher suite : TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA > Server temp key : secp256r1 > Master secret : a16f1687911f759ef9ac2725ec4e9b6cde372c36ed1b2055721e4d9afc2734f205cdedc02052100ed931802b1281bd85 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > > You may send data or use 'quit'. Condition [should_wait_ClientData] taken to state [WAIT_CLIENTDATA] switching from [HANDLED_SERVERFINISHED] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_c013_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_c013_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735753875712) switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Testing for output: 'TestC_c013_data' Found: TestC_c013_data Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735762329856) Client running, waiting... (True, 'TestC_c013_data') ###(017)=[passed] Testing TLS client with TLS 1.2 and TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 >>> test_tls_client("009e", "0303") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735974207744] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 > Accepted connection from 127.0.0.1:51498 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... Starting control thread [tid=140735957299456] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [PREPARE_CLIENTFLIGHT1] ## state=[PREPARE_CLIENTFLIGHT1] Condition [should_add_ClientHello] taken to state [ADDED_CLIENTHELLO] switching from [PREPARE_CLIENTFLIGHT1] to [ADDED_CLIENTHELLO] ## state=[ADDED_CLIENTHELLO] Condition [should_send_ClientFlight1] taken to state [SENT_CLIENTFLIGHT1] switching from [ADDED_CLIENTHELLO] to [SENT_CLIENTFLIGHT1] ## state=[SENT_CLIENTFLIGHT1] switching from [SENT_CLIENTFLIGHT1] to [WAITING_SERVERFLIGHT1] ## state=[WAITING_SERVERFLIGHT1] > Accepted connection from 127.0.0.1:51504 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] not taken Condition [should_handle_ClientHello] taken to state [HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [HANDLED_CLIENTHELLO] ## state=[HANDLED_CLIENTHELLO] switching from [HANDLED_CLIENTHELLO] to [PREPARE_SERVERFLIGHT1] ## state=[PREPARE_SERVERFLIGHT1] Condition [should_add_ServerHello] taken to state [ADDED_SERVERHELLO] switching from [PREPARE_SERVERFLIGHT1] to [ADDED_SERVERHELLO] ## state=[ADDED_SERVERHELLO] Condition [should_add_Certificate] taken to state [ADDED_CERTIFICATE] switching from [ADDED_SERVERHELLO] to [ADDED_CERTIFICATE] ## state=[ADDED_CERTIFICATE] Condition [should_add_ServerKeyExchange] taken to state [ADDED_SERVERKEYEXCHANGE] switching from [ADDED_CERTIFICATE] to [ADDED_SERVERKEYEXCHANGE] ## state=[ADDED_SERVERKEYEXCHANGE] Condition [should_add_CertificateRequest] taken to state [ADDED_CERTIFICATEREQUEST] switching from [ADDED_SERVERKEYEXCHANGE] to [ADDED_CERTIFICATEREQUEST] ## state=[ADDED_CERTIFICATEREQUEST] Condition [should_add_ServerHelloDone] taken to state [ADDED_SERVERHELLODONE] switching from [ADDED_CERTIFICATEREQUEST] to [ADDED_SERVERHELLODONE] ## state=[ADDED_SERVERHELLODONE] Condition [should_send_ServerFlight1] taken to state [WAITING_CLIENTFLIGHT2] switching from [ADDED_SERVERHELLODONE] to [WAITING_CLIENTFLIGHT2] ## state=[WAITING_CLIENTFLIGHT2] switching from [WAITING_SERVERFLIGHT1] to [RECEIVED_SERVERFLIGHT1] ## state=[RECEIVED_SERVERFLIGHT1] Condition [should_handle_ServerHello] taken to state [HANDLED_SERVERHELLO] switching from [RECEIVED_SERVERFLIGHT1] to [HANDLED_SERVERHELLO] ## state=[HANDLED_SERVERHELLO] Condition [should_handle_ServerCertificate] taken to state [HANDLED_SERVERCERTIFICATE] switching from [HANDLED_SERVERHELLO] to [HANDLED_SERVERCERTIFICATE] ## state=[HANDLED_SERVERCERTIFICATE] Condition [should_handle_ServerKeyExchange_from_ServerCertificate] taken to state [HANDLED_SERVERKEYEXCHANGE] switching from [HANDLED_SERVERCERTIFICATE] to [HANDLED_SERVERKEYEXCHANGE] ## state=[HANDLED_SERVERKEYEXCHANGE] Condition [should_handle_ServerHelloDone_from_ServerKeyExchange] taken to state [HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERKEYEXCHANGE] to [HANDLED_SERVERHELLODONE] ## state=[HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERHELLODONE] to [PREPARE_CLIENTFLIGHT2] ## state=[PREPARE_CLIENTFLIGHT2] Condition [should_add_ClientCertificate] not taken Condition [should_add_ClientKeyExchange_from_ClientFlight2] taken to state [ADDED_CLIENTKEYEXCHANGE] switching from [PREPARE_CLIENTFLIGHT2] to [ADDED_CLIENTKEYEXCHANGE] ## state=[ADDED_CLIENTKEYEXCHANGE] Condition [should_add_ClientVerify] not taken Condition [should_add_ChangeCipherSpec_from_ClientKeyExchange] taken to state [ADDED_CHANGECIPHERSPEC] switching from [ADDED_CLIENTKEYEXCHANGE] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ClientFinished] taken to state [ADDED_CLIENTFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_CLIENTFINISHED] ## state=[ADDED_CLIENTFINISHED] TLS: master secret: b6aca9abcb879d3580eaa462545d9677f4fb03a120737f8a894dbb8145f69ce5c83b2fcbb42e7619a2dc806c820a2480 TLS: client read cipher_secret: 155894b583a64f2027ed52bc907f3db5 TLS: client read aead fixed iv: d2a5b80b TLS: client write cipher_secret: 1f078b117663f4c3a11b116684abf06e TLS: client write aead fixed iv: 00c62422 Condition [should_send_ClientFlight2] taken to state [SENT_CLIENTFLIGHT2] switching from [ADDED_CLIENTFINISHED] to [SENT_CLIENTFLIGHT2] ## state=[SENT_CLIENTFLIGHT2] switching from [SENT_CLIENTFLIGHT2] to [WAITING_SERVERFLIGHT2] ## state=[WAITING_SERVERFLIGHT2] TLS: master secret: b6aca9abcb879d3580eaa462545d9677f4fb03a120737f8a894dbb8145f69ce5c83b2fcbb42e7619a2dc806c820a2480 TLS: server read cipher_secret: 1f078b117663f4c3a11b116684abf06e TLS: server read aead fixed iv: 00c62422 TLS: server write cipher_secret: 155894b583a64f2027ed52bc907f3db5 TLS: server write aead fixed iv: d2a5b80b switching from [WAITING_CLIENTFLIGHT2] to [RECEIVED_CLIENTFLIGHT2] ## state=[RECEIVED_CLIENTFLIGHT2] Condition [should_handle_ClientCertificate] not taken Condition [no_ClientCertificate] taken to state [HANDLED_CLIENTCERTIFICATE] switching from [RECEIVED_CLIENTFLIGHT2] to [HANDLED_CLIENTCERTIFICATE] ## state=[HANDLED_CLIENTCERTIFICATE] Condition [should_handle_ClientKeyExchange] taken to state [HANDLED_CLIENTKEYEXCHANGE] switching from [HANDLED_CLIENTCERTIFICATE] to [HANDLED_CLIENTKEYEXCHANGE] ## state=[HANDLED_CLIENTKEYEXCHANGE] Condition [should_handle_CertificateVerify] not taken Condition [no_CertificateVerify] taken to state [HANDLED_CERTIFICATEVERIFY] switching from [HANDLED_CLIENTKEYEXCHANGE] to [HANDLED_CERTIFICATEVERIFY] ## state=[HANDLED_CERTIFICATEVERIFY] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [HANDLED_CERTIFICATEVERIFY] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_ClientFinished] taken to state [HANDLED_CLIENTFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_CLIENTFINISHED] ## state=[HANDLED_CLIENTFINISHED] switching from [HANDLED_CLIENTFINISHED] to [PREPARE_SERVERFLIGHT2] ## state=[PREPARE_SERVERFLIGHT2] Condition [should_add_ChangeCipherSpec] taken to state [ADDED_CHANGECIPHERSPEC] switching from [PREPARE_SERVERFLIGHT2] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ServerFinished] taken to state [ADDED_SERVERFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_SERVERFINISHED] ## state=[ADDED_SERVERFINISHED] Condition [should_send_ServerFlight2] taken to state [SENT_SERVERFLIGHT2] switching from [ADDED_SERVERFINISHED] to [SENT_SERVERFLIGHT2] ## state=[SENT_SERVERFLIGHT2] > TLS handshake completed! > Version : TLS 1.2 > Cipher suite : TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 > Server temp key : ffdhe2048 > Master secret : b6aca9abcb879d3580eaa462545d9677f4fb03a120737f8a894dbb8145f69ce5c83b2fcbb42e7619a2dc806c820a2480 > > Will now act as a simple echo server. switching from [SENT_SERVERFLIGHT2] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERFLIGHT2] to [RECEIVED_SERVERFLIGHT2] ## state=[RECEIVED_SERVERFLIGHT2] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [RECEIVED_SERVERFLIGHT2] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_Finished] taken to state [HANDLED_SERVERFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_SERVERFINISHED] ## state=[HANDLED_SERVERFINISHED] > TLS handshake completed! > Version : TLS 1.2 > Cipher suite : TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 > Server temp key : ffdhe2048 > Master secret : b6aca9abcb879d3580eaa462545d9677f4fb03a120737f8a894dbb8145f69ce5c83b2fcbb42e7619a2dc806c820a2480 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > > You may send data or use 'quit'. Condition [should_wait_ClientData] taken to state [WAIT_CLIENTDATA] switching from [HANDLED_SERVERFINISHED] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_009e_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_009e_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735974207744) Testing for output: 'TestC_009e_data' Found: TestC_009e_data switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735957299456) Client running, waiting... (True, 'TestC_009e_data') ###(018)=[passed] Testing TLS client with TLS 1.2 and TLS_ECDH_anon_WITH_RC4_128_SHA >>> test_tls_client("c016", "0303") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735802175744] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 > Accepted connection from 127.0.0.1:51518 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... Starting control thread [tid=140735793721600] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [PREPARE_CLIENTFLIGHT1] ## state=[PREPARE_CLIENTFLIGHT1] Condition [should_add_ClientHello] taken to state [ADDED_CLIENTHELLO] switching from [PREPARE_CLIENTFLIGHT1] to [ADDED_CLIENTHELLO] ## state=[ADDED_CLIENTHELLO] > Accepted connection from 127.0.0.1:51520 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] not taken Condition [should_handle_ClientHello] taken to state [HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [HANDLED_CLIENTHELLO] ## state=[HANDLED_CLIENTHELLO] switching from [HANDLED_CLIENTHELLO] to [PREPARE_SERVERFLIGHT1] ## state=[PREPARE_SERVERFLIGHT1] Condition [should_add_ServerHello] taken to state [ADDED_SERVERHELLO] switching from [PREPARE_SERVERFLIGHT1] to [ADDED_SERVERHELLO] ## state=[ADDED_SERVERHELLO] Condition [should_add_Certificate] taken to state [ADDED_CERTIFICATE] switching from [ADDED_SERVERHELLO] to [ADDED_CERTIFICATE] ## state=[ADDED_CERTIFICATE] Condition [should_add_ServerKeyExchange] taken to state [ADDED_SERVERKEYEXCHANGE] switching from [ADDED_CERTIFICATE] to [ADDED_SERVERKEYEXCHANGE] ## state=[ADDED_SERVERKEYEXCHANGE] Condition [should_add_CertificateRequest] taken to state [ADDED_CERTIFICATEREQUEST] switching from [ADDED_SERVERKEYEXCHANGE] to [ADDED_CERTIFICATEREQUEST] ## state=[ADDED_CERTIFICATEREQUEST] Condition [should_add_ServerHelloDone] taken to state [ADDED_SERVERHELLODONE] switching from [ADDED_CERTIFICATEREQUEST] to [ADDED_SERVERHELLODONE] ## state=[ADDED_SERVERHELLODONE] Condition [should_send_ServerFlight1] taken to state [WAITING_CLIENTFLIGHT2] switching from [ADDED_SERVERHELLODONE] to [WAITING_CLIENTFLIGHT2] ## state=[WAITING_CLIENTFLIGHT2] Condition [should_send_ClientFlight1] taken to state [SENT_CLIENTFLIGHT1] switching from [ADDED_CLIENTHELLO] to [SENT_CLIENTFLIGHT1] ## state=[SENT_CLIENTFLIGHT1] switching from [SENT_CLIENTFLIGHT1] to [WAITING_SERVERFLIGHT1] ## state=[WAITING_SERVERFLIGHT1] switching from [WAITING_SERVERFLIGHT1] to [RECEIVED_SERVERFLIGHT1] ## state=[RECEIVED_SERVERFLIGHT1] Condition [should_handle_ServerHello] taken to state [HANDLED_SERVERHELLO] switching from [RECEIVED_SERVERFLIGHT1] to [HANDLED_SERVERHELLO] ## state=[HANDLED_SERVERHELLO] Condition [should_handle_ServerCertificate] taken to state [HANDLED_SERVERCERTIFICATE] switching from [HANDLED_SERVERHELLO] to [HANDLED_SERVERCERTIFICATE] ## state=[HANDLED_SERVERCERTIFICATE] Condition [should_handle_ServerKeyExchange_from_ServerCertificate] taken to state [HANDLED_SERVERKEYEXCHANGE] switching from [HANDLED_SERVERCERTIFICATE] to [HANDLED_SERVERKEYEXCHANGE] ## state=[HANDLED_SERVERKEYEXCHANGE] Condition [should_handle_ServerHelloDone_from_ServerKeyExchange] taken to state [HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERKEYEXCHANGE] to [HANDLED_SERVERHELLODONE] ## state=[HANDLED_SERVERHELLODONE] switching from [HANDLED_SERVERHELLODONE] to [PREPARE_CLIENTFLIGHT2] ## state=[PREPARE_CLIENTFLIGHT2] Condition [should_add_ClientCertificate] not taken Condition [should_add_ClientKeyExchange_from_ClientFlight2] taken to state [ADDED_CLIENTKEYEXCHANGE] switching from [PREPARE_CLIENTFLIGHT2] to [ADDED_CLIENTKEYEXCHANGE] ## state=[ADDED_CLIENTKEYEXCHANGE] Condition [should_add_ClientVerify] not taken Condition [should_add_ChangeCipherSpec_from_ClientKeyExchange] taken to state [ADDED_CHANGECIPHERSPEC] switching from [ADDED_CLIENTKEYEXCHANGE] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ClientFinished] taken to state [ADDED_CLIENTFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_CLIENTFINISHED] ## state=[ADDED_CLIENTFINISHED] TLS: master secret: f3acc1bb243ec37c37abf1f1e3d08bf124ad130bd792944f50cf927828f50e5895ae5b1b518c22aab75796d01ba7b09c TLS: client read mac_secret: 596f5554bbfd3e2344fc6bec67299eb7a150bbc8 TLS: client read cipher_secret: d8e8eaeb2bcb1100c5659b91ffe27cbf TLS: client write mac_secret: c45096b3bfe59b64221b22bfa2c8cf2bb7aebaf7 TLS: client write cipher_secret: 3fcff37e818b362d6d27366f093bdf4e Condition [should_send_ClientFlight2] taken to state [SENT_CLIENTFLIGHT2] switching from [ADDED_CLIENTFINISHED] to [SENT_CLIENTFLIGHT2] ## state=[SENT_CLIENTFLIGHT2] switching from [SENT_CLIENTFLIGHT2] to [WAITING_SERVERFLIGHT2] ## state=[WAITING_SERVERFLIGHT2] TLS: master secret: f3acc1bb243ec37c37abf1f1e3d08bf124ad130bd792944f50cf927828f50e5895ae5b1b518c22aab75796d01ba7b09c TLS: server read mac_secret: c45096b3bfe59b64221b22bfa2c8cf2bb7aebaf7 TLS: server read cipher_secret: 3fcff37e818b362d6d27366f093bdf4e TLS: server write mac_secret: 596f5554bbfd3e2344fc6bec67299eb7a150bbc8 TLS: server write cipher_secret: d8e8eaeb2bcb1100c5659b91ffe27cbf switching from [WAITING_CLIENTFLIGHT2] to [RECEIVED_CLIENTFLIGHT2] ## state=[RECEIVED_CLIENTFLIGHT2] Condition [should_handle_ClientCertificate] not taken Condition [no_ClientCertificate] taken to state [HANDLED_CLIENTCERTIFICATE] switching from [RECEIVED_CLIENTFLIGHT2] to [HANDLED_CLIENTCERTIFICATE] ## state=[HANDLED_CLIENTCERTIFICATE] Condition [should_handle_ClientKeyExchange] taken to state [HANDLED_CLIENTKEYEXCHANGE] switching from [HANDLED_CLIENTCERTIFICATE] to [HANDLED_CLIENTKEYEXCHANGE] ## state=[HANDLED_CLIENTKEYEXCHANGE] Condition [should_handle_CertificateVerify] not taken Condition [no_CertificateVerify] taken to state [HANDLED_CERTIFICATEVERIFY] switching from [HANDLED_CLIENTKEYEXCHANGE] to [HANDLED_CERTIFICATEVERIFY] ## state=[HANDLED_CERTIFICATEVERIFY] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [HANDLED_CERTIFICATEVERIFY] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_ClientFinished] taken to state [HANDLED_CLIENTFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_CLIENTFINISHED] ## state=[HANDLED_CLIENTFINISHED] switching from [HANDLED_CLIENTFINISHED] to [PREPARE_SERVERFLIGHT2] ## state=[PREPARE_SERVERFLIGHT2] Condition [should_add_ChangeCipherSpec] taken to state [ADDED_CHANGECIPHERSPEC] switching from [PREPARE_SERVERFLIGHT2] to [ADDED_CHANGECIPHERSPEC] ## state=[ADDED_CHANGECIPHERSPEC] Condition [should_add_ServerFinished] taken to state [ADDED_SERVERFINISHED] switching from [ADDED_CHANGECIPHERSPEC] to [ADDED_SERVERFINISHED] ## state=[ADDED_SERVERFINISHED] Condition [should_send_ServerFlight2] taken to state [SENT_SERVERFLIGHT2] switching from [ADDED_SERVERFINISHED] to [SENT_SERVERFLIGHT2] ## state=[SENT_SERVERFLIGHT2] > TLS handshake completed! > Version : TLS 1.2 > Cipher suite : TLS_ECDH_anon_WITH_RC4_128_SHA > Server temp key : secp256r1 > Master secret : f3acc1bb243ec37c37abf1f1e3d08bf124ad130bd792944f50cf927828f50e5895ae5b1b518c22aab75796d01ba7b09c > > Will now act as a simple echo server. switching from [SENT_SERVERFLIGHT2] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERFLIGHT2] to [RECEIVED_SERVERFLIGHT2] ## state=[RECEIVED_SERVERFLIGHT2] Condition [should_handle_ChangeCipherSpec] taken to state [HANDLED_CHANGECIPHERSPEC] switching from [RECEIVED_SERVERFLIGHT2] to [HANDLED_CHANGECIPHERSPEC] ## state=[HANDLED_CHANGECIPHERSPEC] Condition [should_handle_Finished] taken to state [HANDLED_SERVERFINISHED] switching from [HANDLED_CHANGECIPHERSPEC] to [HANDLED_SERVERFINISHED] ## state=[HANDLED_SERVERFINISHED] > TLS handshake completed! > Version : TLS 1.2 > Cipher suite : TLS_ECDH_anon_WITH_RC4_128_SHA > Server temp key : secp256r1 > Master secret : f3acc1bb243ec37c37abf1f1e3d08bf124ad130bd792944f50cf927828f50e5895ae5b1b518c22aab75796d01ba7b09c > > You may send data or use 'quit'. Condition [should_wait_ClientData] taken to state [WAIT_CLIENTDATA] switching from [HANDLED_SERVERFINISHED] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_c016_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_c016_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735802175744) Testing for output: 'TestC_c016_data' Found: TestC_c016_data switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735793721600) Client running, waiting... (True, 'TestC_c016_data') ###(019)=[passed] Testing TLS server and client with TLS 1.3 and TLS_AES_128_GCM_SHA256 >>> test_tls_client("1301", "0304") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735770784000] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... > Accepted connection from 127.0.0.1:51536 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Starting control thread [tid=140735592395008] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [TLS13_START] ## state=[TLS13_START] Condition [tls13_should_add_ClientHello] taken to state [TLS13_ADDED_CLIENTHELLO] switching from [TLS13_START] to [TLS13_ADDED_CLIENTHELLO] ## state=[TLS13_ADDED_CLIENTHELLO] switching from [TLS13_ADDED_CLIENTHELLO] to [TLS13_SENDING_CLIENTFLIGHT1] ## state=[TLS13_SENDING_CLIENTFLIGHT1] > Accepted connection from 127.0.0.1:51552 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] taken to state [tls13_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [tls13_HANDLED_CLIENTHELLO] ## state=[tls13_HANDLED_CLIENTHELLO] switching from [tls13_HANDLED_CLIENTHELLO] to [tls13_PREPARE_SERVERFLIGHT1] ## state=[tls13_PREPARE_SERVERFLIGHT1] Condition [tls13_should_add_ServerHello] taken to state [tls13_ADDED_SERVERHELLO] switching from [tls13_PREPARE_SERVERFLIGHT1] to [tls13_ADDED_SERVERHELLO] ## state=[tls13_ADDED_SERVERHELLO] Condition [tls13_should_add_EncryptedExtensions] taken to state [tls13_ADDED_ENCRYPTEDEXTENSIONS] switching from [tls13_ADDED_SERVERHELLO] to [tls13_ADDED_ENCRYPTEDEXTENSIONS] ## state=[tls13_ADDED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_add_CertificateRequest] taken to state [tls13_ADDED_CERTIFICATEREQUEST] switching from [tls13_ADDED_ENCRYPTEDEXTENSIONS] to [tls13_ADDED_CERTIFICATEREQUEST] ## state=[tls13_ADDED_CERTIFICATEREQUEST] Condition [tls13_should_add_Certificate] taken to state [tls13_ADDED_CERTIFICATE] switching from [tls13_ADDED_CERTIFICATEREQUEST] to [tls13_ADDED_CERTIFICATE] ## state=[tls13_ADDED_CERTIFICATE] Condition [tls13_should_add_CertificateVerifiy] taken to state [tls13_ADDED_CERTIFICATEVERIFY] switching from [tls13_ADDED_CERTIFICATE] to [tls13_ADDED_CERTIFICATEVERIFY] ## state=[tls13_ADDED_CERTIFICATEVERIFY] Condition [tls13_should_add_Finished] taken to state [tls13_ADDED_SERVERFINISHED] switching from [tls13_ADDED_CERTIFICATEVERIFY] to [tls13_ADDED_SERVERFINISHED] ## state=[tls13_ADDED_SERVERFINISHED] Condition [tls13_should_send_ServerFlight1] taken to state [tls13_WAITING_CLIENTFLIGHT2] switching from [tls13_ADDED_SERVERFINISHED] to [tls13_WAITING_CLIENTFLIGHT2] ## state=[tls13_WAITING_CLIENTFLIGHT2] Condition [tls13_should_send_ClientFlight1] taken to state [TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENDING_CLIENTFLIGHT1] to [TLS13_SENT_CLIENTFLIGHT1] ## state=[TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENT_CLIENTFLIGHT1] to [TLS13_WAITING_SERVERFLIGHT1] ## state=[TLS13_WAITING_SERVERFLIGHT1] switching from [TLS13_WAITING_SERVERFLIGHT1] to [TLS13_RECEIVED_SERVERFLIGHT1] ## state=[TLS13_RECEIVED_SERVERFLIGHT1] Condition [tls13_should_handle_ServerHello] taken to state [TLS13_HANDLED_SERVERHELLO] switching from [TLS13_RECEIVED_SERVERFLIGHT1] to [TLS13_HANDLED_SERVERHELLO] ## state=[TLS13_HANDLED_SERVERHELLO] Condition [tls13_should_handle_encrytpedExtensions] taken to state [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] switching from [TLS13_HANDLED_SERVERHELLO] to [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] ## state=[TLS13_HANDLED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_handle_certificateRequest_from_encryptedExtensions] not taken Condition [tls13_should_handle_certificate_from_encryptedExtensions] taken to state [TLS13_HANDLED_CERTIFICATE] switching from [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] to [TLS13_HANDLED_CERTIFICATE] ## state=[TLS13_HANDLED_CERTIFICATE] Condition [tls13_should_handle_CertificateVerify] taken to state [TLS13_HANDLED_CERTIFICATE_VERIFY] switching from [TLS13_HANDLED_CERTIFICATE] to [TLS13_HANDLED_CERTIFICATE_VERIFY] ## state=[TLS13_HANDLED_CERTIFICATE_VERIFY] Condition [tls13_should_handle_finished] taken to state [TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_CERTIFICATE_VERIFY] to [TLS13_HANDLED_FINISHED] ## state=[TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_FINISHED] to [TLS13_PREPARE_CLIENTFLIGHT2] ## state=[TLS13_PREPARE_CLIENTFLIGHT2] Condition [tls13_should_add_ClientCertificate] not taken Condition [tls13_should_add_ClientFinished] taken to state [TLS13_ADDED_CLIENTFINISHED] switching from [TLS13_PREPARE_CLIENTFLIGHT2] to [TLS13_ADDED_CLIENTFINISHED] ## state=[TLS13_ADDED_CLIENTFINISHED] Condition [tls13_should_send_ClientFlight2] taken to state [TLS13_SENT_CLIENTFLIGHT2] switching from [TLS13_ADDED_CLIENTFINISHED] to [TLS13_SENT_CLIENTFLIGHT2] ## state=[TLS13_SENT_CLIENTFLIGHT2] > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_GCM_SHA256 > Server temp key : x25519 > Master secret : 550c0217181e669bec054296694bb61d522e5d4eae8443fa976cf10d4b577aa1 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 36bbf785064ec09765b9370ca53415d025d74f9779469272eeec881f0d86507f > > You may send data or use 'quit'. switching from [TLS13_SENT_CLIENTFLIGHT2] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [tls13_WAITING_CLIENTFLIGHT2] to [tls13_RECEIVED_CLIENTFLIGHT2] ## state=[tls13_RECEIVED_CLIENTFLIGHT2] Condition [tls13_should_handle_ClientFlight2] not taken Condition [tls13_should_handle_Alert_from_ClientCertificate] not taken Condition [tls13_should_handle_ClientCCS] not taken Condition [tls13_no_ClientCertificate] taken to state [TLS13_HANDLED_CLIENTFINISHED] switching from [tls13_RECEIVED_CLIENTFLIGHT2] to [TLS13_HANDLED_CLIENTFINISHED] ## state=[TLS13_HANDLED_CLIENTFINISHED] > TLS handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_GCM_SHA256 > Server temp key : x25519 > Negotiated sig_alg : sha256+rsaepss > Master secret : 550c0217181e669bec054296694bb61d522e5d4eae8443fa976cf10d4b577aa1 > Resumption master secret : 36bbf785064ec09765b9370ca53415d025d74f9779469272eeec881f0d86507f > > Will now act as a simple echo server. switching from [TLS13_HANDLED_CLIENTFINISHED] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_1301_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_1301_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735770784000) Testing for output: 'TestC_1301_data' Found: TestC_1301_data switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735592395008) Client running, waiting... (True, 'TestC_1301_data') ###(020)=[passed] Testing TLS server and client with TLS 1.3 and TLS_CHACHA20_POLY1305_SHA256 >>> test_tls_client("1303", "0304") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735583940864] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 > Accepted connection from 127.0.0.1:51562 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... Starting control thread [tid=140735575486720] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [TLS13_START] ## state=[TLS13_START] Condition [tls13_should_add_ClientHello] taken to state [TLS13_ADDED_CLIENTHELLO] switching from [TLS13_START] to [TLS13_ADDED_CLIENTHELLO] ## state=[TLS13_ADDED_CLIENTHELLO] switching from [TLS13_ADDED_CLIENTHELLO] to [TLS13_SENDING_CLIENTFLIGHT1] ## state=[TLS13_SENDING_CLIENTFLIGHT1] > Accepted connection from 127.0.0.1:51572 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] taken to state [tls13_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [tls13_HANDLED_CLIENTHELLO] ## state=[tls13_HANDLED_CLIENTHELLO] switching from [tls13_HANDLED_CLIENTHELLO] to [tls13_PREPARE_SERVERFLIGHT1] ## state=[tls13_PREPARE_SERVERFLIGHT1] Condition [tls13_should_add_ServerHello] taken to state [tls13_ADDED_SERVERHELLO] switching from [tls13_PREPARE_SERVERFLIGHT1] to [tls13_ADDED_SERVERHELLO] ## state=[tls13_ADDED_SERVERHELLO] Condition [tls13_should_add_EncryptedExtensions] taken to state [tls13_ADDED_ENCRYPTEDEXTENSIONS] switching from [tls13_ADDED_SERVERHELLO] to [tls13_ADDED_ENCRYPTEDEXTENSIONS] ## state=[tls13_ADDED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_add_CertificateRequest] taken to state [tls13_ADDED_CERTIFICATEREQUEST] switching from [tls13_ADDED_ENCRYPTEDEXTENSIONS] to [tls13_ADDED_CERTIFICATEREQUEST] ## state=[tls13_ADDED_CERTIFICATEREQUEST] Condition [tls13_should_add_Certificate] taken to state [tls13_ADDED_CERTIFICATE] switching from [tls13_ADDED_CERTIFICATEREQUEST] to [tls13_ADDED_CERTIFICATE] ## state=[tls13_ADDED_CERTIFICATE] Condition [tls13_should_add_CertificateVerifiy] taken to state [tls13_ADDED_CERTIFICATEVERIFY] switching from [tls13_ADDED_CERTIFICATE] to [tls13_ADDED_CERTIFICATEVERIFY] ## state=[tls13_ADDED_CERTIFICATEVERIFY] Condition [tls13_should_add_Finished] taken to state [tls13_ADDED_SERVERFINISHED] switching from [tls13_ADDED_CERTIFICATEVERIFY] to [tls13_ADDED_SERVERFINISHED] ## state=[tls13_ADDED_SERVERFINISHED] Condition [tls13_should_send_ClientFlight1] taken to state [TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENDING_CLIENTFLIGHT1] to [TLS13_SENT_CLIENTFLIGHT1] ## state=[TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENT_CLIENTFLIGHT1] to [TLS13_WAITING_SERVERFLIGHT1] ## state=[TLS13_WAITING_SERVERFLIGHT1] Condition [tls13_should_send_ServerFlight1] taken to state [tls13_WAITING_CLIENTFLIGHT2] switching from [tls13_ADDED_SERVERFINISHED] to [tls13_WAITING_CLIENTFLIGHT2] ## state=[tls13_WAITING_CLIENTFLIGHT2] switching from [TLS13_WAITING_SERVERFLIGHT1] to [TLS13_RECEIVED_SERVERFLIGHT1] ## state=[TLS13_RECEIVED_SERVERFLIGHT1] Condition [tls13_should_handle_ServerHello] taken to state [TLS13_HANDLED_SERVERHELLO] switching from [TLS13_RECEIVED_SERVERFLIGHT1] to [TLS13_HANDLED_SERVERHELLO] ## state=[TLS13_HANDLED_SERVERHELLO] Condition [tls13_should_handle_encrytpedExtensions] taken to state [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] switching from [TLS13_HANDLED_SERVERHELLO] to [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] ## state=[TLS13_HANDLED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_handle_certificateRequest_from_encryptedExtensions] not taken Condition [tls13_should_handle_certificate_from_encryptedExtensions] taken to state [TLS13_HANDLED_CERTIFICATE] switching from [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] to [TLS13_HANDLED_CERTIFICATE] ## state=[TLS13_HANDLED_CERTIFICATE] Condition [tls13_should_handle_CertificateVerify] taken to state [TLS13_HANDLED_CERTIFICATE_VERIFY] switching from [TLS13_HANDLED_CERTIFICATE] to [TLS13_HANDLED_CERTIFICATE_VERIFY] ## state=[TLS13_HANDLED_CERTIFICATE_VERIFY] Condition [tls13_should_handle_finished] taken to state [TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_CERTIFICATE_VERIFY] to [TLS13_HANDLED_FINISHED] ## state=[TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_FINISHED] to [TLS13_PREPARE_CLIENTFLIGHT2] ## state=[TLS13_PREPARE_CLIENTFLIGHT2] Condition [tls13_should_add_ClientCertificate] not taken Condition [tls13_should_add_ClientFinished] taken to state [TLS13_ADDED_CLIENTFINISHED] switching from [TLS13_PREPARE_CLIENTFLIGHT2] to [TLS13_ADDED_CLIENTFINISHED] ## state=[TLS13_ADDED_CLIENTFINISHED] Condition [tls13_should_send_ClientFlight2] taken to state [TLS13_SENT_CLIENTFLIGHT2] switching from [TLS13_ADDED_CLIENTFINISHED] to [TLS13_SENT_CLIENTFLIGHT2] ## state=[TLS13_SENT_CLIENTFLIGHT2] > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_CHACHA20_POLY1305_SHA256 > Server temp key : x25519 > Master secret : 002cf51c2dff273bda25ad956b7f8c5e0c233e6d22a4a3bb753810783159d9ce > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 93069470cc876144bfe936f96cdc592295b389c6a5fcea3079d3e7591626ef36 > > You may send data or use 'quit'. switching from [TLS13_SENT_CLIENTFLIGHT2] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [tls13_WAITING_CLIENTFLIGHT2] to [tls13_RECEIVED_CLIENTFLIGHT2] ## state=[tls13_RECEIVED_CLIENTFLIGHT2] Condition [tls13_should_handle_ClientFlight2] not taken Condition [tls13_should_handle_Alert_from_ClientCertificate] not taken Condition [tls13_should_handle_ClientCCS] not taken Condition [tls13_no_ClientCertificate] taken to state [TLS13_HANDLED_CLIENTFINISHED] switching from [tls13_RECEIVED_CLIENTFLIGHT2] to [TLS13_HANDLED_CLIENTFINISHED] ## state=[TLS13_HANDLED_CLIENTFINISHED] > TLS handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_CHACHA20_POLY1305_SHA256 > Server temp key : x25519 > Negotiated sig_alg : sha256+rsaepss > Master secret : 002cf51c2dff273bda25ad956b7f8c5e0c233e6d22a4a3bb753810783159d9ce > Resumption master secret : 93069470cc876144bfe936f96cdc592295b389c6a5fcea3079d3e7591626ef36 > > Will now act as a simple echo server. switching from [TLS13_HANDLED_CLIENTFINISHED] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_1303_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_1303_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735583940864) Testing for output: 'TestC_1303_data' Found: TestC_1303_data switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735575486720) Client running, waiting... (True, 'TestC_1303_data') ###(021)=[passed] Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 >>> test_tls_client("1305", "0304") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735567032576] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 > Accepted connection from 127.0.0.1:51588 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] Thread synchronised Loading client... > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Starting control thread [tid=140735558578432] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [TLS13_START] ## state=[TLS13_START] Condition [tls13_should_add_ClientHello] taken to state [TLS13_ADDED_CLIENTHELLO] switching from [TLS13_START] to [TLS13_ADDED_CLIENTHELLO] ## state=[TLS13_ADDED_CLIENTHELLO] switching from [TLS13_ADDED_CLIENTHELLO] to [TLS13_SENDING_CLIENTFLIGHT1] ## state=[TLS13_SENDING_CLIENTFLIGHT1] > Accepted connection from 127.0.0.1:51594 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] taken to state [tls13_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [tls13_HANDLED_CLIENTHELLO] ## state=[tls13_HANDLED_CLIENTHELLO] switching from [tls13_HANDLED_CLIENTHELLO] to [tls13_PREPARE_SERVERFLIGHT1] ## state=[tls13_PREPARE_SERVERFLIGHT1] Condition [tls13_should_add_ServerHello] taken to state [tls13_ADDED_SERVERHELLO] switching from [tls13_PREPARE_SERVERFLIGHT1] to [tls13_ADDED_SERVERHELLO] ## state=[tls13_ADDED_SERVERHELLO] Condition [tls13_should_add_EncryptedExtensions] taken to state [tls13_ADDED_ENCRYPTEDEXTENSIONS] switching from [tls13_ADDED_SERVERHELLO] to [tls13_ADDED_ENCRYPTEDEXTENSIONS] ## state=[tls13_ADDED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_add_CertificateRequest] taken to state [tls13_ADDED_CERTIFICATEREQUEST] switching from [tls13_ADDED_ENCRYPTEDEXTENSIONS] to [tls13_ADDED_CERTIFICATEREQUEST] ## state=[tls13_ADDED_CERTIFICATEREQUEST] Condition [tls13_should_add_Certificate] taken to state [tls13_ADDED_CERTIFICATE] switching from [tls13_ADDED_CERTIFICATEREQUEST] to [tls13_ADDED_CERTIFICATE] ## state=[tls13_ADDED_CERTIFICATE] Condition [tls13_should_add_CertificateVerifiy] taken to state [tls13_ADDED_CERTIFICATEVERIFY] switching from [tls13_ADDED_CERTIFICATE] to [tls13_ADDED_CERTIFICATEVERIFY] ## state=[tls13_ADDED_CERTIFICATEVERIFY] Condition [tls13_should_add_Finished] taken to state [tls13_ADDED_SERVERFINISHED] switching from [tls13_ADDED_CERTIFICATEVERIFY] to [tls13_ADDED_SERVERFINISHED] ## state=[tls13_ADDED_SERVERFINISHED] Condition [tls13_should_send_ServerFlight1] taken to state [tls13_WAITING_CLIENTFLIGHT2] switching from [tls13_ADDED_SERVERFINISHED] to [tls13_WAITING_CLIENTFLIGHT2] ## state=[tls13_WAITING_CLIENTFLIGHT2] Condition [tls13_should_send_ClientFlight1] taken to state [TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENDING_CLIENTFLIGHT1] to [TLS13_SENT_CLIENTFLIGHT1] ## state=[TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENT_CLIENTFLIGHT1] to [TLS13_WAITING_SERVERFLIGHT1] ## state=[TLS13_WAITING_SERVERFLIGHT1] switching from [TLS13_WAITING_SERVERFLIGHT1] to [TLS13_RECEIVED_SERVERFLIGHT1] ## state=[TLS13_RECEIVED_SERVERFLIGHT1] Condition [tls13_should_handle_ServerHello] taken to state [TLS13_HANDLED_SERVERHELLO] switching from [TLS13_RECEIVED_SERVERFLIGHT1] to [TLS13_HANDLED_SERVERHELLO] ## state=[TLS13_HANDLED_SERVERHELLO] Condition [tls13_should_handle_encrytpedExtensions] taken to state [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] switching from [TLS13_HANDLED_SERVERHELLO] to [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] ## state=[TLS13_HANDLED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_handle_certificateRequest_from_encryptedExtensions] not taken Condition [tls13_should_handle_certificate_from_encryptedExtensions] taken to state [TLS13_HANDLED_CERTIFICATE] switching from [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] to [TLS13_HANDLED_CERTIFICATE] ## state=[TLS13_HANDLED_CERTIFICATE] Condition [tls13_should_handle_CertificateVerify] taken to state [TLS13_HANDLED_CERTIFICATE_VERIFY] switching from [TLS13_HANDLED_CERTIFICATE] to [TLS13_HANDLED_CERTIFICATE_VERIFY] ## state=[TLS13_HANDLED_CERTIFICATE_VERIFY] Condition [tls13_should_handle_finished] taken to state [TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_CERTIFICATE_VERIFY] to [TLS13_HANDLED_FINISHED] ## state=[TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_FINISHED] to [TLS13_PREPARE_CLIENTFLIGHT2] ## state=[TLS13_PREPARE_CLIENTFLIGHT2] Condition [tls13_should_add_ClientCertificate] not taken Condition [tls13_should_add_ClientFinished] taken to state [TLS13_ADDED_CLIENTFINISHED] switching from [TLS13_PREPARE_CLIENTFLIGHT2] to [TLS13_ADDED_CLIENTFINISHED] ## state=[TLS13_ADDED_CLIENTFINISHED] Condition [tls13_should_send_ClientFlight2] taken to state [TLS13_SENT_CLIENTFLIGHT2] switching from [TLS13_ADDED_CLIENTFINISHED] to [TLS13_SENT_CLIENTFLIGHT2] ## state=[TLS13_SENT_CLIENTFLIGHT2] > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Master secret : d40b6771ed44d833a4c2366ec29a086859ea6665826ad5bf9577a8c7a99b8c2c > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 2e6b411ff58efea3e7df3068b169927efd1cdc6f1e39a389e4d12443a01d8f7b > > You may send data or use 'quit'. switching from [TLS13_SENT_CLIENTFLIGHT2] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [tls13_WAITING_CLIENTFLIGHT2] to [tls13_RECEIVED_CLIENTFLIGHT2] ## state=[tls13_RECEIVED_CLIENTFLIGHT2] Condition [tls13_should_handle_ClientFlight2] not taken Condition [tls13_should_handle_Alert_from_ClientCertificate] not taken Condition [tls13_should_handle_ClientCCS] not taken Condition [tls13_no_ClientCertificate] taken to state [TLS13_HANDLED_CLIENTFINISHED] switching from [tls13_RECEIVED_CLIENTFLIGHT2] to [TLS13_HANDLED_CLIENTFINISHED] ## state=[TLS13_HANDLED_CLIENTFINISHED] > TLS handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Negotiated sig_alg : sha256+rsaepss > Master secret : d40b6771ed44d833a4c2366ec29a086859ea6665826ad5bf9577a8c7a99b8c2c > Resumption master secret : 2e6b411ff58efea3e7df3068b169927efd1cdc6f1e39a389e4d12443a01d8f7b > > Will now act as a simple echo server. switching from [TLS13_HANDLED_CLIENTFINISHED] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_1305_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_1305_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735567032576) Testing for output: 'TestC_1305_data' Found: TestC_1305_data switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735558578432) Client running, waiting... (True, 'TestC_1305_data') ###(022)=[passed] Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 and x448 >>> test_tls_client("1305", "0304", curve="x448") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735475085568] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... > Accepted connection from 127.0.0.1:49322 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Starting control thread [tid=140735466631424] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [TLS13_START] ## state=[TLS13_START] Condition [tls13_should_add_ClientHello] taken to state [TLS13_ADDED_CLIENTHELLO] switching from [TLS13_START] to [TLS13_ADDED_CLIENTHELLO] ## state=[TLS13_ADDED_CLIENTHELLO] switching from [TLS13_ADDED_CLIENTHELLO] to [TLS13_SENDING_CLIENTFLIGHT1] ## state=[TLS13_SENDING_CLIENTFLIGHT1] Condition [tls13_should_send_ClientFlight1] taken to state [TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENDING_CLIENTFLIGHT1] to [TLS13_SENT_CLIENTFLIGHT1] ## state=[TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENT_CLIENTFLIGHT1] to [TLS13_WAITING_SERVERFLIGHT1] ## state=[TLS13_WAITING_SERVERFLIGHT1] > Accepted connection from 127.0.0.1:49336 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] taken to state [tls13_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [tls13_HANDLED_CLIENTHELLO] ## state=[tls13_HANDLED_CLIENTHELLO] switching from [tls13_HANDLED_CLIENTHELLO] to [tls13_PREPARE_SERVERFLIGHT1] ## state=[tls13_PREPARE_SERVERFLIGHT1] Condition [tls13_should_add_ServerHello] taken to state [tls13_ADDED_SERVERHELLO] switching from [tls13_PREPARE_SERVERFLIGHT1] to [tls13_ADDED_SERVERHELLO] ## state=[tls13_ADDED_SERVERHELLO] Condition [tls13_should_add_EncryptedExtensions] taken to state [tls13_ADDED_ENCRYPTEDEXTENSIONS] switching from [tls13_ADDED_SERVERHELLO] to [tls13_ADDED_ENCRYPTEDEXTENSIONS] ## state=[tls13_ADDED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_add_CertificateRequest] taken to state [tls13_ADDED_CERTIFICATEREQUEST] switching from [tls13_ADDED_ENCRYPTEDEXTENSIONS] to [tls13_ADDED_CERTIFICATEREQUEST] ## state=[tls13_ADDED_CERTIFICATEREQUEST] Condition [tls13_should_add_Certificate] taken to state [tls13_ADDED_CERTIFICATE] switching from [tls13_ADDED_CERTIFICATEREQUEST] to [tls13_ADDED_CERTIFICATE] ## state=[tls13_ADDED_CERTIFICATE] Condition [tls13_should_add_CertificateVerifiy] taken to state [tls13_ADDED_CERTIFICATEVERIFY] switching from [tls13_ADDED_CERTIFICATE] to [tls13_ADDED_CERTIFICATEVERIFY] ## state=[tls13_ADDED_CERTIFICATEVERIFY] Condition [tls13_should_add_Finished] taken to state [tls13_ADDED_SERVERFINISHED] switching from [tls13_ADDED_CERTIFICATEVERIFY] to [tls13_ADDED_SERVERFINISHED] ## state=[tls13_ADDED_SERVERFINISHED] Condition [tls13_should_send_ServerFlight1] taken to state [tls13_WAITING_CLIENTFLIGHT2] switching from [tls13_ADDED_SERVERFINISHED] to [tls13_WAITING_CLIENTFLIGHT2] ## state=[tls13_WAITING_CLIENTFLIGHT2] switching from [TLS13_WAITING_SERVERFLIGHT1] to [TLS13_RECEIVED_SERVERFLIGHT1] ## state=[TLS13_RECEIVED_SERVERFLIGHT1] Condition [tls13_should_handle_ServerHello] taken to state [TLS13_HANDLED_SERVERHELLO] switching from [TLS13_RECEIVED_SERVERFLIGHT1] to [TLS13_HANDLED_SERVERHELLO] ## state=[TLS13_HANDLED_SERVERHELLO] Condition [tls13_should_handle_encrytpedExtensions] taken to state [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] switching from [TLS13_HANDLED_SERVERHELLO] to [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] ## state=[TLS13_HANDLED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_handle_certificateRequest_from_encryptedExtensions] not taken Condition [tls13_should_handle_certificate_from_encryptedExtensions] taken to state [TLS13_HANDLED_CERTIFICATE] switching from [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] to [TLS13_HANDLED_CERTIFICATE] ## state=[TLS13_HANDLED_CERTIFICATE] Condition [tls13_should_handle_CertificateVerify] taken to state [TLS13_HANDLED_CERTIFICATE_VERIFY] switching from [TLS13_HANDLED_CERTIFICATE] to [TLS13_HANDLED_CERTIFICATE_VERIFY] ## state=[TLS13_HANDLED_CERTIFICATE_VERIFY] Condition [tls13_should_handle_finished] taken to state [TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_CERTIFICATE_VERIFY] to [TLS13_HANDLED_FINISHED] ## state=[TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_FINISHED] to [TLS13_PREPARE_CLIENTFLIGHT2] ## state=[TLS13_PREPARE_CLIENTFLIGHT2] Condition [tls13_should_add_ClientCertificate] not taken Condition [tls13_should_add_ClientFinished] taken to state [TLS13_ADDED_CLIENTFINISHED] switching from [TLS13_PREPARE_CLIENTFLIGHT2] to [TLS13_ADDED_CLIENTFINISHED] ## state=[TLS13_ADDED_CLIENTFINISHED] Condition [tls13_should_send_ClientFlight2] taken to state [TLS13_SENT_CLIENTFLIGHT2] switching from [TLS13_ADDED_CLIENTFINISHED] to [TLS13_SENT_CLIENTFLIGHT2] ## state=[TLS13_SENT_CLIENTFLIGHT2] > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Master secret : a419d6956d77d935ea609fb441eeaa8245a5b41129339de29dfd0fee2342cf83 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 38b866e7dca79b877246cb268643eec08386128ec8e9500762119c31d69970c7 > > You may send data or use 'quit'. switching from [TLS13_SENT_CLIENTFLIGHT2] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [tls13_WAITING_CLIENTFLIGHT2] to [tls13_RECEIVED_CLIENTFLIGHT2] ## state=[tls13_RECEIVED_CLIENTFLIGHT2] Condition [tls13_should_handle_ClientFlight2] not taken Condition [tls13_should_handle_Alert_from_ClientCertificate] not taken Condition [tls13_should_handle_ClientCCS] not taken Condition [tls13_no_ClientCertificate] taken to state [TLS13_HANDLED_CLIENTFINISHED] switching from [tls13_RECEIVED_CLIENTFLIGHT2] to [TLS13_HANDLED_CLIENTFINISHED] ## state=[TLS13_HANDLED_CLIENTFINISHED] > TLS handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Negotiated sig_alg : sha256+rsaepss > Master secret : a419d6956d77d935ea609fb441eeaa8245a5b41129339de29dfd0fee2342cf83 > Resumption master secret : 38b866e7dca79b877246cb268643eec08386128ec8e9500762119c31d69970c7 > > Will now act as a simple echo server. switching from [TLS13_HANDLED_CLIENTFINISHED] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_1305_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_1305_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735475085568) switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Testing for output: 'TestC_1305_data' Found: TestC_1305_data Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735466631424) Client running, waiting... (True, 'TestC_1305_data') ###(023)=[passed] Testing TLS server and client with TLS 1.3 and a retry >>> test_tls_client("1302", "0304", curve="secp256r1", cookie=True) Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735458177280] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... > Accepted connection from 127.0.0.1:49354 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Starting control thread [tid=140735449723136] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [TLS13_START] ## state=[TLS13_START] Condition [tls13_should_add_ClientHello] taken to state [TLS13_ADDED_CLIENTHELLO] switching from [TLS13_START] to [TLS13_ADDED_CLIENTHELLO] ## state=[TLS13_ADDED_CLIENTHELLO] switching from [TLS13_ADDED_CLIENTHELLO] to [TLS13_SENDING_CLIENTFLIGHT1] ## state=[TLS13_SENDING_CLIENTFLIGHT1] Condition [tls13_should_send_ClientFlight1] taken to state [TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENDING_CLIENTFLIGHT1] to [TLS13_SENT_CLIENTFLIGHT1] ## state=[TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENT_CLIENTFLIGHT1] to [TLS13_WAITING_SERVERFLIGHT1] ## state=[TLS13_WAITING_SERVERFLIGHT1] > Accepted connection from 127.0.0.1:49356 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] taken to state [tls13_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [tls13_HANDLED_CLIENTHELLO] ## state=[tls13_HANDLED_CLIENTHELLO] switching from [tls13_HANDLED_CLIENTHELLO] to [tls13_PREPARE_SERVERFLIGHT1] ## state=[tls13_PREPARE_SERVERFLIGHT1] Condition [tls13_should_add_ServerHello] taken to state [tls13_ADDED_SERVERHELLO] switching from [tls13_PREPARE_SERVERFLIGHT1] to [tls13_ADDED_SERVERHELLO] ## state=[tls13_ADDED_SERVERHELLO] Condition [tls13_should_add_EncryptedExtensions] taken to state [tls13_ADDED_ENCRYPTEDEXTENSIONS] switching from [tls13_ADDED_SERVERHELLO] to [tls13_ADDED_ENCRYPTEDEXTENSIONS] ## state=[tls13_ADDED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_add_CertificateRequest] taken to state [tls13_ADDED_CERTIFICATEREQUEST] switching from [tls13_ADDED_ENCRYPTEDEXTENSIONS] to [tls13_ADDED_CERTIFICATEREQUEST] ## state=[tls13_ADDED_CERTIFICATEREQUEST] Condition [tls13_should_add_Certificate] taken to state [tls13_ADDED_CERTIFICATE] switching from [tls13_ADDED_CERTIFICATEREQUEST] to [tls13_ADDED_CERTIFICATE] ## state=[tls13_ADDED_CERTIFICATE] Condition [tls13_should_add_CertificateVerifiy] taken to state [tls13_ADDED_CERTIFICATEVERIFY] switching from [tls13_ADDED_CERTIFICATE] to [tls13_ADDED_CERTIFICATEVERIFY] ## state=[tls13_ADDED_CERTIFICATEVERIFY] Condition [tls13_should_add_Finished] taken to state [tls13_ADDED_SERVERFINISHED] switching from [tls13_ADDED_CERTIFICATEVERIFY] to [tls13_ADDED_SERVERFINISHED] ## state=[tls13_ADDED_SERVERFINISHED] Condition [tls13_should_send_ServerFlight1] taken to state [tls13_WAITING_CLIENTFLIGHT2] switching from [tls13_ADDED_SERVERFINISHED] to [tls13_WAITING_CLIENTFLIGHT2] ## state=[tls13_WAITING_CLIENTFLIGHT2] switching from [TLS13_WAITING_SERVERFLIGHT1] to [TLS13_RECEIVED_SERVERFLIGHT1] ## state=[TLS13_RECEIVED_SERVERFLIGHT1] Condition [tls13_should_handle_ServerHello] taken to state [TLS13_HANDLED_SERVERHELLO] switching from [TLS13_RECEIVED_SERVERFLIGHT1] to [TLS13_HANDLED_SERVERHELLO] ## state=[TLS13_HANDLED_SERVERHELLO] Condition [tls13_should_handle_encrytpedExtensions] taken to state [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] switching from [TLS13_HANDLED_SERVERHELLO] to [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] ## state=[TLS13_HANDLED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_handle_certificateRequest_from_encryptedExtensions] not taken Condition [tls13_should_handle_certificate_from_encryptedExtensions] taken to state [TLS13_HANDLED_CERTIFICATE] switching from [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] to [TLS13_HANDLED_CERTIFICATE] ## state=[TLS13_HANDLED_CERTIFICATE] Condition [tls13_should_handle_CertificateVerify] taken to state [TLS13_HANDLED_CERTIFICATE_VERIFY] switching from [TLS13_HANDLED_CERTIFICATE] to [TLS13_HANDLED_CERTIFICATE_VERIFY] ## state=[TLS13_HANDLED_CERTIFICATE_VERIFY] Condition [tls13_should_handle_finished] taken to state [TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_CERTIFICATE_VERIFY] to [TLS13_HANDLED_FINISHED] ## state=[TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_FINISHED] to [TLS13_PREPARE_CLIENTFLIGHT2] ## state=[TLS13_PREPARE_CLIENTFLIGHT2] Condition [tls13_should_add_ClientCertificate] not taken Condition [tls13_should_add_ClientFinished] taken to state [TLS13_ADDED_CLIENTFINISHED] switching from [TLS13_PREPARE_CLIENTFLIGHT2] to [TLS13_ADDED_CLIENTFINISHED] ## state=[TLS13_ADDED_CLIENTFINISHED] Condition [tls13_should_send_ClientFlight2] taken to state [TLS13_SENT_CLIENTFLIGHT2] switching from [TLS13_ADDED_CLIENTFINISHED] to [TLS13_SENT_CLIENTFLIGHT2] ## state=[TLS13_SENT_CLIENTFLIGHT2] > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_256_GCM_SHA384 > Server temp key : x25519 > Master secret : 8b4858a1c660fa07db048cc7ee63b1e54fe17dcb466e7f41fe055713231d9789ec4cbd20758c5fa1b65ba0679c652e19 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 38340292e2e226da62747be0186cce9edfa322227d4e45bd071bb27505392b335f9e3e761b490122b69466bc573cf106 > > You may send data or use 'quit'. switching from [TLS13_SENT_CLIENTFLIGHT2] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [tls13_WAITING_CLIENTFLIGHT2] to [tls13_RECEIVED_CLIENTFLIGHT2] ## state=[tls13_RECEIVED_CLIENTFLIGHT2] Condition [tls13_should_handle_ClientFlight2] not taken Condition [tls13_should_handle_Alert_from_ClientCertificate] not taken Condition [tls13_should_handle_ClientCCS] not taken Condition [tls13_no_ClientCertificate] taken to state [TLS13_HANDLED_CLIENTFINISHED] switching from [tls13_RECEIVED_CLIENTFLIGHT2] to [TLS13_HANDLED_CLIENTFINISHED] ## state=[TLS13_HANDLED_CLIENTFINISHED] > TLS handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_256_GCM_SHA384 > Server temp key : x25519 > Negotiated sig_alg : sha256+rsaepss > Master secret : 8b4858a1c660fa07db048cc7ee63b1e54fe17dcb466e7f41fe055713231d9789ec4cbd20758c5fa1b65ba0679c652e19 > Resumption master secret : 38340292e2e226da62747be0186cce9edfa322227d4e45bd071bb27505392b335f9e3e761b490122b69466bc573cf106 > > Will now act as a simple echo server. switching from [TLS13_HANDLED_CLIENTFINISHED] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_1302_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_1302_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735458177280) switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735449723136) Client running, waiting... Testing for output: 'TestC_1302_data' Found: TestC_1302_data (True, 'TestC_1302_data') ###(024)=[passed] Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 with Ed25519-signed cert >>> test_tls_client("1305", "0304", sigalgo="ed25519") Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key_ed25519.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert_ed25519.pem Synchronising... Starting control thread [tid=140735466631424] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... Starting control thread [tid=140735475085568] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [TLS13_START] ## state=[TLS13_START] Condition [tls13_should_add_ClientHello] taken to state [TLS13_ADDED_CLIENTHELLO] switching from [TLS13_START] to [TLS13_ADDED_CLIENTHELLO] ## state=[TLS13_ADDED_CLIENTHELLO] switching from [TLS13_ADDED_CLIENTHELLO] to [TLS13_SENDING_CLIENTFLIGHT1] ## state=[TLS13_SENDING_CLIENTFLIGHT1] Condition [tls13_should_send_ClientFlight1] taken to state [TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENDING_CLIENTFLIGHT1] to [TLS13_SENT_CLIENTFLIGHT1] ## state=[TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENT_CLIENTFLIGHT1] to [TLS13_WAITING_SERVERFLIGHT1] ## state=[TLS13_WAITING_SERVERFLIGHT1] > Accepted connection from 127.0.0.1:49416 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 > Accepted connection from 127.0.0.1:49430 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] taken to state [tls13_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [tls13_HANDLED_CLIENTHELLO] ## state=[tls13_HANDLED_CLIENTHELLO] switching from [tls13_HANDLED_CLIENTHELLO] to [tls13_PREPARE_SERVERFLIGHT1] ## state=[tls13_PREPARE_SERVERFLIGHT1] Condition [tls13_should_add_ServerHello] taken to state [tls13_ADDED_SERVERHELLO] switching from [tls13_PREPARE_SERVERFLIGHT1] to [tls13_ADDED_SERVERHELLO] ## state=[tls13_ADDED_SERVERHELLO] Condition [tls13_should_add_EncryptedExtensions] taken to state [tls13_ADDED_ENCRYPTEDEXTENSIONS] switching from [tls13_ADDED_SERVERHELLO] to [tls13_ADDED_ENCRYPTEDEXTENSIONS] ## state=[tls13_ADDED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_add_CertificateRequest] taken to state [tls13_ADDED_CERTIFICATEREQUEST] switching from [tls13_ADDED_ENCRYPTEDEXTENSIONS] to [tls13_ADDED_CERTIFICATEREQUEST] ## state=[tls13_ADDED_CERTIFICATEREQUEST] Condition [tls13_should_add_Certificate] taken to state [tls13_ADDED_CERTIFICATE] switching from [tls13_ADDED_CERTIFICATEREQUEST] to [tls13_ADDED_CERTIFICATE] ## state=[tls13_ADDED_CERTIFICATE] Condition [tls13_should_add_CertificateVerifiy] taken to state [tls13_ADDED_CERTIFICATEVERIFY] switching from [tls13_ADDED_CERTIFICATE] to [tls13_ADDED_CERTIFICATEVERIFY] ## state=[tls13_ADDED_CERTIFICATEVERIFY] Condition [tls13_should_add_Finished] taken to state [tls13_ADDED_SERVERFINISHED] switching from [tls13_ADDED_CERTIFICATEVERIFY] to [tls13_ADDED_SERVERFINISHED] ## state=[tls13_ADDED_SERVERFINISHED] Condition [tls13_should_send_ServerFlight1] taken to state [tls13_WAITING_CLIENTFLIGHT2] switching from [tls13_ADDED_SERVERFINISHED] to [tls13_WAITING_CLIENTFLIGHT2] ## state=[tls13_WAITING_CLIENTFLIGHT2] switching from [TLS13_WAITING_SERVERFLIGHT1] to [TLS13_RECEIVED_SERVERFLIGHT1] ## state=[TLS13_RECEIVED_SERVERFLIGHT1] Condition [tls13_should_handle_ServerHello] taken to state [TLS13_HANDLED_SERVERHELLO] switching from [TLS13_RECEIVED_SERVERFLIGHT1] to [TLS13_HANDLED_SERVERHELLO] ## state=[TLS13_HANDLED_SERVERHELLO] Condition [tls13_should_handle_encrytpedExtensions] taken to state [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] switching from [TLS13_HANDLED_SERVERHELLO] to [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] ## state=[TLS13_HANDLED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_handle_certificateRequest_from_encryptedExtensions] not taken Condition [tls13_should_handle_certificate_from_encryptedExtensions] taken to state [TLS13_HANDLED_CERTIFICATE] switching from [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] to [TLS13_HANDLED_CERTIFICATE] ## state=[TLS13_HANDLED_CERTIFICATE] Condition [tls13_should_handle_CertificateVerify] taken to state [TLS13_HANDLED_CERTIFICATE_VERIFY] switching from [TLS13_HANDLED_CERTIFICATE] to [TLS13_HANDLED_CERTIFICATE_VERIFY] ## state=[TLS13_HANDLED_CERTIFICATE_VERIFY] Condition [tls13_should_handle_finished] taken to state [TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_CERTIFICATE_VERIFY] to [TLS13_HANDLED_FINISHED] ## state=[TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_FINISHED] to [TLS13_PREPARE_CLIENTFLIGHT2] ## state=[TLS13_PREPARE_CLIENTFLIGHT2] Condition [tls13_should_add_ClientCertificate] not taken Condition [tls13_should_add_ClientFinished] taken to state [TLS13_ADDED_CLIENTFINISHED] switching from [TLS13_PREPARE_CLIENTFLIGHT2] to [TLS13_ADDED_CLIENTFINISHED] ## state=[TLS13_ADDED_CLIENTFINISHED] Condition [tls13_should_send_ClientFlight2] taken to state [TLS13_SENT_CLIENTFLIGHT2] switching from [TLS13_ADDED_CLIENTFINISHED] to [TLS13_SENT_CLIENTFLIGHT2] ## state=[TLS13_SENT_CLIENTFLIGHT2] > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Master secret : bae7d5ec91031e35592fcf7f746b0403177addb2a32c5ad630b40ac40c4fdc97 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : ced5af402b8c1a127f1fa3ba8740707cdd274fbb14c0fb50b5297355a9ca6cd3 > > You may send data or use 'quit'. switching from [TLS13_SENT_CLIENTFLIGHT2] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [tls13_WAITING_CLIENTFLIGHT2] to [tls13_RECEIVED_CLIENTFLIGHT2] ## state=[tls13_RECEIVED_CLIENTFLIGHT2] Condition [tls13_should_handle_ClientFlight2] not taken Condition [tls13_should_handle_Alert_from_ClientCertificate] not taken Condition [tls13_should_handle_ClientCCS] not taken Condition [tls13_no_ClientCertificate] taken to state [TLS13_HANDLED_CLIENTFINISHED] switching from [tls13_RECEIVED_CLIENTFLIGHT2] to [TLS13_HANDLED_CLIENTFINISHED] ## state=[TLS13_HANDLED_CLIENTFINISHED] > TLS handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Negotiated sig_alg : ed25519 > Master secret : bae7d5ec91031e35592fcf7f746b0403177addb2a32c5ad630b40ac40c4fdc97 > Resumption master secret : ced5af402b8c1a127f1fa3ba8740707cdd274fbb14c0fb50b5297355a9ca6cd3 > > Will now act as a simple echo server. switching from [TLS13_HANDLED_CLIENTFINISHED] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_1305_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_1305_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735466631424) switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735475085568) Testing for output: 'TestC_1305_data' Found: TestC_1305_data Client running, waiting... (True, 'TestC_1305_data') ###(025)=[passed] Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 and client auth >>> test_tls_client("1305", "0304", client_auth=True) Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735974207744] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... > Accepted connection from 127.0.0.1:49456 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Starting control thread [tid=140735957299456] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [TLS13_START] ## state=[TLS13_START] Condition [tls13_should_add_ClientHello] taken to state [TLS13_ADDED_CLIENTHELLO] switching from [TLS13_START] to [TLS13_ADDED_CLIENTHELLO] ## state=[TLS13_ADDED_CLIENTHELLO] switching from [TLS13_ADDED_CLIENTHELLO] to [TLS13_SENDING_CLIENTFLIGHT1] ## state=[TLS13_SENDING_CLIENTFLIGHT1] Condition [tls13_should_send_ClientFlight1] taken to state [TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENDING_CLIENTFLIGHT1] to [TLS13_SENT_CLIENTFLIGHT1] ## state=[TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENT_CLIENTFLIGHT1] to [TLS13_WAITING_SERVERFLIGHT1] ## state=[TLS13_WAITING_SERVERFLIGHT1] > Accepted connection from 127.0.0.1:49458 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] taken to state [tls13_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [tls13_HANDLED_CLIENTHELLO] ## state=[tls13_HANDLED_CLIENTHELLO] switching from [tls13_HANDLED_CLIENTHELLO] to [tls13_PREPARE_SERVERFLIGHT1] ## state=[tls13_PREPARE_SERVERFLIGHT1] Condition [tls13_should_add_ServerHello] taken to state [tls13_ADDED_SERVERHELLO] switching from [tls13_PREPARE_SERVERFLIGHT1] to [tls13_ADDED_SERVERHELLO] ## state=[tls13_ADDED_SERVERHELLO] Condition [tls13_should_add_EncryptedExtensions] taken to state [tls13_ADDED_ENCRYPTEDEXTENSIONS] switching from [tls13_ADDED_SERVERHELLO] to [tls13_ADDED_ENCRYPTEDEXTENSIONS] ## state=[tls13_ADDED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_add_CertificateRequest] taken to state [tls13_ADDED_CERTIFICATEREQUEST] switching from [tls13_ADDED_ENCRYPTEDEXTENSIONS] to [tls13_ADDED_CERTIFICATEREQUEST] ## state=[tls13_ADDED_CERTIFICATEREQUEST] Condition [tls13_should_add_Certificate] taken to state [tls13_ADDED_CERTIFICATE] switching from [tls13_ADDED_CERTIFICATEREQUEST] to [tls13_ADDED_CERTIFICATE] ## state=[tls13_ADDED_CERTIFICATE] Condition [tls13_should_add_CertificateVerifiy] taken to state [tls13_ADDED_CERTIFICATEVERIFY] switching from [tls13_ADDED_CERTIFICATE] to [tls13_ADDED_CERTIFICATEVERIFY] ## state=[tls13_ADDED_CERTIFICATEVERIFY] Condition [tls13_should_add_Finished] taken to state [tls13_ADDED_SERVERFINISHED] switching from [tls13_ADDED_CERTIFICATEVERIFY] to [tls13_ADDED_SERVERFINISHED] ## state=[tls13_ADDED_SERVERFINISHED] Condition [tls13_should_send_ServerFlight1] taken to state [tls13_WAITING_CLIENTFLIGHT2] switching from [tls13_ADDED_SERVERFINISHED] to [tls13_WAITING_CLIENTFLIGHT2] ## state=[tls13_WAITING_CLIENTFLIGHT2] switching from [TLS13_WAITING_SERVERFLIGHT1] to [TLS13_RECEIVED_SERVERFLIGHT1] ## state=[TLS13_RECEIVED_SERVERFLIGHT1] Condition [tls13_should_handle_ServerHello] taken to state [TLS13_HANDLED_SERVERHELLO] switching from [TLS13_RECEIVED_SERVERFLIGHT1] to [TLS13_HANDLED_SERVERHELLO] ## state=[TLS13_HANDLED_SERVERHELLO] Condition [tls13_should_handle_encrytpedExtensions] taken to state [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] switching from [TLS13_HANDLED_SERVERHELLO] to [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] ## state=[TLS13_HANDLED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_handle_certificateRequest_from_encryptedExtensions] taken to state [TLS13_HANDLED_CERTIFICATEREQUEST] switching from [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] to [TLS13_HANDLED_CERTIFICATEREQUEST] ## state=[TLS13_HANDLED_CERTIFICATEREQUEST] Condition [tls13_should_handle_Certificate_from_CertificateRequest] taken to state [TLS13_HANDLED_CERTIFICATE] switching from [TLS13_HANDLED_CERTIFICATEREQUEST] to [TLS13_HANDLED_CERTIFICATE] ## state=[TLS13_HANDLED_CERTIFICATE] Condition [tls13_should_handle_CertificateVerify] taken to state [TLS13_HANDLED_CERTIFICATE_VERIFY] switching from [TLS13_HANDLED_CERTIFICATE] to [TLS13_HANDLED_CERTIFICATE_VERIFY] ## state=[TLS13_HANDLED_CERTIFICATE_VERIFY] Condition [tls13_should_handle_finished] taken to state [TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_CERTIFICATE_VERIFY] to [TLS13_HANDLED_FINISHED] ## state=[TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_FINISHED] to [TLS13_PREPARE_CLIENTFLIGHT2] ## state=[TLS13_PREPARE_CLIENTFLIGHT2] Condition [tls13_should_add_ClientCertificate] taken to state [TLS13_ADDED_CLIENTCERTIFICATE] switching from [TLS13_PREPARE_CLIENTFLIGHT2] to [TLS13_ADDED_CLIENTCERTIFICATE] ## state=[TLS13_ADDED_CLIENTCERTIFICATE] Condition [tls13_should_skip_ClientCertificateVerify] not taken Condition [tls13_should_add_ClientCertificateVerify] taken to state [TLS13_ADDED_CERTIFICATEVERIFY] switching from [TLS13_ADDED_CLIENTCERTIFICATE] to [TLS13_ADDED_CERTIFICATEVERIFY] ## state=[TLS13_ADDED_CERTIFICATEVERIFY] switching from [TLS13_ADDED_CERTIFICATEVERIFY] to [TLS13_ADDED_CLIENTFINISHED] ## state=[TLS13_ADDED_CLIENTFINISHED] Condition [tls13_should_send_ClientFlight2] taken to state [TLS13_SENT_CLIENTFLIGHT2] switching from [TLS13_ADDED_CLIENTFINISHED] to [TLS13_SENT_CLIENTFLIGHT2] ## state=[TLS13_SENT_CLIENTFLIGHT2] > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Master secret : 1a837cf5cba5928b13e380df255e6d2b212ba08a690bc7135090e717f49deb0b > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 5c6e60494c05a46570fbbd8af00a44b83d48ea5448a154d3a02b0431a8b86910 > > You may send data or use 'quit'. switching from [TLS13_SENT_CLIENTFLIGHT2] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [tls13_WAITING_CLIENTFLIGHT2] to [tls13_RECEIVED_CLIENTFLIGHT2] ## state=[tls13_RECEIVED_CLIENTFLIGHT2] Condition [tls13_should_handle_ClientFlight2] taken to state [TLS13_HANDLED_CLIENTCERTIFICATE] switching from [tls13_RECEIVED_CLIENTFLIGHT2] to [TLS13_HANDLED_CLIENTCERTIFICATE] ## state=[TLS13_HANDLED_CLIENTCERTIFICATE] > Received client certificate chain... Condition [tls13_should_handle_ClientCertificateVerify] taken to state [TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] switching from [TLS13_HANDLED_CLIENTCERTIFICATE] to [TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] ## state=[TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] Condition [tls13_should_handle_ClientFinished] taken to state [TLS13_HANDLED_CLIENTFINISHED] switching from [TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] to [TLS13_HANDLED_CLIENTFINISHED] ## state=[TLS13_HANDLED_CLIENTFINISHED] > TLS handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Negotiated sig_alg : sha256+rsaepss > Master secret : 1a837cf5cba5928b13e380df255e6d2b212ba08a690bc7135090e717f49deb0b > Client certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Client, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 5c6e60494c05a46570fbbd8af00a44b83d48ea5448a154d3a02b0431a8b86910 > > Will now act as a simple echo server. switching from [TLS13_HANDLED_CLIENTFINISHED] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_1305_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_1305_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735974207744) switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735957299456) Testing for output: 'TestC_1305_data' Found: TestC_1305_data Client running, waiting... (True, 'TestC_1305_data') ###(026)=[passed] Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 and key update >>> test_tls_client("1305", "0304", key_update=True) Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735802175744] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... > Accepted connection from 127.0.0.1:49472 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Starting control thread [tid=140735793721600] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [TLS13_START] ## state=[TLS13_START] Condition [tls13_should_add_ClientHello] taken to state [TLS13_ADDED_CLIENTHELLO] switching from [TLS13_START] to [TLS13_ADDED_CLIENTHELLO] ## state=[TLS13_ADDED_CLIENTHELLO] switching from [TLS13_ADDED_CLIENTHELLO] to [TLS13_SENDING_CLIENTFLIGHT1] ## state=[TLS13_SENDING_CLIENTFLIGHT1] Condition [tls13_should_send_ClientFlight1] taken to state [TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENDING_CLIENTFLIGHT1] to [TLS13_SENT_CLIENTFLIGHT1] ## state=[TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENT_CLIENTFLIGHT1] to [TLS13_WAITING_SERVERFLIGHT1] ## state=[TLS13_WAITING_SERVERFLIGHT1] > Accepted connection from 127.0.0.1:49480 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] taken to state [tls13_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [tls13_HANDLED_CLIENTHELLO] ## state=[tls13_HANDLED_CLIENTHELLO] switching from [tls13_HANDLED_CLIENTHELLO] to [tls13_PREPARE_SERVERFLIGHT1] ## state=[tls13_PREPARE_SERVERFLIGHT1] Condition [tls13_should_add_ServerHello] taken to state [tls13_ADDED_SERVERHELLO] switching from [tls13_PREPARE_SERVERFLIGHT1] to [tls13_ADDED_SERVERHELLO] ## state=[tls13_ADDED_SERVERHELLO] Condition [tls13_should_add_EncryptedExtensions] taken to state [tls13_ADDED_ENCRYPTEDEXTENSIONS] switching from [tls13_ADDED_SERVERHELLO] to [tls13_ADDED_ENCRYPTEDEXTENSIONS] ## state=[tls13_ADDED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_add_CertificateRequest] taken to state [tls13_ADDED_CERTIFICATEREQUEST] switching from [tls13_ADDED_ENCRYPTEDEXTENSIONS] to [tls13_ADDED_CERTIFICATEREQUEST] ## state=[tls13_ADDED_CERTIFICATEREQUEST] Condition [tls13_should_add_Certificate] taken to state [tls13_ADDED_CERTIFICATE] switching from [tls13_ADDED_CERTIFICATEREQUEST] to [tls13_ADDED_CERTIFICATE] ## state=[tls13_ADDED_CERTIFICATE] Condition [tls13_should_add_CertificateVerifiy] taken to state [tls13_ADDED_CERTIFICATEVERIFY] switching from [tls13_ADDED_CERTIFICATE] to [tls13_ADDED_CERTIFICATEVERIFY] ## state=[tls13_ADDED_CERTIFICATEVERIFY] Condition [tls13_should_add_Finished] taken to state [tls13_ADDED_SERVERFINISHED] switching from [tls13_ADDED_CERTIFICATEVERIFY] to [tls13_ADDED_SERVERFINISHED] ## state=[tls13_ADDED_SERVERFINISHED] Condition [tls13_should_send_ServerFlight1] taken to state [tls13_WAITING_CLIENTFLIGHT2] switching from [tls13_ADDED_SERVERFINISHED] to [tls13_WAITING_CLIENTFLIGHT2] ## state=[tls13_WAITING_CLIENTFLIGHT2] switching from [TLS13_WAITING_SERVERFLIGHT1] to [TLS13_RECEIVED_SERVERFLIGHT1] ## state=[TLS13_RECEIVED_SERVERFLIGHT1] Condition [tls13_should_handle_ServerHello] taken to state [TLS13_HANDLED_SERVERHELLO] switching from [TLS13_RECEIVED_SERVERFLIGHT1] to [TLS13_HANDLED_SERVERHELLO] ## state=[TLS13_HANDLED_SERVERHELLO] Condition [tls13_should_handle_encrytpedExtensions] taken to state [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] switching from [TLS13_HANDLED_SERVERHELLO] to [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] ## state=[TLS13_HANDLED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_handle_certificateRequest_from_encryptedExtensions] not taken Condition [tls13_should_handle_certificate_from_encryptedExtensions] taken to state [TLS13_HANDLED_CERTIFICATE] switching from [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] to [TLS13_HANDLED_CERTIFICATE] ## state=[TLS13_HANDLED_CERTIFICATE] Condition [tls13_should_handle_CertificateVerify] taken to state [TLS13_HANDLED_CERTIFICATE_VERIFY] switching from [TLS13_HANDLED_CERTIFICATE] to [TLS13_HANDLED_CERTIFICATE_VERIFY] ## state=[TLS13_HANDLED_CERTIFICATE_VERIFY] Condition [tls13_should_handle_finished] taken to state [TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_CERTIFICATE_VERIFY] to [TLS13_HANDLED_FINISHED] ## state=[TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_FINISHED] to [TLS13_PREPARE_CLIENTFLIGHT2] ## state=[TLS13_PREPARE_CLIENTFLIGHT2] Condition [tls13_should_add_ClientCertificate] not taken Condition [tls13_should_add_ClientFinished] taken to state [TLS13_ADDED_CLIENTFINISHED] switching from [TLS13_PREPARE_CLIENTFLIGHT2] to [TLS13_ADDED_CLIENTFINISHED] ## state=[TLS13_ADDED_CLIENTFINISHED] Condition [tls13_should_send_ClientFlight2] taken to state [TLS13_SENT_CLIENTFLIGHT2] switching from [TLS13_ADDED_CLIENTFINISHED] to [TLS13_SENT_CLIENTFLIGHT2] ## state=[TLS13_SENT_CLIENTFLIGHT2] > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Master secret : ebe7d054d88a724f98b834250ebf7b81437bf27d4c47cb81c7b8887d883fdb7f > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 564793fd81543b602259693adf864dd0b80f0185ffaf3546e26f1d6ecc5578f9 > > You may send data or use 'quit'. switching from [TLS13_SENT_CLIENTFLIGHT2] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [tls13_WAITING_CLIENTFLIGHT2] to [tls13_RECEIVED_CLIENTFLIGHT2] ## state=[tls13_RECEIVED_CLIENTFLIGHT2] Condition [tls13_should_handle_ClientFlight2] not taken Condition [tls13_should_handle_Alert_from_ClientCertificate] not taken Condition [tls13_should_handle_ClientCCS] not taken Condition [tls13_no_ClientCertificate] taken to state [TLS13_HANDLED_CLIENTFINISHED] switching from [tls13_RECEIVED_CLIENTFLIGHT2] to [TLS13_HANDLED_CLIENTFINISHED] ## state=[TLS13_HANDLED_CLIENTFINISHED] > TLS handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Negotiated sig_alg : sha256+rsaepss > Master secret : ebe7d054d88a724f98b834250ebf7b81437bf27d4c47cb81c7b8887d883fdb7f > Resumption master secret : 564793fd81543b602259693adf864dd0b80f0185ffaf3546e26f1d6ecc5578f9 > > Will now act as a simple echo server. switching from [TLS13_HANDLED_CLIENTFINISHED] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_1305_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_1305_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735802175744) switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: Condition [should_handle_ServerData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_SERVERDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Testing for output: 'TestC_1305_data' Found: TestC_1305_data Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735793721600) Client running, waiting... (True, 'TestC_1305_data') ###(027)=[passed] Testing TLS server and client with TLS 1.3 and TLS_AES_128_CCM_8_SHA256 and session resumption >>> test_tls_client("1305", "0304", client_auth=True, sess_in_out=True) Starting server... Server started ! /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_key.pem /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/scapy/layers/tls/pki/srv_cert.pem Synchronising... Starting control thread [tid=140735770784000] ## state=[INITIAL] > Starting TLS server automaton. > Receiving 'stop_server' will cause a graceful exit. > Interrupting with Ctrl-Z might leave a loose socket hanging. switching from [INITIAL] to [BIND] ## state=[BIND] switching from [BIND] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Thread synchronised Loading client... > Accepted connection from 127.0.0.1:49490 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] > Peer socket closed ! switching from [WAITING_CLIENTFLIGHT1] to [SOCKET_CLOSED] ## state=[SOCKET_CLOSED] switching from [SOCKET_CLOSED] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Starting control thread [tid=140735762329856] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [TLS13_START] ## state=[TLS13_START] Condition [tls13_should_add_ClientHello] taken to state [TLS13_ADDED_CLIENTHELLO] switching from [TLS13_START] to [TLS13_ADDED_CLIENTHELLO] ## state=[TLS13_ADDED_CLIENTHELLO] switching from [TLS13_ADDED_CLIENTHELLO] to [TLS13_SENDING_CLIENTFLIGHT1] ## state=[TLS13_SENDING_CLIENTFLIGHT1] Condition [tls13_should_send_ClientFlight1] taken to state [TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENDING_CLIENTFLIGHT1] to [TLS13_SENT_CLIENTFLIGHT1] ## state=[TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENT_CLIENTFLIGHT1] to [TLS13_WAITING_SERVERFLIGHT1] ## state=[TLS13_WAITING_SERVERFLIGHT1] > Accepted connection from 127.0.0.1:49500 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] taken to state [tls13_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [tls13_HANDLED_CLIENTHELLO] ## state=[tls13_HANDLED_CLIENTHELLO] switching from [tls13_HANDLED_CLIENTHELLO] to [tls13_PREPARE_SERVERFLIGHT1] ## state=[tls13_PREPARE_SERVERFLIGHT1] Condition [tls13_should_add_ServerHello] taken to state [tls13_ADDED_SERVERHELLO] switching from [tls13_PREPARE_SERVERFLIGHT1] to [tls13_ADDED_SERVERHELLO] ## state=[tls13_ADDED_SERVERHELLO] Condition [tls13_should_add_EncryptedExtensions] taken to state [tls13_ADDED_ENCRYPTEDEXTENSIONS] switching from [tls13_ADDED_SERVERHELLO] to [tls13_ADDED_ENCRYPTEDEXTENSIONS] ## state=[tls13_ADDED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_add_CertificateRequest] taken to state [tls13_ADDED_CERTIFICATEREQUEST] switching from [tls13_ADDED_ENCRYPTEDEXTENSIONS] to [tls13_ADDED_CERTIFICATEREQUEST] ## state=[tls13_ADDED_CERTIFICATEREQUEST] Condition [tls13_should_add_Certificate] taken to state [tls13_ADDED_CERTIFICATE] switching from [tls13_ADDED_CERTIFICATEREQUEST] to [tls13_ADDED_CERTIFICATE] ## state=[tls13_ADDED_CERTIFICATE] Condition [tls13_should_add_CertificateVerifiy] taken to state [tls13_ADDED_CERTIFICATEVERIFY] switching from [tls13_ADDED_CERTIFICATE] to [tls13_ADDED_CERTIFICATEVERIFY] ## state=[tls13_ADDED_CERTIFICATEVERIFY] Condition [tls13_should_add_Finished] taken to state [tls13_ADDED_SERVERFINISHED] switching from [tls13_ADDED_CERTIFICATEVERIFY] to [tls13_ADDED_SERVERFINISHED] ## state=[tls13_ADDED_SERVERFINISHED] Condition [tls13_should_send_ServerFlight1] taken to state [tls13_WAITING_CLIENTFLIGHT2] switching from [tls13_ADDED_SERVERFINISHED] to [tls13_WAITING_CLIENTFLIGHT2] ## state=[tls13_WAITING_CLIENTFLIGHT2] switching from [TLS13_WAITING_SERVERFLIGHT1] to [TLS13_RECEIVED_SERVERFLIGHT1] ## state=[TLS13_RECEIVED_SERVERFLIGHT1] Condition [tls13_should_handle_ServerHello] taken to state [TLS13_HANDLED_SERVERHELLO] switching from [TLS13_RECEIVED_SERVERFLIGHT1] to [TLS13_HANDLED_SERVERHELLO] ## state=[TLS13_HANDLED_SERVERHELLO] Condition [tls13_should_handle_encrytpedExtensions] taken to state [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] switching from [TLS13_HANDLED_SERVERHELLO] to [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] ## state=[TLS13_HANDLED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_handle_certificateRequest_from_encryptedExtensions] taken to state [TLS13_HANDLED_CERTIFICATEREQUEST] switching from [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] to [TLS13_HANDLED_CERTIFICATEREQUEST] ## state=[TLS13_HANDLED_CERTIFICATEREQUEST] Condition [tls13_should_handle_Certificate_from_CertificateRequest] taken to state [TLS13_HANDLED_CERTIFICATE] switching from [TLS13_HANDLED_CERTIFICATEREQUEST] to [TLS13_HANDLED_CERTIFICATE] ## state=[TLS13_HANDLED_CERTIFICATE] Condition [tls13_should_handle_CertificateVerify] taken to state [TLS13_HANDLED_CERTIFICATE_VERIFY] switching from [TLS13_HANDLED_CERTIFICATE] to [TLS13_HANDLED_CERTIFICATE_VERIFY] ## state=[TLS13_HANDLED_CERTIFICATE_VERIFY] Condition [tls13_should_handle_finished] taken to state [TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_CERTIFICATE_VERIFY] to [TLS13_HANDLED_FINISHED] ## state=[TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_FINISHED] to [TLS13_PREPARE_CLIENTFLIGHT2] ## state=[TLS13_PREPARE_CLIENTFLIGHT2] Condition [tls13_should_add_ClientCertificate] taken to state [TLS13_ADDED_CLIENTCERTIFICATE] switching from [TLS13_PREPARE_CLIENTFLIGHT2] to [TLS13_ADDED_CLIENTCERTIFICATE] ## state=[TLS13_ADDED_CLIENTCERTIFICATE] Condition [tls13_should_skip_ClientCertificateVerify] not taken Condition [tls13_should_add_ClientCertificateVerify] taken to state [TLS13_ADDED_CERTIFICATEVERIFY] switching from [TLS13_ADDED_CLIENTCERTIFICATE] to [TLS13_ADDED_CERTIFICATEVERIFY] ## state=[TLS13_ADDED_CERTIFICATEVERIFY] switching from [TLS13_ADDED_CERTIFICATEVERIFY] to [TLS13_ADDED_CLIENTFINISHED] ## state=[TLS13_ADDED_CLIENTFINISHED] Condition [tls13_should_send_ClientFlight2] taken to state [TLS13_SENT_CLIENTFLIGHT2] switching from [TLS13_ADDED_CLIENTFINISHED] to [TLS13_SENT_CLIENTFLIGHT2] ## state=[TLS13_SENT_CLIENTFLIGHT2] > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Master secret : 81458e54282fcb0b1246b9d9d959b36a8396230fe6909428f621e31a65b9fc22 > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 26ff2f6086633708eac253f15d53069fe29d2facf5fc34a681c5ce1d39048799 > > You may send data or use 'quit'. switching from [TLS13_SENT_CLIENTFLIGHT2] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [tls13_WAITING_CLIENTFLIGHT2] to [tls13_RECEIVED_CLIENTFLIGHT2] ## state=[tls13_RECEIVED_CLIENTFLIGHT2] Condition [tls13_should_handle_ClientFlight2] taken to state [TLS13_HANDLED_CLIENTCERTIFICATE] switching from [tls13_RECEIVED_CLIENTFLIGHT2] to [TLS13_HANDLED_CLIENTCERTIFICATE] ## state=[TLS13_HANDLED_CLIENTCERTIFICATE] > Received client certificate chain... Condition [tls13_should_handle_ClientCertificateVerify] taken to state [TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] switching from [TLS13_HANDLED_CLIENTCERTIFICATE] to [TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] ## state=[TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] Condition [tls13_should_handle_ClientFinished] taken to state [TLS13_HANDLED_CLIENTFINISHED] switching from [TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] to [TLS13_HANDLED_CLIENTFINISHED] ## state=[TLS13_HANDLED_CLIENTFINISHED] > TLS handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Negotiated sig_alg : sha256+rsaepss > Master secret : 81458e54282fcb0b1246b9d9d959b36a8396230fe6909428f621e31a65b9fc22 > Client certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Client, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 26ff2f6086633708eac253f15d53069fe29d2facf5fc34a681c5ce1d39048799 > > Will now act as a simple echo server. switching from [TLS13_HANDLED_CLIENTFINISHED] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_1305_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_1305_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [WAITING_SERVERDATA] switching from [WAIT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] taken to state [TLS13_RECEIVED_NEW_SESSION_TICKET] switching from [RECEIVED_SERVERDATA] to [TLS13_RECEIVED_NEW_SESSION_TICKET] ## state=[TLS13_RECEIVED_NEW_SESSION_TICKET] > Received a TLS 1.3 NewSessionTicket that was stored to /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/session Condition [should_store_session_ticket_file] taken to state [WAIT_CLIENTDATA] switching from [TLS13_RECEIVED_NEW_SESSION_TICKET] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] not taken Condition [no_more_ClientData] taken to state [CLOSE_NOTIFY] switching from [WAIT_CLIENTDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735762329856) switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Sending a TLSAlert to the client... Condition [close_session] taken to state [WAITING_CLIENT] switching from [CLOSE_NOTIFY] to [WAITING_CLIENT] ## state=[WAITING_CLIENT] > > Waiting for a new client on 127.0.0.1:4433 Loading client... Starting control thread [tid=140735753875712] Running client... ## state=[INITIAL] > Starting TLS client automaton. switching from [INITIAL] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [CONNECT] ## state=[CONNECT] > > Trying to connect on 127.0.0.1:4433 > switching from [CONNECT] to [TLS13_START] ## state=[TLS13_START] Condition [tls13_should_add_ClientHello] taken to state [TLS13_ADDED_CLIENTHELLO] switching from [TLS13_START] to [TLS13_ADDED_CLIENTHELLO] ## state=[TLS13_ADDED_CLIENTHELLO] switching from [TLS13_ADDED_CLIENTHELLO] to [TLS13_SENDING_CLIENTFLIGHT1] ## state=[TLS13_SENDING_CLIENTFLIGHT1] Condition [tls13_should_send_ClientFlight1] taken to state [TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENDING_CLIENTFLIGHT1] to [TLS13_SENT_CLIENTFLIGHT1] ## state=[TLS13_SENT_CLIENTFLIGHT1] switching from [TLS13_SENT_CLIENTFLIGHT1] to [TLS13_WAITING_SERVERFLIGHT1] ## state=[TLS13_WAITING_SERVERFLIGHT1] > Accepted connection from 127.0.0.1:49502 > switching from [WAITING_CLIENT] to [INIT_TLS_SESSION] ## state=[INIT_TLS_SESSION] switching from [INIT_TLS_SESSION] to [WAITING_CLIENTFLIGHT1] ## state=[WAITING_CLIENTFLIGHT1] switching from [WAITING_CLIENTFLIGHT1] to [RECEIVED_CLIENTFLIGHT1] ## state=[RECEIVED_CLIENTFLIGHT1] Condition [tls13_should_handle_ClientHello] taken to state [tls13_HANDLED_CLIENTHELLO] switching from [RECEIVED_CLIENTFLIGHT1] to [tls13_HANDLED_CLIENTHELLO] ## state=[tls13_HANDLED_CLIENTHELLO] switching from [tls13_HANDLED_CLIENTHELLO] to [tls13_PREPARE_SERVERFLIGHT1] ## state=[tls13_PREPARE_SERVERFLIGHT1] Condition [tls13_should_add_ServerHello] taken to state [tls13_ADDED_SERVERHELLO] switching from [tls13_PREPARE_SERVERFLIGHT1] to [tls13_ADDED_SERVERHELLO] ## state=[tls13_ADDED_SERVERHELLO] Condition [tls13_should_add_EncryptedExtensions] taken to state [tls13_ADDED_ENCRYPTEDEXTENSIONS] switching from [tls13_ADDED_SERVERHELLO] to [tls13_ADDED_ENCRYPTEDEXTENSIONS] ## state=[tls13_ADDED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_add_CertificateRequest] taken to state [tls13_ADDED_CERTIFICATEREQUEST] switching from [tls13_ADDED_ENCRYPTEDEXTENSIONS] to [tls13_ADDED_CERTIFICATEREQUEST] ## state=[tls13_ADDED_CERTIFICATEREQUEST] Condition [tls13_should_add_Certificate] taken to state [tls13_ADDED_CERTIFICATE] switching from [tls13_ADDED_CERTIFICATEREQUEST] to [tls13_ADDED_CERTIFICATE] ## state=[tls13_ADDED_CERTIFICATE] Condition [tls13_should_add_CertificateVerifiy] taken to state [tls13_ADDED_CERTIFICATEVERIFY] switching from [tls13_ADDED_CERTIFICATE] to [tls13_ADDED_CERTIFICATEVERIFY] ## state=[tls13_ADDED_CERTIFICATEVERIFY] Condition [tls13_should_add_Finished] taken to state [tls13_ADDED_SERVERFINISHED] switching from [tls13_ADDED_CERTIFICATEVERIFY] to [tls13_ADDED_SERVERFINISHED] ## state=[tls13_ADDED_SERVERFINISHED] Condition [tls13_should_send_ServerFlight1] taken to state [tls13_WAITING_CLIENTFLIGHT2] switching from [tls13_ADDED_SERVERFINISHED] to [tls13_WAITING_CLIENTFLIGHT2] ## state=[tls13_WAITING_CLIENTFLIGHT2] switching from [TLS13_WAITING_SERVERFLIGHT1] to [TLS13_RECEIVED_SERVERFLIGHT1] ## state=[TLS13_RECEIVED_SERVERFLIGHT1] Condition [tls13_should_handle_ServerHello] taken to state [TLS13_HANDLED_SERVERHELLO] switching from [TLS13_RECEIVED_SERVERFLIGHT1] to [TLS13_HANDLED_SERVERHELLO] ## state=[TLS13_HANDLED_SERVERHELLO] Condition [tls13_should_handle_encrytpedExtensions] taken to state [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] switching from [TLS13_HANDLED_SERVERHELLO] to [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] ## state=[TLS13_HANDLED_ENCRYPTEDEXTENSIONS] Condition [tls13_should_handle_certificateRequest_from_encryptedExtensions] taken to state [TLS13_HANDLED_CERTIFICATEREQUEST] switching from [TLS13_HANDLED_ENCRYPTEDEXTENSIONS] to [TLS13_HANDLED_CERTIFICATEREQUEST] ## state=[TLS13_HANDLED_CERTIFICATEREQUEST] Condition [tls13_should_handle_Certificate_from_CertificateRequest] taken to state [TLS13_HANDLED_CERTIFICATE] switching from [TLS13_HANDLED_CERTIFICATEREQUEST] to [TLS13_HANDLED_CERTIFICATE] ## state=[TLS13_HANDLED_CERTIFICATE] Condition [tls13_should_handle_CertificateVerify] taken to state [TLS13_HANDLED_CERTIFICATE_VERIFY] switching from [TLS13_HANDLED_CERTIFICATE] to [TLS13_HANDLED_CERTIFICATE_VERIFY] ## state=[TLS13_HANDLED_CERTIFICATE_VERIFY] Condition [tls13_should_handle_finished] taken to state [TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_CERTIFICATE_VERIFY] to [TLS13_HANDLED_FINISHED] ## state=[TLS13_HANDLED_FINISHED] switching from [TLS13_HANDLED_FINISHED] to [TLS13_PREPARE_CLIENTFLIGHT2] ## state=[TLS13_PREPARE_CLIENTFLIGHT2] Condition [tls13_should_add_ClientCertificate] taken to state [TLS13_ADDED_CLIENTCERTIFICATE] switching from [TLS13_PREPARE_CLIENTFLIGHT2] to [TLS13_ADDED_CLIENTCERTIFICATE] ## state=[TLS13_ADDED_CLIENTCERTIFICATE] Condition [tls13_should_skip_ClientCertificateVerify] not taken Condition [tls13_should_add_ClientCertificateVerify] taken to state [TLS13_ADDED_CERTIFICATEVERIFY] switching from [TLS13_ADDED_CLIENTCERTIFICATE] to [TLS13_ADDED_CERTIFICATEVERIFY] ## state=[TLS13_ADDED_CERTIFICATEVERIFY] switching from [TLS13_ADDED_CERTIFICATEVERIFY] to [TLS13_ADDED_CLIENTFINISHED] ## state=[TLS13_ADDED_CLIENTFINISHED] Condition [tls13_should_send_ClientFlight2] taken to state [TLS13_SENT_CLIENTFLIGHT2] switching from [TLS13_ADDED_CLIENTFINISHED] to [TLS13_SENT_CLIENTFLIGHT2] ## state=[TLS13_SENT_CLIENTFLIGHT2] > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Master secret : 16225ebb6c850933bc05000ab7e6da8fa9ca2ee5e19f2eb5afa523ea48d9ad4f > Server certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Server, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 6f7305430619462bf17dece9d6b16a85d0ec5d1da620bab471e359d3d25cb984 > > You may send data or use 'quit'. switching from [TLS13_SENT_CLIENTFLIGHT2] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [tls13_WAITING_CLIENTFLIGHT2] to [tls13_RECEIVED_CLIENTFLIGHT2] ## state=[tls13_RECEIVED_CLIENTFLIGHT2] Condition [tls13_should_handle_ClientFlight2] taken to state [TLS13_HANDLED_CLIENTCERTIFICATE] switching from [tls13_RECEIVED_CLIENTFLIGHT2] to [TLS13_HANDLED_CLIENTCERTIFICATE] ## state=[TLS13_HANDLED_CLIENTCERTIFICATE] > Received client certificate chain... Condition [tls13_should_handle_ClientCertificateVerify] taken to state [TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] switching from [TLS13_HANDLED_CLIENTCERTIFICATE] to [TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] ## state=[TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] Condition [tls13_should_handle_ClientFinished] taken to state [TLS13_HANDLED_CLIENTFINISHED] switching from [TLS13_HANDLED_CLIENT_CERTIFICATEVERIFY] to [TLS13_HANDLED_CLIENTFINISHED] ## state=[TLS13_HANDLED_CLIENTFINISHED] > TLS handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_CCM_8_SHA256 > Server temp key : x25519 > Negotiated sig_alg : sha256+rsaepss > Master secret : 16225ebb6c850933bc05000ab7e6da8fa9ca2ee5e19f2eb5afa523ea48d9ad4f > Client certificate chain: [[X.509 Cert. Subject:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test Client, Issuer:/C=MN/L=Ulaanbaatar/OU=Scapy Test PKI/CN=Scapy Test CA]] > Resumption master secret : 6f7305430619462bf17dece9d6b16a85d0ec5d1da620bab471e359d3d25cb984 > > Will now act as a simple echo server. switching from [TLS13_HANDLED_CLIENTFINISHED] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'TestC_1305_data' Condition [should_handle_ClientData] taken to state [ADDED_SERVERDATA] switching from [RECEIVED_CLIENTDATA] to [ADDED_SERVERDATA] ## state=[ADDED_SERVERDATA] Condition [should_send_ServerData] taken to state [SENT_SERVERDATA] switching from [ADDED_SERVERDATA] to [SENT_SERVERDATA] ## state=[SENT_SERVERDATA] switching from [SENT_SERVERDATA] to [WAITING_CLIENTDATA] ## state=[WAITING_CLIENTDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] not taken > Received: b'TestC_1305_data' Condition [should_handle_ServerData] taken to state [HANDLED_SERVERDATA] switching from [RECEIVED_SERVERDATA] to [HANDLED_SERVERDATA] ## state=[HANDLED_SERVERDATA] switching from [HANDLED_SERVERDATA] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] taken to state [ADDED_CLIENTDATA] switching from [WAIT_CLIENTDATA] to [ADDED_CLIENTDATA] ## state=[ADDED_CLIENTDATA] Condition [should_send_ClientData] taken to state [SENT_CLIENTDATA] switching from [ADDED_CLIENTDATA] to [SENT_CLIENTDATA] ## state=[SENT_CLIENTDATA] switching from [SENT_CLIENTDATA] to [WAITING_SERVERDATA] ## state=[WAITING_SERVERDATA] switching from [WAITING_SERVERDATA] to [RECEIVED_SERVERDATA] ## state=[RECEIVED_SERVERDATA] Condition [should_handle_CertificateRequest_postauth] not taken Condition [should_handle_NewSessionTicket] taken to state [TLS13_RECEIVED_NEW_SESSION_TICKET] switching from [RECEIVED_SERVERDATA] to [TLS13_RECEIVED_NEW_SESSION_TICKET] ## state=[TLS13_RECEIVED_NEW_SESSION_TICKET] > Ignored TLS 1.3 NewSessionTicket. Condition [should_store_session_ticket_file] taken to state [WAIT_CLIENTDATA] switching from [TLS13_RECEIVED_NEW_SESSION_TICKET] to [WAIT_CLIENTDATA] ## state=[WAIT_CLIENTDATA] Condition [add_ClientData] not taken Condition [no_more_ClientData] taken to state [CLOSE_NOTIFY] switching from [WAIT_CLIENTDATA] to [CLOSE_NOTIFY] ## state=[CLOSE_NOTIFY] > > Trying to send a TLSAlert to the server... Condition [close_session] taken to state [FINAL] switching from [CLOSE_NOTIFY] to [FINAL] ## state=[FINAL] > Closing client socket... > Ending TLS client automaton. Stopping control thread (tid=140735753875712) switching from [WAITING_CLIENTDATA] to [RECEIVED_CLIENTDATA] ## state=[RECEIVED_CLIENTDATA] > Received: b'stop_server' Condition [should_handle_ClientData] taken to state [CLOSE_NOTIFY_FINAL] switching from [RECEIVED_CLIENTDATA] to [CLOSE_NOTIFY_FINAL] ## state=[CLOSE_NOTIFY_FINAL] > > Sending a TLSAlert to the client... Condition [close_session_final] taken to state [FINAL] switching from [CLOSE_NOTIFY_FINAL] to [FINAL] ## state=[FINAL] > Closing server socket... > Ending TLS server automaton. Stopping control thread (tid=140735770784000) Client running, waiting... Testing for output: 'TestC_1305_data' Found: TestC_1305_data (True, 'TestC_1305_data') ###(028)=[passed] Clear session file >>> file_sess = scapy_path("/test/session") >>> try: ... os.remove(file_sess) ... except: ... pass ... ###### ## TLS client automaton tests against builtin ssl using Post Handshake Authentication ###### ###(029)=[passed] Load native server util functions >>> import ssl >>> import contextlib >>> import threading >>> >>> load_layer("tls") >>> load_layer("http") >>> >>> >>> root_ca_cert = hex_bytes("0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949446c7a4343416e2b6741774942416749555664642b794d436278356772635441773335717939337552517841774451594a4b6f5a496876634e4151454c0a42514177577a454c4d416b474131554542684d4351554578436a414942674e564241674d41574578436a414942674e564241634d41574578436a414942674e560a42416f4d41574578436a414942674e564241734d41574578436a414942674e5642414d4d415745784544414f42676b71686b69473977304243514557415745770a4868634e4d6a4d774e5445344d444d7a4d4455305768634e4d7a67774e5445354d444d7a4d445530576a42624d517377435159445651514745774a425154454b0a4d41674741315545434177425954454b4d41674741315545427777425954454b4d41674741315545436777425954454b4d41674741315545437777425954454b0a4d4167474131554541777742595445514d41344743537147534962334451454a4152594259544343415349774451594a4b6f5a496876634e41514542425141440a676745504144434341516f4367674542414a37775a326b6457577a6b6277725838565176743565747a55587737577967664970475038786543483632446979690a354a48546b3352716a6531444362476369566b4b386956746439507852475478764a6a476a49694b686a3545306e304c336542513771466c6567374a6d3147750a507a4154455779456f6a773975513343794c4f76395742374574434e626647476334544f564649635742684e5a5777324e306e37533834546f435a4942366c4e0a4c4c583639646f65684a33372b55457455553159775a4a474d72586a435653502b6f3136436568306c4d466e6553594d6a376c434b49426666525278725765720a354763733577423548574d636d6630626e774471534d78374d566a746f663678506b7570495039526f497977306b324f71516c4543612b4855556451306346590a564a53506d63424b554e6336787254756c346e447136442b6563594f7461754854726c36326e55434177454141614e544d464577485159445652304f424259450a4650786e62526467356a436549742b65556d314342695245583536334d42384741315564497751594d4261414650786e62526467356a436549742b65556d31430a42695245583536334d41384741315564457745422f7751464d414d42416638774451594a4b6f5a496876634e4151454c4251414467674542414876625a7a572b0a767553313239393268774442424a67586938386f426955787459383931556839364e77315876586841685873745338775551643749497a62795251626b6866530a424e6d626f59656e6b6b4272462b37474e696e394630564c516f7a344c67414c566e376c763635414f51554d7357503859694238563841516c6c447a305a2f770a69335a78423631436c50694f4d347a6e4a6a33324263794f50594267456b4a6c695143503854514c68555067504f742f7a4130453873584e56757354563976690a3168356d6e77332f4248572f52524e79496642365938336c5939345a577933754a72514d674352633957344a5076644e564a61494b38694241743258533276740a5665634a4b6942785347474a4564486561774b6a542f5674736b64432b3357696f756430527652716c7745622f4a50686b686553576d4a6b70436545773253720a6e6f64314c4c346b6a574159344c633d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a") >>> rsa_cert = hex_bytes("0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d494944666a4343416d616741774942416749424154414e42676b71686b69473977304241517346414442624d517377435159445651514745774a425154454b0a4d41674741315545434177425954454b4d41674741315545427777425954454b4d41674741315545436777425954454b4d41674741315545437777425954454b0a4d4167474131554541777742595445514d41344743537147534962334451454a4152594259544165467730794d7a41314d5467774d7a51354d445261467730790a4f4441314d5463774d7a51354d4452614d467378437a414a42674e5642415954416b4a434d516f774341594456515149444146694d516f7743415944565151480a444146694d516f77434159445651514b444146694d516f77434159445651514c444146694d516f774341594456515144444146694d5241774467594a4b6f5a490a6876634e41516b42466746694d494942496a414e42676b71686b6947397730424151454641414f43415138414d49494243674b43415145413647667370784a570a655a366231313741312f6f637668303368706e6e366e6b5064487a5a33387956784b4f586a38505a4f4659794d79676a6546742f625a644a6a4b4179716432520a6c4374397a76716b3067306346336552373756457a626b724b6f7a384e73506757566577496e5933436c5633313367666b4e755955652f73666259303448376f0a5455694a73392f524c383975746a444e742b6d7259544f62426e4c7036734546774a646574426f694e6a623767693631363641763471576c50556d5a5331796b0a69386e385867554e5131535a5a4d4776497a4138556148433034684a556c342f4a5944622f51665551715034316464426d3877677252726b553176384136346b0a6a543344334954766f7234516e4b6b61436a32675853486658306e42636e4a644759572f484a38642f426e2b47714f6b324d5a515636656649722b4f6b5948330a7448575753543271676f6c6930514944415141426f303077537a414a42674e5648524d45416a41414d4230474131556444675157424254754631747a507a557a0a6b726471483838483850443354485269637a416642674e5648534d4547444157674254385a323058594f59776e694c666e6c4a745167596b52462b65747a414e0a42676b71686b6947397730424151734641414f4341514541484278614d6d68744a5035524d306b48595932486952755862635677455a2b6a46745968636252460a53484d32562f59526d55576f324f78666236574c727679482f65703552792f525a4c737261426a4e53495749394774462b3457794c305949482b52436e3235550a35316a34724e587269484d5a6c2f796375686d7456496c754a4f4d6a67572b44684b6b4568726e307a674653537654636c797a6843726653556f52595a7a362b0a474e305a705476486f35512f746d72752f6f6c47695a4271464d30554d4e4f4577444251586c68645964365134313479793574616c2f524f4c424b64595949420a534744696b552b356a75764e613761686e6f726365314c5a6d6d6e332b576530673052792f73362f39555135577339336f39635136335458654775773078674b0a7a496744627a38534948634c2b747559784b68364357636b4f436b67366e564e63616b45554c2f3243674b687a413d3d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a") >>> rsa_key = hex_bytes("0a2d2d2d2d2d424547494e2050524956415445204b45592d2d2d2d2d0a4d494945766749424144414e42676b71686b6947397730424151454641415343424b67776767536b41674541416f49424151446f5a2b796e456c5a356e7076580a587344582b68792b485465476d65667165513930664e6e667a4a58456f35655077396b34566a497a4b434e34573339746c306d4d6f444b70335a47554b33334f0a2b71545344527758643548767455544e755373716a507732772b425a56374169646a634b5658665865422b5132356852372b7839746a54676675684e53496d7a0a333945767a3236324d4d3233366174684d35734763756e71775158416c313630476949324e7675434c7258726f432f6970615539535a6c4c584b534c796678650a42513144564a6c6b7761386a4d4478526f634c5469456c53586a386c674e7639423952436f2f6a56313047627a43437447755254572f77447269534e506350630a684f2b697668436371526f4b506142644964396653634679636c305a686238636e783338476634616f365459786c4258703538697634365267666530645a5a4a0a5061714369574c5241674d42414145436767454142756750447342516768446f317475357744617555394774394b6e4f5958665973667444685553726c4754370a3173373436465646624d3259704f73576763543778507054627877477832713179644e77676b364237637045383770464563454669364241795962614a7241320a414e777355726f4c55356a2b425363617a63714e765162365a336141727656457a774532665539394d7a47786c31776e612b6a5152716d4a456f764c466a66310a68584841786e4d6765514f73556c6f506e6833682f4159774b3934385444732b634a4b4a33776a376a6335794a66456e70352f73784268433165356738594f450a563671426c682f702f3462615074757a49726a324d384f44566772304661624945362b537530577a4c6366597a50432b35536930543345673735672f736e666b0a724473703743517a55644973696d3443485432627a44483656775749774271386d4f645961766e592f514b426751442b764d626b414d54714c2f4d482f70614c0a46672f505272322f502b384c745a555247593477414138566c4b4334664342473250544a474837475231546559386e5a466d584878526561534a4667365855690a6153534f484b39586d2f43715962477664624a7553426f42492f6562566264706c504454376143374a52697766704176504d7a516b6552326d36556775516e720a6b49474376584f2f673874525357494e6d68354e5a46364533514b42675144706a732f78783531423753544c386d5946544e7147506a52316669697635684b2b0a492b6255643975585a33527445503078666e682f344f6c682b7a6c664d596b7a49356c376a68384c74326a6b31364978426a38376e774366566c636b5044464d0a516c4f624a676376383632364a5843377745666c3837594e77524d426b5238776964685a774b5052464a79395072315270782b715176507054483633704368770a704f435a7273514d68514b4267472b73334e6936435a6e4e575a4d6f706d446c5642722f6e56484a756f64386e4a5135697438364e324b7a6e4e346a394a5a360a714a3238636c2b4569413153322f7569325134434e7232356b4a7057337259754f41746851664637654c2b4a517264304e72776f4f645a454b566e6338794b440a58437a636f546c4b49772f452f487270416256794d434662544d4953764f6d626d567479714e724e38595636555655374f6f75644d393631416f4742414a4d630a6f5635706e5751704f3051374b6f657349506a74745a314d4764537831707874674c6654787a3157724c38474e48553464433459504f69366c536967797771720a49634878677879654b6a50366e753743514a494e56526349433175486a6f573651573834524d3676626e34526c7a4372724a33724a49454658444e67645954640a54716b3537665745526a58746a74496673704a4d4764615a6d446554377555453958505834535542416f4742414e4466535966544239774330334859415846550a78553554682f763075387a7a2b7235477a586863342b33513446746769336b51743164682f702b47384c764257744b65354d622f6651424c77514154613143330a735837786863612b66553467642f536638526a6a54783634696b413545585147306c6443696a6c4463554c4f5868386d4557574d636b2b333932416648584a740a4a687951526b427a453941664339526f642b61365455686f0a2d2d2d2d2d454e442050524956415445204b45592d2d2d2d2d0a") >>> >>> cafile = get_temp_file() >>> certfile = get_temp_file() >>> keyfile = get_temp_file() >>> >>> with open(cafile, "wb") as fd: ... fd.write(root_ca_cert) ... 1307 >>> with open(certfile, "wb") as fd: ... fd.write(rsa_cert) ... 1274 >>> with open(keyfile, "wb") as fd: ... fd.write(rsa_key) ... 1705 >>> >>> REQS = [ ... HTTP() / HTTPRequest(Path="/a.txt", Host="127.0.0.1:59000") / b"hey1", ... HTTP() / HTTPRequest(Path="/b.txt", Host="127.0.0.1:59000") / b"hey2", ... ] >>> >>> RESPS = [ ... HTTP() / HTTPResponse(Status_Code="401", Reason_Phrase="Unauthorized") / "Please login", ... HTTP() / HTTPResponse(Status_Code="200", Reason_Phrase="OK") / "Welcome", ... ] >>> >>> def run_tls_native_test_server(post_handshake_auth=False, ... with_hello_retry=False): ... # Create ... context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ... context.load_verify_locations(cafile=cafile) ... if post_handshake_auth: ... context.post_handshake_auth = True ... if with_hello_retry: ... context.set_ecdh_curve("prime256v1") ... context.verify_mode = ssl.CERT_REQUIRED ... context.load_cert_chain(certfile=certfile, keyfile=keyfile) ... ... lock = threading.Lock() ... lock.acquire() ... ... def ssl_server(): ... server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ... server.settimeout(1) ... server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... server.bind(("0.0.0.0", 59000)) ... server.listen(5) ... # Sync ... lock.release() ... # Accept socket ... client_socket, addr = server.accept() ... ssl_client_socket = context.wrap_socket(client_socket, server_side=True) ... # Receive / send data ... resp = ssl_client_socket.read(len(REQS[0])) ... assert resp == bytes(REQS[0]) ... ssl_client_socket.send(bytes(RESPS[0])) ... if post_handshake_auth: ... # Post-handshake ... t = ssl_client_socket.verify_client_post_handshake() ... # Receive / send data ... resp = ssl_client_socket.read(len(REQS[1])) ... assert resp == bytes(REQS[1]) ... ssl_client_socket.send(bytes(RESPS[1])) ... # close socket ... try: ... ssl_client_socket.shutdown(socket.SHUT_RDWR) ... finally: ... ssl_client_socket.close() ... try: ... server.shutdown(socket.SHUT_RDWR) ... finally: ... server.close() ... ... server = threading.Thread(target=ssl_server) ... server.start() ... assert lock.acquire(timeout=5), "Server failed to start in time !" ... return server ... >>> >>> def test_tls_client_native(post_handshake_auth=False, ... with_hello_retry=False): ... server = run_tls_native_test_server( ... post_handshake_auth=post_handshake_auth, ... with_hello_retry=with_hello_retry, ... ) ... ... a = TLSClientAutomaton.tlslink( ... HTTP, ... server="127.0.0.1", ... dport=59000, ... version="tls13", ... mycert=certfile, ... mykey=keyfile, ... # we select x25519 but the server enforces seco256r1, so a Hello Retry will be issued ... curve="x25519" if with_hello_retry else None, ... # debug=4, ... ) ... # First request ... pkt = a.sr1(REQS[0], timeout=1, verbose=0) ... assert pkt.load == b"Please login" ... # Second request ... a.send(REQS[1]) ... pkt = a.sr1(REQS[1], timeout=1, verbose=0) ... assert pkt.load == b"Welcome" ... # Close ... a.close() ... # Wait for server to close ... server.join(3) ... assert not server.is_alive() ... ###(030)=[passed] Testing TLS client against ssl.SSLContext server with TLS 1.3 and a post-handshake authentication >>> test_tls_client_native(post_handshake_auth=True) > Starting TLS client automaton. > > Trying to connect on 127.0.0.1:59000 > > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_GCM_SHA256 > Server temp key : x25519 > Master secret : ebb5a1140fe1b82f4956fd5c3d2cd3132acef5c1de5ba32aeb3b3765aaa0e9a7 > Server certificate chain: [[X.509 Cert. Subject:/C=BB/ST=b/L=b/O=b/OU=b/CN=b/emailAddress=b, Issuer:/C=AA/ST=a/L=a/O=a/OU=a/CN=a/emailAddress=a], [X.509 Cert. Subject:/C=AA/ST=a/L=a/O=a/OU=a/CN=a/emailAddress=a, Issuer:/C=AA/ST=a/L=a/O=a/OU=a/CN=a/emailAddress=a]] > Resumption master secret : 1041c76919bc326f537c94bc0475b43db7fdcff080514fdac997e8af2bd723fc > > You may send data or use 'quit'. > Ignored TLS 1.3 NewSessionTicket. > Ignored TLS 1.3 NewSessionTicket. > Server asked for a certificate... > TLS 1.3 post-handshake authentication sent! > Ignored TLS 1.3 NewSessionTicket. > Ignored TLS 1.3 NewSessionTicket. > Peer socket closed ! > Closing client socket... > Ending TLS client automaton. ###(031)=[passed] Testing TLS client against ssl.SSLContext server with TLS 1.3 and a Hello-Retry request >>> test_tls_client_native(with_hello_retry=True) > Starting TLS client automaton. > > Trying to connect on 127.0.0.1:59000 > > TLS 1.3 handshake completed! > Version : TLS 1.3 > Cipher suite : TLS_AES_128_GCM_SHA256 > Server temp key : secp256r1 > Master secret : a34fbfa93f016db99281fdeca77e77af12c7d662de139f85bf742238c32e0542 > Server certificate chain: [[X.509 Cert. Subject:/C=BB/ST=b/L=b/O=b/OU=b/CN=b/emailAddress=b, Issuer:/C=AA/ST=a/L=a/O=a/OU=a/CN=a/emailAddress=a], [X.509 Cert. Subject:/C=AA/ST=a/L=a/O=a/OU=a/CN=a/emailAddress=a, Issuer:/C=AA/ST=a/L=a/O=a/OU=a/CN=a/emailAddress=a]] > Resumption master secret : 3714d55d01ada71786640933d84acada930ed0abe2ab68c9b32a4b542091e864 > > You may send data or use 'quit'. > Ignored TLS 1.3 NewSessionTicket. > Ignored TLS 1.3 NewSessionTicket. > Peer socket closed ! > Closing client socket... > Ending TLS client automaton. AltBeacon unit tests ━ Run at 01:42:36 from [test/contrib/altbeacon.uts] by UTscapy in 0.02112436294555664 └ Passed=7 └ Failed=0 ###### ## AltBeacon tests ###### ###(000)=[passed] Setup >>> def next_eir(p): ... return EIR_Hdr(p[Padding].load) ... ###(001)=[passed] Presence check >>> AltBeacon ###(002)=[passed] AltBeaconParserTest.testRecognizeBeacon >>> d = hex_bytes('02011a1bff1801beac2f234454cf6d4a0fadf2f4911ba9ffa600010002c509') >>> p = EIR_Hdr(d) >>> >>> assert EIR_Flags in p >>> >>> p = next_eir(p) >>> assert p[EIR_Manufacturer_Specific_Data].company_id == RADIUS_NETWORKS_MFG >>> assert p[AltBeacon].mfg_reserved == 9 ###(003)=[passed] AltBeaconParserTest.testDetectsDaveMHardwareBeacon >>> d = hex_bytes('02011a1bff1801beac2f234454cf6d4a0fadf2f4911ba9ffa600050003be020e09526164426561636f6e20555342020a03000000000000000000000000') >>> p = EIR_Hdr(d) >>> >>> assert EIR_Flags in p >>> >>> p = next_eir(p) >>> assert p[EIR_Manufacturer_Specific_Data].company_id == RADIUS_NETWORKS_MFG >>> assert AltBeacon in p >>> >>> p = next_eir(p) >>> assert p[EIR_CompleteLocalName].local_name == b'RadBeacon USB' >>> >>> p = next_eir(p) >>> assert p[EIR_TX_Power_Level].level == 3 ###(004)=[passed] AltBeaconParserTest.testParseWrongFormatReturnsNothing >>> d = hex_bytes('02011a1aff1801ffff2f234454cf6d4a0fadf2f4911ba9ffa600010002c509') >>> p = EIR_Hdr(d) >>> >>> assert EIR_Flags in p >>> >>> p = next_eir(p) >>> assert p[EIR_Manufacturer_Specific_Data].company_id == RADIUS_NETWORKS_MFG >>> assert AltBeacon not in p ###(005)=[passed] AltBeaconParserTest.testParsesBeaconMissingDataField >>> d = hex_bytes('02011a1aff1801beac2f234454cf6d4a0fadf2f4911ba9ffa600010002c50000') >>> p = EIR_Hdr(d) >>> >>> assert EIR_Flags in p >>> >>> p = next_eir(p) >>> assert p[EIR_Manufacturer_Specific_Data].company_id == RADIUS_NETWORKS_MFG >>> assert p[AltBeacon].id1 == uuid.UUID('2f234454-cf6d-4a0f-adf2-f4911ba9ffa6') >>> assert p[AltBeacon].id2 == 1 >>> assert p[AltBeacon].id3 == 2 >>> assert p[AltBeacon].tx_power == -59 ###(006)=[passed] Build EIR >>> p = AltBeacon( ... id1=uuid.UUID('2f234454-cf6d-4a0f-adf2-f4911ba9ffa6'), ... id2=1, ... id3=2, ... tx_power=-59, ... ) >>> >>> d = raw(p.build_eir()[-1]) >>> assert d == hex_bytes('1bff1801beac2f234454cf6d4a0fadf2f4911ba9ffa600010002c500') Regression tests for aoe module ━ Run at 01:42:36 from [test/contrib/aoe.uts] by UTscapy in 0.014912843704223633 └ Passed=6 └ Failed=0 ###### ## Basic tests ###### ###(000)=[passed] Build - Check Ethertype >>> a = Ether(src="00:01:02:03:04:05") >>> b = AOE() >>> c = a / b >>> assert c[Ether].type == 0x88a2 ###(001)=[passed] Build - Check default >>> p = AOE() >>> assert hasattr(p, "q_conf_info") ###(002)=[passed] Build - Check Issue ATA command >>> p = AOE() >>> p.cmd = 0 >>> >>> assert hasattr(p, "i_ata_cmd") ###(003)=[passed] Build - Check Query Config Information >>> p = AOE() >>> p.cmd = 1 >>> >>> assert hasattr(p, "q_conf_info") ###(004)=[passed] Build - Check Mac Mask List >>> p = AOE() >>> p.cmd = 2 >>> >>> assert hasattr(p, "mac_m_list") ###(005)=[passed] Build - Check ReserveRelease >>> p = AOE() >>> p.cmd = 3 >>> >>> assert hasattr(p, "res_rel") Regression tests for the avs module ━ Run at 01:42:36 from [test/contrib/avs.uts] by UTscapy in 0.00891876220703125 └ Passed=1 └ Failed=0 ###### ## Basic AVS test ###### ###(000)=[passed] Default build, storage and dissection >>> pkt = AVSWLANHeader()/Dot11()/Dot11Auth() >>> _filepath = get_temp_file(autoext=".pcap") >>> wrpcap(_filepath, pkt) >>> pkt1 = rdpcap(_filepath)[0] >>> assert raw(pkt) == raw(pkt1) >>> assert AVSWLANHeader in pkt >>> assert Dot11 in pkt >>> assert Dot11Auth in pkt >>> >>> try: ... os.remove(_filepath) ... except Exception: ... pass ... Test campaign ━ Run at 01:42:36 from [test/contrib/bfd.uts] by UTscapy in 0.023070096969604492 └ Passed=8 └ Failed=0 ###### ## BFD ###### ###(000)=[passed] BFD, basic instantiation >>> from scapy.contrib.bfd import * >>> a = UDP(sport=3784, dport=3784)/BFD() >>> assert raw(a) == b'\x0e\xc8\x0e\xc8\x00 \x00\x00 \xc0\x03\x18\x11\x11\x11\x11"""";\x9a\xca\x00;\x9a\xca\x00;\x9a\xca\x00' No IP underlayer to compute checksum. Leaving null. ###(001)=[passed] BFD - dissection >>> assert BFD in UDP(raw(a)) No IP underlayer to compute checksum. Leaving null. ###(002)=[passed] BFD with OptionalAuth [Simple Password Auth] [dissection] >>> p = UDP(b'\x04\x00\x0e\xc8\x00\x29\x72\x31\x20\x44\x05\x21\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0f\x42\x40\x00\x0f\x42\x40\x00\x00\x00\x00\x01\x09\x02\x73\x65\x63\x72\x65\x74\x4e\x0a\x90\x40') >>> assert(isinstance(p[1], BFD)) >>> assert(p[1].len == 33) >>> assert(isinstance(p[2], OptionalAuth)) >>> assert(p[2].auth_type == 1) >>> assert(p[2].auth_len == 9) ###(003)=[passed] BFD with OptionalAuth [Keyed MD5 Auth] [dissection] >>> p = UDP(b'\x04\x00\x0e\xc8\x00\x38\x6a\xcc\x20\x44\x05\x30\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0f\x42\x40\x00\x0f\x42\x40\x00\x00\x00\x00\x02\x18\x02\x00\x00\x00\x00\x05\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16\x3c\xc3\xf8\x21') >>> assert(isinstance(p[1], BFD)) >>> assert(p[1].len == 48) >>> assert(isinstance(p[2], OptionalAuth)) >>> assert(p[2].auth_type ==2) >>> assert(p[2].auth_len == 24) ###(004)=[passed] BFD with OptionalAuth [Meticulous Keyed SHA1 Auth] [dissection] >>> p = UDP(b'\x04\x00\x0e\xc8\x00\x3c\x37\x8a\x20\x44\x05\x34\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0f\x42\x40\x00\x0f\x42\x40\x00\x00\x00\x00\x05\x1c\x02\x00\x00\x00\x00\x05\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\xea\x6d\x1f\x21') >>> assert(isinstance(p[1], BFD)) >>> assert(p[1].len == 52) >>> assert(isinstance(p[2], OptionalAuth)) >>> assert(p[2].auth_type ==5) >>> assert(p[2].auth_len == 28) ###(005)=[passed] BFD with OptionalAuth [Simple Password Auth] [Build] >>> p = UDP(sport=3784, dport=3784)/BFD(flags="A", optional_auth=OptionalAuth(auth_type=1)) >>> assert raw(p) == b'\x0e\xc8\x0e\xc8\x00+\x00\x00 \xc4\x03#\x11\x11\x11\x11"""";\x9a\xca\x00;\x9a\xca\x00;\x9a\xca\x00\x01\x0b\x01password' No IP underlayer to compute checksum. Leaving null. ###(006)=[passed] BFD with OptionalAuth [Keyed MD5 Auth] [Build] >>> p = UDP(sport=3784, dport=3784)/BFD(flags="A", optional_auth=OptionalAuth(auth_type=2)) >>> assert raw(p) == b'\x0e\xc8\x0e\xc8\x008\x00\x00 \xc4\x030\x11\x11\x11\x11"""";\x9a\xca\x00;\x9a\xca\x00;\x9a\xca\x00\x02\x18\x01\x00\x00\x00\x00\x00_M\xcc;Z\xa7e\xd6\x1d\x83\'\xde\xb8\x82\xcf\x99' No IP underlayer to compute checksum. Leaving null. ###(007)=[passed] BFD with OptionalAuth [Meticulous Keyed SHA1 Auth] [Build] >>> p = UDP(sport=3784, dport=3784)/BFD(flags="A", optional_auth=OptionalAuth(auth_type=5)) >>> assert raw(p) == b'\x0e\xc8\x0e\xc8\x00<\x00\x00 \xc4\x034\x11\x11\x11\x11"""";\x9a\xca\x00;\x9a\xca\x00;\x9a\xca\x00\x05\x1c\x01\x00\x00\x00\x00\x00[\xaaa\xe4\xc9\xb9??\x06\x82%\x0bl\xf83\x1b~\xe6\x8f\xd8' No IP underlayer to compute checksum. Leaving null. Regression tests for the bgp module ━ Run at 01:42:36 from [test/contrib/bgp.uts] by UTscapy in 0.3539297580718994 └ Passed=156 └ Failed=0 ###### ## Default configuration ###### ###(000)=[passed] OLD speaker (see RFC 6793) >>> bgp_module_conf.use_2_bytes_asn = True ###### ## BGPNLRI_IPv4 class tests ###### ###(001)=[passed] BGPNLRI_IPv4 - Instantiation >>> raw(BGPNLRI_IPv4()) == b'\x00' True ###(002)=[passed] BGPNLRI_IPv4 - Instantiation with specific values (1) >>> raw(BGPNLRI_IPv4(prefix = '255.255.255.255/32')) == b' \xff\xff\xff\xff' True ###(003)=[passed] BGPNLRI_IPv4 - Instantiation with specific values (2) >>> raw(BGPNLRI_IPv4(prefix = '0.0.0.0/0')) == b'\x00' True ###(004)=[passed] BGPNLRI_IPv4 - Instantiation with specific values (3) >>> raw(BGPNLRI_IPv4(prefix = '192.0.2.0/24')) == b'\x18\xc0\x00\x02' True ###(005)=[passed] BGPNLRI_IPv4 - Basic dissection >>> nlri = BGPNLRI_IPv4(b'\x00') >>> nlri.prefix == '0.0.0.0/0' True ###(006)=[passed] BGPNLRI_IPv4 - Dissection with specific values >>> nlri = BGPNLRI_IPv4(b'\x18\xc0\x00\x02') >>> nlri.prefix == '192.0.2.0/24' True ###### ## BGPNLRI_IPv6 class tests ###### ###(007)=[passed] BGPNLRI_IPv6 - Instantiation >>> raw(BGPNLRI_IPv6()) == b'\x00' True ###(008)=[passed] BGPNLRI_IPv6 - Instantiation with specific values (1) >>> raw(BGPNLRI_IPv6(prefix = '::/0')) == b'\x00' True ###(009)=[passed] BGPNLRI_IPv6 - Instantiation with specific values (2) >>> raw(BGPNLRI_IPv6(prefix = '2001:db8::/32')) == b' \x01\r\xb8' True ###(010)=[passed] BGPNLRI_IPv6 - Basic dissection >>> nlri = BGPNLRI_IPv6(b'\x00') >>> nlri.prefix == '::/0' True ###(011)=[passed] BGPNLRI_IPv6 - Dissection with specific values >>> nlri = BGPNLRI_IPv6(b' \x01\r\xb8') >>> nlri.prefix == '2001:db8::/32' True ###### ## BGP class tests ###### ###(012)=[passed] BGP - Instantiation (Should be a KEEPALIVE) >>> m = BGP() >>> assert raw(m) == b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x04' >>> assert m.type == BGP.KEEPALIVE_TYPE ###(013)=[passed] BGP - Instantiation with specific values (1) >>> raw(BGP(type = 0)) == b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x00' True ###(014)=[passed] BGP - Instantiation with specific values (2) >>> raw(BGP(type = 1)) == b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x01' True ###(015)=[passed] BGP - Instantiation with specific values (3) >>> raw(BGP(type = 2)) == b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x02' True ###(016)=[passed] BGP - Instantiation with specific values (4) >>> raw(BGP(type = 3)) == b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x03' True ###(017)=[passed] BGP - Instantiation with specific values (5) >>> raw(BGP(type = 4)) == b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x04' True ###(018)=[passed] BGP - Instantiation with specific values (6) >>> raw(BGP(type = 5)) == b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x05' True ###(019)=[passed] BGP - Basic dissection >>> h = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x04') >>> assert h.type == BGP.KEEPALIVE_TYPE >>> assert h.len == 19 ###(020)=[passed] BGP - Dissection with specific values >>> h = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x01') >>> assert h.type == BGP.OPEN_TYPE >>> assert h.len == 19 ###### ## BGPKeepAlive class tests ###### ###(021)=[passed] BGPKeepAlive - Instantiation (by default, should be a "generic" capability) >>> raw(BGPKeepAlive()) b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x04' >>> raw(BGPKeepAlive()) == b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x04' True ###(022)=[passed] BGPKeepAlive - Swallowing tests: combined BGPKeepAlive >>> o = BGPKeepAlive() >>> m=IP(src="12.0.0.1",dst="12.0.0.2")/TCP(dport=54321)/BGP(raw(o)*2) >>> m.show() ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = tcp chksum = None src = 12.0.0.1 dst = 12.0.0.2 \options \ ###[ TCP ]### sport = bgp dport = 54321 seq = 0 ack = 0 dataofs = None reserved = 0 flags = S window = 8192 chksum = None urgptr = 0 options = [] ###[ KEEPALIVE ]### marker = 0xffffffffffffffffffffffffffffffff len = 19 type = KEEPALIVE ###[ KEEPALIVE ]### marker = 0xffffffffffffffffffffffffffffffff len = 19 type = KEEPALIVE >>> assert isinstance(m[BGPKeepAlive].payload, BGPKeepAlive) >>> assert m[BGPKeepAlive].payload.marker == 0xffffffffffffffffffffffffffffffff ###### ## BGPCapability class tests ###### ###(023)=[passed] BGPCapability - Instantiation (by default, should be a "generic" capability) >>> raw(BGPCapability()) b'\x00\x00' >>> raw(BGPCapability()) == b'\x00\x00' True ###(024)=[passed] BGPCapability - Instantiation with specific values (1) >>> c = BGPCapability(code = 70) >>> assert raw(c) == b'F\x00' ###(025)=[passed] BGPCapability - Check exception >>> from scapy.contrib.bgp import _BGPInvalidDataException >>> try: ... BGPCapability("\x00") ... False ... except _BGPInvalidDataException: ... True ... True ###(026)=[passed] BGPCapability - Test haslayer() >>> assert BGPCapFourBytesASN().haslayer(BGPCapability) >>> assert BGPCapability in BGPCapFourBytesASN() ###(027)=[passed] BGPCapability - Test getlayer() >>> assert isinstance(BGPCapFourBytesASN().getlayer(BGPCapability), BGPCapFourBytesASN) >>> assert isinstance(BGPCapFourBytesASN()[BGPCapability], BGPCapFourBytesASN) ###(028)=[passed] BGPCapability - sessions (1) >>> p = IP()/TCP()/BGPCapability() >>> l = PacketList(p) >>> s = l.sessions() # Crashed on commit: e42ecdc54556c4852ca06b1a6da6c1ccbf3f522e >>> assert len(s) == 1 ###(029)=[passed] BGPCapability - sessions (2) >>> p = IP()/UDP()/BGPCapability() >>> l = PacketList(p) >>> s = l.sessions() # Crashed on commit: e42ecdc54556c4852ca06b1a6da6c1ccbf3f522e >>> assert len(s) == 1 ###### ## BGPCapMultiprotocol class tests ###### ###(030)=[passed] BGPCapMultiprotocol - Inheritance >>> c = BGPCapMultiprotocol() >>> assert isinstance(c, BGPCapability) ###(031)=[passed] BGPCapMultiprotocol - Instantiation >>> raw(BGPCapMultiprotocol()) == b'\x01\x04\x00\x00\x00\x00' True ###(032)=[passed] BGPCapMultiprotocol - Instantiation with specific values (1) >>> raw(BGPCapMultiprotocol(afi = 1, safi = 1)) == b'\x01\x04\x00\x01\x00\x01' True ###(033)=[passed] BGPCapMultiprotocol - Instantiation with specific values (2) >>> raw(BGPCapMultiprotocol(afi = 2, safi = 1)) == b'\x01\x04\x00\x02\x00\x01' True ###(034)=[passed] BGPCapMultiprotocol - Dissection with specific values >>> c = BGPCapMultiprotocol(b'\x01\x04\x00\x02\x00\x01') >>> assert c.code == 1 >>> assert c.length == 4 >>> assert c.afi == 2 >>> assert c.reserved == 0 >>> assert c.safi == 1 ###### ## BGPCapORFBlock class tests ###### ###(035)=[passed] BGPCapORFBlock - Instantiation >>> raw(BGPCapORFBlock()) == b'\x00\x00\x00\x00\x00' True ###(036)=[passed] BGPCapORFBlock - Instantiation with specific values (1) >>> raw(BGPCapORFBlock(afi = 1, safi = 1)) == b'\x00\x01\x00\x01\x00' True ###(037)=[passed] BGPCapORFBlock - Instantiation with specific values (2) >>> raw(BGPCapORFBlock(afi = 2, safi = 1)) == b'\x00\x02\x00\x01\x00' True ###(038)=[passed] BGPCapORFBlock - Basic dissection >>> c = BGPCapORFBlock(b'\x00\x00\x00\x00\x00') >>> c.afi == 0 and c.reserved == 0 and c.safi == 0 and c.orf_number == 0 True ###(039)=[passed] BGPCapORFBlock - Dissection with specific values >>> c = BGPCapORFBlock(b'\x00\x02\x00\x01\x00') >>> c.afi == 2 and c.reserved == 0 and c.safi == 1 and c.orf_number == 0 True ###### ## BGPCapORFBlock.ORF class tests ###### ###(040)=[passed] BGPCapORFBlock.ORF - Instantiation >>> raw(BGPCapORFBlock.ORFTuple()) == b'\x00\x00' True ###(041)=[passed] BGPCapORFBlock.ORF - Instantiation with specific values (1) >>> raw(BGPCapORFBlock.ORFTuple(orf_type = 64, send_receive = 3)) == b'@\x03' True ###(042)=[passed] BGPCapORFBlock.ORF - Basic dissection >>> c = BGPCapORFBlock.ORFTuple(b'\x00\x00') >>> c.orf_type == 0 and c.send_receive == 0 True ###(043)=[passed] BGPCapORFBlock.ORF - Dissection with specific values >>> c = BGPCapORFBlock.ORFTuple(b'@\x03') >>> c.orf_type == 64 and c.send_receive == 3 True ###### ## BGPCapORF class tests ###### ###(044)=[passed] BGPCapORF - Inheritance >>> c = BGPCapORF() >>> assert isinstance(c, BGPCapability) ###(045)=[passed] BGPCapORF - Instantiation >>> raw(BGPCapORF()) == b'\x03\x00' True ###(046)=[passed] BGPCapORF - Instantiation with specific values (1) >>> raw(BGPCapORF(orf = [BGPCapORFBlock(afi = 1, safi = 1, entries = [BGPCapORFBlock.ORFTuple(orf_type = 64, send_receive = 3)])])) == b'\x03\x07\x00\x01\x00\x01\x01@\x03' True ###(047)=[passed] BGPCapORF - Instantiation with specific values (2) >>> raw(BGPCapORF(orf = [BGPCapORFBlock(afi = 1, safi = 1, entries = [BGPCapORFBlock.ORFTuple(orf_type = 64, send_receive = 3)]), BGPCapORFBlock(afi = 2, safi = 1, entries = [BGPCapORFBlock.ORFTuple(orf_type = 64, send_receive = 3)])])) == b'\x03\x0e\x00\x01\x00\x01\x01@\x03\x00\x02\x00\x01\x01@\x03' True ###(048)=[passed] BGPCapORF - Basic dissection >>> c = BGPCapORF(b'\x03\x00') >>> c.code == 3 and c.length == 0 True ###(049)=[passed] BGPCapORF - Dissection with specific values >>> c = BGPCapORF(orf = [BGPCapORFBlock(afi = 1, safi = 1, entries = [BGPCapORFBlock.ORFTuple(orf_type = 64, send_receive = 3)]), BGPCapORFBlock(afi = 2, safi = 1, entries = [BGPCapORFBlock.ORFTuple(orf_type = 64, send_receive = 3)])]) >>> c.code == 3 and c.orf[0].afi == 1 and c.orf[0].safi == 1 and c.orf[0].entries[0].orf_type == 64 and c.orf[0].entries[0].send_receive == 3 and c.orf[1].afi == 2 and c.orf[1].safi == 1 and c.orf[1].entries[0].orf_type == 64 and c.orf[1].entries[0].send_receive == 3 True ###(050)=[passed] BGPCapORF - Dissection >>> p = BGPCapORF(b'\x03\x07\x00\x01\x00\x01\x01@\x03') >>> assert len(p.orf) == 1 ###### ## BGPCapGracefulRestart.GRTuple class tests ###### ###(051)=[passed] BGPCapGracefulRestart.GRTuple - Instantiation >>> raw(BGPCapGracefulRestart.GRTuple()) == b'\x00\x00\x00\x00' True ###(052)=[passed] BGPCapGracefulRestart.GRTuple - Instantiation with specific values >>> raw(BGPCapGracefulRestart.GRTuple(afi = 1, safi = 1, flags = 128)) == b'\x00\x01\x01\x80' True ###(053)=[passed] BGPCapGracefulRestart.GRTuple - Basic dissection >>> c = BGPCapGracefulRestart.GRTuple(b'\x00\x00\x00\x00') >>> c.afi == 0 and c.safi == 0 and c.flags == 0 True ###(054)=[passed] BGPCapGracefulRestart.GRTuple - Dissection with specific values >>> c = BGPCapGracefulRestart.GRTuple(b'\x00\x01\x01\x80') >>> c.afi == 1 and c.safi == 1 and c.flags == 128 True ###### ## BGPCapGracefulRestart class tests ###### ###(055)=[passed] BGPCapGracefulRestart - Inheritance >>> c = BGPCapGracefulRestart() >>> assert isinstance(c, BGPCapGracefulRestart) ###(056)=[passed] BGPCapGracefulRestart - Instantiation >>> raw(BGPCapGracefulRestart()) == b'@\x02\x00\x00' True ###(057)=[passed] BGPCapGracefulRestart - Instantiation with specific values (1) >>> raw(BGPCapGracefulRestart(restart_time = 120, entries = [BGPCapGracefulRestart.GRTuple(afi = 1, safi = 1)])) == b'@\x06\x00x\x00\x01\x01\x00' True ###(058)=[passed] BGPCapGracefulRestart - Instantiation with specific values (2) >>> raw(BGPCapGracefulRestart(restart_time = 120, entries = [BGPCapGracefulRestart.GRTuple(afi = 1, safi = 1)])) == b'@\x06\x00x\x00\x01\x01\x00' True ###(059)=[passed] BGPCapGracefulRestart - Instantiation with specific values (3) >>> raw(BGPCapGracefulRestart(restart_time = 120, entries = [BGPCapGracefulRestart.GRTuple(afi = 1, safi = 1, flags = 128)])) == b'@\x06\x00x\x00\x01\x01\x80' True ###(060)=[passed] BGPCapGracefulRestart - Instantiation with specific values (4) >>> raw(BGPCapGracefulRestart(restart_time = 120, restart_flags = 0x8, entries = [BGPCapGracefulRestart.GRTuple(afi = 1, safi = 1, flags = 128)])) == b'@\x06\x80x\x00\x01\x01\x80' True ###(061)=[passed] BGPCapGracefulRestart - Basic dissection >>> c = BGPCapGracefulRestart(b'@\x02\x00\x00') >>> c.code == 64 and c.restart_flags == 0 and c.restart_time == 0 True ###(062)=[passed] BGPCapGracefulRestart - Dissection with specific values >>> c = BGPCapGracefulRestart(b'@\x06\x80x\x00\x01\x01\x80') >>> c.code == 64 and c.restart_time == 120 and c.restart_flags == 0x8 and c.entries[0].afi == 1 and c.entries[0].safi == 1 and c.entries[0].flags == 128 True ###### ## BGPCapFourBytesASN class tests ###### ###(063)=[passed] BGPCapFourBytesASN - Inheritance >>> c = BGPCapFourBytesASN() >>> assert isinstance(c, BGPCapFourBytesASN) ###(064)=[passed] BGPCapFourBytesASN - Instantiation >>> raw(BGPCapFourBytesASN()) == b'A\x04\x00\x00\x00\x00' True ###(065)=[passed] BGPCapFourBytesASN - Instantiation with specific values (1) >>> raw(BGPCapFourBytesASN(asn = 6555555)) == b'A\x04\x00d\x07\xa3' True ###(066)=[passed] BGPCapFourBytesASN - Instantiation with specific values (2) >>> raw(BGPCapFourBytesASN(asn = 4294967295)) == b'A\x04\xff\xff\xff\xff' True ###(067)=[passed] BGPCapFourBytesASN - Basic dissection >>> c = BGPCapFourBytesASN(b'A\x04\x00\x00\x00\x00') >>> c.code == 65 and c.length == 4 and c.asn == 0 True ###(068)=[passed] BGPCapFourBytesASN - Dissection with specific values >>> c = BGPCapFourBytesASN(b'A\x04\xff\xff\xff\xff') >>> c.code == 65 and c.length == 4 and c.asn == 4294967295 True ###### ## BGPAuthenticationInformation class tests ###### ###(069)=[passed] BGPAuthenticationInformation - Instantiation >>> raw(BGPAuthenticationInformation()) == b'\x00' True ###(070)=[passed] BGPAuthenticationInformation - Basic dissection >>> c = BGPAuthenticationInformation(b'\x00') >>> c.authentication_code == 0 and not c.authentication_data True ###### ## BGPOptParam class tests ###### ###(071)=[passed] BGPOptParam - Instantiation >>> raw(BGPOptParam()) == b'\x02\x00' True ###(072)=[passed] BGPOptParam - Instantiation with specific values (1) >>> raw(BGPOptParam(param_type = 1)) == b'\x01\x00' True >>> raw(BGPOptParam(param_type = 1, param_value = BGPAuthenticationInformation())) == b'\x01\x00' True ###(073)=[passed] BGPOptParam - Instantiation with specific values (2) >>> raw(BGPOptParam(param_type = 2)) == b'\x02\x00' True ###(074)=[passed] BGPOptParam - Instantiation with specific values (3) >>> raw(BGPOptParam(param_type = 2, param_value = BGPCapFourBytesASN(asn = 4294967295))) == b'\x02\x06A\x04\xff\xff\xff\xff' True ###(075)=[passed] BGPOptParam - Instantiation with specific values (4) >>> raw(BGPOptParam(param_type = 2, param_value = BGPCapability(code = 127))) == b'\x02\x02\x7f\x00' True ###(076)=[passed] BGPOptParam - Instantiation with specific values (5) >>> raw(BGPOptParam(param_type = 2, param_value = BGPCapability(code = 255))) == b'\x02\x02\xff\x00' True ###(077)=[passed] BGPOptParam - Basic dissection >>> p = BGPOptParam(b'\x02\x00') >>> p.param_type == 2 and p.param_length == 0 True ###(078)=[passed] BGPOptParam - Dissection with specific values >>> p = BGPOptParam(b'\x02\x06A\x04\xff\xff\xff\xff') >>> p.param_type == 2 and p.param_length == 6 and p.param_value[0].code == 65 and p.param_value[0].length == 4 and p.param_value[0].asn == 4294967295 True ###### ## BGPOpen class tests ###### ###(079)=[passed] BGPOpen - Instantiation >>> raw(BGPOpen()) == b'\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(080)=[passed] BGPOpen - Instantiation with specific values (1) >>> raw(BGPOpen(my_as = 64501, bgp_id = "192.0.2.1")) == b'\x04\xfb\xf5\x00\x00\xc0\x00\x02\x01\x00' True ###(081)=[passed] BGPOpen - Instantiation with specific values (2) >>> opt = BGPOptParam(param_value = BGPCapMultiprotocol(afi = 1, safi = 1)) >>> raw(BGPOpen(my_as = 64501, bgp_id = "192.0.2.1", opt_params = [opt])) == b'\x04\xfb\xf5\x00\x00\xc0\x00\x02\x01\x08\x02\x06\x01\x04\x00\x01\x00\x01' True ###(082)=[passed] BGPOpen - Instantiation with specific values (3) >>> cap = BGPOptParam(param_value = BGPCapMultiprotocol(afi = 1, safi = 1)) >>> capabilities = [cap] >>> cap = BGPOptParam(param_value = BGPCapability(code = 128)) >>> capabilities.append(cap) >>> cap = BGPOptParam(param_value = BGPCapability(code = 2)) >>> capabilities.append(cap) >>> cap = BGPOptParam(param_value = BGPCapGracefulRestart(restart_time = 120, entries = [BGPCapGracefulRestart.GRTuple(afi = 1, safi= 1, flags = 128)])) >>> capabilities.append(cap) >>> cap = BGPOptParam(param_value = BGPCapFourBytesASN(asn = 64503)) >>> capabilities.append(cap) >>> raw(BGPOpen(my_as = 64503, bgp_id = "192.168.100.3", hold_time = 30, opt_params = capabilities)) == b'\x04\xfb\xf7\x00\x1e\xc0\xa8d\x03"\x02\x06\x01\x04\x00\x01\x00\x01\x02\x02\x80\x00\x02\x02\x02\x00\x02\x08@\x06\x00x\x00\x01\x01\x80\x02\x06A\x04\x00\x00\xfb\xf7' True ###(083)=[passed] BGPOpen - Dissection with specific values (1) >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00?\x01\x04\xfb\xf7\x00\x1e\xc0\xa8d\x03"\x02\x06\x01\x04\x00\x01\x00\x01\x02\x02\x80\x00\x02\x02\x02\x00\x02\x08@\x06\x00x\x00\x01\x01\x80\x02\x06A\x04\x00\x00\xfb\xf7') >>> assert BGPHeader in m and BGPOpen in m >>> assert m.len == 63 >>> assert m.type == BGP.OPEN_TYPE >>> assert m.version == 4 >>> assert m.my_as == 64503 >>> assert m.hold_time == 30 >>> assert m.bgp_id == "192.168.100.3" >>> assert m.opt_param_len == 34 >>> assert isinstance(m.opt_params[0].param_value, BGPCapMultiprotocol) >>> assert isinstance(m.opt_params[1].param_value, BGPCapability) >>> assert isinstance(m.opt_params[2].param_value, BGPCapability) >>> assert isinstance(m.opt_params[3].param_value, BGPCapGracefulRestart) ###(084)=[passed] BGPOpen - Dissection with specific values (2) (followed by a KEEPALIVE) >>> messages = b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00=\x01\x04\xfb\xf6\x00\xb4\xc0\xa8ze \x02\x06\x01\x04\x00\x01\x00\x01\x02\x06\x01\x04\x00\x02\x00\x01\x02\x02\x80\x00\x02\x02\x02\x00\x02\x06A\x04\x00\x00\xfb\xf6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x04' >>> m = BGP(messages) >>> raw(m) == b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00=\x01\x04\xfb\xf6\x00\xb4\xc0\xa8ze \x02\x06\x01\x04\x00\x01\x00\x01\x02\x06\x01\x04\x00\x02\x00\x01\x02\x02\x80\x00\x02\x02\x02\x00\x02\x06A\x04\x00\x00\xfb\xf6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x13\x04' True ###(085)=[passed] BGPOpen - Dissection with specific values (3) >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x8f\x01\x04\xfd\xe8\x00\xb4\n\xff\xff\x01r\x02\x06\x01\x04\x00\x01\x00\x84\x02\x06\x01\x04\x00\x19\x00A\x02\x06\x01\x04\x00\x02\x00\x02\x02\x06\x01\x04\x00\x01\x00\x02\x02\x06\x01\x04\x00\x02\x00\x80\x02\x06\x01\x04\x00\x01\x00\x80\x02\x06\x01\x04\x00\x01\x00B\x02\x06\x01\x04\x00\x02\x00\x01\x02\x06\x01\x04\x00\x02\x00\x04\x02\x06\x01\x04\x00\x01\x00\x01\x02\x06\x01\x04\x00\x01\x00\x04\x02\x02\x80\x00\x02\x02\x02\x00\x02\x04@\x02\x80x\x02\x02F\x00\x02\x06A\x04\x00\x00\xfd\xe8') >>> assert BGPHeader in m and BGPOpen in m ###(086)=[passed] BGPOpen - Dissection with specific values (4) >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x8f\x01\x04\xfd\xe8\x00\xb4\n\xff\xff\x02r\x02\x06\x01\x04\x00\x01\x00\x84\x02\x06\x01\x04\x00\x19\x00A\x02\x06\x01\x04\x00\x02\x00\x02\x02\x06\x01\x04\x00\x01\x00\x02\x02\x06\x01\x04\x00\x02\x00\x80\x02\x06\x01\x04\x00\x01\x00\x80\x02\x06\x01\x04\x00\x01\x00B\x02\x06\x01\x04\x00\x02\x00\x01\x02\x06\x01\x04\x00\x02\x00\x04\x02\x06\x01\x04\x00\x01\x00\x01\x02\x06\x01\x04\x00\x01\x00\x04\x02\x02\x80\x00\x02\x02\x02\x00\x02\x04@\x02\x00x\x02\x02F\x00\x02\x06A\x04\x00\x00\xfd\xe8') >>> assert BGPHeader in m and BGPOpen in m ###### ## BGPPAOrigin class tests ###### ###(087)=[passed] BGPPAOrigin - Instantiation >>> raw(BGPPAOrigin()) == b'\x00' True ###(088)=[passed] BGPPAOrigin - Instantiation with specific values >>> raw(BGPPAOrigin(origin = 1)) == b'\x01' True ###(089)=[passed] BGPPAOrigin - Dissection >>> a = BGPPAOrigin(b'\x00') >>> a.origin == 0 True ###### ## BGPPAASPath class tests ###### ###(090)=[passed] BGPPAASPath - Instantiation >>> raw(BGPPAASPath()) == b'' True ###(091)=[passed] BGPPAASPath - Instantiation with specific values (1) >>> raw(BGPPAASPath(segments = [BGPPAASPath.ASPathSegment(segment_type = 2, segment_value = [64496, 64497, 64498])])) == b'\x02\x03\xfb\xf0\xfb\xf1\xfb\xf2' True ###(092)=[passed] BGPPAASPath - Instantiation with specific values (2) >>> raw(BGPPAASPath(segments = [BGPPAASPath.ASPathSegment(segment_type = 1, segment_value = [64496, 64497, 64498])])) == b'\x01\x03\xfb\xf0\xfb\xf1\xfb\xf2' True ###(093)=[passed] BGPPAASPath - Instantiation with specific values (3) >>> raw(BGPPAASPath(segments = [BGPPAASPath.ASPathSegment(segment_type = 1, segment_value = [64496, 64497, 64498]), BGPPAASPath.ASPathSegment(segment_type = 2, segment_value = [64500, 64501, 64502, 64502, 64503])])) == b'\x01\x03\xfb\xf0\xfb\xf1\xfb\xf2\x02\x05\xfb\xf4\xfb\xf5\xfb\xf6\xfb\xf6\xfb\xf7' True ###(094)=[passed] BGPPAASPath - Dissection (1) >>> a = BGPPAASPath(b'\x02\x03\xfb\xf0\xfb\xf1\xfb\xf2') >>> a.segments[0].segment_type == 2 and a.segments[0].segment_length == 3 and a.segments[0].segment_value == [64496, 64497, 64498] True ###(095)=[passed] BGPPAASPath - Dissection (2) >>> a = BGPPAASPath(b'\x01\x03\xfb\xf0\xfb\xf1\xfb\xf2\x02\x05\xfb\xf4\xfb\xf5\xfb\xf6\xfb\xf6\xfb\xf7') >>> a.segments[0].segment_type == 1 and a.segments[0].segment_length == 3 and a.segments[0].segment_value == [64496, 64497, 64498] and a.segments[1].segment_type == 2 and a.segments[1].segment_length == 5 and a.segments[1].segment_value == [64500, 64501, 64502, 64502, 64503] True ###### ## BGPPANextHop class tests ###### ###(096)=[passed] BGPPANextHop - Instantiation >>> raw(BGPPANextHop()) == b'\x00\x00\x00\x00' True ###(097)=[passed] BGPPANextHop - Instantiation with specific values >>> raw(BGPPANextHop(next_hop = "192.0.2.1")) == b'\xc0\x00\x02\x01' True ###(098)=[passed] BGPPANextHop - Basic dissection >>> a = BGPPANextHop(b'\x00\x00\x00\x00') >>> a.next_hop == "0.0.0.0" True ###(099)=[passed] BGPPANextHop - Dissection with specific values >>> a = BGPPANextHop(b'\xc0\x00\x02\x01') >>> a.next_hop == '192.0.2.1' True ###### ## BGPPAMultiExitDisc class tests ###### ###(100)=[passed] BGPPAMultiExitDisc - Instantiation >>> raw(BGPPAMultiExitDisc()) == b'\x00\x00\x00\x00' True ###(101)=[passed] BGPPAMultiExitDisc - Instantiation with specific values (1) >>> raw(BGPPAMultiExitDisc(med = 4)) == b'\x00\x00\x00\x04' True ###(102)=[passed] BGPPAMultiExitDisc - Basic dissection >>> a = BGPPAMultiExitDisc(b'\x00\x00\x00\x00') >>> a.med == 0 True ###### ## BGPPALocalPref class tests ###### ###(103)=[passed] BGPPALocalPref - Instantiation >>> raw(BGPPALocalPref()) == b'\x00\x00\x00\x00' True ###(104)=[passed] BGPPALocalPref - Instantiation with specific values (1) >>> raw(BGPPALocalPref(local_pref = 110)) == b'\x00\x00\x00n' True ###(105)=[passed] BGPPALocalPref - Basic dissection >>> a = BGPPALocalPref(b'\x00\x00\x00n') >>> a.local_pref == 110 True ###### ## BGPPAAggregator class tests ###### ###(106)=[passed] BGPPAAggregator - Instantiation >>> raw(BGPPAAggregator()) == b'\x00\x00\x00\x00\x00\x00' True ###(107)=[passed] BGPPAAggregator - Instantiation with specific values (1) >>> raw(BGPPAAggregator(aggregator_asn = 64500, speaker_address = "192.0.2.1")) == b'\xfb\xf4\xc0\x00\x02\x01' True ###(108)=[passed] BGPPAAggregator - Dissection >>> a = BGPPAAggregator(b'\xfb\xf4\xc0\x00\x02\x01') >>> a.aggregator_asn == 64500 and a.speaker_address == "192.0.2.1" True ###### ## BGPPACommunity class tests ###### ###(109)=[passed] BGPPACommunity - Basic instantiation >>> raw(BGPPACommunity()) == b'\x00\x00\x00\x00' True ###(110)=[passed] BGPPACommunity - Instantiation with specific value >>> raw(BGPPACommunity(community = 0xFFFFFF01)) == b'\xff\xff\xff\x01' True ###(111)=[passed] BGPPACommunity - Dissection >>> a = BGPPACommunity(b'\xff\xff\xff\x01') >>> a.community == 0xFFFFFF01 True ###### ## BGPPAOriginatorID class tests ###### ###(112)=[passed] BGPPAOriginatorID - Basic instantiation >>> raw(BGPPAOriginatorID()) == b'\x00\x00\x00\x00' True ###(113)=[passed] BGPPAOriginatorID - Instantiation with specific value >>> raw(BGPPAOriginatorID(originator_id = '192.0.2.1')) == b'\xc0\x00\x02\x01' True ###(114)=[passed] BGPPAOriginatorID - Dissection >>> a = BGPPAOriginatorID(b'\xc0\x00\x02\x01') >>> a.originator_id == "192.0.2.1" True ###### ## BGPPAClusterList class tests ###### ###(115)=[passed] BGPPAClusterList - Basic instantiation >>> raw(BGPPAClusterList()) == b'' True ###(116)=[passed] BGPPAClusterList - Instantiation with specific values >>> raw(BGPPAClusterList(cluster_list = [150000, 165465465, 132132])) == b'\x00\x02I\xf0\t\xdc\xcdy\x00\x02\x04$' True ###(117)=[passed] BGPPAClusterList - Dissection >>> a = BGPPAClusterList(b'\x00\x02I\xf0\t\xdc\xcdy\x00\x02\x04$') >>> a.cluster_list[0] == 150000 and a.cluster_list[1] == 165465465 and a.cluster_list[2] == 132132 True ###### ## BGPPAMPReachNLRI class tests ###### ###(118)=[passed] BGPPAMPReachNLRI - Instantiation >>> raw(BGPPAMPReachNLRI()) == b'\x00\x00\x00\x00\x00' True ###(119)=[passed] BGPPAMPReachNLRI - Instantiation with specific values (1) >>> raw(BGPPAMPReachNLRI(afi=2, safi=1, nh_addr_len=16, nh_v6_addr = "2001:db8::2", nlri = [BGPNLRI_IPv6(prefix = "2001:db8:2::/64")])) == b'\x00\x02\x01\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00@ \x01\r\xb8\x00\x02\x00\x00' True ###(120)=[passed] BGPPAMPReachNLRI - Dissection (1) >>> a = BGPPAMPReachNLRI(b'\x00\x02\x01 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xfe\x80\x00\x00\x00\x00\x00\x00\xc0\x02\x0b\xff\xfe~\x00\x00\x00@ \x01\r\xb8\x00\x02\x00\x02@ \x01\r\xb8\x00\x02\x00\x01@ \x01\r\xb8\x00\x02\x00\x00') >>> a.afi == 2 and a.safi == 1 and a.nh_addr_len == 32 and a.nh_v6_global == "2001:db8::2" and a.nh_v6_link_local == "fe80::c002:bff:fe7e:0" and a.reserved == 0 and a.nlri[0].prefix == "2001:db8:2:2::/64" and a.nlri[1].prefix == "2001:db8:2:1::/64" and a.nlri[2].prefix == "2001:db8:2::/64" True ###(121)=[passed] BGPPAMPReachNLRI - Dissection (2) >>> a = BGPPAMPReachNLRI(b'\x00\x02\x01 \xfe\x80\x00\x00\x00\x00\x00\x00\xfa\xc0\x01\x00\x15\xde\x15\x81\xfe\x80\x00\x00\x00\x00\x00\x00\xfa\xc0\x01\x00\x15\xde\x15\x81\x00\x06\x04\x05\x08\x04\x10\x03`\x03\x80\x03\xa0\x03\xc0\x04\xe0\x05\xf0\x06\xf8\t\xfe\x00\x16 \x01<\x08-\x07.\x040\x10?\xfe\x10 \x02\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff@\x01\x00\x00\x00\x00\x00\x00\x00\x17 \x01\x00 \x01\x00\x000 \x01\x00\x02\x00\x00 \x01\r\xb8\x1c \x01\x00\x10\x07\xfc\n\xfe\x80\x08\xff\n\xfe\xc0\x03 \x03@\x08_`\x00d\xff\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x01\x07\x02') >>> a.afi == 2 and a.safi == 1 and a.nh_addr_len == 32 and a.nh_v6_global == "fe80::fac0:100:15de:1581" and a.nh_v6_link_local == "fe80::fac0:100:15de:1581" and a.reserved == 0 and a.nlri[0].prefix == "400::/6" and a.nlri[1].prefix == "800::/5" and raw(a.nlri[18]) == b'`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff' and a.nlri[35].prefix == "200::/7" True ###### ## BGPPAMPUnreachNLRI class tests ###### ###(122)=[passed] BGPPAMPUnreachNLRI - Instantiation >>> raw(BGPPAMPUnreachNLRI()) == b'\x00\x00\x00' True ###(123)=[passed] BGPPAMPUnreachNLRI - Instantiation with specific values (1) >>> raw(BGPPAMPUnreachNLRI(afi = 2, safi = 1)) == b'\x00\x02\x01' True ###(124)=[passed] BGPPAMPUnreachNLRI - Instantiation with specific values (2) >>> raw(BGPPAMPUnreachNLRI(afi = 2, safi = 1, afi_safi_specific = BGPPAMPUnreachNLRI_IPv6(withdrawn_routes = [BGPNLRI_IPv6(prefix = "2001:db8:2::/64")]))) == b'\x00\x02\x01@ \x01\r\xb8\x00\x02\x00\x00' True ###(125)=[passed] BGPPAMPUnreachNLRI - Dissection (1) >>> a = BGPPAMPUnreachNLRI(b'\x00\x02\x01') >>> a.afi == 2 and a.safi == 1 True ###(126)=[passed] BGPPAMPUnreachNLRI - Dissection (2) >>> a = BGPPAMPUnreachNLRI(b'\x00\x02\x01\x03`\x03\x80\x03\xa0\x03\xc0\x04\xe0\x05\xf0\x06\xf8\x10 \x02`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff@\x01\x00\x00\x00\x00\x00\x00\x00\x17 \x01\x00 \x01\x00\x000 \x01\x00\x02\x00\x00 \x01\r\xb8\n\xfe\xc0\x07\xfc\n\xfe\x80\x1c \x01\x00\x10\x03 \x06\x04\x03@\x08_\x05\x08\x04\x10') >>> a.afi == 2 and a.safi == 1 and a.afi_safi_specific.withdrawn_routes[0].prefix == "6000::/3" and a.afi_safi_specific.withdrawn_routes[11].prefix == "2001::/32" and a.afi_safi_specific.withdrawn_routes[23].prefix == "1000::/4" True ###### ## BGPPAAS4Aggregator class tests ###### ###(127)=[passed] BGPPAAS4Aggregator - Instantiation >>> raw(BGPPAAS4Aggregator()) == b'\x00\x00\x00\x00\x00\x00\x00\x00' True ###(128)=[passed] BGPPAAS4Aggregator - Instantiation with specific values >>> raw(BGPPAAS4Aggregator(aggregator_asn = 644566565, speaker_address = "192.0.2.1")) == b'&kN%\xc0\x00\x02\x01' True ###(129)=[passed] BGPPAAS4Aggregator - Dissection >>> a = BGPPAAS4Aggregator(b'&kN%\xc0\x00\x02\x01') >>> a.aggregator_asn == 644566565 and a.speaker_address == "192.0.2.1" True ###### ## BGPPALargeCommunity class tests ###### ###(130)=[passed] BGPPALargeCommunity - Instantiation >>> raw(BGPPALargeCommunity()) == b'' True ###(131)=[passed] BGPPALargeCommunity - Instantiation with specific values >>> raw(BGPPALargeCommunity(segments=BGPLargeCommunitySegment(global_administrator=161,local_data_part1=0,local_data_part2=0))) == b'\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x00' True ###(132)=[passed] BGPPALargeCommunity - Dissection >>> a = BGPPALargeCommunity(b'\x00\x00\x00\xa1\x00\x00\x00\x00\x00\x00\x00\x00') >>> a.segments[0].global_administrator == 161 and a.segments[0].local_data_part1 == 0 and a.segments[0].local_data_part2 == 0 True ###### ## BGPPathAttr class tests ###### ###(133)=[passed] BGPPathAttr - Instantiation >>> raw(BGPPathAttr()) == b'\x80\x00\x00' True ###(134)=[passed] BGPPathAttr - Instantiation with specific values (1) >>> raw(BGPPathAttr(type_code = 1, attribute = BGPPAOrigin(origin = 0))) b'\x80\x01\x01\x00' ###(135)=[passed] BGPPathAttr - Instantiation with specific values (2) >>> raw(BGPPathAttr(type_code = 2, attribute = BGPPAASPath(segments = [BGPPAASPath.ASPathSegment(segment_type = 2, segment_value = [64501, 64501, 64501])]))) == b'\x80\x02\x08\x02\x03\xfb\xf5\xfb\xf5\xfb\xf5' True ###(136)=[passed] BGPPathAttr - Instantiation with specific values (3) >>> raw(BGPPathAttr(type_code = 14, attribute = BGPPAMPReachNLRI(afi = 2, safi = 1, nh_addr_len = 16, nh_v6_addr = "2001:db8::2", nlri = [BGPNLRI_IPv6(prefix = "2001:db8:2::/64")]))) == b'\x80\x0e\x1e\x00\x02\x01\x10 \x01\r\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00@ \x01\r\xb8\x00\x02\x00\x00' True ###(137)=[passed] BGPPathAttr - Dissection (1) >>> a = BGPPathAttr(b'\x90\x0f\x00X\x00\x02\x01\x03`\x03\x80\x03\xa0\x03\xc0\x04\xe0\x05\xf0\x06\xf8\x10 \x02`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff@\x01\x00\x00\x00\x00\x00\x00\x00\x17 \x01\x00 \x01\x00\x000 \x01\x00\x02\x00\x00 \x01\r\xb8\n\xfe\xc0\x07\xfc\n\xfe\x80\x1c \x01\x00\x10\x03 \x06\x04\x03@\x08_\x05\x08\x04\x10') >>> a.type_flags == 0x90 and a.type_code == 15 and a.attr_ext_len == 88 and a.attribute.afi == 2 and a.attribute.safi == 1 and a.attribute.afi_safi_specific.withdrawn_routes[0].prefix == "6000::/3" and a.attribute.afi_safi_specific.withdrawn_routes[1].prefix == "8000::/3" and a.attribute.afi_safi_specific.withdrawn_routes[2].prefix == "a000::/3" and a.attribute.afi_safi_specific.withdrawn_routes[3].prefix == "c000::/3" and a.attribute.afi_safi_specific.withdrawn_routes[4].prefix == "e000::/4" and a.attribute.afi_safi_specific.withdrawn_routes[5].prefix == "f000::/5" and a.attribute.afi_safi_specific.withdrawn_routes[23].prefix == "1000::/4" True ###(138)=[passed] BGPPathAttr - advanced >>> b = BGPPathAttr(type_code=0x10, attribute=BGPPAExtComms(extended_communities=[ ... BGPPAExtCommunity(value=BGPPAExtCommTwoOctetASSpecific()), ... BGPPAExtCommunity(value=BGPPAExtCommIPv4AddressSpecific()), ... BGPPAExtCommunity(value=BGPPAExtCommFourOctetASSpecific()), ... BGPPAExtCommunity(value=BGPPAExtCommOpaque()), ... BGPPAExtCommunity(value=BGPPAExtCommTrafficMarking()), ... BGPPAExtCommunity(value=BGPPAExtCommRedirectIPv4()), ... BGPPAExtCommunity(value=BGPPAExtCommRedirectAS4Byte()), ... ])) >>> b = BGPPathAttr(raw(b)) >>> cls_list = [x.value.__class__ for x in b.attribute.extended_communities] >>> assert cls_list == [BGPPAExtCommTwoOctetASSpecific, BGPPAExtCommIPv4AddressSpecific, BGPPAExtCommFourOctetASSpecific, BGPPAExtCommOpaque, ... BGPPAExtCommTrafficMarking, BGPPAExtCommRedirectIPv4, BGPPAExtCommRedirectAS4Byte] >>> b.show() ###[ BGPPathAttr ]### type_flags= Optional type_code = EXTENDED COMMUNITIES attr_len = 56 \attribute \ |###[ EXTENDED_COMMUNITIES ]### | \extended_communities\ | |###[ EXTENDED_COMMUNITY ]### | | type_high = Transitive Two-Octet AS-Specific Extended Community | | type_low = 0 | | \value \ | | |###[ Two-Octet AS Specific Extended Community ]### | | | global_administrator= 0 | | | local_administrator= 0 | |###[ EXTENDED_COMMUNITY ]### | | type_high = Transitive IPv4-Address-Specific Extended Community | | type_low = 0 | | \value \ | | |###[ IPv4 Address Specific Extended Community ]### | | | global_administrator= 0 | | | local_administrator= 0 | |###[ EXTENDED_COMMUNITY ]### | | type_high = Transitive Four-Octet AS-Specific Extended Community | | type_low = 0 | | \value \ | | |###[ Four-Octet AS Specific Extended Community ]### | | | global_administrator= 0 | | | local_administrator= 0 | |###[ EXTENDED_COMMUNITY ]### | | type_high = Transitive Opaque Extended Community | | type_low = 0 | | \value \ | | |###[ Opaque Extended Community ]### | | | value = b'' | |###[ EXTENDED_COMMUNITY ]### | | type_high = Generic Transitive Experimental Use Extended Community | | type_low = Flow spec traffic-remarking | | \value \ | | |###[ FlowSpec traffic-marking extended community ]### | | | dscp = 48 | |###[ EXTENDED_COMMUNITY ]### | | type_high = Generic Transitive Experimental Use Extended Community Part 2 | | type_low = Flow spec redirect IPv4 format | | \value \ | | |###[ FlowSpec redirect IPv4 extended community ]### | | | ip_addr = 0 | | | value = 0 | |###[ EXTENDED_COMMUNITY ]### | | type_high = Generic Transitive Experimental Use Extended Community Part 3 | | type_low = Flow spec redirect AS-4byte format | | \value \ | | |###[ FlowSpec redirect AS-4byte extended community ]### | | | asn = 0 | | | value = 0 ###### ## BGPUpdate class tests ###### ###(139)=[passed] BGPUpdate - Instantiation >>> raw(BGPUpdate()) == b'\x00\x00\x00\x00' True ###(140)=[passed] BGPUpdate - Dissection (1) >>> bgp_module_conf.use_2_bytes_asn = True >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x000\x02\x00\x19\x18\xc0\xa8\x96\x18\x07\x07\x07\x18\xc63d\x18\xc0\xa8\x01\x19\x06\x06\x06\x00\x18\xc0\xa8\x1a\x00\x00') >>> assert BGPHeader in m and BGPUpdate in m >>> assert m.withdrawn_routes_len == 25 >>> assert m.withdrawn_routes[0].prefix == "192.168.150.0/24" >>> assert m.withdrawn_routes[5].prefix == "192.168.26.0/24" >>> assert m.path_attr_len == 0 ###(141)=[passed] BGPUpdate - Behave like a NEW speaker (RFC 6793) - Dissection (2) >>> bgp_module_conf.use_2_bytes_asn = False >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00=\x02\x00\x00\x00"@\x01\x01\x00@\x02\x06\x02\x01\x00\x00\xfb\xfa@\x03\x04\xc0\xa8\x10\x06\x80\x04\x04\x00\x00\x00\x00\xc0\x08\x04\xff\xff\xff\x01\x18\xc0\xa8\x01') >>> assert BGPHeader in m and BGPUpdate in m >>> assert m.path_attr[1].attribute.segments[0].segment_value == [64506] >>> assert m.path_attr[4].attribute.community == 0xFFFFFF01 >>> assert m.nlri[0].prefix == "192.168.1.0/24" ###(142)=[passed] BGPUpdate - Dissection (MP_REACH_NLRI) >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\xd8\x02\x00\x00\x00\xc1@\x01\x01\x00@\x02\x06\x02\x01\x00\x00\xfb\xf6\x90\x0e\x00\xb0\x00\x02\x01 \xfe\x80\x00\x00\x00\x00\x00\x00\xfa\xc0\x01\x00\x15\xde\x15\x81\xfe\x80\x00\x00\x00\x00\x00\x00\xfa\xc0\x01\x00\x15\xde\x15\x81\x00\x06\x04\x05\x08\x04\x10\x03`\x03\x80\x03\xa0\x03\xc0\x04\xe0\x05\xf0\x06\xf8\t\xfe\x00\x16 \x01<\x08-\x07.\x040\x10?\xfe\x10 \x02\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff@\x01\x00\x00\x00\x00\x00\x00\x00\x17 \x01\x00 \x01\x00\x000 \x01\x00\x02\x00\x00 \x01\r\xb8\x1c \x01\x00\x10\x07\xfc\n\xfe\x80\x08\xff\n\xfe\xc0\x03 \x03@\x08_`\x00d\xff\x9b\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x01\x07\x02') >>> assert BGPHeader in m and BGPUpdate in m >>> assert m.path_attr[2].attribute.afi == 2 >>> assert m.path_attr[2].attribute.safi == 1 >>> assert m.path_attr[2].attribute.nh_addr_len == 32 >>> assert m.path_attr[2].attribute.nh_v6_global == "fe80::fac0:100:15de:1581" >>> assert m.path_attr[2].attribute.nh_v6_link_local == "fe80::fac0:100:15de:1581" >>> assert m.path_attr[2].attribute.nlri[0].prefix == "400::/6" >>> assert m.nlri == [] ###(143)=[passed] BGPUpdate - Dissection (MP_UNREACH_NLRI) >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00s\x02\x00\x00\x00\\\x90\x0f\x00X\x00\x02\x01\x03`\x03\x80\x03\xa0\x03\xc0\x04\xe0\x05\xf0\x06\xf8\x10 \x02`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff@\x01\x00\x00\x00\x00\x00\x00\x00\x17 \x01\x00 \x01\x00\x000 \x01\x00\x02\x00\x00 \x01\r\xb8\n\xfe\xc0\x07\xfc\n\xfe\x80\x1c \x01\x00\x10\x03 \x06\x04\x03@\x08_\x05\x08\x04\x10') >>> assert BGPHeader in m and BGPUpdate in m >>> assert m.path_attr[0].attribute.afi == 2 >>> assert m.path_attr[0].attribute.safi == 1 >>> assert m.path_attr[0].attribute.afi_safi_specific.withdrawn_routes[0].prefix == "6000::/3" >>> assert m.nlri == [] ###(144)=[passed] BGPUpdate - Dissection (with BGP Additional Path) >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x17\x05\x00\x01\x01\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\xd0\x02\x00\xb9\x00\x00\x00\x02\x00\x00\x00\x00\x04 \n\xe9\x19\xb2\x00\x00\x00\x04 \n\xe9\x19\x90\x00\x00\x00\x04 \n\xe9\x19\x93\x00\x00\x00\x04 \n\xe9\x19\xbb\x00\x00\x00\x04 \n\xe9\x19\x9f\x00\x00\x00\x04 \n\xe9\x19\x8c\x00\x00\x00\x04 \n\xe9\x19\xb1\x00\x00\x00\x04 \n\xe9\x19\x8f\x00\x00\x00\x04 \n\xe9\x19\x98\x00\x00\x00\x04 \n\xe9\x19\x9b\x00\x00\x00\x04 \n\xe9\x19\x8b\x00\x00\x00\x04 \n\xe9\x19\xb3\x00\x00\x00\x04 \n\xe9\x19\x91\x00\x00\x00\x04 \n\xe9\x19\xb6\x00\x00\x00\x04 \n\xe9\x19\x94\x00\x00\x00\x04 \n\xe9\x19\x97\x00\x00\x00\x04 \n\xe9\x19\xbc\x00\x00\x00\x04 \n\xe9\x19\x9d\x00\x00\x00\x04 \n\xe9\x19\xa3\x00\x00\x00\x04 \n\xe9\x19\x84\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x005\x02\x00\x00\x00\x15@\x01\x01\x00@\x02\x00@\x03\x04\n\x16\x0cX@\x05\x04\x00\x00\x00d\x00\x00\x00\x02 \n\xe9\x00\x16\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x17\x05\x00\x01\x02\x01') >>> assert m.withdrawn_routes[0].nlri_path_id == 2 >>> assert len(m.withdrawn_routes) == 21 >>> assert m.withdrawn_routes[-1].sprintf("%prefix%") == "10.233.25.132/32" >>> assert len(m.getlayer(BGPUpdate, 2).path_attr) == 4 >>> assert m.getlayer(BGPUpdate, 2).nlri[0].nlri_path_id == 2 >>> assert m.getlayer(BGPUpdate, 2).nlri[0].sprintf("%prefix%") == "10.233.0.22/32" ###(145)=[passed] BGPUpdate - with BGPHeader >>> p = BGP(raw(BGPHeader()/BGPUpdate())) >>> assert BGPHeader in p and BGPUpdate in p ###### ## BGPNotification class tests ###### ###(146)=[passed] BGPNotification - Instantiation >>> raw(BGPNotification()) == b'\x00\x00' True ###(147)=[passed] BGPNotification - Dissection (Administratively Reset) >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x15\x03\x06\x04') >>> m.type == BGP.NOTIFICATION_TYPE and m.error_code == 6 and m.error_subcode == 4 True ###(148)=[passed] BGPNotification - Dissection (Bad Peer AS) >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x17\x03\x02\x02\x00\x00') >>> m.type == BGP.NOTIFICATION_TYPE and m.error_code == 2 and m.error_subcode == 2 True ###(149)=[passed] BGPNotification - Dissection (Attribute Flags Error) >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x19\x03\x03\x04\x80\x01\x01\x00') >>> m.type == BGP.NOTIFICATION_TYPE and m.error_code == 3 and m.error_subcode == 4 True ###### ## BGPRouteRefresh class tests ###### ###(150)=[passed] BGPRouteRefresh - Instantiation >>> raw(BGPRouteRefresh()) == b'\x00\x01\x00\x01' True ###(151)=[passed] BGPRouteRefresh - Instantiation with specific values >>> raw(BGPRouteRefresh(afi = 1, safi = 1)) == b'\x00\x01\x00\x01' True ###(152)=[passed] BGPRouteRefresh - Dissection (1) >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x17\x05\x00\x02\x00\x01') >>> m.type == BGP.ROUTEREFRESH_TYPE and m.len == 23 and m.afi == 2 and m.subtype == 0 and m.safi == 1 True ###(153)=[passed] BGPRouteRefresh - Dissection (2) - With ORFs >>> m = BGP(b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00.\x05\x00\x01\x00\x01\x01\x80\x00\x13 \x00\x00\x00\x05\x18\x18\x15\x01\x01\x00\x00\x00\x00\x00\n\x00 \x00') >>> assert m.type == BGP.ROUTEREFRESH_TYPE >>> assert m.len == 46 >>> assert m.afi == 1 >>> assert m.subtype == 0 >>> assert m.safi == 1 >>> assert m.orf_data[0].when_to_refresh == 1 >>> assert m.orf_data[0].orf_type == 128 >>> assert m.orf_data[0].orf_len == 19 >>> assert len(m.orf_data[0].entries) == 2 >>> assert m.orf_data[0].entries[0].action == 0 >>> assert m.orf_data[0].entries[0].match == 1 >>> assert m.orf_data[0].entries[0].prefix.prefix == "1.1.0.0/21" >>> assert m.orf_data[0].entries[1].action == 0 >>> assert m.orf_data[0].entries[1].match == 0 >>> assert m.orf_data[0].entries[1].prefix.prefix == "0.0.0.0/0" ###(154)=[passed] BGPRouteRefresh - Dissection (3) - bad ORFS (GH3345) >>> m = BGPRouteRefresh(b'\x00\x01\x00\x01\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00') >>> assert m.orf_data.orf_type == 0 >>> assert m.orf_data.entries[0].load == b'\x00\x00\x00\x00\x00\x00\x00' ###### ## BGPCapGeneric fuzz() ###### ###(155)=[passed] BGPCapGeneric fuzz() >>> for i in range(10): ... assert isinstance(raw(fuzz(BGPCapGeneric())), bytes) ... Test campaign ━ Run at 01:42:36 from [test/contrib/bier.uts] by UTscapy in 0.007054567337036133 └ Passed=1 └ Failed=0 ###### ## BIER tests ###### ###(000)=[passed] BIER - build/dissection >>> from scapy.contrib.mpls import MPLS >>> >>> p1 = MPLS()/BIER(length=BIERLength.BIER_LEN_256)/IP()/UDP() >>> assert p1[MPLS].s == 1 >>> p2 = BIFT()/BIER(length=BIERLength.BIER_LEN_64)/IP()/UDP() >>> assert p2[BIFT].s == 1 >>> >>> p1[MPLS] >>> >>> p1[BIER] >> >>> p1[IP] > >>> p2[BIFT] >>> >>> p2[BIER] >> >>> p2[IP] > Bundle Protocol tests ━ Run at 01:42:36 from [test/contrib/bp.uts] by UTscapy in 0.010067224502563477 └ Passed=1 └ Failed=0 ###### ## Bundle Protocol (BP) basic tests ###### ###(000)=[passed] Build packets & dissect >>> from scapy.contrib.ltp import LTPex >>> >>> pkt = Ether(src="aa:aa:aa:aa:aa:aa", dst="bb:bb:bb:bb:bb:bb")/IP(src="192.168.0.1", dst="192.168.0.2")/UDP()/LTP(flags=7,\ ... SessionOriginator=2, ... SessionNumber=113, ... HeaderExtensions=[ ... LTPex(ExTag=1, ExData=b"\x00"), ... ], ... DATA_ClientServiceID=1, ... DATA_PayloadOffset=0, ... LTP_Payload=[ ... BP(ProcFlags=415)/\ ... BPBLOCK(ProcFlags=10, load="data") ... ]) >>> >>> pkt = Ether(raw(pkt)) >>> assert LTP in pkt >>> bp = pkt[LTP].LTP_Payload[0] >>> assert BP in bp >>> assert BPBLOCK in bp >>> assert bp.load == b"data" >>> >>> bp.mysummary() ('BP(6) flags( FR AR DF CT S ) len(7) CBHE: d[0,0] s[0, 0] r[0, 0] c[0, 0] ct[0] ctsn[0] lt[0] fo[0] tl[0]', []) Regression tests for nativecanfdsocket ━ Run at 01:42:36 from [test/contrib/canfdsocket_native.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for the CANSocket ━ Run at 01:42:36 from [test/contrib/canfdsocket_python_can.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for compatibility between NativeCANSocket and PythonCANSocket ━ Run at 01:42:36 from [test/contrib/cansocket.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for nativecansocket ━ Run at 01:42:36 from [test/contrib/cansocket_native.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for the CANSocket ━ Run at 01:42:36 from [test/contrib/cansocket_python_can.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for the avs module ━ Run at 01:42:36 from [test/contrib/carp.uts] by UTscapy in 0.003968477249145508 └ Passed=1 └ Failed=0 ###### ## Basic CARP test ###### ###(000)=[passed] Build >>> pkt = Ether()/IP()/CARP() >>> pkt = Ether(raw(pkt)) >>> assert CARP in pkt >>> assert pkt[CARP].chksum >>> assert pkt[CARP].build_hmac_sha1(ip4l=['192.168.0.111']) == b'\xbd\x82\xc7\x8f6\x1a\x0e\xff\xcfl\x14\xa2v\xedW;>ic\xa3' Regression tests for the cdp module ━ Run at 01:42:36 from [test/contrib/cdp.uts] by UTscapy in 0.02602672576904297 └ Passed=8 └ Failed=0 ###### ## CDP ###### ###(000)=[passed] CDPv2 - Dissection (1) >>> s = b'\x02\xb4\x8c\xfa\x00\x01\x00\x0cmyswitch\x00\x02\x00\x11\x00\x00\x00\x01\x01\x01\xcc\x00\x04\xc0\xa8\x00\xfd\x00\x03\x00\x13FastEthernet0/1\x00\x04\x00\x08\x00\x00\x00(\x00\x05\x01\x14Cisco Internetwork Operating System Software \nIOS (tm) C2950 Software (C2950-I6K2L2Q4-M), Version 12.1(22)EA14, RELEASE SOFTWARE (fc1)\nTechnical Support: http://www.cisco.com/techsupport\nCopyright (c) 1986-2010 by cisco Systems, Inc.\nCompiled Tue 26-Oct-10 10:35 by nburra\x00\x06\x00\x15cisco WS-C2950-12\x00\x08\x00$\x00\x00\x0c\x01\x12\x00\x00\x00\x00\xff\xff\xff\xff\x01\x02!\xff\x00\x00\x00\x00\x00\x00\x00\x0b\xbe\x18\x9a@\xff\x00\x00\x00\t\x00\x0cMYDOMAIN\x00\n\x00\x06\x00\x01\x00\x0b\x00\x05\x01\x00\x0e\x00\x07\x01\x00\n\x00\x12\x00\x05\x00\x00\x13\x00\x05\x00\x00\x16\x00\x11\x00\x00\x00\x01\x01\x01\xcc\x00\x04\xc0\xa8\x00\xfd' >>> cdpv2 = CDPv2_HDR(s) >>> assert len(cdpv2) == 450 >>> assert cdpv2.vers == 2 >>> assert cdpv2.ttl == 180 >>> assert cdpv2.cksum == 0x8cfa >>> assert cdpv2.haslayer(CDPMsgDeviceID) >>> assert cdpv2.haslayer(CDPMsgAddr) >>> assert cdpv2.haslayer(CDPAddrRecordIPv4) >>> assert cdpv2.haslayer(CDPMsgPortID) >>> assert cdpv2.haslayer(CDPMsgCapabilities) >>> assert cdpv2.haslayer(CDPMsgSoftwareVersion) >>> assert cdpv2.haslayer(CDPMsgPlatform) >>> assert cdpv2.haslayer(CDPMsgProtoHello) >>> assert cdpv2.haslayer(CDPMsgVTPMgmtDomain) >>> assert cdpv2.haslayer(CDPMsgNativeVLAN) >>> assert cdpv2.haslayer(CDPMsgDuplex) >>> assert cdpv2.haslayer(CDPMsgVoIPVLANReply) >>> assert cdpv2.haslayer(CDPMsgTrustBitmap) >>> assert cdpv2.haslayer(CDPMsgUntrustedPortCoS) >>> assert cdpv2.haslayer(CDPMsgMgmtAddr) >>> assert cdpv2[CDPMsgProtoHello].len == 36 >>> assert cdpv2[CDPMsgProtoHello].oui == 0xc >>> assert cdpv2[CDPMsgProtoHello].protocol_id == 0x112 >>> assert cdpv2[CDPMsgTrustBitmap].type == 0x0012 >>> assert cdpv2[CDPMsgTrustBitmap].len == 5 >>> assert cdpv2[CDPMsgTrustBitmap].trust_bitmap == 0x0 >>> assert cdpv2[CDPMsgUntrustedPortCoS].type == 0x0013 >>> assert cdpv2[CDPMsgUntrustedPortCoS].len == 5 >>> assert cdpv2[CDPMsgUntrustedPortCoS].untrusted_port_cos == 0x0 ###(001)=[passed] CDPv2 - Rebuild (1) >>> cdpv2.cksum = None >>> assert raw(cdpv2) == s ###(002)=[passed] CDPv2 - Dissection (2) >>> s = b'\x02\xb4\xd7\xdb\x00\x01\x00\x13SIP001122334455\x00\x02\x00\x11\x00\x00\x00\x01\x01\x01\xcc\x00\x04\xc0\xa8\x01!\x00\x03\x00\nPort 1\x00\x04\x00\x08\x00\x00\x00\x10\x00\x05\x00\x10P003-08-2-00\x00\x06\x00\x17Cisco IP Phone 7960\x00\x0f\x00\x08 \x02\x00\x01\x00\x0b\x00\x05\x01\x00\x10\x00\x06\x18\x9c' >>> cdpv2 = CDPv2_HDR(s) >>> assert cdpv2.vers == 2 >>> assert cdpv2.ttl == 180 >>> assert cdpv2.cksum == 0xd7db >>> assert cdpv2.haslayer(CDPMsgDeviceID) >>> assert cdpv2.haslayer(CDPMsgAddr) >>> assert cdpv2.haslayer(CDPAddrRecordIPv4) >>> assert cdpv2.haslayer(CDPMsgPortID) >>> assert cdpv2.haslayer(CDPMsgCapabilities) >>> assert cdpv2.haslayer(CDPMsgSoftwareVersion) >>> assert cdpv2.haslayer(CDPMsgPlatform) >>> assert cdpv2.haslayer(CDPMsgVoIPVLANQuery) >>> assert cdpv2.haslayer(CDPMsgDuplex) >>> assert cdpv2.haslayer(CDPMsgPower) >>> assert cdpv2[CDPMsgVoIPVLANQuery].type == 0x000f >>> assert cdpv2[CDPMsgVoIPVLANQuery].len == 8 >>> assert cdpv2[CDPMsgVoIPVLANQuery].unknown1 == 0x20 >>> assert cdpv2[CDPMsgVoIPVLANQuery].vlan == 512 >>> >>> assert cdpv2[CDPMsgPower].sprintf("%power%") == '6300 mW' ###(003)=[passed] CDPv2 - Rebuild (2) >>> cdpv2.cksum = None >>> s2 = s[:2] + b"\xf3\xf1" + s[4:] >>> assert raw(cdpv2) == s2 ###(004)=[passed] CDPv2 - Complex Packet >>> r = b'\x01\x00\x0c\xcc\xcc\xcc\x11"3DUf\x01\x80\xaa\xaa\x03\x00\x00\x0c \x00\x02\xb4uV\x00\x01\x00\nRouter\x00\x05\x00\x04\x00\x06\x00\x04\x00\x02\x00\x11\x00\x00\x00\x02\x01\x01\xcc\x00\x04\xc0\xa8\x01e\x00\x03\x00\x18GigabitEthernet0/0/1\x00\x04\x00\x08\x00\x00\x00A\x00\x07\x00\t\x14\x00\x00\x00\x18\x00\t\x00\x04\x00\x0b\x00\x05\x01\x00\x16\x00\x11\x00\x00\x00\x01\x01\x01\xcc\x00\x04\xc0\xa8\x01e' >>> p = Dot3(r) >>> assert CDPMsgPortID in p and CDPMsgIPPrefix in p ###(005)=[passed] CDPChecksum - packet with odd length >>> pkt = CDPv2_HDR(vers=2, ttl=180, msg='123') >>> assert len(pkt) == 7 ###(006)=[passed] CDPv2 - CDPMsgAddr Packet >>> cdp_msg_addr = CDPMsgAddr(addr=[CDPAddrRecordIPv4(), CDPAddrRecordIPv6()]) >>> assert cdp_msg_addr.haslayer(CDPAddrRecordIPv4) >>> assert cdp_msg_addr.haslayer(CDPAddrRecordIPv6) >>> assert len(cdp_msg_addr.addr) == 2 >>> >>> assert raw(cdp_msg_addr)[4:8] == b'\x00\x00\x00\x02' ###(007)=[passed] CDPv2 - CDPMsgPowerRequest and CDPMsgPowerAvailable Packet >>> s = b'\x02\xb4\x39\xfa\x00\x01\x00\x09\x53\x63\x61\x70\x79\x00\x02\x00\x11\x00\x00\x00\x01\x01\x01\xcc\x00\x04\x7f\x00\x00\x01\x00\x10\x00\x06\x00\x10\x00\x19\x00\x18\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x1a\x00\x14\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07' >>> cdpv2 = CDPv2_HDR(s) >>> assert cdpv2.vers == 2 >>> assert cdpv2.ttl == 180 >>> assert cdpv2.cksum == 0x39fa >>> assert cdpv2.haslayer(CDPMsgDeviceID) >>> assert cdpv2.haslayer(CDPMsgAddr) >>> assert cdpv2.haslayer(CDPMsgPower) >>> assert cdpv2.haslayer(CDPMsgPowerRequest) >>> assert cdpv2.haslayer(CDPMsgPowerAvailable) >>> assert cdpv2[CDPMsgPowerRequest].type == 0x0019 >>> assert cdpv2[CDPMsgPowerRequest].len == 24 >>> assert cdpv2[CDPMsgPowerRequest].req_id == 0 >>> assert cdpv2[CDPMsgPowerRequest].mgmt_id == 0 >>> assert len(cdpv2[CDPMsgPowerRequest].power_requested_list) == 4 >>> assert cdpv2[CDPMsgPowerRequest].power_requested_list == [1, 2, 3, 4] >>> assert cdpv2[CDPMsgPowerAvailable].type == 0x001a >>> assert cdpv2[CDPMsgPowerAvailable].len == 20 >>> assert cdpv2[CDPMsgPowerAvailable].req_id == 0 >>> assert cdpv2[CDPMsgPowerAvailable].mgmt_id == 0 >>> assert len(cdpv2[CDPMsgPowerAvailable].power_available_list) == 3 >>> assert cdpv2[CDPMsgPowerAvailable].power_available_list == [5, 6, 7] Regression tests for the avs module ━ Run at 01:42:36 from [test/contrib/chdlc.uts] by UTscapy in 0.012043476104736328 └ Passed=3 └ Failed=0 ###### ## Basic AVS test ###### ###(000)=[passed] Default build, storage and dissection >>> pkt = CHDLC()/SLARP() >>> _filepath = get_temp_file(autoext=".pcap") >>> wrpcap(_filepath, pkt) >>> pkt1 = rdpcap(_filepath)[0] >>> assert raw(pkt) == raw(pkt1) >>> assert CHDLC in pkt >>> assert SLARP in pkt >>> >>> try: ... os.remove(_filepath) ... except Exception: ... pass ... ###(001)=[passed] Build request >>> pkt = CHDLC()/SLARP(type=0, address="192.168.0.131", mask="255.255.0.0") >>> pkt = CHDLC(raw(pkt)) >>> assert pkt[SLARP].address == "192.168.0.131" ###(002)=[passed] Build keepalive >>> pkt = CHDLC()/SLARP(type=2, mysequence=123, yoursequence=123456789, reliability=555) >>> pkt = CHDLC(raw(pkt)) >>> assert pkt[SLARP].yoursequence == 123456789 CoAP layer test campaign ━ Run at 01:42:36 from [test/contrib/coap.uts] by UTscapy in 0.03873300552368164 └ Passed=12 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the CoAP layer >>> from scapy.contrib.coap import * ###### ## Test CoAP ###### ###(001)=[passed] CoAP default values >>> assert raw(CoAP()) == b'\x40\x00\x00\x00' ###(002)=[passed] Token length calculation >>> p = CoAP(token='foobar') >>> assert CoAP(raw(p)).tkl == 6 ###(003)=[passed] CON GET dissect >>> p = CoAP(b'\x40\x01\xd9\xe1\xbb\x2e\x77\x65\x6c\x6c\x2d\x6b\x6e\x6f\x77\x6e\x04\x63\x6f\x72\x65') >>> assert p.code == 1 >>> assert p.ver == 1 >>> assert p.tkl == 0 >>> assert p.tkl == 0 >>> assert p.msg_id == 55777 >>> assert p.token == b'' >>> assert p.type == 0 >>> assert p.options == [('Uri-Path', b'.well-known'), ('Uri-Path', b'core')] ###(004)=[passed] Extended option delta >>> assert raw(CoAP(options=[("Uri-Query", "query")])) == b'\x40\x00\x00\x00\xd5\x02\x71\x75\x65\x72\x79' ###(005)=[passed] Extended option length >>> assert raw(CoAP(options=[("Location-Path", 'x' * 280)])) == b'\x40\x00\x00\x00\x8e\x00\x0b' + b'\x78' * 280 >>> assert len(CoAP(b'\x40\x00\x00\x00\x8e\x00\x0b' + b'\x78' * 280 + b'\xff').options[0][1]) == 280 ###(006)=[passed] Options should be ordered by option number >>> assert raw(CoAP(options=[("Uri-Query", "b"),("Uri-Path","a")])) == b'\x40\x00\x00\x00\xb1\x61\x41\x62' ###(007)=[passed] Options of the same type should not be reordered >>> assert raw(CoAP(options=[("Uri-Path", "b"),("Uri-Path","a")])) == b'\x40\x00\x00\x00\xb1\x62\x01\x61' ###### ## Test layer binding ###### ###(008)=[passed] Destination port >>> p = UDP()/CoAP() >>> assert p[UDP].dport == 5683 ###(009)=[passed] Source port >>> s = b'\x16\x33\xa0\xa4\x00\x78\xfe\x8b\x60\x45\xd9\xe1\xc1\x28\xff\x3c\x2f\x3e\x3b\x74\x69\x74\x6c\x65\x3d\x22\x47\x65' \ ... b'\x6e\x65\x72\x61\x6c\x20\x49\x6e\x66\x6f\x22\x3b\x63\x74\x3d\x30\x2c\x3c\x2f\x74\x69\x6d\x65\x3e\x3b\x69\x66\x3d' \ ... b'\x22\x63\x6c\x6f\x63\x6b\x22\x3b\x72\x74\x3d\x22\x54\x69\x63\x6b\x73\x22\x3b\x74\x69\x74\x6c\x65\x3d\x22\x49\x6e' \ ... b'\x74\x65\x72\x6e\x61\x6c\x20\x43\x6c\x6f\x63\x6b\x22\x3b\x63\x74\x3d\x30\x3b\x6f\x62\x73\x2c\x3c\x2f\x61\x73\x79' \ ... b'\x6e\x63\x3e\x3b\x63\x74\x3d\x30' >>> assert CoAP in UDP(s) ###(010)=[passed] building with a text/plain payload >>> p = CoAP(ver = 1, type = 0, code = 0x42, msg_id = 0xface, options=[("Content-Format", b"\x00")], paymark = b"\xff") >>> p /= Raw(b"\xde\xad\xbe\xef") >>> assert raw(p) == b'\x40\x42\xfa\xce\xc1\x00\xff\xde\xad\xbe\xef' ###(011)=[passed] dissection with a text/plain payload >>> p = CoAP(raw(p)) >>> assert p.ver == 1 >>> assert p.type == 0 >>> assert p.code == 0x42 >>> assert p.msg_id == 0xface >>> assert isinstance(p.payload, Raw) >>> assert p.payload.load == b'\xde\xad\xbe\xef' Test campaign ━ Run at 01:42:36 from [test/contrib/concox.uts] by UTscapy in 0.011371612548828125 └ Passed=1 └ Failed=0 ###### ## Concox CRX1 ###### ###(000)=[passed] Basic tests >>> r = raw(CRX1New(default_packet_length=5, default_packet_content=CRX1NewPacketContent())) >>> assert r == b'xx\x05\x12\x00\x00\x00\x00\r\n' >>> c = CRX1New(r) >>> assert CRX1NewPacketContent in c >>> >>> r = raw(CRX1New(start_bit=0x7979, extended_packet_length=5, extended_packet_content=CRX1NewPacketContent())) >>> assert r == b'yy\x00\x05\x12\x00\x00\x00\x00\r\n' >>> c = CRX1New(r) >>> assert CRX1NewPacketContent in c >>> >>> p = CRX1NewPacketContent(b'\x01\x41\x42\x43\x44\x45\x46\x47\x48\x02\x03\x04\x05') >>> assert p.terminal_id == b'4142434445464748' >>> >>> p = CRX1NewPacketContent(b'\x12\x41\x42\x43\x44\x45\x46\x47\x48\x02\x03\x04\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04') >>> assert p.crc == 0x304 and p.latitude Validation of Diameter layer ━ Run at 01:42:36 from [test/contrib/diameter.uts] by UTscapy in 0.16594386100769043 └ Passed=36 └ Failed=0 ###### ## Different ways of building basic AVPs ###### ###(000)=[passed] AVP identified by full name >>> a1 = AVP ('High-User-Priority', val=15) >>> a1.show() ###[ AVP High-User-Priority ]### avpCode = 559 avpFlags = 0x40 (-M-) avpLen = 0xc val = 15 >>> raw(a1) == b'\x00\x00\x02/@\x00\x00\x0c\x00\x00\x00\x0f' True ###(001)=[passed] Same AVP identified by the beginning of the name >>> a1b = AVP ('High-U', val=15) >>> a1b.show() ###[ AVP High-User-Priority ]### avpCode = 559 avpFlags = 0x40 (-M-) avpLen = 0xc val = 15 >>> raw(a1b) == raw(a1) True ###(002)=[passed] Same AVP identified by its code >>> a1c = AVP (559, val=15) >>> a1c.show() ###[ AVP High-User-Priority ]### avpCode = 559 avpFlags = 0x40 (-M-) avpLen = 0xc val = 15 >>> raw(a1c) == raw(a1) True ###(003)=[passed] The Session-Id AVP (with some padding added) >>> a2 = AVP ('Session-Id', val='aaa.test.orange.fr;1428128;644587') >>> a2.show() ###[ AVP Session-Id ]### avpCode = 263 avpFlags = 0x40 (-M-) avpLen = None val = b'aaa.test.orange.fr;1428128;644587' >>> raw(a2) == b'\x00\x00\x01\x07@\x00\x00)aaa.test.orange.fr;1428128;644587\x00\x00\x00' True ###(004)=[passed] An enumerated AVP >>> a3 = AVP ('Auth-Session-State', val='NO_STATE_MAINTAINED') >>> a3.show() ###[ AVP Auth-Session-State ]### avpCode = 277 avpFlags = 0x40 (-M-) avpLen = 0xc val = NO_STATE_MAINTAINED (1) >>> raw(a3) == b'\x00\x00\x01\x15@\x00\x00\x0c\x00\x00\x00\x01' True ###(005)=[passed] An address AVP >>> a4v4 = AVP("CG-Address", val='192.168.0.1') >>> a4v4.show() ###[ AVP CG-Address ]### avpCode = 846 avpFlags = 0xc0 (VM-) avpLen = None avpVnd = 3GPP (10415) val = 192.168.0.1 >>> raw(a4v4) == b'\x00\x00\x03N\xc0\x00\x00\x12\x00\x00(\xaf\x00\x01\xc0\xa8\x00\x01\x00\x00' True >>> >>> a4v6 = AVP("CG-Address", val='::1') >>> a4v6.show() ###[ AVP CG-Address ]### avpCode = 846 avpFlags = 0xc0 (VM-) avpLen = None avpVnd = 3GPP (10415) val = ::1 >>> raw(a4v6) == b'\x00\x00\x03N\xc0\x00\x00\x1e\x00\x00(\xaf\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00' True >>> >>> a4error = AVP("CG-Address", val="unknown") Warning: Address format not supported yet. >>> a4error.show() Warning: Address format not yet decoded. ###[ AVP CG-Address ]### avpCode = 846 avpFlags = 0xc0 (VM-) avpLen = None avpVnd = 3GPP (10415) val = b'' >>> assert raw(a4error) == raw(AVP("CG-Address")) ###(006)=[passed] A time AVP >>> a5 = AVP("Expiry-Time") >>> a5.show() ###[ AVP Expiry-Time ]### avpCode = 709 avpFlags = 0x80 (V--) avpLen = 0x10 avpVnd = 3GPP (10415) val = Sun Dec 8 01:42:36 2024 >>> assert not a5.val ###(007)=[passed] An empty Auth App ID AVP >>> a6 = AVP("Auth-Application-Id") >>> a6.show() ###[ AVP Auth-Application-Id ]### avpCode = 258 avpFlags = 0x40 (-M-) avpLen = 0xc val = None (Unknown) >>> raw(a6) == b'\x00\x00\x01\x02@\x00\x00\x0c\x00\x00\x00\x00' True ###(008)=[passed] An ISDN AVP >>> a7 = AVP("MSISDN", val="101") >>> a7.show() ###[ AVP MSISDN ]### avpCode = 701 avpFlags = 0xc0 (VM-) avpLen = None avpVnd = 3GPP (10415) val = b'101' >>> raw(a7) == b'\x00\x00\x02\xbd\xc0\x00\x00\x0e\x00\x00(\xaf\x01\xf1\x00\x00' True ###(009)=[passed] Some OctetString AVPs >>> a8 = AVP("Authorization-Token", val="test") >>> a8.show() ###[ AVP Authorization-Token ]### avpCode = 506 avpFlags = 0xc0 (VM-) avpLen = None avpVnd = 3GPP (10415) val = test >>> assert raw(a8) == b'\x00\x00\x01\xfa\xc0\x00\x00\x10\x00\x00(\xaftest' >>> >>> a8 = AVP("Authorization-Token", val=b"test\xc3\xa9") >>> a8.show() ###[ AVP Authorization-Token ]### avpCode = 506 avpFlags = 0xc0 (VM-) avpLen = None avpVnd = 3GPP (10415) val = testé >>> assert a8.val == b"test\xc3\xa9" >>> assert raw(a8) == b'\x00\x00\x01\xfa\xc0\x00\x00\x12\x00\x00(\xaftest\xc3\xa9\x00\x00' ###(010)=[passed] Unknown AVP identifier >>> a9 = AVP("wrong") The AVP identifier wrong has not been found. >>> assert not a9 ###### ## AVPs with vendor field ###### ###(011)=[passed] Vendor AVP identified by full name >>> a4 = AVP ('Feature-List-ID', val=1) >>> a4.show() ###[ AVP Feature-List-ID ]### avpCode = 629 avpFlags = 0x80 (V--) avpLen = 0x10 avpVnd = 3GPP (10415) val = 1 >>> raw(a4) == b'\x00\x00\x02u\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x01' True ###(012)=[passed] Same AVP identified by its code and vendor ID This time a list is required as first argument >>> a4c = AVP ( [629, 10415], val=1) >>> raw(a4c) == raw(a4) True ###### ## Altering the AVPs default provided values ###### ###(013)=[passed] Altering the flags of the Origin-Host AVP >>> a5 = AVP ('Origin-Host', avpFlags=187, val='aaa.test.orange.fr') >>> a5.show() ###[ AVP Origin-Host ]### avpCode = 264 avpFlags = 0xbb (V-Pxx-xx) avpLen = None val = b'aaa.test.orange.fr' >>> raw(a5) == b'\x00\x00\x01\x08\xbb\x00\x00\x1aaaa.test.orange.fr\x00\x00' True ###(014)=[passed] Altering the length of the Destination-Realm AVP >>> a6 = AVP (283, avpLen=33, val='foreign.realm1.fr') >>> a6.show() ###[ AVP Destination-Realm ]### avpCode = 283 avpFlags = 0x40 (-M-) avpLen = 0x21 val = b'foreign.realm1.fr' >>> raw(a6) == b'\x00\x00\x01\x1b@\x00\x00!foreign.realm1.fr\x00\x00\x00' True ###(015)=[passed] Altering the vendor of the Public-Identity AVP, and hence the flags ... >>> a7 = AVP ( [601, 98765432], val = 'sip:+0123456789@aaa.test.orange.fr') The AVP identifier [601, 98765432] has not been found. >>> a7.show() ###[ AVP Unknown ]### avpCode = 601 avpFlags = 0x80 (V--) avpLen = None avpVnd = Unkown_Vendor (98765432) val = b'sip:+0123456789@aaa.test.orange.fr' >>> raw(a7) == b'\x00\x00\x02Y\x80\x00\x00.\x05\xe3\nxsip:+0123456789@aaa.test.orange.fr\x00\x00' True ###### ## Grouped AVPs ###### ###(016)=[passed] The Supported-Features AVP (with vendor) >>> a8 = AVP ('Supported-Features') >>> a8.val.append(a1) >>> a8.val.append(a5) >>> a8.show() ###[ AVP Supported-Features ]### avpCode = 628 avpFlags = 0x80 (V--) avpLen = None avpVnd = 3GPP (10415) \val \ |###[ AVP High-User-Priority ]### | avpCode = 559 | avpFlags = 0x40 (-M-) | avpLen = 0xc | val = 15 |###[ AVP Origin-Host ]### | avpCode = 264 | avpFlags = 0xbb (V-Pxx-xx) | avpLen = None | val = b'aaa.test.orange.fr' >>> raw(a8) == b'\x00\x00\x02t\x80\x00\x004\x00\x00(\xaf\x00\x00\x02/@\x00\x00\x0c\x00\x00\x00\x0f\x00\x00\x01\x08\xbb\x00\x00\x1aaaa.test.orange.fr\x00\x00' True ###(017)=[passed] The same AVP created more simply >>> a8b = AVP ('Supported-Features', val = [a1, a5]) >>> raw(a8b) == raw(a8) True ###(018)=[passed] (re)Building the previous AVP from scratch >>> a8c = AVP ('Supported-Features', val = [ ... AVP ('High-User-Priority', val=15), ... AVP ('Origin-Host', avpFlags=187, val='aaa.test.orange.fr') ]) >>> raw(a8c) == raw(a8) True ###(019)=[passed] Another (dummy) grouped AVP >>> a9 = AVP (297, val = [a2, a4, a6]) >>> a9.show() ###[ AVP Experimental-Result ]### avpCode = 297 avpFlags = 0x40 (-M-) avpLen = None \val \ |###[ AVP Session-Id ]### | avpCode = 263 | avpFlags = 0x40 (-M-) | avpLen = None | val = b'aaa.test.orange.fr;1428128;644587' |###[ AVP Feature-List-ID ]### | avpCode = 629 | avpFlags = 0x80 (V--) | avpLen = 0x10 | avpVnd = 3GPP (10415) | val = 1 |###[ AVP Destination-Realm ]### | avpCode = 283 | avpFlags = 0x40 (-M-) | avpLen = 0x21 | val = b'foreign.realm1.fr' >>> raw(a9) == b'\x00\x00\x01)@\x00\x00`\x00\x00\x01\x07@\x00\x00)aaa.test.orange.fr;1428128;644587\x00\x00\x00\x00\x00\x02u\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x01\x00\x00\x01\x1b@\x00\x00!foreign.realm1.fr\x00\x00\x00' True ###(020)=[passed] A grouped AVP inside another grouped AVP >>> a10 = AVP ('Server-Cap', val = [a1, a9]) >>> a10.show() ###[ AVP Server-Capabilities ]### avpCode = 603 avpFlags = 0xc0 (VM-) avpLen = None avpVnd = 3GPP (10415) \val \ |###[ AVP High-User-Priority ]### | avpCode = 559 | avpFlags = 0x40 (-M-) | avpLen = 0xc | val = 15 |###[ AVP Experimental-Result ]### | avpCode = 297 | avpFlags = 0x40 (-M-) | avpLen = None | \val \ | |###[ AVP Session-Id ]### | | avpCode = 263 | | avpFlags = 0x40 (-M-) | | avpLen = None | | val = b'aaa.test.orange.fr;1428128;644587' | |###[ AVP Feature-List-ID ]### | | avpCode = 629 | | avpFlags = 0x80 (V--) | | avpLen = 0x10 | | avpVnd = 3GPP (10415) | | val = 1 | |###[ AVP Destination-Realm ]### | | avpCode = 283 | | avpFlags = 0x40 (-M-) | | avpLen = 0x21 | | val = b'foreign.realm1.fr' >>> raw(a10) == b'\x00\x00\x02[\xc0\x00\x00x\x00\x00(\xaf\x00\x00\x02/@\x00\x00\x0c\x00\x00\x00\x0f\x00\x00\x01)@\x00\x00`\x00\x00\x01\x07@\x00\x00)aaa.test.orange.fr;1428128;644587\x00\x00\x00\x00\x00\x02u\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x01\x00\x00\x01\x1b@\x00\x00!foreign.realm1.fr\x00\x00\x00' True ###(021)=[passed] A big grouped AVP >>> a11 = AVP ('SIP-Auth', val = [a2, a4, a8, a10]) >>> a11.show() ###[ AVP SIP-Auth-Data-Item ]### avpCode = 376 avpFlags = 0x40 (-M-) avpLen = None \val \ |###[ AVP Session-Id ]### | avpCode = 263 | avpFlags = 0x40 (-M-) | avpLen = None | val = b'aaa.test.orange.fr;1428128;644587' |###[ AVP Feature-List-ID ]### | avpCode = 629 | avpFlags = 0x80 (V--) | avpLen = 0x10 | avpVnd = 3GPP (10415) | val = 1 |###[ AVP Supported-Features ]### | avpCode = 628 | avpFlags = 0x80 (V--) | avpLen = None | avpVnd = 3GPP (10415) | \val \ | |###[ AVP High-User-Priority ]### | | avpCode = 559 | | avpFlags = 0x40 (-M-) | | avpLen = 0xc | | val = 15 | |###[ AVP Origin-Host ]### | | avpCode = 264 | | avpFlags = 0xbb (V-Pxx-xx) | | avpLen = None | | val = b'aaa.test.orange.fr' |###[ AVP Server-Capabilities ]### | avpCode = 603 | avpFlags = 0xc0 (VM-) | avpLen = None | avpVnd = 3GPP (10415) | \val \ | |###[ AVP High-User-Priority ]### | | avpCode = 559 | | avpFlags = 0x40 (-M-) | | avpLen = 0xc | | val = 15 | |###[ AVP Experimental-Result ]### | | avpCode = 297 | | avpFlags = 0x40 (-M-) | | avpLen = None | | \val \ | | |###[ AVP Session-Id ]### | | | avpCode = 263 | | | avpFlags = 0x40 (-M-) | | | avpLen = None | | | val = b'aaa.test.orange.fr;1428128;644587' | | |###[ AVP Feature-List-ID ]### | | | avpCode = 629 | | | avpFlags = 0x80 (V--) | | | avpLen = 0x10 | | | avpVnd = 3GPP (10415) | | | val = 1 | | |###[ AVP Destination-Realm ]### | | | avpCode = 283 | | | avpFlags = 0x40 (-M-) | | | avpLen = 0x21 | | | val = b'foreign.realm1.fr' >>> raw(a11) == b'\x00\x00\x01x@\x00\x00\xf0\x00\x00\x01\x07@\x00\x00)aaa.test.orange.fr;1428128;644587\x00\x00\x00\x00\x00\x02u\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x01\x00\x00\x02t\x80\x00\x004\x00\x00(\xaf\x00\x00\x02/@\x00\x00\x0c\x00\x00\x00\x0f\x00\x00\x01\x08\xbb\x00\x00\x1aaaa.test.orange.fr\x00\x00\x00\x00\x02[\xc0\x00\x00x\x00\x00(\xaf\x00\x00\x02/@\x00\x00\x0c\x00\x00\x00\x0f\x00\x00\x01)@\x00\x00`\x00\x00\x01\x07@\x00\x00)aaa.test.orange.fr;1428128;644587\x00\x00\x00\x00\x00\x02u\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x01\x00\x00\x01\x1b@\x00\x00!foreign.realm1.fr\x00\x00\x00' True ###(022)=[passed] Dissect grouped AVP >>> a12 = DiamG(b'\x01\x00\x00!\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xbd\xc0\x00\x00\r\x00\x00(\xaf\x01') >>> assert isinstance(a12.avpList[0], AVP_10415_701) >>> assert "MSISDN" in a12.avpList[0].name ###### ## Diameter Requests (without AVPs) ###### ###(023)=[passed] A simple request identified by its name >>> r1 = DiamReq ('Capabilities-Exchange', drHbHId=1234, drEtEId=5678) >>> r1.show() ###[ Capabilities-Exchange-Request ]### version = 0x1 drLen = None drFlags = 0x80 Request (R---) drCode = 257 (Capabilities-Exchange) drAppId = Diameter_Common_Messages drHbHId = 0x4d2 drEtEId = 0x162e \avpList \ >>> raw(r1) == b'\x01\x00\x00\x14\x80\x00\x01\x01\x00\x00\x00\x00\x00\x00\x04\xd2\x00\x00\x16.' True ###(024)=[passed] Unknown request by its name >>> ur = DiamReq ('Unknown') Diameter command with name Unknown not found in DR_cmd_def dictionary. >>> raw(ur) == b'\x01\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(025)=[passed] The same one identified by its code >>> r1b = DiamReq (257, drHbHId=1234, drEtEId=5678) >>> raw(r1b) == raw(r1) True ###(026)=[passed] Unknown request by its code >>> ur = DiamReq (0) No Diameter command with code 0 found in DR_cmd_def dictionary >>> raw(ur) == b'\x01\x00\x00\x14\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(027)=[passed] The same one identified by its abbreviation Only the first 2 abbreviation letters are significant (although 3 are provided in this example) >>> r1c = DiamReq ('CER', drHbHId=1234, drEtEId=5678) >>> raw(r1c) == raw(r1) True ###(028)=[passed] Altering the request default fields >>> r2 = DiamReq ('CER', drHbHId=1234, drEtEId=5678, drFlags=179, drAppId=978, drLen=12) >>> r2.show() ###[ Capabilities-Exchange-Request ]### version = 0x1 drLen = 0xc drFlags = 0xb3 Request (R-ET--xx) drCode = 257 (Capabilities-Exchange) drAppId = 978 drHbHId = 0x4d2 drEtEId = 0x162e \avpList \ >>> raw(r2) == b'\x01\x00\x00\x0c\xb3\x00\x01\x01\x00\x00\x03\xd2\x00\x00\x04\xd2\x00\x00\x16.' True ###(029)=[passed] Altering the default request fields with string >>> r2b = DiamReq ('CER', drAppId="1") >>> r2b.show() ###[ Capabilities-Exchange-Request ]### version = 0x1 drLen = None drFlags = None drCode = 257 (Capabilities-Exchange) drAppId = 3GPP_S13/S13' drHbHId = 0x0 drEtEId = 0x0 \avpList \ >>> raw(r2b) == b'\x01\x00\x00\x14\x00\x00\x01\x01\x01\x00\x00$\x00\x00\x00\x00\x00\x00\x00\x00' True ###(030)=[passed] Altering the default request fields with invalid string >>> r2be = DiamReq ('CER', drAppId="-1") Application ID with name -1 not found in AppIDsEnum dictionary. >>> r2be.show() ###[ Unknown ]### version = 0x1 drLen = None drFlags = None drCode = 257 (Capabilities-Exchange) drAppId = None drHbHId = 0x0 drEtEId = 0x0 \avpList \ >>> raw(r2be) == b'\x01\x00\x00\x14\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###### ## Diameter Answers (without AVPs) ###### ###(031)=[passed] A simple answer identified by its name >>> ans1 = DiamAns ('Capabilities-Exchange', drHbHId=1234, drEtEId=5678) >>> ans1.show() ###[ Capabilities-Exchange-Answer ]### version = 0x1 drLen = None drFlags = 0x0 Answer (----) drCode = 257 (Capabilities-Exchange) drAppId = Diameter_Common_Messages drHbHId = 0x4d2 drEtEId = 0x162e \avpList \ >>> raw(ans1) == b'\x01\x00\x00\x14\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x04\xd2\x00\x00\x16.' True ###(032)=[passed] Same answer identified by its code or abbreviation >>> ans1b = DiamAns (257, drHbHId=1234, drEtEId=5678) >>> ans1c = DiamAns ('CEA', drHbHId=1234, drEtEId=5678) >>> a = raw(ans1b) == raw(ans1) >>> b = raw(ans1c) == raw(ans1) >>> a, b (True, True) >>> assert a and b ###(033)=[passed] Altering the answer default fields >>> ans2 = DiamAns ('CEA', drHbHId=1234, drEtEId=5678, drFlags=115, drAppId=1154, drLen=18) >>> ans2.show() ###[ Capabilities-Exchange-Answer ]### version = 0x1 drLen = 0x12 drFlags = 0x73 Answer (-PET--xx) drCode = 257 (Capabilities-Exchange) drAppId = 1154 drHbHId = 0x4d2 drEtEId = 0x162e \avpList \ >>> raw(ans2) == b'\x01\x00\x00\x12s\x00\x01\x01\x00\x00\x04\x82\x00\x00\x04\xd2\x00\x00\x16.' True ###### ## Full Diameter messages ###### ###(034)=[passed] A dummy Multimedia-Auth request (identified by only a portion of its name) >>> r3 = DiamReq ('Multimedia-Auth', drHbHId=0x5478, drEtEId=0x1234, avpList = [a11]) >>> r3.show() ###[ Multimedia-Auth-Request ]### version = 0x1 drLen = None drFlags = 0xc0 Request (RP--) drCode = 286 (Multimedia-Auth) drAppId = Diameter_Session_Initiation_Protocol_(SIP)_Application drHbHId = 0x5478 drEtEId = 0x1234 \avpList \ |###[ AVP SIP-Auth-Data-Item ]### | avpCode = 376 | avpFlags = 0x40 (-M-) | avpLen = None | \val \ | |###[ AVP Session-Id ]### | | avpCode = 263 | | avpFlags = 0x40 (-M-) | | avpLen = None | | val = b'aaa.test.orange.fr;1428128;644587' | |###[ AVP Feature-List-ID ]### | | avpCode = 629 | | avpFlags = 0x80 (V--) | | avpLen = 0x10 | | avpVnd = 3GPP (10415) | | val = 1 | |###[ AVP Supported-Features ]### | | avpCode = 628 | | avpFlags = 0x80 (V--) | | avpLen = None | | avpVnd = 3GPP (10415) | | \val \ | | |###[ AVP High-User-Priority ]### | | | avpCode = 559 | | | avpFlags = 0x40 (-M-) | | | avpLen = 0xc | | | val = 15 | | |###[ AVP Origin-Host ]### | | | avpCode = 264 | | | avpFlags = 0xbb (V-Pxx-xx) | | | avpLen = None | | | val = b'aaa.test.orange.fr' | |###[ AVP Server-Capabilities ]### | | avpCode = 603 | | avpFlags = 0xc0 (VM-) | | avpLen = None | | avpVnd = 3GPP (10415) | | \val \ | | |###[ AVP High-User-Priority ]### | | | avpCode = 559 | | | avpFlags = 0x40 (-M-) | | | avpLen = 0xc | | | val = 15 | | |###[ AVP Experimental-Result ]### | | | avpCode = 297 | | | avpFlags = 0x40 (-M-) | | | avpLen = None | | | \val \ | | | |###[ AVP Session-Id ]### | | | | avpCode = 263 | | | | avpFlags = 0x40 (-M-) | | | | avpLen = None | | | | val = b'aaa.test.orange.fr;1428128;644587' | | | |###[ AVP Feature-List-ID ]### | | | | avpCode = 629 | | | | avpFlags = 0x80 (V--) | | | | avpLen = 0x10 | | | | avpVnd = 3GPP (10415) | | | | val = 1 | | | |###[ AVP Destination-Realm ]### | | | | avpCode = 283 | | | | avpFlags = 0x40 (-M-) | | | | avpLen = 0x21 | | | | val = b'foreign.realm1.fr' >>> raw(r3) == b'\x01\x00\x01\x04\xc0\x00\x01\x1e\x00\x00\x00\x06\x00\x00Tx\x00\x00\x124\x00\x00\x01x@\x00\x00\xf0\x00\x00\x01\x07@\x00\x00)aaa.test.orange.fr;1428128;644587\x00\x00\x00\x00\x00\x02u\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x01\x00\x00\x02t\x80\x00\x004\x00\x00(\xaf\x00\x00\x02/@\x00\x00\x0c\x00\x00\x00\x0f\x00\x00\x01\x08\xbb\x00\x00\x1aaaa.test.orange.fr\x00\x00\x00\x00\x02[\xc0\x00\x00x\x00\x00(\xaf\x00\x00\x02/@\x00\x00\x0c\x00\x00\x00\x0f\x00\x00\x01)@\x00\x00`\x00\x00\x01\x07@\x00\x00)aaa.test.orange.fr;1428128;644587\x00\x00\x00\x00\x00\x02u\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x01\x00\x00\x01\x1b@\x00\x00!foreign.realm1.fr\x00\x00\x00' True ###(035)=[passed] The same request built from scratch >>> r3b = DiamReq ('Multimedia-Auth', drHbHId=0x5478, drEtEId=0x1234, ... avpList = [ ... AVP ('SIP-Auth', val = [ ... AVP ('Session-Id', val='aaa.test.orange.fr;1428128;644587'), ... AVP ('Feature-List-ID', val=1), ... AVP ('Supported-Features', val = [ ... AVP ('High-User-Priority', val=15), ... AVP ('Origin-Host', avpFlags=187, val='aaa.test.orange.fr') ... ]), ... AVP ('Server-Cap', val = [ ... AVP ('High-User-Priority', val=15), ... AVP (297, val = [ ... AVP ('Session-Id', val='aaa.test.orange.fr;1428128;644587'), ... AVP ('Feature-List-ID', val=1), ... AVP (283, avpLen=33, val='foreign.realm1.fr') ... ]) ... ]) ... ]) ... ]) >>> >>> raw(r3b) == raw(r3) True Test campaign ━ Run at 01:42:36 from [test/contrib/dtp.uts] by UTscapy in 0.019983530044555664 └ Passed=3 └ Failed=0 ###### ## DTP Contrib tests ###### ###(000)=[passed] Basic DTP build >>> pkt = DTP(tlvlist=[DTPNeighbor(neighbor='00:11:22:33:44:55'), DTPDomain(domain=b"\x01\x02\x03")]) >>> assert raw(pkt) == b'\x01\x00\x04\x00\n\x00\x11"3DU\x00\x01\x00\x07\x01\x02\x03' ###(001)=[passed] Basic DTP dissection >>> pkt = Ether(b'\x01\x00\x0c\xcc\xcc\xcc\xd0P\x99V\xdd\xf9\x00"\xaa\xaa\x03\x00\x00\x0c \x04\x01\x00\x03\x00\x05\xa5\x00\x04\x00\n\xaa\xbb\xcc\xdd\xee\xff\x00\x01\x00\x05\x00\x00\x02\x00\x05\x03') >>> assert DTP in pkt >>> assert pkt[DTP].tlvlist[0].dtptype == b'\xa5' >>> assert pkt[DTP].tlvlist[1].neighbor == 'aa:bb:cc:dd:ee:ff' >>> assert pkt[DTP].tlvlist[2].domain == b'\x00' >>> assert pkt[DTP].tlvlist[3].status == b'\x03' ###(002)=[passed] Test negotiate_trunk >>> from unittest import mock >>> >>> def test_pkt(pkt): ... pkt = Ether(raw(pkt)) ... assert DTP in pkt ... assert len(pkt[DTP].tlvlist) == 4 ... print("Succeed") ... >>> @mock.patch("scapy.contrib.dtp.sendp", side_effect=test_pkt) ... def _test_negotiate_trunk(m): ... negotiate_trunk() ... >>> _test_negotiate_trunk() Trying to negotiate a trunk on interface eth0 Succeed Test campaign ━ Run at 01:42:36 from [test/contrib/eddystone.uts] by UTscapy in 0.024335384368896484 └ Passed=6 └ Failed=0 ###### ## Eddystone tests ###### ###(000)=[passed] Setup >>> def expect_exception(e, c): ... try: ... c() ... return False ... except e: ... return True ... ###(001)=[passed] Eddystone URL (decode EIR) >>> d = hex_bytes('0c16aafe10040373636170790a') >>> p = EIR_Hdr(d) >>> p.show() ###[ EIR Header ]### len = 12 type = svc_data_16_bit_uuid ###[ EIR Service Data - 16-bit UUID ]### svc_uuid = 0xfeaa ###[ Eddystone Frame ]### type = 1 reserved = 0 ###[ Eddystone URL ]### tx_power = 4 url_scheme= b'https://' url = b'scapy.net' >>> >>> assert p[EIR_ServiceData16BitUUID].svc_uuid == 0xfeaa >>> assert p[Eddystone_URL].to_url() == b'https://scapy.net' ###(002)=[passed] Eddystone URL (decode LE Set Advertising Data) >>> d = hex_bytes('01082020140201020303aafe0c16aafe10040373636170790a0000000000000000000000') >>> p = HCI_Hdr(d) >>> >>> assert p[EIR_ServiceData16BitUUID].svc_uuid == 0xfeaa >>> assert p[Eddystone_URL].to_url() == b'https://scapy.net' ###(003)=[passed] Eddystone URL (encode frames) >>> d = raw(Eddystone_URL.from_url('https://scapy.net')) >>> assert d == hex_bytes('10000373636170790a') >>> >>> d = raw(Eddystone_URL.from_url('https://www.scapy.net')) >>> assert d == hex_bytes('10000173636170790a') >>> >>> d = raw(Eddystone_URL.from_url('http://www.example.com/hello.info.html')) >>> assert d == hex_bytes('1000006578616d706c650068656c6c6f0b2e68746d6c') ###(004)=[passed] Eddystone URL (encode unsupported scheme) >>> assert expect_exception(Exception, lambda: Eddystone_URL.from_url('gopher://example.com')) ###(005)=[passed] Eddystone URL (encode advertising report) >>> p = Eddystone_URL.from_url('https://scapy.net').build_advertising_report() >>> assert raw(p[EIR_ServiceData16BitUUID]) == hex_bytes('aafe10000373636170790a') EIGRP Tests ━ Run at 01:42:37 from [test/contrib/eigrp.uts] by UTscapy in 0.1405320167541504 └ Passed=53 └ Failed=0 Tests for the Scapy EIGRP layer ###### ## Basic Layer Tests ###### These are just some basic tests ###(000)=[passed] EIGRP IPv4 Binding >>> p = IP()/EIGRP() >>> p[IP].proto == 88 True ###(001)=[passed] EIGRP IPv6 Binding >>> p = IPv6()/EIGRP() >>> p[IPv6].nh == 88 True ###(002)=[passed] EIGRP checksum field >>> p = IP()/EIGRP(flags=0xa, seq=23, ack=42, asn=100) >>> s = p[EIGRP].build() >>> struct.unpack("!H", s[2:4])[0] == 64843 True ###### ## Custom Field Tests ###### Test funciontally of custom made fields ###(003)=[passed] ShortVersionField nice representation >>> f = ShortVersionField("ver", 3072) >>> f.i2repr(None, 3072) == "v12.0" and f.i2repr(None, 258) == "v1.2" True ###(004)=[passed] ShortVersionField h2i function >>> f = ShortVersionField("ver", 0) >>> f.h2i(None, 3073) == f.h2i(None, "v12.1") True ###(005)=[passed] ShortVersionField error >>> try: ... f = ShortVersionField("ver", None) ... f.h2i(None, "Error") ... assert False ... except Scapy_Exception: ... assert True ... >>> f = ShortVersionField("ver", "default") >>> assert f.h2i(None, "Error") == "default" set value to default. Format of 'Error' is invalid >>> assert f.i2repr(None, "Error") == "unknown" >>> assert f.randval() <= 65535 ###(006)=[passed] EigrpIPField length with prefix length of 8 bit >>> f = EigrpIPField("ipaddr", "192.168.1.0", length=8) >>> assert f.m2i(None, b"\x01") == '1.0.0.0' >>> assert f.i2m(None, "1.0.0.0") == b"\x01" >>> assert f.i2len(None, "") == 1 ###(007)=[passed] EigrpIPField length with prefix length of 12 bit >>> f = EigrpIPField("ipaddr", "192.168.1.0", length=12) >>> assert f.m2i(None, b"\x01\x02") == '1.2.0.0' >>> assert f.i2len(None, "") == 2 ###(008)=[passed] EigrpIPField length with prefix length of 24 bit >>> f = EigrpIPField("ipaddr", "192.168.1.0", length=24) >>> assert f.m2i(None, b"\x01\x02\x03") == '1.2.3.0' >>> assert f.i2len(None, "") == 3 ###(009)=[passed] EigrpIPField length with prefix length of 28 bit >>> f = EigrpIPField("ipaddr", "192.168.1.0", length=28) >>> assert f.m2i(None, b"\x01\x02\x03\x04") == '1.2.3.4' >>> assert f.i2len(None, "") == 4 ###(010)=[passed] EigrpIPField randval >>> assert inet_pton(socket.AF_INET, f.randval()) ###(011)=[passed] EigrpIP6Field length with prefix length of 8 bit >>> f = EigrpIP6Field("ipaddr", "2000::", length=8) >>> f.i2len(None, "") == 2 True ###(012)=[passed] EigrpIP6Field length with prefix length of 99 bit >>> f = EigrpIP6Field("ipaddr", "2000::", length=99) >>> f.i2len(None, "") == 13 True ###(013)=[passed] EigrpIP6Field length with prefix length of 128 bit >>> f = EigrpIP6Field("ipaddr", "2000::", length=128) >>> f.i2len(None, "") == 16 True ###(014)=[passed] EigrpIP6Field randval >>> assert inet_pton(socket.AF_INET6, f.randval()) ###(015)=[passed] EIGRPGuessPayloadClass function: Return Parameters TLV >>> from scapy.contrib.eigrp import _EIGRPGuessPayloadClass >>> isinstance(_EIGRPGuessPayloadClass(b"\x00\x01" + b"\x00" * 50), EIGRPParam) True ###(016)=[passed] EIGRPGuessPayloadClass function: Return Authentication Data TLV >>> isinstance(_EIGRPGuessPayloadClass(b"\x00\x02" + b"\x00" * 50), EIGRPAuthData) True ###(017)=[passed] EIGRPGuessPayloadClass function: Return Sequence TLV >>> isinstance(_EIGRPGuessPayloadClass(b"\x00\x03" + b"\x00" * 50), EIGRPSeq) True ###(018)=[passed] EIGRPGuessPayloadClass function: Return Software Version TLV >>> isinstance(_EIGRPGuessPayloadClass(b"\x00\x04" + b"\x00" * 50), EIGRPSwVer) True ###(019)=[passed] EIGRPGuessPayloadClass function: Return Next Multicast Sequence TLV >>> isinstance(_EIGRPGuessPayloadClass(b"\x00\x05" + b"\x00" * 50), EIGRPNms) True ###(020)=[passed] EIGRPGuessPayloadClass function: Return Stub Router TLV >>> isinstance(_EIGRPGuessPayloadClass(b"\x00\x06" + b"\x00" * 50), EIGRPStub) True ###(021)=[passed] EIGRPGuessPayloadClass function: Return Internal Route TLV >>> isinstance(_EIGRPGuessPayloadClass(b"\x01\x02" + b"\x00" * 50), EIGRPIntRoute) True ###(022)=[passed] EIGRPGuessPayloadClass function: Return External Route TLV >>> isinstance(_EIGRPGuessPayloadClass(b"\x01\x03" + b"\x00" * 50), EIGRPExtRoute) True ###(023)=[passed] EIGRPGuessPayloadClass function: Return IPv6 Internal Route TLV >>> isinstance(_EIGRPGuessPayloadClass(b"\x04\x02" + b"\x00" * 50), EIGRPv6IntRoute) True ###(024)=[passed] EIGRPGuessPayloadClass function: Return IPv6 External Route TLV >>> isinstance(_EIGRPGuessPayloadClass(b"\x04\x03" + b"\x00" * 100), EIGRPv6ExtRoute) True ###(025)=[passed] EIGRPGuessPayloadClass function: Return EIGRPGeneric >>> isinstance(_EIGRPGuessPayloadClass(b"\x23\x42" + b"\x00" * 50), EIGRPGeneric) True ###### ## TLV List ###### ###(026)=[passed] EIGRP parameters and software version >>> p = IP()/EIGRP(tlvlist=[EIGRPParam()/EIGRPSwVer()]) >>> s = b'\x45\x00\x00\x3C\x00\x01\x00\x00\x40\x58\x7C\x67\x7F\x00\x00\x01\x7F\x00\x00\x01\x02\x05\xEE\x6C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x64\x00\x01\x00\x0C\x01\x00\x01\x00\x00\x00\x00\x0F\x00\x04\x00\x08\x0C\x00\x01\x02' >>> raw(p) == s True ###(027)=[passed] EIGRP Sequence >>> p = EIGRP(tlvlist=[EIGRPSeq(addrlen=16, ip6addr="45e4:0ecf:cff3:7be2:6059:771e:a221:3342")]) >>> assert raw(p) == b'\x02\x05\x881\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x03\x00\x15\x10E\xe4\x0e\xcf\xcf\xf3{\xe2`Yw\x1e\xa2!3B' >>> p = EIGRP(raw(p)) >>> assert p.tlvlist[0].ip6addr == "45e4:ecf:cff3:7be2:6059:771e:a221:3342" ###(028)=[passed] EIGRP Generic >>> p = EIGRP(opcode=5, ack=1, flags="init", tlvlist=[EIGRPGeneric(value=b"data"), EIGRPGeneric(value=b"doto")]) >>> p = EIGRP(raw(p)) >>> assert p.tlvlist[1].value == b"doto" >>> assert p.tlvlist[1].len == 8 >>> assert p.summary() == 'EIGRP (AS=100 Opcode=Hello (ACK) Flags=init)' ###(029)=[passed] EIGRP internal route length field >>> p = IP()/EIGRP(tlvlist=[EIGRPIntRoute(prefixlen=24, dst="192.168.1.0")]) >>> struct.unpack("!H", p[EIGRPIntRoute].build()[2:4])[0] == 28 True >>> p = IP(raw(p)) >>> assert p.tlvlist[0].prefixlen == 24 >>> assert p.tlvlist[0].dst == "192.168.1.0" ###(030)=[passed] EIGRP external route length field >>> p = IP()/EIGRP(tlvlist=[EIGRPExtRoute(prefixlen=16, dst="10.1.0.0")]) >>> struct.unpack("!H", p[EIGRPExtRoute].build()[2:4])[0] == 47 True ###(031)=[passed] EIGRPv6 internal route length field >>> p = IP()/EIGRP(tlvlist=[EIGRPv6IntRoute(prefixlen=64, dst="2000::")]) >>> struct.unpack("!H", p[EIGRPv6IntRoute].build()[2:4])[0] == 46 True >>> p = IP(raw(p)) >>> assert p.tlvlist[0].prefixlen == 64 >>> assert p.tlvlist[0].dst == "2000::" ###(032)=[passed] EIGRPv6 external route length field >>> p = IP()/EIGRP(tlvlist=[EIGRPv6ExtRoute(prefixlen=99, dst="2000::")]) >>> struct.unpack("!H", p[EIGRPv6ExtRoute].build()[2:4])[0] == 70 True ###### ## Stub Flags ###### The receive-only flag is always set, when a router announces itself as stub router. ###(033)=[passed] Receive-Only >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="receive-only")]) >>> p[EIGRPStub].flags == 0x0008 True ###(034)=[passed] Connected >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+receive-only")]) >>> p[EIGRPStub].flags == 0x0009 True ###(035)=[passed] Static >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="static+receive-only")]) >>> p[EIGRPStub].flags == 0x000a True ###(036)=[passed] Summary >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="summary+receive-only")]) >>> p[EIGRPStub].flags == 0x000c True ###(037)=[passed] Connected, Summary >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+summary+receive-only")]) >>> p[EIGRPStub].flags == 0x000d True ###(038)=[passed] Static, Summary >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="static+summary+receive-only")]) >>> p[EIGRPStub].flags == 0x000e True ###(039)=[passed] Redistributed, Connected >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+connected+receive-only")]) >>> p[EIGRPStub].flags == 0x0019 True ###(040)=[passed] Redistributed, Static >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+static+receive-only")]) >>> p[EIGRPStub].flags == 0x001a True ###(041)=[passed] Redistributed, Static, Connected >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+static+connected+receive-only")]) >>> p[EIGRPStub].flags == 0x001b True ###(042)=[passed] Redistributed, Summary >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+summary+receive-only")]) >>> p[EIGRPStub].flags == 0x001c True ###(043)=[passed] Redistributed, Connected, Summary >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="redistributed+connected+summary+receive-only")]) >>> p[EIGRPStub].flags == 0x001d True ###(044)=[passed] Connected, Redistributed, Static, Summary >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+redistributed+static+summary+receive-only")]) >>> p[EIGRPStub].flags == 0x001f True ###(045)=[passed] Leak-Map >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="leak-map+receive-only")]) >>> p[EIGRPStub].flags == 0x0028 True ###(046)=[passed] Connected, Leak-Map >>> p = IP()/EIGRP(tlvlist=[EIGRPStub(flags="connected+leak-map+receive-only")]) >>> p[EIGRPStub].flags == 0x0029 True ###### ## Routing Updates ###### ###(047)=[passed] External route flag external >>> p = EIGRPExtRoute(flags="external") >>> p.flags == 0x1 True ###(048)=[passed] External route flag candidate-default route >>> p = EIGRPExtRoute(flags="candidate-default") >>> p.flags == 0x2 True ###(049)=[passed] Multiple internal routing updates >>> p = IP()/EIGRP(tlvlist=[EIGRPIntRoute(), EIGRPIntRoute(hopcount=12), EIGRPIntRoute()]) >>> p[EIGRPIntRoute:2].hopcount == 12 True ###(050)=[passed] Multiple external routing updates >>> p = IP()/EIGRP(tlvlist=[EIGRPExtRoute(), EIGRPExtRoute(mtu=23), EIGRPExtRoute()]) >>> p[EIGRPExtRoute:2].mtu == 23 True ###### ## Authentication Data TLV ###### ###(051)=[passed] Verify keysize calculation >>> p = IP()/EIGRP(tlvlist=[EIGRPAuthData(authdata=b"\xaa\xbb\xcc")]) >>> p[EIGRPAuthData].build()[6:8] == b"\x00\x03" True ###(052)=[passed] Verify length calculation >>> p = IP()/EIGRP(tlvlist=[EIGRPAuthData(authdata=b"\xaa\xbb\xcc\xdd")]) >>> p[EIGRPAuthData].build()[2:4] == b"\x00\x1c" True ENIP Tests ━ Run at 01:42:37 from [test/contrib/enipTCP.uts] by UTscapy in 0.049903154373168945 └ Passed=22 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the enip layer >>> from scapy.contrib.enipTCP import * ###### ## Test ENIP/TCP Encapsulation Header ###### ###(001)=[passed] Encapsulation Header Default Values >>> pkt=ENIPTCP() >>> assert pkt.commandId == None >>> assert pkt.length == 0 >>> assert pkt.session == 0 >>> assert pkt.status == None >>> assert pkt.senderContext == 0 >>> assert pkt.options == 0 ###### ## ENIP List Services 0x0004 ###### ###(002)=[passed] ENIP List Services Reply Command ID >>> pkt=ENIPTCP() >>> pkt.commandId=0x4 >>> assert pkt.commandId == 0x4 ###(003)=[passed] ENIP List Services Default Values >>> pkt=ENIPListServices() >>> assert pkt.itemCount == 0 ###(004)=[passed] ENIP List Services Custom Values >>> pkt.items.append(ENIPListServicesItem(serviceName=b'test')) >>> assert pkt.items[0].itemTypeCode == 0 >>> assert pkt.items[0].itemLength == 0 >>> assert pkt.items[0].protocolVersion == 0 >>> assert pkt.items[0].flag == 0 >>> assert pkt.items[0].serviceName == b'test' ###### ## ENIP List Identity 0x0063 ###### ###(005)=[passed] ENIP List Identity Reply Command ID >>> pkt=ENIPTCP() >>> pkt.commandId=0x63 >>> assert pkt.commandId == 0x63 >>> assert raw(pkt) == b"c\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" ###(006)=[passed] ENIP List Identity Default Values >>> pkt=ENIPListIdentity() >>> assert pkt.itemCount == 0 ###(007)=[passed] ENIP List Identity Custom Values >>> pkt=ENIPListIdentityItem(sinAddress="192.168.1.1", ... productNameLength=4, productName=b"test") >>> assert pkt.protocolVersion == 0 >>> assert pkt.sinAddress == "192.168.1.1" >>> assert pkt.productNameLength == 4 >>> assert pkt.productName == b'test' ###### ## ENIP List Interfaces ###### ###(008)=[passed] ENIP List Interfaces Reply Command ID >>> pkt=ENIPTCP() >>> pkt.commandId=0x64 >>> assert pkt.commandId == 0x64 ###(009)=[passed] ENIP List Interfaces Reply Default Values >>> pkt=ENIPListInterfaces() >>> assert pkt.itemCount == 0 ###(010)=[passed] ENIP List Interfaces Reply Items Default Values >>> pkt=ENIPListInterfacesItem(itemTypeCode=0x0c) >>> assert pkt.itemTypeCode == 0x0c >>> assert pkt.itemLength == 0 >>> assert pkt.itemData == b'' ###### ## ENIP Register Session ###### ###(011)=[passed] ENIP Register Session Command ID >>> pkt=ENIPTCP() >>> pkt.commandId=0x65 >>> assert pkt.commandId == 0x65 ###(012)=[passed] ENIP Register Session Default Values >>> pkt=ENIPRegisterSession() >>> assert pkt.protocolVersion == 1 >>> assert pkt.options == 0 ###(013)=[passed] ENIP Register Session Request >>> registerSessionReqPkt = b'\x65\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00' >>> >>> pkt = ENIPTCP(registerSessionReqPkt) >>> assert pkt.commandId == 0x65 >>> assert pkt.length == 4 >>> assert pkt.session == 0 >>> assert pkt.status == 0 >>> assert pkt.senderContext == 0 >>> assert pkt.options == 0 >>> assert pkt[ENIPRegisterSession].protocolVersion == 1 >>> assert pkt[ENIPRegisterSession].options == 0 ###(014)=[passed] ENIP Register Session Reply >>> registerSessionRepPkt = b'\x65\x00\x04\x00\x7b\x9a\x4e\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00' >>> >>> pkt = ENIPTCP(registerSessionRepPkt) >>> assert pkt.commandId == 0x65 >>> assert pkt.length == 4 >>> assert pkt.session == 0xa14e9a7b >>> assert pkt.status == 0 >>> assert pkt.senderContext == 0 >>> assert pkt.options == 0 >>> assert pkt[ENIPRegisterSession].protocolVersion == 1 >>> assert pkt[ENIPRegisterSession].options == 0 >>> raw(pkt) b'e\x00\x04\x00{\x9aN\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00' ###### ## ENIP Send RR Data ###### ###(015)=[passed] ENIP Send RR Data Command ID >>> pkt=ENIPTCP() >>> pkt.commandId=0x6f >>> assert pkt.commandId == 0x6f ###(016)=[passed] ENIP Send RR Data Default Values >>> pkt=ENIPSendRRData() >>> assert pkt.interface == 0 >>> assert pkt.timeout == 255 >>> assert pkt.itemCount == 0 ###(017)=[passed] ENIP Send RR Data Request >>> sendRRDataReqPkt = b'\x6f\x00\x3e\x00\x7b\x9a\x4e\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\xb2\x00\x2e\x00' >>> pkt = ENIPTCP(sendRRDataReqPkt) >>> assert pkt.commandId == 0x6f >>> assert pkt.length == 62 >>> assert pkt.session == 0xa14e9a7b >>> assert pkt.status == 0 >>> assert pkt.senderContext == 0 >>> assert pkt.options == 0 >>> assert pkt.interface == 0 >>> assert pkt.timeout == 0 >>> assert pkt.itemCount == 2 ###(018)=[passed] ENIP Send RR Data Reply >>> sendRRDataRepPkt = b'\x6f\x00\x2e\x00\x7b\x9a\x4e\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x02\x00\x00\x00\x00\x00\xb2\x00\x1e\x00' >>> >>> pkt = ENIPTCP(sendRRDataRepPkt) >>> assert pkt.commandId == 0x6f >>> assert pkt.length == 46 >>> assert pkt.session == 0xa14e9a7b >>> assert pkt.status == 0 >>> assert pkt.senderContext == 0 >>> assert pkt.options == 0 >>> assert pkt.interface == 0 >>> assert pkt.timeout == 1024 >>> assert pkt.items[0].typeId == 0 >>> assert pkt.items[0].length == 0 >>> assert pkt.items[1].typeId == 0x00b2 >>> assert pkt.items[1].length == 30 ###### ## ENIP Send Unit Data ###### ###(019)=[passed] ENIP Send Unit Data Command ID >>> pkt=ENIPTCP() >>> pkt.commandId=0x70 >>> assert pkt.commandId == 0x70 ###(020)=[passed] ENIP Send Unit Data Default Values >>> pkt=ENIPSendUnitData() >>> assert pkt.interface == 0 >>> assert pkt.timeout == 255 >>> assert pkt.itemCount == 0 ###(021)=[passed] ENIP Send Unit Data >>> sendUnitDataPkt = b'\x70\x00\x2d\x00\x7b\x9a\x4e\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xa1\x00\x04\x00\xcc\x60\x9a\x7b\xb1\x00\x19\x00\x01\x00' >>> >>> pkt = ENIPTCP(sendUnitDataPkt) >>> assert pkt.commandId == 0x70 >>> assert pkt.length == 45 >>> assert pkt.session == 0xa14e9a7b >>> assert pkt.status == 0 >>> assert pkt.senderContext == 0 >>> assert pkt.options == 0 >>> assert pkt.interface == 0 >>> assert pkt.timeout == 0 >>> assert pkt.itemCount == 2 >>> >>> assert pkt.items[0].typeId == 0x00a1 >>> assert pkt.items[0].length == 4 >>> assert pkt.items[0].data == b'\x7b\x9a\x60\xcc' >>> assert pkt.items[1].typeId == 0x00b1 >>> assert pkt.items[1].length == 25 >>> assert pkt.items[1].data == b'\x00\x01' ERSPAN ━ Run at 01:42:37 from [test/contrib/erspan.uts] by UTscapy in 0.019357919692993164 └ Passed=5 └ Failed=0 ###### ## ERSPAN I ###### ###(000)=[passed] Build & dissect ERSPAN 1 >>> pkt = GRE()/ERSPAN_I()/Ether() >>> pkt = GRE(bytes(pkt)) MAC address to reach destination not found. Using broadcast. >>> assert ERSPAN in pkt >>> assert pkt.proto == 0x88be >>> assert pkt.seqnum_present == 0 ###### ## ERSPAN II ###### ###(001)=[passed] Build ERSPAN II >>> pkt = GRE()/ERSPAN_II()/Ether(src="11:11:11:11:11:11", dst="ff:ff:ff:ff:ff:ff") >>> b = bytes(pkt) >>> assert b == b'\x10\x00\x88\xbe\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x11\x11\x11\x11\x11\x11\x90\x00' ###(002)=[passed] Dissect ERSPAN II >>> pkt = GRE(b) >>> assert pkt[GRE].proto == 0x88be >>> assert pkt[GRE].seqnum_present == 1 >>> assert pkt[GRE][ERSPAN].ver == 1 >>> assert pkt[Ether].src == "11:11:11:11:11:11" ###### ## ERSPAN III ###### ###(003)=[passed] Build & dissect ERSPAN III with platform specific >>> pkt = GRE()/ERSPAN_III()/ERSPAN_PlatformSpecific()/Ether() >>> pkt = GRE(bytes(pkt)) MAC address to reach destination not found. Using broadcast. >>> assert pkt[GRE].proto == 0x22eb >>> assert pkt[ERSPAN_III].o == 1 >>> assert ERSPAN_PlatformSpecific in pkt >>> assert Ether in pkt ###(004)=[passed] Build & dissect ERSPAN III without platform specific >>> pkt = GRE()/ERSPAN_III()/Ether() >>> pkt = GRE(bytes(pkt)) more MAC address to reach destination not found. Using broadcast. >>> assert pkt[GRE].proto == 0x22eb >>> assert pkt[ERSPAN_III].o == 0 >>> assert ERSPAN_PlatformSpecific not in pkt >>> assert Ether in pkt ESMC unit tests ━ Run at 01:42:37 from [test/contrib/esmc.uts] by UTscapy in 0.010383844375610352 └ Passed=2 └ Failed=0 ###### ## ESMC ###### ###(000)=[passed] Build & dissect ESMC and QLTLV >>> pkt = Ether(src="00:13:c4:12:0f:0d") / SlowProtocol() / ESMC(event=1) / QLTLV(ssmCode=0x2) >>> pkt.show() ###[ Ethernet ]### dst = 01:80:c2:00:00:02 src = 00:13:c4:12:0f:0d type = 0x8809 ###[ SlowProtocol ]### subtype = OSSP ###[ ESMC ]### ituOui = 0019a7 ituSubtype= 1 version = 1 event = 1 reserved1 = 0 reserved2 = 000000 ###[ QLTLV ]### type = 1 length = 4 ssmCode = 0x2 >>> s = raw(pkt) >>> raw_pkt = b'\x01\x80\xc2\x00\x00\x02\x00\x13\xc4\x12\x0f\x0d\x88\x09\x0a\x00\x19\xa7\x00' \ ... b'\x01\x18\x00\x00\x00\x01\x00\x04\x02' >>> assert s == raw_pkt >>> >>> p = Ether(s) >>> assert SlowProtocol in p and ESMC in p and QLTLV in p >>> assert raw(p) == raw_pkt ###(001)=[passed] Build & dissect ESMC and EQLTLV >>> pkt = pkt / EQLTLV(clockIdentity=b'\x11\x22\x33\x44\x55\x66\x77\x88') >>> pkt.show() ###[ Ethernet ]### dst = 01:80:c2:00:00:02 src = 00:13:c4:12:0f:0d type = 0x8809 ###[ SlowProtocol ]### subtype = OSSP ###[ ESMC ]### ituOui = 0019a7 ituSubtype= 1 version = 1 event = 1 reserved1 = 0 reserved2 = 000000 ###[ QLTLV ]### type = 1 length = 4 ssmCode = 0x2 ###[ EQLTLV ]### type = 2 length = 20 enhancedSsmCode= 0xff clockIdentity= 1122334455667788 flag = 0 cascaded_eEEcs= 1 cascaded_EEcs= 0 reserved = 0000000000 >>> s = raw(pkt) >>> raw_pkt = b'\x01\x80\xc2\x00\x00\x02\x00\x13\xc4\x12\x0f\x0d\x88\x09\x0a\x00\x19\xa7\x00' \ ... b'\x01\x18\x00\x00\x00\x01\x00\x04\x02\x02\x00\x14\xff\x11\x22\x33\x44\x55\x66' \ ... b'\x77\x88\x00\x01\x00\x00\x00\x00\x00\x00' >>> assert s == raw_pkt >>> >>> p = Ether(s) >>> assert SlowProtocol in p and ESMC in p and QLTLV in p and EQLTLV in p >>> assert raw(p) == raw_pkt EtherCat test campaign ━ Run at 01:42:37 from [test/contrib/ethercat.uts] by UTscapy in 0.2176210880279541 └ Passed=9 └ Failed=0 ###### ## LEBitFields ###### ###(000)=[passed] regression test >>> TEST_SAMPLE_ENUM = { ... 0x01: 'one', ... 0x02: 'two', ... 0x03: 'three', ... 0x04: 'four', ... 0x05: 'five', ... 0x06: 'six', ... 0x07: 'seven' ... } >>> >>> class BitFieldUserExampleLE(Packet): ... ... fields_desc = [ ... LEBitEnumField('a', 0, 2, TEST_SAMPLE_ENUM), ... LEBitField('b', 0, 18), ... LEBitField('c', 0, 5), ... LEBitField('d', 0, 23), ... ] ... >>> class BitFieldUserExample(Packet): ... ... fields_desc = [ ... BitEnumField('a', 0, 2, TEST_SAMPLE_ENUM), ... BitField('b', 0, 18), ... BitField('c', 0, 5), ... BitField('d', 0, 23), ... ] ... >>> test_data = [ ... { ... 'a':0x01, ... 'b':0x00, ... 'c':0x00, ... 'd':0x123456 ... }, ... { ... 'a': 0x00, ... 'b': 0b111111111111111111, ... 'c': 0x00, ... 'd': 0x112233 ... }, ... { ... 'a': 0x00, ... 'b': 0x00, ... 'c': 0x01, ... 'd': 0x00 ... }, ... ] >>> >>> for data in test_data: ... bf_le = BitFieldUserExampleLE(**data) ... bf = BitFieldUserExample(**data) ... # rebuild big-endian and little-endian bitfields from its own binary expressions ... bf_le = BitFieldUserExampleLE(bf_le.do_build()) ... bf = BitFieldUserExample(bf.do_build()) ... ''' disabled as only required for 'visual debugging' ... from scapy.compat import raw ... # dump content for debugging ... bitstr = '' ... hexstr = '' ... for i in bytearray(raw(bf)): ... bitstr += '{:08b} '.format(i) ... hexstr += '{:02x} '.format(i) ... print('BE - BITS: {} HEX: {} ({})'.format(bitstr, hexstr, data)) ... bitstr = '' ... hexstr = '' ... for i in bytearray(raw(bf_le)): ... bitstr += '{:08b} '.format(i) ... hexstr += '{:02x} '.format(i) ... print('LE - BITS: {} HEX: {} ({})'.format(bitstr, hexstr, data)) ... ''' ... # compare values ... for key in data: ... assert getattr(bf,key) == data[key] ... assert (getattr(bf_le, key) == data[key]) ... " disabled as only required for 'visual debugging'\n from scapy.compat import raw\n # dump content for debugging\n bitstr = ''\n hexstr = ''\n for i in bytearray(raw(bf)):\n bitstr += '{:08b} '.format(i)\n hexstr += '{:02x} '.format(i)\n print('BE - BITS: {} HEX: {} ({})'.format(bitstr, hexstr, data))\n bitstr = ''\n hexstr = ''\n for i in bytearray(raw(bf_le)):\n bitstr += '{:08b} '.format(i)\n hexstr += '{:02x} '.format(i)\n print('LE - BITS: {} HEX: {} ({})'.format(bitstr, hexstr, data))\n " " disabled as only required for 'visual debugging'\n from scapy.compat import raw\n # dump content for debugging\n bitstr = ''\n hexstr = ''\n for i in bytearray(raw(bf)):\n bitstr += '{:08b} '.format(i)\n hexstr += '{:02x} '.format(i)\n print('BE - BITS: {} HEX: {} ({})'.format(bitstr, hexstr, data))\n bitstr = ''\n hexstr = ''\n for i in bytearray(raw(bf_le)):\n bitstr += '{:08b} '.format(i)\n hexstr += '{:02x} '.format(i)\n print('LE - BITS: {} HEX: {} ({})'.format(bitstr, hexstr, data))\n " " disabled as only required for 'visual debugging'\n from scapy.compat import raw\n # dump content for debugging\n bitstr = ''\n hexstr = ''\n for i in bytearray(raw(bf)):\n bitstr += '{:08b} '.format(i)\n hexstr += '{:02x} '.format(i)\n print('BE - BITS: {} HEX: {} ({})'.format(bitstr, hexstr, data))\n bitstr = ''\n hexstr = ''\n for i in bytearray(raw(bf_le)):\n bitstr += '{:08b} '.format(i)\n hexstr += '{:02x} '.format(i)\n print('LE - BITS: {} HEX: {} ({})'.format(bitstr, hexstr, data))\n " ###(001)=[passed] Avoid mix of LEBitFields and BitFields >>> TEST_SAMPLE_ENUM = { ... 0x01: 'one', ... 0x02: 'two', ... 0x03: 'three', ... 0x04: 'four', ... 0x05: 'five', ... 0x06: 'six', ... 0x07: 'seven' ... } >>> >>> class MissingFieldSameLEFieldTypes(Packet): ... ... fields_desc = [ ... LEBitEnumField('a', 0, 2, TEST_SAMPLE_ENUM), ... LEBitField('b', 0, 18), ... ] ... >>> try: ... frm = MissingFieldSameLEFieldTypes().build() ... assert False ... except LEBitFieldSequenceException: ... pass ... >>> >>> class MissingFieldDifferentLEFieldTypes(Packet): ... ... fields_desc = [ ... LEBitEnumField('a', 0, 2, TEST_SAMPLE_ENUM), ... LEBitField('b', 0, 18), ... ] ... >>> try: ... frm = MissingFieldDifferentLEFieldTypes().build() ... assert False ... except LEBitFieldSequenceException: ... pass ... >>> >>> class MixedBitFieldTypesLEBE(Packet): ... ... fields_desc = [ ... LEBitField('a', 0, 12), ... BitField('b', 0, 4), ... ] ... >>> try: ... frm = MixedBitFieldTypesLEBE().build() ... assert False ... except LEBitFieldSequenceException: ... pass ... >>> >>> class MixedBitFieldTypesBELE(Packet): ... ... fields_desc = [ ... BitField('b', 0, 4), ... LEBitField('a', 0, 12), ... ] ... >>> try: ... frm = MixedBitFieldTypesBELE().build() ... assert False ... except LEBitFieldSequenceException: ... pass ... ###### ## EtherCat header layer handling ###### ###(002)=[passed] EtherCat and padding >>> frm = Ether() / EtherCat() >>> frm = Ether(frm.do_build()) EtherCat.guess_payload_class() - unknown or invalid DLPDU type >>> assert frm[EtherCat].length == 0 >>> assert len(frm) == 60 >>> frm = Ether()/Dot1Q()/Dot1Q()/EtherCat() >>> frm = Ether()/EtherCat() >>> assert len(frm) == 60 >>> frm = Ether(frm.do_build()) EtherCat.guess_payload_class() - unknown or invalid DLPDU type >>> assert frm[EtherCat].length == 0 ###(003)=[passed] EtherCat and RawPayload >>> frm=Ether()/EtherCat()/Raw(b'0123456789') >>> assert len(frm) == 60 >>> frm = Ether(frm.do_build()) more EtherCat.guess_payload_class() - unknown or invalid DLPDU type >>> assert frm[EtherCat].length == 10 >>> frm = Ether()/EtherCat()/Raw(b'012345678901234567890123456789012345678901234567890123456789') >>> frm = Ether(frm.do_build()) >>> assert len(frm) == 76 >>> assert frm[EtherCat].length == 60 ###(004)=[passed] EtherCat - test invalid length detection >>> nums_11_bits = [random.randint(0, 65535) & 0b11111111111 for dummy in range(0, 23)] >>> nums_4_bits = [random.randint(0, 16) & 0b1111 for dummy in range(0, 23)] >>> >>> old_max_list_count = conf.max_list_count >>> conf.max_list_count = 3000 >>> >>> frm = Ether()/EtherCat()/EtherCatAPRD(adp=0x1234, ado=0x5678, irq=0xbad0, wkc=0xbeef, data=[1]*2035, c=1) >>> frm = Ether(frm.do_build()) >>> assert frm[EtherCat].length == 2047 >>> assert len(frm[EtherCatAPRD].data) == 2035 >>> assert frm[EtherCatAPRD].c == 1 >>> >>> data_oversized = False >>> try: ... frm = Ether()/EtherCat()/EtherCatAPRD(adp=0x1234, ado=0x5678, irq=0xbad0, wkc=0xbeef, data=[2]*2048, c=1) ... frm = Ether(frm.do_build()) ... except ValueError as err: ... data_oversized = True ... assert 'data size' in str(err) ... >>> assert data_oversized == True >>> dlpdu_oversized = False >>> try: ... frm = Ether()/EtherCat()/EtherCatAPRD(adp=0x1234, ado=0x5678, irq=0xbad0, wkc=0xbeef, data=[2]*2036, c=1) ... frm = Ether(frm.do_build()) ... except ValueError as err: ... dlpdu_oversized = True ... assert 'EtherCat message' in str(err) ... >>> assert dlpdu_oversized == True >>> >>> frm = Ether()/EtherCat(_reserved=1)/EtherCatAPRD(adp=0x1234, ado=0x5678, irq=0xbad0, wkc=0xbeef, data=[3], c=0) >>> frm = Ether(frm.do_build()) >>> assert frm[EtherCatAPRD].c == 0 >>> >>> >>> assert frm[EtherCat]._reserved == 0 >>> >>> conf.max_list_count = old_max_list_count ###(005)=[passed] EtherCat and Type12 DLPDU layers >>> for type_id in EtherCat.ETHERCAT_TYPE12_DLPDU_TYPES: ... data = [random.randint(0, 255) for dummy in range(random.randint(1, 10))] ... frm = Ether() / EtherCat() / EtherCat.ETHERCAT_TYPE12_DLPDU_TYPES[type_id](data= data) ... frm = Ether(frm.do_build()) ... # expect to have one layer of current Type12 DLPDU type ... dlpdu_lyr = frm[EtherCat.ETHERCAT_TYPE12_DLPDU_TYPES[type_id]] ... assert dlpdu_lyr.data == data ... ###(006)=[passed] EtherCat and Type12 DLPDU layer using structure used for physical and broadcast addressing >>> test_data = [121,99,110,104,114,109,58,41] >>> frm = Ether()/EtherCat()/EtherCatAPRD(adp=0x1234, ado=0x5678, irq=0xbad0, wkc=0xbeef, data=test_data) >>> frm = Ether(frm.do_build()) >>> aprd_lyr = frm[EtherCatAPRD] >>> assert aprd_lyr.adp == 0x1234 >>> assert aprd_lyr.ado == 0x5678 >>> assert aprd_lyr.irq == 0xbad0 >>> assert aprd_lyr.wkc == 0xbeef >>> assert aprd_lyr.data == test_data ###(007)=[passed] EtherCat and Type12 DLPDU layer using structure used for logical addressing >>> test_data = [116,104,101,116,97,111,105,115,103,114,101,97,116] >>> frm = Ether() / EtherCat() / EtherCatLRD(adr=0x11223344, irq=0xbad0, wkc=0xbeef, data=test_data) >>> frm = Ether(frm.do_build()) >>> aprd_lyr = frm[EtherCatLRD] >>> assert (aprd_lyr.adr == 0x11223344) >>> assert (aprd_lyr.irq == 0xbad0) >>> assert (aprd_lyr.wkc == 0xbeef) >>> assert (aprd_lyr.data == test_data) ###(008)=[passed] EtherCat and randomly stacked Type12 DLPDU layers >>> for outer_dummy in range(10): ... frm = Ether()/EtherCat() ... layer_ids = [] ... for inner_dummy in range(random.randint(1, 20)): ... layer_id = random.choice(list(EtherCat.ETHERCAT_TYPE12_DLPDU_TYPES)) ... layer_ids.append(layer_id) ... frm = frm / EtherCat.ETHERCAT_TYPE12_DLPDU_TYPES[layer_id]() ... # build frame and convert back ... frm = Ether(frm.do_build()) ... idx = 0 ... for layer_id in layer_ids: ... assert type(EtherCat.ETHERCAT_TYPE12_DLPDU_TYPES[layer_id]()) == type(frm[2 + idx]) ... idx += 1 ... Test campaign ━ Run at 01:42:37 from [test/contrib/etherip.uts] by UTscapy in 0.003795623779296875 └ Passed=1 └ Failed=0 ###### ## EtherIP Contrib tests ###### ###(000)=[passed] Basic EtherIP test >>> pkt = Ether(b'\x99\xc1o\xd2\xf5c\x9d\xb7\xd0\xc2\xe0\xd3\x08\x00E\x00\x00@\x00\x01\x00\x00@a,\xf3B\x83\x17\xc6\xad\xc2E^0\x00\xd5/\xf26\xab\xe2\x9f\xb4tD\xa4\x98\x08\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01W-\xe7\x98H\xfa\xad\xc2E^\x08\x00\xf7\xff\x00\x00\x00\x00') >>> assert ICMP in pkt >>> assert EtherIP in pkt Exposure Notification System tests ━ Run at 01:42:37 from [test/contrib/exposure_notification.uts] by UTscapy in 0.011931419372558594 └ Passed=4 └ Failed=0 ###### ## ENS tests ###### ###(000)=[passed] Setup >>> def next_eir(p): ... return EIR_Hdr(p[Padding].load) ... ###(001)=[passed] Presence check >>> Exposure_Notification_Frame ###(002)=[passed] Raw payload copied from BluetoothExplorer.app >>> d = hex_bytes('17df1d67405e3395470e62ca4fda6a9303687b31') >>> p = Exposure_Notification_Frame(d) >>> >>> assert p.identifier == hex_bytes('17df1d67405e3395470e62ca4fda6a93') >>> assert p.metadata == hex_bytes('03687b31') ###(003)=[passed] Raw captured payload >>> d = hex_bytes('02011a03036ffd17166ffde23f352fa09307a85d4194912443180d484dc151') >>> p = EIR_Hdr(d) >>> >>> assert EIR_Flags in p >>> >>> p = next_eir(p) >>> assert p[EIR_CompleteList16BitServiceUUIDs].svc_uuids == [ ... EXPOSURE_NOTIFICATION_UUID] >>> >>> p = next_eir(p) >>> assert p[EIR_ServiceData16BitUUID].svc_uuid == EXPOSURE_NOTIFICATION_UUID >>> assert p[Exposure_Notification_Frame].identifier == hex_bytes( ... 'e23f352fa09307a85d4194912443180d') >>> assert p[Exposure_Notification_Frame].metadata == hex_bytes('484dc151') >>> >>> p2 = p[Exposure_Notification_Frame].build_eir() >>> >>> p2[0] = EIR_Hdr() / EIR_Flags(flags=[ ... 'general_disc_mode', 'simul_le_br_edr_ctrl', 'simul_le_br_edr_host']) >>> >>> assert LowEnergyBeaconHelper.base_eir[0][EIR_Flags].flags == [ ... 'general_disc_mode', 'br_edr_not_supported'] >>> >>> assert b''.join(map(raw, p2)) == d Test campaign ━ Run at 01:42:37 from [test/contrib/geneve.uts] by UTscapy in 0.04680919647216797 └ Passed=9 └ Failed=0 ###### ## GENEVE ###### ###(000)=[passed] Build & dissect - GENEVE encapsulates Ether >>> s = raw(IP()/UDP(sport=10000)/GENEVE()/Ether(dst='00:01:00:11:11:11',src='00:02:00:22:22:22')) >>> assert s == b'E\x00\x002\x00\x01\x00\x00@\x11|\xb8\x7f\x00\x00\x01\x7f\x00\x00\x01\'\x10\x17\xc1\x00\x1e\x9a\x1c\x00\x00eX\x00\x00\x00\x00\x00\x01\x00\x11\x11\x11\x00\x02\x00"""\x90\x00' >>> >>> p = IP(s) >>> assert GENEVE in p and Ether in p[GENEVE].payload ###(001)=[passed] Build & dissect - GENEVE with options encapsulates Ether >>> s = raw(IP()/UDP(sport=10000)/GENEVE(critical=1, options=b'\x00\x01\x81\x02\x0a\x0a\x0b\x0b')/Ether(dst='00:01:00:11:11:11',src='00:02:00:22:22:22')) >>> assert s == b'E\x00\x00:\x00\x01\x00\x00@\x11|\xb0\x7f\x00\x00\x01\x7f\x00\x00\x01\'\x10\x17\xc1\x00&\x01\xb4\x02@eX\x00\x00\x00\x00\x00\x01\x81\x02\n\n\x0b\x0b\x00\x01\x00\x11\x11\x11\x00\x02\x00"""\x90\x00' >>> >>> p = IP(s) >>> assert GENEVE in p and Ether in p[GENEVE].payload and p[GENEVE].critical == 1 and p[GENEVE].optionlen == 2 ###(002)=[passed] Build & dissect - GENEVE with metadata options encapsulates Ether >>> s = raw(Ether()/Dot1Q()/IP()/UDP(sport=57025,dport=6081)/GENEVE(proto=0x6558,options=GeneveOptions(classid=0x0102,type=0x80,data=b'\x00\x01\x00\x02'))/Ether()/IP()/ICMP(type=8)) >>> assert (s == b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x81\x00\x00\x01\x08\x00E\x00\x00V\x00\x01\x00\x00@\x11|\x94\x7f\x00\x00\x01\x7f\x00\x00\x01\xde\xc1\x17\xc1\x00B\x1a\x86\x02\x00eX\x00\x00\x00\x00\x01\x02\x80\x01\x00\x01\x00\x02\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00\x1c\x00\x01\x00\x00@\x01|\xde\x7f\x00\x00\x01\x7f\x00\x00\x01\x08\x00\xf7\xff\x00\x00\x00\x00') >>> >>> p = Ether(s) >>> assert GENEVE in p and Ether in p[GENEVE].payload and p[GENEVE].proto == 0x6558 and p[GeneveOptions].length == 1 and p[GeneveOptions].classid == 0x102 and p[GeneveOptions].type == 0x80 ###(003)=[passed] Build & dissect - GENEVE with multiple options >>> s = raw(GENEVE(proto=0x0800,options=[GeneveOptions(classid=0x0102,type=0x1,data=b'\x00\x01\x00\x02'), GeneveOptions(classid=0x0102,type=0x2,data=b'\x00\x01\x00\x02')])) >>> p = GENEVE(s) >>> assert p.optionlen == 4 >>> assert len(p.options) == 2 >>> assert p.options[0].classid == 0x102 and p.options[0].type == 0x1 >>> assert p.options[1].classid == 0x102 and p.options[1].type == 0x2 ###(004)=[passed] Build & dissect - GENEVE encapsulates IPv4 >>> s = raw(IP()/UDP(sport=10000)/GENEVE()/IP()) >>> assert s == b"E\x00\x008\x00\x01\x00\x00@\x11|\xb2\x7f\x00\x00\x01\x7f\x00\x00\x01'\x10\x17\xc1\x00$\xba\xd2\x00\x00\x08\x00\x00\x00\x00\x00E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01" >>> >>> p = IP(s) >>> assert GENEVE in p and IP in p[GENEVE].payload ###(005)=[passed] Build & dissect - GENEVE encapsulates IPv6 >>> s = raw(IP()/UDP(sport=10000)/GENEVE()/IPv6()) >>> assert s == b"E\x00\x00L\x00\x01\x00\x00@\x11|\x9e\x7f\x00\x00\x01\x7f\x00\x00\x01'\x10\x17\xc1\x008\xa0\x8a\x00\x00\x86\xdd\x00\x00\x00\x00`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01" >>> >>> p = IP(s) >>> assert GENEVE in p and IPv6 in p[GENEVE].payload ###(006)=[passed] GENEVE - Answers >>> a = GENEVE(proto=0x0800)/b'E\x00\x00\x1c\x00\x01\x00\x00@\x01\xfa$\xc0\xa8\x00w\xac\xd9\x12\xc3\x08\x00\xf7\xff\x00\x00\x00\x00' >>> b = GENEVE(proto=0x0800)/b'E\x00\x00\x1c\x00\x00\x00\x007\x01\x03&\xac\xd9\x12\xc3\xc0\xa8\x00w\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> c = Raw("data") >>> >>> a = GENEVE(raw(a)) >>> b = GENEVE(raw(b)) >>> >>> assert b.answers(a) >>> assert not a.answers(b) >>> assert not b.answers(c) >>> assert not a.answers(c) ###(007)=[passed] GENEVE - Summary >>> a = GENEVE(proto=0x0800)/b'E\x00\x00\x1c\x00\x01\x00\x00@\x01\xfa$\xc0\xa8\x00w\xac\xd9\x12\xc3\x08\x00\xf7\xff\x00\x00\x00\x00' >>> a = GENEVE(raw(a)) >>> assert a.summary() == 'GENEVE / IP / ICMP 192.168.0.119 > 172.217.18.195 echo-request 0' >>> assert a.mysummary() in ['GENEVE (vni=0x0,optionlen=0,proto=0x800)', 'GENEVE (vni=0x0,optionlen=0,proto=IPv4)'] ###(008)=[passed] GENEVE - Optionlen >>> for size in range(0, 0x1f, 4): ... p = GENEVE(bytes(GENEVE(options=GeneveOptions(data=RandString(size))))) ... assert p[GENEVE].optionlen == (size // 4 + 1) ... assert len(p[GENEVE].options[0].data) == size ... Test campaign ━ Run at 01:42:37 from [test/contrib/gtp.uts] by UTscapy in 0.2663750648498535 └ Passed=73 └ Failed=0 ###### ## GTPv1 ###### ###(000)=[passed] GTPHeader, basic instantiation >>> a = GTPHeader() >>> assert a.version == 1 >>> assert a.E == a.S == a.PN == 0 ###(001)=[passed] GTP_U_Header detection >>> a = GTPHeader(raw(GTP_U_Header()/GTPErrorIndication())) >>> assert isinstance(a, GTP_U_Header) ###(002)=[passed] GTP_U_Header with PDU Session Container >>> a = GTPHeader(raw(GTP_U_Header()/GTPPDUSessionContainer(QFI=3))) >>> assert isinstance(a, GTP_U_Header) >>> assert a[GTP_U_Header].E == 1 and a[GTP_U_Header].next_ex == 0x85 >>> assert a[GTPPDUSessionContainer].ExtHdrLen == 1 >>> assert a[GTPPDUSessionContainer].PPP == 0 and a[GTPPDUSessionContainer].RQI == 0 >>> assert a[GTPPDUSessionContainer].QFI == 3 >>> assert a[GTPPDUSessionContainer].NextExtHdr == 0 ###(003)=[passed] GTP_U_Header with PDU Session Container with QFI/PPI >>> a = GTPHeader(raw(GTP_U_Header()/GTPPDUSessionContainer(type=0, QFI=3, PPP=1, PPI=6))) >>> assert isinstance(a, GTP_U_Header) >>> assert a[GTP_U_Header].E == 1 and a[GTP_U_Header].next_ex == 0x85 >>> assert a[GTPPDUSessionContainer].ExtHdrLen == 2 >>> assert a[GTPPDUSessionContainer].PPP == 1 and a[GTPPDUSessionContainer].RQI == 0 >>> assert a[GTPPDUSessionContainer].QFI == 3 and a[GTPPDUSessionContainer].PPI == 6 >>> assert a[GTPPDUSessionContainer].NextExtHdr == 0 >>> assert a[GTPPDUSessionContainer].type == 0 ###(004)=[passed] GTP_U_Header sub layers >>> a = IPv6(raw(IPv6()/UDP()/GTP_U_Header()/IPv6())) >>> b = IPv6(raw(IPv6()/UDP()/GTP_U_Header()/IP())) >>> c = IP(raw(IP()/UDP()/GTP_U_Header()/IPv6())) >>> d = IP(raw(IP()/UDP()/GTP_U_Header()/IP())) >>> >>> assert isinstance(a[GTP_U_Header].payload, IPv6) >>> assert isinstance(b[GTP_U_Header].payload, IP) >>> assert isinstance(c[GTP_U_Header].payload, IPv6) >>> assert isinstance(d[GTP_U_Header].payload, IP) >>> >>> a = IP(raw(IP()/UDP()/GTP_U_Header()/PPP())) >>> assert isinstance(a[GTP_U_Header].payload, PPP) ###(005)=[passed] GTPPDUSessionContainer(), dissect >>> h = 'fa163ed6de7bfa163ed82b9408004500008400000000fe114b560a0a2e010a0a2efe086808680070000034ff006000000001fa163e850200ff800000000045000054074d00004001fb490a0a31fe0a0a32010000325600930001c444ca5f00000000759e0a0000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637' >>> gtp = Ether(hex_bytes(h)) >>> gtp[GTP_U_Header].ExtHdrLen == 2 and gtp[GTP_U_Header].padding == b'\x00\x00\x00' and gtp[GTP_U_Header][IP].src == '10.10.49.254' and gtp[GTP_U_Header][IP][ICMP].type == 0 and gtp[GTP_U_Header].type == 0 and gtp[GTP_U_Header].QMP == 0 and gtp[GTP_U_Header].PPP == 1 and gtp[GTP_U_Header].RQI == 1 and gtp[GTP_U_Header].QFI == 63 and gtp[GTP_U_Header].PPI == 4 True ###(006)=[passed] GTPPDUSessionContainer with padding >>> data = b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00^\x00\x01\x00\x00@\x11|\x8c\x7f\x00\x00\x01\x7f\x00\x00\x01\x08h\x08h\x00J\xed^4\xff\x00:\x00\x00\x00\x00\x00\x00\x00\x85\x04\x08\xbf\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00E\x00\x00&\x00\x01\x00\x00@\x11|\xc4\x7f\x00\x00\x01\x7f\x00\x00\x01\x005\x005\x00\x12\x01^ffffffffff000' >>> gtp = Ether(data) >>> assert IP in gtp ###(007)=[passed] GTPEchoResponse matches GTPEchoRequest by seq >>> req = GTPHeader(seq=12345)/GTPEchoRequest() >>> res = GTPHeader(seq=12345)/GTPEchoResponse() >>> assert req.hashret() == res.hashret() >>> assert res.answers(req) ###(008)=[passed] GTPCreatePDPContextRequest(), basic instantiation >>> gtp = IP(src="127.0.0.1", dst="127.0.0.1")/UDP(dport=2123, sport=2123)/GTPHeader(teid=2807)/GTPCreatePDPContextRequest() >>> gtp.dport == 2123 and gtp.teid == 2807 and len(gtp.IE_list) == 5 True ###(009)=[passed] GTPCreatePDPContextRequest(), basic dissection >>> random.seed(0x2807) >>> rg = raw(gtp) >>> rg b"E\x00\x00K\x00\x01\x00\x00@\x11|\x9f\x7f\x00\x00\x01\x7f\x00\x00\x01\x08K\x08K\x007\x8e\x860\x10\x00'\x00\x00\n\xf7\x10\x12\x05\xf7(\x14\x0b\x85\x00\x04_\xe2,i\x85\x00\x04\xadm\x97\x83\x87\x00\x0f1DfOTLcIukpXKxV" >>> assert rg in [ ... b"E\x00\x00K\x00\x01\x00\x00@\x11|\x9f\x7f\x00\x00\x01\x7f\x00\x00\x01\x08K\x08K\x007\x8e\x860\x10\x00'\x00\x00\n\xf7\x10\x12\x05\xf7(\x14\x0b\x85\x00\x04_\xe2,i\x85\x00\x04\xadm\x97\x83\x87\x00\x0f1DfOTLcIukpXKxV", ... b'E\x00\x00K\x00\x01\x00\x00@\x11|\x9f\x7f\x00\x00\x01\x7f\x00\x00\x01\x08K\x08K\x007ty0\x10\x00\'\x00\x00\n\xf7\x10\xf0\x84"\x1c\x14\x00\x85\x00\x04\x02D\x81\xe8\x85\x00\x04\xbd\xeb\x92z\x87\x00\x0fv2LUNmjgwdrVOeg', ... b"E\x00\x00K\x00\x01\x00\x00@\x11|\x9f\x7f\x00\x00\x01\x7f\x00\x00\x01\x08K\x08K\x007n\xb20\x10\x00'\x00\x00\n\xf7\x10\x91\x9f\xbc\xaa\x14\x07\x85\x00\x04<\x7f\x87\x14\x85\x00\x04\xbcU\x14\xcb\x87\x00\x0f9Co27Fbj65eKHyQ", ... ] ###(010)=[passed] GTPV1UpdatePDPContextRequest(), dissect >>> h = "3333333333332222222222228100a38408004588006800000000fd1134820a2a00010a2a00024aa5084b005408bb32120044ed99aea9386f0000100000530514058500040a2a00018500040a2a000187000c0213921f739680fe74f2ffff94000130970001019800080112f41004d204d29900024000b6000101" >>> gtp = Ether(hex_bytes(h)) >>> assert gtp.gtp_type == 18 >>> assert gtp.next_ex == 0 ###(011)=[passed] GTPV1UpdatePDPContextResponse(), dissect >>> h = "3333333333332222222222228100838408004588005400000000fd1182850a2a00010a2a0002084b084b00406b46321300305843da17f07300000180100000032c7f4a0f58108500040a2a00018500040a2a000187000f0213921f7396d1fe7482ffff004a00f7a71e0a" >>> gtp = Ether(hex_bytes(h)) >>> gtp.gtp_type == 19 True ###(012)=[passed] IE_Cause(), dissect >>> h = "3333333333332222222222228100838408004588005400000000fd1182850a2a00010a2a0002084b084b00406b4632130030f15422be19ed0000018010000046a97f4a0f58108500040a2a00018500040a2a000187000f0213921f7396d1fe7482ffff004a00f7a71e0a" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.ietype == 1 and ie.CauseValue == 128 True ###(013)=[passed] IE_Cause(), basic instantiation >>> ie = IE_Cause(CauseValue='IMSI not known') >>> ie.ietype == 1 and ie.CauseValue == 194 True ###(014)=[passed] IE_IMSI(), dissect >>> h = "333333333333222222222222810083840800458800ba00000000fc1185060a2a00010a2a00024ace084b00a68204321000960eeec43e99ae00000202081132547600000332f42004d27b0ffc102c0787b611b2f9023914051a0400800002f1218300070661616161616184001480802110010100108106000000008306000000008500040a2a00018500040a2a00018600079111111111111187000d0213621f7396737374f2ffff0094000120970001029800080032f42004d204d299000240009a00081111111111110000d111193b" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.ietype == 2 and ie.imsi == b'2080112345670000' True ###(015)=[passed] IE_IMSI(), basic instantiation >>> ie = IE_IMSI(imsi='208103397660354') >>> ie.ietype == 2 and ie.imsi == b'208103397660354' True ###(016)=[passed] IE_Routing(), dissect >>> h = "33333333333322222222222281008384080045880072647100003e11dcf60a2a00010a2a0002084b084b005e78d93212004ef51a4ac3a291ff000332f42004d27b10eb3981b414058500040a2a00018500040a2a000187000f0213921f7396d1fe7482ffff004a0094000110970001019800080132f42004d204d299000240fcb60001015bf2090f" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.ietype == 3 and ie.MCC == b'234' and ie.MNC == b'02' and ie.LAC == 1234 and ie.RAC == 123 True ###(017)=[passed] IE_Routing(), basic instantiation >>> ie = IE_Routing(MCC='234', MNC='02', LAC=1234, RAC=123) >>> ie.ietype == 3 and ie.MCC == b'234' and ie.MNC == b'02' and ie.LAC == 1234 and ie.RAC == 123 True ###(018)=[passed] IE_Recovery(), dissect >>> h = "3333333333332222222222228100038408004500002ac6e60000fd11ccbc0a2a00010a2a0002084b084b001659db32020006c192a26c8cb400000e0e00000000f4b40b31" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.ietype == 14 and ie.restart_counter == 14 True ###(019)=[passed] IE_Recovery(), basic instantiation >>> ie = IE_Recovery(restart_counter=14) >>> ie.ietype == 14 and ie.restart_counter == 14 True ###(020)=[passed] IE_SelectionMode(), dissect >>> h = "333333333333222222222222810083840800458800c500000000fc1184df0a2a00010a2a00024a55084b00b1f62a321000a11c025b77dccc00000202081132547600000332f42004d27b0ffc1055080923117c347b6a14051a0a00800002f1218300070661616161616184001d8080211001000010810600000000830600000000000d00000a000005008500040a2a00018500040a2a00018600079111111111111187000f0213921f7396d3fe74f2ffff00640094000120970001019800080132f42004d204d299000240009a00081111111111110000eea69220" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[2] >>> ie.ietype == 15 and ie.SelectionMode == 252 True ###(021)=[passed] IE_SelectionMode(), basic instantiation >>> ie = IE_SelectionMode(SelectionMode=252) >>> ie.ietype == 15 and ie.SelectionMode == 252 True ###(022)=[passed] IE_TEIDI(), dissect >>> h = "3333333333332222222222228100838408004588005400000000fd1182850a2a00010a2a0002084b084b00406b46321300303f0ff4fb966f00000180109a0f08ef7f3af826978500040a2a00018500040a2a000187000f0213921f7396d1fe7482ffff004a00f7a71e0a" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[1] >>> ie.ietype == 16 and ie.TEIDI == 0x9a0f08ef True ###(023)=[passed] IE_TEIDI(), basic instantiation >>> ie = IE_TEIDI(TEIDI=0x9a0f08ef) >>> ie.ietype == 16 and ie.TEIDI == 0x9a0f08ef True ###(024)=[passed] IE_TEICP(), dissect >>> h = "333333333333222222222222810083840800458800c500000000fc1184df0a2a00010a2a00024a55084b00b1f62a321000a1b75eb617464800000202081132547600000332f42004d27b0ffc10db5c765711ba5d87ba14051a0a00800002f1218300070661616161616184001d8080211001000010810600000000830600000000000d00000a000005008500040a2a00018500040a2a00018600079111111111111187000f0213921f7396d3fe74f2ffff00640094000120970001019800080132f42004d204d299000240009a00081111111111110000eea69220" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[4] >>> ie.ietype == 17 and ie.TEICI == 0xba5d87ba True ###(025)=[passed] IE_TEICP(), basic instantiation >>> ie = IE_TEICP(TEICI=0xba5d87ba) >>> ie.ietype == 17 and ie.TEICI == 0xba5d87ba True ###(026)=[passed] IE_Teardown(), dissect >>> h = "3333333333332222222222228100838408004588002c00000000fd1184640a2a00010a2a00023d66084b00184c2232140008ba66ce5b6efe000013ff14050000c309006c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.ietype == 19 and ie.indicator == 255 True ###(027)=[passed] IE_Teardown(), basic instantiation >>> ie = IE_Teardown(indicator='True') >>> ie.ietype == 19 and ie.indicator == 255 True ###(028)=[passed] IE_NSAPI(), dissect >>> h = "3333333333332222222222228100838408004588002c00000000fd1184640a2a00010a2a00023d66084b00184c2232140008dafc273ee7ab000013ff14050000c309006c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[1] >>> ie.ietype == 20 and ie.NSAPI == 5 True ###(029)=[passed] IE_NSAPI(), basic instantiation >>> ie = IE_NSAPI(NSAPI=5) >>> ie.ietype == 20 and ie.NSAPI == 5 True ###(030)=[passed] IE_ChargingCharacteristics(), dissect >>> h = "333333333333222222222222810083840800458800bc00000000fc1184c90a2a00010a2a00024acf084b00a87bbb32100098a3e2565004a400000202081132547600000332f42004d27b0ffc10b87f17ad11c53c5e1b14051a0400800002f1218300070661616161616184001480802110010000108106000000008306000000008500040a2a00018500040a2a00018600079111111111111187000f0213921f7396d3fe74f2ffff004a0094000120970001019800080132f42004d204d299000240009a00081111111111110000951c5bbe" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[6] >>> ie.ietype == 26 and ie.normal_charging == 0 and ie.prepaid_charging == 1 and ie.flat_rate_charging == 0 True ###(031)=[passed] IE_ChargingCharacteristics(), basic instantiation >>> ie = IE_ChargingCharacteristics( ... normal_charging=0, prepaid_charging=1, flat_rate_charging=0) >>> ie.ietype == 26 and ie.normal_charging == 0 and ie.prepaid_charging == 1 and ie.flat_rate_charging == 0 True ###(032)=[passed] IE_TraceReference(), basic instantiation >>> ie = IE_TraceReference(Trace_reference=0x1212) >>> ie.ietype == 27 and ie.Trace_reference == 0x1212 True ###(033)=[passed] IE_TraceType(), basic instantiation >>> ie = IE_TraceType(Trace_type=0x1212) >>> ie.ietype == 28 and ie.Trace_type == 0x1212 True ###(034)=[passed] IE_ChargingId(), dissect >>> h = "3333333333332222222222228100838408004588005400000000fd1182850a2a00010a2a0002084b084b00406b4632130030e77ffb7e30410000018010ed654ff37fff1bc3f28500040a2a00018500040a2a000187000f0213921f7396d1fe7482ffff004a00f7a71e0a" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[2] >>> ie.ietype == 127 and ie.Charging_id == 0xff1bc3f2 True ###(035)=[passed] IE_ChargingId(), basic instantiation >>> ie = IE_ChargingId(Charging_id=0xff1bc3f2) >>> ie.ietype == 127 and ie.Charging_id == 0xff1bc3f2 True ###(036)=[passed] IE_EndUserAddress(), dissect >>> h = "3333333333332222222222228100838408004588008500000000fd11840b0a2a00010a2a0002084b4a6c00717c8a32110061c1b9728f356a0000018008fe10af709e9011e3cb6a4b7fb60e1b28800006f1210a2a00038400218080210a0301000a03060ab0aa93802110030100108106ac14020a8306ac1402278500040a2a00018500040a2a000187000c0213621f7396486874f2ffff44ded108" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[5] >>> ie.ietype == 128 and ie.length == 6 and ie.PDPTypeOrganization == 1 and ie.PDPTypeNumber == 0x21 and ie.PDPAddress == '10.42.0.3' True ###(037)=[passed] IE_EndUserAddress(), IPv4/IPv6 dissect >>> h = "00e0fc065f3800e1fc452bf30800450000cf00004000ff11a8afbd28ac11bd28ac0b084b084b00bb0000321100ab645b29420f990000018008fe0e12100270582511027258257f030b15a6800016f18d0a2a00032805021582842522000000000000000084004f80c0230e0200000e0957656c636f6d65210a802110030000108106bd28c6508306bd28c651000310280402148000ffff0000000000000080000310280402148000ffff000000000000008100050101850004bd28ac12850004bd28ac1287000f0223921f9196fefe74f8fefe004a00fb00040acf6976" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[6] >>> ie.ietype == 128 and ie.length == 22 and ie.PDPTypeOrganization == 1 and ie.PDPTypeNumber == 0x8d and ie.PDPAddress == '10.42.0.3' and ie.IPv6_PDPAddress == '2805:215:8284:2522::' True ###(038)=[passed] IE_EndUserAddress(), basic instantiation IPv4 >>> ie = IE_EndUserAddress( ... length=6, PDPTypeOrganization=1, PDPTypeNumber=0x21, PDPAddress='10.42.0.3') >>> ie.ietype == 128 and ie.length == 6 and ie.PDPTypeOrganization == 1 and ie.PDPTypeNumber == 0x21 and ie.PDPAddress == '10.42.0.3' True ###(039)=[passed] IE_EndUserAddress(), basic instantiation IPv6 >>> ie = IE_EndUserAddress( ... length=18, PDPTypeOrganization=1, PDPTypeNumber=0x57, IPv6_PDPAddress='2804::') >>> ie.ietype == 128 and ie.length == 18 and ie.PDPTypeOrganization == 1 and ie.PDPTypeNumber == 0x57 and ie.IPv6_PDPAddress == '2804::' True ###(040)=[passed] IE_EndUserAddress(), basic instantiation IPv4/IPv6 >>> ie = IE_EndUserAddress( ... length=22, PDPTypeOrganization=1, PDPTypeNumber=0x8d, PDPAddress='10.42.0.3', IPv6_PDPAddress ='2804::') >>> ie.ietype == 128 and ie.length == 22 and ie.PDPTypeOrganization == 1 and ie.PDPTypeNumber == 0x8d and ie.IPv6_PDPAddress == '2804::' and ie.PDPAddress == '10.42.0.3' True ###(041)=[passed] IE_AccessPointName(), dissect >>> h = "333333333333222222222222810083840800458800bc00000000fc1184c90a2a00010a2a00024acf084b00a87bbb3210009867fe972185e800000202081132547600000332f42004d27b0ffc1093b20c3f11940eb2bf14051a0400800002f1218300070661616161616184001480802110010000108106000000008306000000008500040a2a00018500040a2a00018600079111111111111187000f0213921f7396d3fe74f2ffff004a0094000120970001019800080132f42004d204d299000240009a000811111111111100001b1212951c5bbe" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[8] >>> ie.ietype == 131 and ie.APN == b'aaaaaa' True ###(042)=[passed] IE_AccessPointName(), basic instantiation >>> ie = IE_AccessPointName(APN='aaaaaa') >>> ie.ietype == 131 and ie.APN == b'aaaaaa' True ###(043)=[passed] IE_ProtocolConfigurationOptions(), dissect >>> h = "333333333333222222222222810083840800458800c300000000fc1184e50a2a00010a2a00024a4d084b00af41993210009fdef90e15440900000202081132547600000332f42004d27b0ffc10c29998b81145c6c9ee14051a0a00800002f1218300070661616161616184001d80c02306010100060000802110010100108106000000008306000000008500040a2a00018500040a2a00018600079111111111111187000d0213621f73967373741affff0094000120970001029800080032f42004d204d299000240009a0008111111111111000081182fb2" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[9] >>> ie.ietype == 132 and ie.Protocol_Configuration == b'\x80\xc0#\x06\x01\x01\x00\x06\x00\x00\x80!\x10\x01\x01\x00\x10\x81\x06\x00\x00\x00\x00\x83\x06\x00\x00\x00\x00' True ###(044)=[passed] IE_ProtocolConfigurationOptions(), basic instantiation >>> ie = IE_ProtocolConfigurationOptions( ... length=29, Protocol_Configuration=b'\x80\xc0#\x06\x01\x01\x00\x06\x00\x00\x80!\x10\x01\x01\x00\x10\x81\x06\x00\x00\x00\x00\x83\x06\x00\x00\x00\x00') >>> ie.ietype == 132 and ie.Protocol_Configuration == b'\x80\xc0#\x06\x01\x01\x00\x06\x00\x00\x80!\x10\x01\x01\x00\x10\x81\x06\x00\x00\x00\x00\x83\x06\x00\x00\x00\x00' True ###(045)=[passed] IE_GSNAddress(), simple build/dissect IPv4 >>> r = raw(IE_GSNAddress(length=4, ipv4_address='10.42.0.1')) >>> assert r == b'\x85\x00\x04\x0a\x2a\x00\x01' >>> ie = IE_GSNAddress(r) >>> ie.ietype == 133 and ie.ipv4_address == '10.42.0.1' True ###(046)=[passed] IE_GSNAddress(), simple build/dissect IPv6 >>> r = raw(IE_GSNAddress(length=16, ipv6_address='fd01:1::1')) >>> assert r == b'\x85\x00\x10\xfd\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> ie = IE_GSNAddress(r) >>> ie.ietype == 133 and ie.ipv6_address == 'fd01:1::1' True ###(047)=[passed] IE_GSNAddress(), dissect IPv4 >>> h = "3333333333332222222222228100838408004588005400000000fd1182850a2a00010a2a0002084b084b00406b463213003031146413c18000000180109181ba027fcf701a8c8500040a2a00018500040a2a000187000f0213921f7396d1fe7482ffff004a00f7a71e0a" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[3] >>> ie.ietype == 133 and ie.ipv4_address == '10.42.0.1' True ###(048)=[passed] IE_GSNAddress(), dissect IPv6 >>> h = "33333333333322222222222286dd60000000002c1140fd010001000000000000000000000001fd01000100000000000000000000000208680868002ce2e9321a001c000000000000000010000004d2850010fd010001000000000000000000000001" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[1] >>> ie.ietype == 133 and ie.ipv6_address == 'fd01:1::1' True ###(049)=[passed] IE_GSNAddress(), basic instantiation IPv4 >>> ie = IE_GSNAddress(length=4, ipv4_address='10.42.0.1') >>> ie.ietype == 133 and ie.ipv4_address == '10.42.0.1' True ###(050)=[passed] IE_GSNAddress(), basic instantiation IPv6 >>> ie = IE_GSNAddress(length=16, ipv6_address='fd01:1::1') >>> ie.ietype == 133 and ie.ipv6_address == 'fd01:1::1' True ###(051)=[passed] IE_MSInternationalNumber(), dissect >>> h = "333333333333222222222222810083840800458800c300000000fc1184e50a2a00010a2a00024a4d084b00af41993210009f79504a3e048e00000202081132547600000332f42004d27b0ffc10a692773d1158da9e2214051a0a00800002f1218300070661616161616184001d80c02306010100060000802110010100108106000000008306000000008500040a2a00018500040a2a00018600079111111111111187000d0213621f73967373741affff0094000120970001029800080032f42004d204d299000240009a0008111111111111000081182fb2" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[12] >>> ie.ietype == 134 and ie.flags == 145 and ie.digits == b'111111111111' True ###(052)=[passed] IE_MSInternationalNumber(), basic instantiation >>> ie = IE_MSInternationalNumber(flags=145, digits='111111111111') >>> ie.ietype == 134 and ie.flags == 145 and ie.digits == b'111111111111' True ###(053)=[passed] IE_QoS(), dissect >>> h = "3333333333332222222222228100838408004588005400000000fd1182850a2a00010a2a0002084b084b00406b4632130030afe9d3a3317e0000018010bd82f3997f9febcaf58500040a2a00018500040a2a000187000f0213921f7396d1fe7482ffff004a00f7a71e0a" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[5] >>> ie.ietype == 135 and ie.allocation_retention_prioiry == 2 and ie.delay_class == 2 and ie.traffic_class == 3 True ###(054)=[passed] IE_QoS(), basic instantiation >>> ie = IE_QoS(allocation_retention_prioiry=2, delay_class=2, traffic_class=3, length=50) >>> ie.ietype == 135 and ie.allocation_retention_prioiry == 2 and ie.delay_class == 2 and ie.traffic_class == 3 True ###(055)=[passed] IE_CommonFlags(), dissect >>> h = "3333333333332222222222228100a38408004588006800000000fd1134820a2a00010a2a00024aa5084b005408bb32120044623f97e3ac610000104d82c69214058500040a2a00018500040a2a000187000c0213921f739680fe74f2ffff94000130970001019800080132f42004d204d29900024000b6000101" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[5] >>> ie.ietype == 148 and ie.nrsn == 1 and ie.no_qos_nego == 1 and ie.prohibit_payload_compression == 0 True ###(056)=[passed] IE_CommonFlags(), basic instantiation >>> ie = IE_CommonFlags(nrsn=1, no_qos_nego=1) >>> ie.ietype == 148 and ie.nrsn == 1 and ie.no_qos_nego == 1 and ie.prohibit_payload_compression == 0 True ###(057)=[passed] IE_APNRestriction(), basic instantiation >>> ie = IE_APNRestriction(restriction_type_value=12) >>> ie.ietype == 149 and ie.restriction_type_value == 12 True ###(058)=[passed] IE_RATType(), dissect >>> h = "3333333333332222222222228100a38408004588006800000000fd1134820a2a00010a2a00024aa5084b005408bb321200442f686a89d33c000010530ec20a14058500040a2a00018500040a2a000187000c0213921f739680fe74f2ffff94000130970001019800080132f42004d204d29900024000b6000101" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[6] >>> ie.ietype == 151 and ie.RAT_Type == 1 True ###(059)=[passed] IE_RATType(), basic instantiation >>> ie = IE_RATType(RAT_Type=1) >>> ie.ietype == 151 and ie.RAT_Type == 1 True ###(060)=[passed] IE_UserLocationInformation(), dissect >>> h = "3333333333332222222222228100a38408004588006800000000fd1134820a2a00010a2a00024aa5084b005408bb32120044981eb5dcb29400001016e85d9f14058500040a2a00018500040a2a000187000c0213921f739680fe74f2ffff94000130970001019800080132f42004d204d29900024000b6000101" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[7] >>> ie.MCC == b'234' and ie.MNC == b'02' and ie.LAC == 1234 and ie.SAC == 1234 True ###(061)=[passed] IE_UserLocationInformation(), basic instantiation >>> ie = IE_UserLocationInformation(MCC='234', MNC='02', LAC=1234, SAC=1234) >>> ie.ietype == 152 and ie.MCC == b'234' and ie.MNC == b'02' and ie.LAC == 1234 and ie.SAC == 1234 True ###(062)=[passed] IE_MSTimeZone(), dissect >>> h = "3333333333332222222222228100a38408004588006800000000fd1134820a2a00010a2a00024aa5084b005408bb32120044f24a4d5825290000102ca9c8c314058500040a2a00018500040a2a000187000c0213921f739680fe74f2ffff94000130970001019800080132f42004d204d29900024000b6000101" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[8] >>> ie.ietype == 153 and ie.timezone == 64 and ie.daylight_saving_time == 0 True ###(063)=[passed] IE_MSTimeZone(), basic instantiation >>> ie = IE_MSTimeZone(timezone=64) >>> ie.ietype == 153 and ie.timezone == 64 and ie.daylight_saving_time == 0 True ###(064)=[passed] IE_IMEI(), dissect >>> h = "333333333333222222222222810083840800458800c300000000fc1184e50a2a00010a2a00024a4d084b00af41993210009f2f3ae0eb7b9c00000202081132547600000332f42004d27b0ffc10424a10c8117ca21aba14051a0a00800002f1218300070661616161616184001d80c02306010100060000802110010100108106000000008306000000008500040a2a00018500040a2a00018600079111111111111187000d0213621f73967373741affff0094000120970001029800080032f42004d204d299000240009a0008111111111111000081182fb2" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[18] and ie.ietype == 154 and ie.IMEI == b'0132750094080322' ###(065)=[passed] IE_IMEI(), basic instantiation >>> ie = IE_IMEI(IMEI='0132750094080322') >>> ie.ietype == 154 and ie.IMEI == b'0132750094080322' True ###(066)=[passed] IE_MSInfoChangeReportingAction(), basic instantiation >>> ie = IE_MSInfoChangeReportingAction(Action=12) >>> ie.ietype == 181 and ie.Action == 12 True ###(067)=[passed] IE_DirectTunnelFlags(), dissect >>> h = "3333333333332222222222228100a38408004588006800000000fd1134820a2a00010a2a00024aa5084b005408bb32120044d2a7dffabfb70000108caa6b0b14058500040a2a00018500040a2a000187000c0213921f739680fe74f2ffff94000130970001019800080132f42004d204d29900024000b6000101" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[9] >>> ie.ietype == 182 and ie.EI == 0 and ie.GCSI == 0 and ie.DTI == 1 True ###(068)=[passed] IE_DirectTunnelFlags(), basic instantiation >>> ie = IE_DirectTunnelFlags(DTI=1) >>> ie.ietype == 182 and ie.EI == 0 and ie.GCSI == 0 and ie.DTI == 1 True ###(069)=[passed] IE_BearerControlMode(), basic instantiation >>> ie = IE_BearerControlMode(bearer_control_mode=1) >>> ie.ietype == 184 and ie.bearer_control_mode == 1 True ###(070)=[passed] IE_EvolvedAllocationRetentionPriority(), basic instantiation >>> ie = IE_EvolvedAllocationRetentionPriority(PCI=1) >>> ie.ietype == 191 and ie.PCI == 1 True ###(071)=[passed] IE_CharginGatewayAddress(), basic instantiation >>> ie = IE_CharginGatewayAddress() >>> assert ie.ietype == 251 and ie.ipv4_address == '127.0.0.1' >>> ie = IE_CharginGatewayAddress(length=16) >>> assert ie.ietype == 251 and ie.ipv6_address == '::1' ###(072)=[passed] IE_PrivateExtension(), basic instantiation >>> ie = IE_PrivateExtension(extention_value='hello') >>> ie.ietype == 255 and ie.extention_value == b'hello' True Test campaign ━ Run at 01:42:38 from [test/contrib/gtp_v2.uts] by UTscapy in 0.2966017723083496 └ Passed=90 └ Failed=0 ###### ## GTPv2 ###### ###(000)=[passed] GTPHeader v2, basic instantiation >>> gtp = IP()/UDP(dport=2123)/GTPHeader(gtp_type=1) >>> gtp.dport == 2123 and gtp.gtp_type == 1 True ###(001)=[passed] GTPV2EchoRequest, basic instantiation >>> gtp = IP()/UDP(dport=2123) / GTPHeader(seq=12345) / GTPV2EchoRequest() >>> gtp.dport == 2123 and gtp.seq == 12345 and gtp.gtp_type == 1 and gtp.T == 0 True ###(002)=[passed] GTPV2CreateSessionRequest, basic instantiation >>> gtp = IP() / UDP(dport=2123) / \ ... GTPHeader(gtp_type="create_session_req", teid=2807, seq=12345) / \ ... GTPV2CreateSessionRequest(IE_list=[IE_IMSI(IMSI=b'001030000000356'),IE_APN(APN=b'super')]) >>> >>> assert gtp.dport == 2123 and gtp.teid == 2807 and gtp.seq == 12345 >>> ie = gtp.IE_list[1] >>> assert ie.APN == b"super" ###(003)=[passed] GTPV2EchoRequest, dissection >>> h = "333333333333222222222222810080c808004588002937dd0000fd1115490a2a00010a2a0002084b084b00152d0e4001000900000100030001000daa000000003f1f382f" >>> gtp = Ether(hex_bytes(h)) >>> gtp.gtp_type == 1 True ###(004)=[passed] GTPV2EchoResponse, dissection >>> h = "3333333333332222222222228100e384080045fc002fd6d70000f21180d40a2a00010a2a0002084b084b001b00004002000f000001000300010001020002001000731cd7c5" >>> gtp = Ether(hex_bytes(h)) >>> gtp.gtp_type == 2 True ###(005)=[passed] GTPV2ModifyBearerRequest, dissection >>> h = "3333333333332222222222228100a384080045b8004300000000fc1185350a2a00010a2a00027a76084b002f6c344822002392e9e1143652540052000100065d00120049000100055700090080000010927f000002ac79a28e" >>> gtp = Ether(hex_bytes(h)) >>> gtp.gtp_type == 34 True ###(006)=[passed] IE_IMSI, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd00000000661759000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100235700090385000010927f00000250001600580700000000000000000000000000000000000000007200020040005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.IMSI == b"2080112345670000" True ###(007)=[passed] IE_IMSI, basic instantiation >>> ie = IE_IMSI(ietype='IMSI', length=8, IMSI='2080112345670000') >>> ie.ietype == 1 and ie.IMSI == b'2080112345670000' True >>> assert bytes(ie) == b'\x01\x00\x08\x00\x02\x08\x112Tv\x00\x00' ###(008)=[passed] IE_Cause, dissection >>> h = "3333333333332222222222228100838408004588004a00000000fd1193160a2a00010a2a0002084b824600366a744823002a45e679235ea151000200020010005d001800490001006c0200020010005700090081000010927f000002558d3b69" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.Cause == 16 True ###(009)=[passed] IE_Cause, basic instantiation >>> ie = IE_Cause( ... ietype='Cause', length=2, Cause='Request accepted', PCE=1, BCE=0, CS=0) >>> ie.ietype == 2 and ie.Cause == 16 and ie.PCE == 1 and ie.BCE == 0 and ie.CS == 0 True ###(010)=[passed] IE_Cause, basic instantiation 2 >>> ie = IE_Cause( ... ietype='Cause', length=2, Cause='Request accepted', PCE=0, BCE=1, CS=0) >>> ie.ietype == 2 and ie.Cause == 16 and ie.PCE == 0 and ie.BCE == 1 and ie.CS == 0 True ###(011)=[passed] IE_Cause, basic instantiation 3 >>> ie = IE_Cause( ... ietype='Cause', length=2, Cause='Request accepted', PCE=0, BCE=0, CS=1) >>> ie.ietype == 2 and ie.Cause == 16 and ie.PCE == 0 and ie.BCE == 0 and ie.CS == 1 True ###(012)=[passed] IE_RecoveryRestart, dissection >>> h = "3333333333332222222222228100838408004588002937dd0000fd1115490a2a00010a2a0002084b084b00152d0e400100095e4b1f00030001000daa000000003f1f382f" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.ietype == 3 and ie.restart_counter == 13 True ###(013)=[passed] IE_RecoveryRestart, basic instantiation >>> ie = IE_RecoveryRestart( ... ietype='Recovery Restart', length=1, restart_counter=17) >>> ie.ietype == 3 and ie.restart_counter == 17 True ###(014)=[passed] IE_APN, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[7] >>> ie.APN == b'aaaaaaaaaaaaaaaaaaaaaaaaa' True ###(015)=[passed] IE_APN, basic instantiation >>> ie = IE_APN(ietype='APN', length=26, APN='aaaaaaaaaaaaaaaaaaaaaaaaa') >>> ie.ietype == 71 and ie.APN == b'aaaaaaaaaaaaaaaaaaaaaaaaa' True >>> assert bytes(ie) == b'G\x00\x1a\x00\x19aaaaaaaaaaaaaaaaaaaaaaaaa' ###(016)=[passed] IE_AMBR, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[11] >>> ie.AMBR_Uplink == 5888 and ie.AMBR_Downlink == 42000 True ###(017)=[passed] IE_AMBR, basic instantiation >>> ie = IE_AMBR( ... ietype='AMBR', length=8, AMBR_Uplink=5888, AMBR_Downlink=42000) >>> ie.ietype == 72 and ie.AMBR_Uplink == 5888 and ie.AMBR_Downlink == 42000 True ###(018)=[passed] IE_EPSBearerID, dissection >>> h = "3333333333332222222222228100838408004580006d00000000f31180d20a2a00010a2a0002084b85930059e49a4823004d55819f6500ede7000200020010004c000600111111111111490001003248000800000061a8000249f07f000100005d001300490001000b0200020010005e00040039004f454a0004007f00000436f73a63" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[2] >>> ie.EBI == 50 True ###(019)=[passed] IE_EPSBearerID, basic instantiation >>> ie = IE_EPSBearerID(ietype='EPS Bearer ID', length=1, EBI=50) >>> ie.ietype == 73 and ie.EBI == 50 True ###(020)=[passed] IE_IP_Address, dissection >>> h = "3333333333332222222222228100838408004580006d00000000f31180d20a2a00010a2a0002084b85930059e49a4823004d84530d5a4cdee2000200020010004c00060011111111111149000100b248000800000061a8000249f07f000100005d00130049000100da0200020010005e00040039004f454a0004007f00000436f73a63" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[6] >>> ie.address == '127.0.0.4' True ###(021)=[passed] IE_IP_Address, basic instantiation >>> ie = IE_IP_Address(ietype='IP Address', length=4, address='127.0.0.4') >>> ie.ietype == 74 and ie.address == '127.0.0.4' True ###(022)=[passed] IE_MEI, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b00080071655774980786ff56000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[1] >>> ie.MEI == b"17567547897068" True ###(023)=[passed] IE_MEI, basic instantiation >>> ie = IE_MEI(ietype='MEI', length=1, MEI=175675478970685) >>> ie.ietype == 75 and ie.MEI == 175675478970685 True ###(024)=[passed] IE_MSISDN, dissection >>> h = "3333333333332222222222228100838408004580006d00000000f31180d20a2a00010a2a0002084b85930059e49a4823004d55819f6500ede7000200020010004c000600111111111111490001003248000800000061a8000249f07f000100005d001300490001000b0200020010005e00040039004f454a0004007f00000436f73a63" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[1] >>> ie.digits == b'111111111111' True ###(025)=[passed] IE_MSISDN, basic instantiation >>> ie = IE_MSISDN(ietype='MSISDN', length=6, digits='111111111111') >>> ie.ietype == 76 and ie.digits == b'111111111111' True >>> assert bytes(ie) == b'L\x00\x06\x00\x11\x11\x11\x11\x11\x11' ###(026)=[passed] IE_Indication, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b00080071655774980786ff56000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[10] >>> ie.DAF == 0 and ie.DTF == 0 and ie.PS == 1 and ie.CCRSI == 0 and ie.CPRAI == 0 and ie.PPON == 0 and ie.CLII == 0 and ie.CPSR == 0 True ###(027)=[passed] IE_Indication, basic instantiation >>> ie = IE_Indication(ietype='Indication', length=8, PS=1, CPRAI=1) >>> ie.ietype == 77 and ie.PS == 1 and ie.CPRAI == 1 True ###(028)=[passed] IE_Indication, basic instantiation 2 >>> ie = IE_Indication(ietype='Indication', length=8, DTF=1, PPSI=1) >>> ie.ietype == 77 and ie.DTF == 1 and ie.PPSI == 1 True ###(029)=[passed] IE_PCO, dissection >>> h = "333333333333222222222222810083840800458800a500000000fd1183bb0a2a00010a2a0002084b76a00091cf0b48210085bd574af24c68e300020002001000570009008b000010927f0000025700090187000010927f0000024f000500017f0000037f000100004e00220080000d040a2a0003000d040a2a00038021100300001081060a2a000483060a2a00045d00250049000100660200020010005700090081000010927f0000025700090285000010927f000002dd9f22c6" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[5] >>> ie.Protocols[0].address == '10.42.0.3' True ###(030)=[passed] IE_PCO, basic instantiation >>> ie = IE_PCO(ietype='Protocol Configuration Options', length=8, Extension=1, PPP=3, Protocols=[ ... PCO_DNS_Server_IPv4(type='DNS Server IPv4 Address Request', length=4, address='10.42.0.3')]) >>> ie.Extension == 1 and ie.PPP == 3 and ie.Protocols[0].address == '10.42.0.3' True ###(031)=[passed] IE_EPCO, dissection >>> h = "d89ef3da40e2fa163e956dce08004500003000010000401144e10a0f0f3d0a0f1281084b084b001c0c154821000c0000000100000100c500040080001b00" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.Protocols[0].type == 27 True ###(032)=[passed] IE_EPCO, basic instantiation >>> ie = IE_EPCO(Protocols=[PCO_S_Nssai(type=27, length=0)], ietype=197, length=4, CR_flag=0, instance=0, Extension=1, SPARE=0, PPP=0) >>> ie.Extension == 1 and ie.ietype == 197 and ie.Protocols[0].type == 27 and ie.Protocols[0].length == 0 True ###(033)=[passed] IE_APCO, dissection >>> h = "d89ef3da40e2fa163e956dce0800450000360001000040115d650a0f0f3d01020304084b084b00220000482000160000000100000100a3000a0080000c00001200000d00" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.Protocols[0].type == 12 and ie.Protocols[1].type == 18 and ie.Protocols[2].type == 13 True ###(034)=[passed] IE_APCO, basic instantiation >>> ie = IE_APCO(Protocols=[PCO_P_CSCF_IPv4_Address_Request(address=None, type=12, length=0),PCO_P_CSCF_Re_selection_Support(type=18, length=0),PCO_DNS_Server_IPv4(address=None, type=13, length=0)], ietype=163, length=10, CR_flag=0, instance=0, extension=1, SPARE=0, PPP=0) >>> ie.extension == 1 and ie.ietype == 163 and ie.length == 10 and ie.Protocols[0].type == 12 and ie.Protocols[1].type == 18 and ie.Protocols[2].type == 13 True ###(035)=[passed] IE_MMContext_EPS, dissection >>> h = "d89ef3da40e2fa163e956dce08004500007f0001000040114bbd0a0a0f3d0a0f0b5b084b084b006b5a234883005f0000180f76d163006b0046008800910000020000021890aa80be385102083701a2907066f8bd9f2a28b717671c71c71c71c71c71c70100003d090002625a00028040000812345678900000000000000000006d000900880005000470677731" >>> gtp = Ether(hex_bytes(h)) DNS RR prematured end (ofs=5, len=5) >>> ie = gtp.IE_list[0] >>> ie.Sec_Mode == 4 and ie.Nhi == 0 and ie.Drxi == 1 and ie.Ksi == 0 and ie.Num_quint == 0 and ie.Num_Quad == 0 and ie.Uambri == 0 and ie.Osci == 0 and ie.Sambri == 1 and ie.Nas_algo == 1 and ie.Nas_cipher == 1 and ie.Nas_dl_count == 2 and ie.Nas_ul_count == 2 and ie.Kasme == 11111111111111111111111111111111111111111111111111111111111111111111111111111 True ###(036)=[passed] IE_MMContext_EPS, basic instantiation >>> ie = IE_MMContext_EPS(ietype=107, length=70, CR_flag=0, instance=0, Sec_Mode=4, Nhi=0, Drxi=1, Ksi=0, Num_quint=0, Num_Quad=0, Uambri=0, Osci=0, Sambri=1, Nas_algo=1, Nas_cipher=1, Nas_dl_count=2, Nas_ul_count=2, Kasme=11111111111111111111111111111111111111111111111111111111111111111111111111111) >>> ie.Sec_Mode == 4 and ie.Nhi == 0 and ie.Drxi == 1 and ie.Ksi == 0 and ie.Num_quint == 0 and ie.Num_Quad == 0 and ie.Uambri == 0 and ie.Osci == 0 and ie.Sambri == 1 and ie.Nas_algo == 1 and ie.Nas_cipher == 1 and ie.Nas_dl_count == 2 and ie.Nas_ul_count == 2 and ie.Kasme == 11111111111111111111111111111111111111111111111111111111111111111111111111111 True ###(037)=[passed] IE_PDNConnection, IE_FQDN, dissection >>> h = "d89ef3da40e2fa163e956dce08004500008a0001000040114bbd0a0a0f3d0a0f0b5b084b084b00765a234883006a0000180f76d163006b0046008800910000020000021890aa80be385102083701a2907066f8bd9f2a28b717671c71c71c71c71c71c70100003d090002625a00028040000812345678900000000000000000006d0014008800100004706777310474657374056c6f63616c" >>> gtp = Ether(hex_bytes(h)) DNS RR prematured end (ofs=16, len=16) >>> ie = gtp.IE_list[1].IE_list[0] >>> ie.fqdn == b'pgw1.test.local' True >>> gtp.build().hex() == h True ###(038)=[passed] IE_PDNConnection, IE_FQDN, basic instantiation >>> ie = IE_PDNConnection(IE_list=[IE_FQDN(ietype=136, length=5, CR_flag=0, instance=0, fqdn=b'pgw1.test.local')], ietype=109, length=9, CR_flag=0, instance=0) >>> ie2 = ie.IE_list[0] >>> ie2.fqdn == b'pgw1.test.local' True ###(039)=[passed] IE_PAA, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[9] >>> ie.PDN_type == 1 and ie.ipv4 == '127.0.0.3' True ###(040)=[passed] IE_PAA, basic instantiation >>> ie = IE_PAA(ietype='PAA', length=5, PDN_type='IPv4', ipv4='127.0.0.3') >>> ie.ietype == 79 and ie.PDN_type == 1 and ie.ipv4 == '127.0.0.3' True ###(041)=[passed] IE_Bearer_QoS, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[12].IE_list[2] >>> ie.MaxBitRateForUplink == 0 and ie.MaxBitRateForDownlink == 0 and ie.QCI == 7 True ###(042)=[passed] IE_Bearer_QoS, basic instantiation >>> ie = IE_Bearer_QoS(ietype='Bearer QoS', length=22, PCI=4, PriorityLevel=5, PVI=6, QCI=7, ... MaxBitRateForUplink=1, MaxBitRateForDownlink=2, GuaranteedBitRateForUplink=3, GuaranteedBitRateForDownlink=4) >>> ie.ietype == 80 and ie.PCI == 4 and ie.PriorityLevel == 5 and ie.PVI == 6 and ie.QCI == 7 and ie.MaxBitRateForUplink == 1 and ie.MaxBitRateForDownlink == 2 and ie.GuaranteedBitRateForUplink == 3 and ie.GuaranteedBitRateForDownlink == 4 True ###(043)=[passed] IE_RAT, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[4] >>> ie.RAT_type == 6 True ###(044)=[passed] IE_RAT, basic instantiation >>> ie = IE_RAT(ietype='RAT', length=1, RAT_type='EUTRAN') >>> ie.ietype == 82 and ie.RAT_type == 6 True ###(045)=[passed] IE_ServingNetwork, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[3] >>> ie.MCC == b'234' and ie.MNC == b'02' True ###(046)=[passed] IE_ServingNetwork, basic instantiation >>> ie = IE_ServingNetwork( ... ietype='Serving Network', length=3, MCC='234', MNC='02') >>> ie.ietype == 83 and ie.MCC == b'234' and ie.MNC == b'02' True ###(047)=[passed] IE_ULI, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[2] >>> ie.TAI_Present == 1 and ie.ECGI_Present == 1 and ie.TAI.MCC == b'234' and ie.TAI.MNC == b'02' and ie.TAI.TAC == 12345 and ie.ECGI.MCC == b'234' and ie.ECGI.MNC == b'02' and ie.ECGI.ECI == 123456 True ###(048)=[passed] IE_ULI, basic instantiation >>> ie = IE_ULI(ietype='ULI', length=13, LAI_Present=0, ECGI_Present=1, TAI_Present=1, RAI_Present=0, SAI_Present=0, ... CGI_Present=0, TAI=ULI_TAI(MCC='234', MNC='02', TAC=12345), ECGI=ULI_ECGI(MCC='234', MNC='02', ECI=123456)) >>> ie.ietype == 86 and ie.LAI_Present == 0 and ie.ECGI_Present == 1 and ie.TAI_Present == 1 and ie.RAI_Present == 0 and ie.SAI_Present == 0 and ie.CGI_Present == 0 and ie.TAI.MCC == b'234' and ie.TAI.MNC == b'02' and ie.TAI.TAC == 12345 and ie.ECGI.MCC == b'234' and ie.ECGI.MNC == b'02' and ie.ECGI.ECI == 123456 True ###(049)=[passed] IE_UCI, dissection >>> h = "fe1d70fa717ceeeeeeeeeeee080045000127a4f500003c11e9aec0a8ee80c0a87f50084b23a301131aa1482001070000000001020f009100080021f3540000001602" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.CSG_ID == 22 and ie.AccessMode == 0 and ie.LCSG == 1 and ie.CMI == 0 and ie.MCC == b'123' and ie.MNC == b'45' True ###(050)=[passed] IE_UCI, basic instantiation >>> ie = IE_UCI(ietype='UCI', length=8, CR_flag=0, instance=0, MCC=b'123', MNC=b'45', SPARE1=0, SPARE2=0, CSG_ID=22, AccessMode=0, LCSG=1, CMI=0) >>> ie.ietype == 145 and ie.CSG_ID == 22 and ie.AccessMode == 0 and ie.LCSG == 1 and ie.CMI == 0 and ie.MCC == b'123' and ie.MNC == b'45' True ###(051)=[passed] IE_BearerFlags, dissection >>> h = "0026f126c100000c29b131dd81004d040800450000d8a6010000401118680a2180350a212735084b138800c47f8248210011000023f2000001005d006200610001000a" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0].IE_list[0] >>> ie.ASI == 1 and ie.Vind == 0 and ie.VB == 1 and ie.PPC == 0 True ###(052)=[passed] IE_BearerFlags, basic instantiation >>> ie = IE_BearerFlags(ietype='Bearer Flags', length=1, CR_flag=0, instance=0, SPARE=0, ASI=1, Vind=0, VB=1, PPC=0) >>> ie.ietype == 97 and ie.ASI == 1 and ie.Vind == 0 and ie.VB == 1 and ie.PPC == 0 True ###(053)=[passed] IE_UPF_SelInd_Flags, dissection >>> h = "000c29b131dd0026f126c10081000d04080045000112608940003f111ea60a2127350a2180351388084b00fe0ec44820000d0000000000000100ca00010000" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.DCNR == 0 True ###(054)=[passed] IE_UPF_SelInd_Flags, basic instantiation >>> ie = IE_UPF_SelInd_Flags(ietype='UP Function Selection Indication Flags', length=1, CR_flag=0, instance=0, SPARE=0, DCNR=0) >>> ie.ietype == 202 and ie.DCNR == 0 True ###(055)=[passed] IE_Ran_Nas_Cause, dissection >>> h = "00000000000000000000000008004500005a0000000040114d390101010101010102084b084b0046bf694824000e000ba0df00002300ac0002003011" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.protocol_type == 3 and ie.cause_type == 0 and ie.cause_value == 17 True ###(056)=[passed] IE_Ran_Nas_Cause, basic instantiation >>> ie = IE_Ran_Nas_Cause(ietype='RAN/NAS Cause', length=2, CR_flag=0, instance=0, protocol_type=3, cause_type=0, cause_value=17) >>> ie.ietype == 172 and ie.protocol_type == 3 and ie.cause_type == 0 and ie.cause_value == 17 True ###(057)=[passed] IE_FQCSID, dissection >>> h = "d89ef3da40e2fa163e956dce0800450000330001000040117a2a0a0f0f3d0a09dd3a084b084b001f454648240013000000010000010084000700010a01010b00c8" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[0] >>> ie.ietype == 132 and ie.nodeid_type == 0 and ie.num_csid == 1 and ie.nodeid_v4 == '10.1.1.11' and ie.csid == 200 True ###(058)=[passed] IE_FQCSID, basic instantiation >>> ie = IE_FQCSID(ietype=132, length=19, CR_flag=0, instance=0, nodeid_type=1, num_csid=1, nodeid_v4=None, nodeid_v6=42540578207381523466529575969228128257, nodeid_nonip=None, csid=0) >>> ie.ietype == 132 and ie.nodeid_type == 1 and ie.num_csid == 1 and ie.nodeid_v6 == 42540578207381523466529575969228128257 and ie.csid == 0 True ###(059)=[passed] IE_FTEID, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[5] >>> ie.GRE_Key == 4242 and ie.ipv4 == '127.0.0.2' True ###(060)=[passed] IE_FTEID, basic instantiation >>> ie = IE_FTEID(ietype='F-TEID', length=9, ipv4_present=1, ... InterfaceType=10, GRE_Key=0x1092, ipv4='127.0.0.2') >>> ie.ietype == 87 and ie.ipv4_present == 1 and ie.InterfaceType == 10 and ie.GRE_Key == 0x1092 and ie.ipv4 == '127.0.0.2' True ###(061)=[passed] IE_BearerContext, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[12] >>> len(ie.IE_list) == 3 and ie.IE_list[0].ietype == 73 and ie.IE_list[0].EBI == 229 and ie.IE_list[ ... 1].ietype == 87 and ie.IE_list[1].ipv4 == '127.0.0.2' and ie.IE_list[2].ietype == 80 and ie.IE_list[2].QCI == 7 True ###(062)=[passed] IE_BearerContext, basic instantiation >>> ie = IE_BearerContext(ietype='Bearer Context', length=44, IE_list=[ ... IE_EPSBearerID(ietype='EPS Bearer ID', length=1, EBI=229)]) >>> ie.ietype == 93 and len(ie.IE_list) == 1 and ie.IE_list[ ... 0].ietype == 73 and ie.IE_list[0].EBI == 229 True ###(063)=[passed] IE_ChargingID, dissection >>> h = "3333333333332222222222228100838408004580006d00000000f31180d20a2a00010a2a0002084b85930059e49a4823004da0316b4d96ac2c000200020010004c00060011111111111149000100c348000800000061a8000249f07f000100005d001300490001003f0200020010005e00040039004f454a0004007f00000436f73a63" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[5].IE_list[2] >>> ie.ChargingID == 956321605 True ###(064)=[passed] IE_ChargingID, basic instantiation >>> ie = IE_ChargingID(ietype='Charging ID', length=4, ChargingID=956321605) >>> ie.ietype == 94 and ie.ChargingID == 956321605 True ###(065)=[passed] IE_ChargingCharacteristics, dissection >>> h = "3333333333332222222222228100a384080045b8011800000000fc1193150a2a00010a2a00027be5084b010444c4482000f82fd783953790a2000100080002081132547600004c0006001111111111114b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a001961616161616161616161616161616161616161616161616161800001000063000100014f000500017f0000034d000400000800007f00010000480008000000c3500002e6304e001a008080211001000010810600000000830600000000000d00000a005d001f00490001000750001600190700000000000000000000000000000000000000007200020014005f0002000a008e80b09f" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[18] >>> ie.ChargingCharacteristic == 0xa00 True ###(066)=[passed] IE_ChargingCharacteristics, basic instantiation >>> ie = IE_ChargingCharacteristics( ... ietype='Charging Characteristics', length=2, ChargingCharacteristic=0xa00) >>> ie.ietype == 95 and ie.ChargingCharacteristic == 0xa00 True ###(067)=[passed] IE_PDN_type, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[8] >>> ie.PDN_type == 1 True ###(068)=[passed] IE_PDN_type, basic instantiation >>> ie = IE_PDN_type(ietype='PDN Type', length=1, PDN_type='IPv4') >>> ie.ietype == 99 and ie.PDN_type == 1 True ###(069)=[passed] IE_UE_Timezone, dissection >>> h = "3333333333332222222222228100a384080045b800ed00000000fc1193430a2a00010a2a00027f61084b00d91c47482000cd140339f4d99f66000100080002081132547600004b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a00196161616161616161616161616161616161616161616161616163000100014f000500017f0000034d0004000808000048000800000017000000a4105d002c0049000100e55700090385000010927f00000250001600580700000000000000000000000000000000000000007200020014005311004c" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[13] >>> ie.Timezone == 20 and ie.DST == 0 True ###(070)=[passed] IE_UE_Timezone, basic instantiation >>> ie = IE_UE_Timezone(ietype='UE Time zone', length=2, Timezone=20, DST=0) >>> ie.ietype == 114 and ie.Timezone == 20 and ie.DST == 0 True ###(071)=[passed] IE_UE_Timezone, basic instantiation >>> ie = IE_UE_Timezone(ietype='UE Time zone', length=2, Timezone=20, DST=1) >>> ie.ietype == 114 and ie.Timezone == 20 and ie.DST == 1 True ###(072)=[passed] IE_Port_Number, dissection >>> h = "00010203040800808e8f8ab608004500004100010000401169140b00019705000001ec45084b002da8524820001d00000000006e400001000700420061896453f44a0004005f1e1d737e0002004532" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[2] >>> ie.PortNumber == 17714 True ###(073)=[passed] IE_Port_Number, basic instantiation >>> ie = IE_Port_Number( ... ietype='Port Number', length=2, PortNumber=17714) >>> ie.ietype == 126 and ie.PortNumber == 17714 True ###(074)=[passed] IE_APN_Restriction, dissection >>> h = "3333333333332222222222228100838408004580006d00000000f31180d20a2a00010a2a0002084b85930059e49a4823004d55819f6500ede7000200020010004c000600111111111111490001003248000800000061a8000249f07f000100005d001300490001000b0200020010005e00040039004f454a0004007f00000436f73a63" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[4] >>> ie.APN_Restriction == 0 True ###(075)=[passed] IE_APN_Restriction, basic instantiation >>> ie = IE_APN_Restriction( ... ietype='APN Restriction', length=1, APN_Restriction=0) >>> ie.ietype == 127 and ie.APN_Restriction == 0 True ###(076)=[passed] IE_SelectionMode, dissection >>> h = "3333333333332222222222228100a384080045b8011800000000fc1193150a2a00010a2a00027be5084b010444c4482000f8093ca4cc47fa69000100080002081132547600004c0006001111111111114b000800000000000001e24056000d001832f420303932f4200001e2405300030032f4205200010006570009008a000010927f0000025700090187000010927f00000247001a001961616161616161616161616161616161616161616161616161800001000063000100014f000500017f0000034d000400000800007f00010000480008000000c3500002e6304e001a008080211001000010810600000000830600000000000d00000a005d001f00490001004850001600190700000000000000000000000000000000000000007200020014005f0002000a008e80b09f" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[9] >>> ie.SelectionMode == 0 True ###(077)=[passed] IE_SelectionMode, basic instantiation >>> ie = IE_SelectionMode( ... ietype='Selection Mode', length=1, SelectionMode=4) >>> ie.ietype == 128 and ie.SelectionMode == 4 True ###(078)=[passed] IE_MMBR, dissection >>> h = "3333333333332222222222228100838408004580014c97af0000f011830e0a2a00010a2a000282d5084b013876a74820012c29694a667f4a0b000100080002081132547600004c0006001111111111114b000800000000000001e24056000f000632f42030391a8532f42030391a855300030032f420520001000157001900c6000010927f0000020000000000000000000000000000fe8247001a001961616161616161616161616161616161616161616161616161800001000063000100014f000500017f0000034d000400000000007f000100004800080000001640000052084e00200080c02306010000060000802110010000108106000000008306000000000005005d003c00490001006057001902c4000010927f0000020000000000000000000000000000fe825000160029080000000000000000000000000000000000000000720002006e005f0002000a00a10008000000164000005208e4701ad2" >>> gtp = Ether(hex_bytes(h)) >>> ie = gtp.IE_list[18] >>> ie.uplink_rate == 5696 and ie.downlink_rate == 21000 True ###(079)=[passed] IE_MMBR, basic instantiation >>> ie = IE_MMBR(ietype='Max MBR/APN-AMBR (MMBR)', ... length=8, uplink_rate=5696, downlink_rate=21000) >>> ie.ietype == 161 and ie.uplink_rate == 5696 and ie.downlink_rate == 21000 True ###(080)=[passed] GTPHeader isn't an answer to not GTPHeader instance >>> GTPHeader(gtp_type=2).answers(Ether()) == False True ###(081)=[passed] GTPHeader is an answer to a message with the same sequence number >>> GTPHeader(seq=42).answers(GTPHeader(seq=42)) == True True ###(082)=[passed] GTPHeader isn't an answer to a message with a different sequence number >>> GTPHeader(seq=42).answers(GTPHeader(seq=24)) == False True ###(083)=[passed] GTPV2EchoResponse answers >>> assert (GTPHeader(seq=1)/GTPV2EchoResponse()).answers(GTPHeader(seq=1)/GTPV2EchoRequest()) >>> assert not (GTPHeader(seq=1)/GTPV2EchoResponse()).answers(GTPHeader(seq=1)/GTPV2EchoResponse()) ###(084)=[passed] GTPHeader post_build >>> gtp = GTPHeader(gtp_type="create_session_req") / ("X"*32) >>> gtp.show2() ###[ GTP v2 Header ]### version = 2 P = 1 T = 1 MP = 0 SPARE1 = 0 SPARE2 = 0 gtp_type = create_session_req length = 40 teid = 0x0 seq = 25292 SPARE3 = 0 ###[ GTPv2 Create Session Request ]### \IE_list \ |###[ Raw ]### | load = b'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' ###(085)=[passed] GTPHeader length calculation >>> h = GTPHeader(seq=12345, version=2, T=1, teid=1234)/("X"*32) >>> h = GTPHeader(h.do_build()) >>> h[GTPHeader].length == len(bytes(h)) - 4 True ###(086)=[passed] GTPHeader hashret >>> req = GTPHeader(gtp_type="create_session_req", seq=1) / ("X"*32) >>> res = GTPHeader(gtp_type="create_session_res", seq=1) / ("Y"*32) >>> req.hashret() == res.hashret() True ###(087)=[passed] IE_NotImplementedTLV >>> h = "333333333333222222222222810080c808004588002937dd0000fd1115490a2a00010a2a0002084b084b00152d0e4001000900000100fe0001000daa000000003f1f382f" >>> gtp = Ether(hex_bytes(h)) >>> isinstance(gtp.IE_list[0], IE_NotImplementedTLV) True >>> isinstance(gtp.IE_list[0].payload, NoPayload) True ###(088)=[passed] IE_PrivateExtension, dissection >>> h = "d89ef3da40e2fa163e956dce08004500005b0001000040115d400a0f0f3d01020304084b084b00470000482000620000000100000100ff0015000137020046462d46462d46462d46462d46462d4646ff00160001370100000100000000000000000000000000000000" >>> gtp = Ether(hex_bytes(h)) >>> ie1 = gtp.IE_list[0] >>> ie2 = gtp.IE_list[1] >>> ie1.enterprisenum == 311 and bytes_hex(ie1.proprietaryvalue) == b'020046462d46462d46462d46462d46462d4646' True >>> ie2.enterprisenum == 311 and bytes_hex(ie2.proprietaryvalue) == b'0100000100000000000000000000000000000000' True ###(089)=[passed] IE_PrivateExtension, basic instantiation >>> ie1 = IE_PrivateExtension(ietype=255, length=21, SPARE=0, instance=0, enterprisenum=311, proprietaryvalue=hex_bytes('020046462d46462d46462d46462d46462d4646')) >>> ie2 = IE_PrivateExtension(ietype=255, length=22, SPARE=0, instance=0, enterprisenum=311, proprietaryvalue=hex_bytes('0100000100000000000000000000000000000000')) >>> ie1.enterprisenum == 311 and bytes_hex(ie1.proprietaryvalue) == b'020046462d46462d46462d46462d46462d4646' True >>> ie2.enterprisenum == 311 and bytes_hex(ie2.proprietaryvalue) == b'0100000100000000000000000000000000000000' True Test campaign ━ Run at 01:42:38 from [test/contrib/gxrp.uts] by UTscapy in 0.4777491092681885 └ Passed=9 └ Failed=0 ###### ## GVRP test ###### ###(000)=[passed] Construction test >>> pkt = GVRP(vlan=2) >>> assert pkt.vlan == 2 >>> assert pkt == GVRP(raw(pkt)) ###### ## GMRP test ###### ###(001)=[passed] GMRP_GROUP Construction test >>> pkt = GMRP_GROUP(addr="01:23:45:67:89:00") >>> assert pkt.addr == "01:23:45:67:89:00" >>> assert pkt == GMRP_GROUP(raw(pkt)) ###(002)=[passed] GMRP_SERVICE Construction test >>> pkt = GMRP_SERVICE(event="All Groups") >>> assert pkt.event == 0 >>> pkt = GMRP_SERVICE(event="All Unregistered Groups") >>> assert pkt.event == 1 >>> assert pkt == GMRP_SERVICE(raw(pkt)) ###### ## GARP Attribute test ###### ###(003)=[passed] GMRP_GROUP Construction test >>> pkt = GARP_ATTRIBUTE(event='LeaveAll') >>> assert pkt.event == 0 >>> assert GARP_ATTRIBUTE(pkt.build()).len == 2 >>> assert len(pkt.build()) == 2 >>> pkt = GARP_ATTRIBUTE(event='JoinEmpty')/GVRP() >>> assert pkt.event == 1 >>> assert GARP_ATTRIBUTE(pkt.build()).len == 4 >>> assert len(pkt.build()) == 4 >>> pkt = GARP_ATTRIBUTE(event='JoinIn')/GVRP() >>> assert pkt.event == 2 >>> assert GARP_ATTRIBUTE(pkt.build()).len == 4 >>> assert len(pkt.build()) == 4 >>> pkt = GARP_ATTRIBUTE(event='LeaveEmpty')/GVRP() >>> assert pkt.event == 3 >>> assert GARP_ATTRIBUTE(pkt.build()).len == 4 >>> assert len(pkt.build()) == 4 >>> pkt = GARP_ATTRIBUTE(event='LeaveIn')/GVRP() >>> assert pkt.event == 4 >>> assert GARP_ATTRIBUTE(pkt.build()).len == 4 >>> assert len(pkt.build()) == 4 >>> pkt = GARP_ATTRIBUTE(event='Empty')/GVRP() >>> assert pkt.event == 5 >>> assert GARP_ATTRIBUTE(pkt.build()).len == 4 >>> assert len(pkt.build()) == 4 >>> pkt = GARP_ATTRIBUTE(event='JoinEmpty')/GVRP() >>> del pkt.payload >>> assert pkt == GARP_ATTRIBUTE(event='JoinEmpty') >>> assert GARP_ATTRIBUTE(raw(pkt)) == GARP_ATTRIBUTE(raw(GARP_ATTRIBUTE(event='JoinEmpty'))) >>> assert len(pkt.build()) == 2 ###(004)=[passed] GVRP Stacking test >>> pkt = Dot3(dst="01:80:c2:00:00:21")/LLC_GARP(dsap=0x42, ssap=0x42, ctrl=3)/GARP( ... msgs=[GARP_MESSAGE(attrs=[GARP_ATTRIBUTE(event='JoinIn')/GVRP(vlan=1), ... GARP_ATTRIBUTE(event='JoinIn')/GVRP(vlan=2)]), ... GARP_MESSAGE(attrs=[GARP_ATTRIBUTE(event='JoinIn')/GVRP(vlan=3), ... GARP_ATTRIBUTE(event='JoinIn')/GVRP(vlan=4)])]) >>> assert pkt.getlayer(GARP_MESSAGE, 1).getlayer(GARP_ATTRIBUTE, 1)[GVRP].vlan == 1 >>> assert pkt.getlayer(GARP_MESSAGE, 1).getlayer(GARP_ATTRIBUTE, 2)[GVRP].vlan == 2 >>> assert pkt.getlayer(GARP_MESSAGE, 2).getlayer(GARP_ATTRIBUTE, 1)[GVRP].vlan == 3 >>> assert pkt.getlayer(GARP_MESSAGE, 2).getlayer(GARP_ATTRIBUTE, 2)[GVRP].vlan == 4 >>> pkt = Dot3(pkt.build()) >>> assert pkt.getlayer(GARP_MESSAGE, 1).getlayer(GARP_ATTRIBUTE, 1)[GVRP].vlan == 1 >>> assert pkt.getlayer(GARP_MESSAGE, 1).getlayer(GARP_ATTRIBUTE, 2)[GVRP].vlan == 2 >>> assert pkt.getlayer(GARP_MESSAGE, 2).getlayer(GARP_ATTRIBUTE, 1)[GVRP].vlan == 3 >>> assert pkt.getlayer(GARP_MESSAGE, 2).getlayer(GARP_ATTRIBUTE, 2)[GVRP].vlan == 4 ###(005)=[passed] GMRP Stacking test >>> pkt = Dot3(dst="01:80:c2:00:00:20")/LLC_GARP(dsap=0x42, ssap=0x42, ctrl=3)/GARP( ... msgs=[GARP_MESSAGE(type = 1, attrs=[GARP_ATTRIBUTE(event='JoinIn')/GMRP_GROUP(addr="00:00:00:00:00:01"), ... GARP_ATTRIBUTE(event='JoinIn')/GMRP_GROUP(addr="00:00:00:00:00:02")]), ... GARP_MESSAGE(type = 2, attrs=[GARP_ATTRIBUTE(event='JoinIn')/GMRP_SERVICE(event="All Groups"), ... GARP_ATTRIBUTE(event='JoinIn')/GMRP_SERVICE(event="All Unregistered Groups")])]) >>> assert pkt.getlayer(GARP_MESSAGE, 1).getlayer(GARP_ATTRIBUTE, 1)[GMRP_GROUP].addr == "00:00:00:00:00:01" >>> assert pkt.getlayer(GARP_MESSAGE, 1).getlayer(GARP_ATTRIBUTE, 2)[GMRP_GROUP].addr == "00:00:00:00:00:02" >>> assert pkt.getlayer(GARP_MESSAGE, 2).getlayer(GARP_ATTRIBUTE, 1)[GMRP_SERVICE].event == 0 >>> assert pkt.getlayer(GARP_MESSAGE, 2).getlayer(GARP_ATTRIBUTE, 2)[GMRP_SERVICE].event == 1 >>> pkt = Dot3(pkt.build()) >>> assert pkt.getlayer(GARP_MESSAGE, 1).getlayer(GARP_ATTRIBUTE, 1)[GMRP_GROUP].addr == "00:00:00:00:00:01" >>> assert pkt.getlayer(GARP_MESSAGE, 1).getlayer(GARP_ATTRIBUTE, 2)[GMRP_GROUP].addr == "00:00:00:00:00:02" >>> assert pkt.getlayer(GARP_MESSAGE, 2).getlayer(GARP_ATTRIBUTE, 1)[GMRP_SERVICE].event == 0 >>> assert pkt.getlayer(GARP_MESSAGE, 2).getlayer(GARP_ATTRIBUTE, 2)[GMRP_SERVICE].event == 1 ###(006)=[passed] GARP from pcap >>> pkts = rdpcap(scapy_path("test/pcaps/gvrp.pcapng.gz")) >>> for p in pkts: ... if len(p[GARP_ATTRIBUTE].payload) > 0: ... assert p[GVRP] is not None ... ###(007)=[passed] GARP tshark check >>> import tempfile, os >>> pkt = Dot3(dst="01:80:c2:00:00:21")/LLC_GARP(dsap=0x42, ssap=0x42, ctrl=3)/GARP( ... msgs=[GARP_MESSAGE(attrs=[GARP_ATTRIBUTE(event='JoinIn')/GVRP(vlan=1), ... GARP_ATTRIBUTE(event='JoinIn')/GVRP(vlan=2)]), ... GARP_MESSAGE(attrs=[GARP_ATTRIBUTE(event='JoinIn')/GVRP(vlan=3), ... GARP_ATTRIBUTE(event='JoinIn')/GVRP(vlan=4)])]) >>> >>> fd, pcapfilename = tempfile.mkstemp() >>> wrpcap(pcapfilename, pkt) >>> rv = tcpdump(pcapfilename, prog=conf.prog.tshark, getfd=True, args=['-Y', 'gvrp'], dump=True, wait=True) /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 9675 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert rv != b"" >>> os.close(fd) >>> os.unlink(pcapfilename) ###(008)=[passed] GARP tshark check >>> import tempfile, os >>> pkt = Dot3(dst="01:80:c2:00:00:20")/LLC_GARP(dsap=0x42, ssap=0x42, ctrl=3)/GARP( ... msgs=[GARP_MESSAGE(type = 1, attrs=[GARP_ATTRIBUTE(event='JoinIn')/GMRP_GROUP(addr="00:00:00:00:00:01"), ... GARP_ATTRIBUTE(event='JoinIn')/GMRP_GROUP(addr="00:00:00:00:00:02")]), ... GARP_MESSAGE(type = 2, attrs=[GARP_ATTRIBUTE(event='JoinIn')/GMRP_SERVICE(event="All Groups"), ... GARP_ATTRIBUTE(event='JoinIn')/GMRP_SERVICE(event="All Unregistered Groups")])]) >>> >>> fd, pcapfilename = tempfile.mkstemp() >>> wrpcap(pcapfilename, pkt) >>> rv = tcpdump(pcapfilename, prog=conf.prog.tshark, getfd=True, args=['-Y', 'gmrp'], dump=True, wait=True) /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 9679 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert rv != b"" >>> os.close(fd) >>> os.unlink(pcapfilename) HICP test campaign ━ Run at 01:42:38 from [test/contrib/hicp.uts] by UTscapy in 0.022680282592773438 └ Passed=8 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the HICP layer >>> from scapy.contrib.hicp import * ###### ## HICP Module scan request ###### ###(001)=[passed] Build and dissect module scan >>> pkt = HICPModuleScan() >>> assert(pkt.hicp_command == b"Module scan") >>> assert(raw(pkt) == b"MODULE SCAN\x00") >>> pkt = HICP(b"Module scan\x00") >>> assert(pkt.hicp_command == b"Module scan") ###### ## HICP Module scan response ###### ###(002)=[passed] Build and dissect device description >>> pkt=HICPModuleScanResponse(fieldbus_type="kwack") >>> assert(pkt.protocol_version == b"1.00") >>> assert(pkt.fieldbus_type == b"kwack") >>> assert(pkt.mac_address == "ff:ff:ff:ff:ff:ff") >>> pkt=HICP( ... b"\x50\x72\x6f\x74\x6f\x63\x6f\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e" \ ... b"\x20\x3d\x20\x31\x2e\x30\x30\x3b\x46\x42\x20\x74\x79\x70\x65\x20" \ ... b"\x3d\x20\x3b\x4d\x6f\x64\x75\x6c\x65\x20\x76\x65\x72\x73\x69\x6f" \ ... b"\x6e\x20\x3d\x20\x3b\x4d\x41\x43\x20\x3d\x20\x65\x65\x3a\x65\x65" \ ... b"\x3a\x65\x65\x3a\x65\x65\x3a\x65\x65\x3a\x65\x65\x3b\x49\x50\x20" \ ... b"\x3d\x20\x32\x35\x35\x2e\x32\x35\x35\x2e\x32\x35\x35\x2e\x32\x35" \ ... b"\x35\x3b\x53\x4e\x20\x3d\x20\x32\x35\x35\x2e\x32\x35\x35\x2e\x32" \ ... b"\x35\x35\x2e\x30\x3b\x47\x57\x20\x3d\x20\x30\x2e\x30\x2e\x30\x2e" \ ... b"\x30\x3b\x44\x48\x43\x50\x20\x3d\x20\x4f\x46\x46\x3b\x48\x4e\x20" \ ... b"\x3d\x20\x3b\x44\x4e\x53\x31\x20\x3d\x20\x30\x2e\x30\x2e\x30\x2e" \ ... b"\x30\x3b\x44\x4e\x53\x32\x20\x3d\x20\x30\x2e\x30\x2e\x30\x2e\x30" \ ... b"\x3b\x00" ... ) >>> assert(pkt.hicp_command == b"Module scan response") >>> assert(pkt.protocol_version == b"1.00") >>> assert(pkt.mac_address == "ee:ee:ee:ee:ee:ee") >>> assert(pkt.subnet_mask == "255.255.255.0") >>> pkt=HICP(b"Protocol version = 2; FB type = TEST;Module version = 1.0.0;MAC = cc:cc:cc:cc:cc:cc;IP = 192.168.1.1;SN = 255.255.255.0;GW = 192.168.1.254;DHCP=ON;HN = bonjour;DNS1 = 1.1.1.1;DNS2 = 2.2.2.2") >>> assert(pkt.hicp_command == b"Module scan response") >>> assert(pkt.protocol_version == b"2") >>> assert(pkt.fieldbus_type == b"TEST") >>> assert(pkt.module_version == b"1.0.0") >>> assert(pkt.mac_address == "cc:cc:cc:cc:cc:cc") >>> assert(pkt.ip_address == "192.168.1.1") >>> assert(pkt.subnet_mask == "255.255.255.0") >>> assert(pkt.gateway_address == "192.168.1.254") >>> assert(pkt.dhcp == b"ON") >>> assert(pkt.hostname == b"bonjour") >>> assert(pkt.dns1 == "1.1.1.1") >>> assert(pkt.dns2 == "2.2.2.2") ###### ## HICP Wink request ###### ###(003)=[passed] Build and dissect Winks >>> pkt = HICPWink(target="dd:dd:dd:dd:dd:dd") >>> assert(pkt.target == "dd:dd:dd:dd:dd:dd") >>> pkt = HICP(b"To: bb:bb:bb:bb:bb:bb;WINK;\x00") >>> assert(pkt.target == "bb:bb:bb:bb:bb:bb") ###### ## HICP Configure request ###### ###(004)=[passed] Build and dissect new network settings >>> pkt = HICPConfigure(target="aa:aa:aa:aa:aa:aa", hostname="llama") >>> assert(pkt.target == "aa:aa:aa:aa:aa:aa") >>> assert(pkt.ip_address == "255.255.255.255") >>> assert(pkt.hostname == b"llama") >>> assert(raw(pkt) == b"Configure: aa-aa-aa-aa-aa-aa;IP = 255.255.255.255;SN = 255.255.255.0;GW = 0.0.0.0;DHCP = OFF;HN = llama;DNS1 = 0.0.0.0;DNS2 = 0.0.0.0;\x00") >>> pkt = HICP(b"Configure: aa-aa-aa-aa-aa-aa;IP = 255.255.255.255;SN = 255.255.255.0;GW = 0.0.0.0;DHCP = OFF;HN = llama;DNS1 = 0.0.0.0;DNS2 = 0.0.0.0;\x00") >>> assert(pkt.hicp_command == b"Configure") >>> assert(pkt.target == "aa:aa:aa:aa:aa:aa") >>> assert(pkt.ip_address == "255.255.255.255") >>> assert(pkt.hostname == b"llama") ###### ## HICP Configure response ###### ###(005)=[passed] Build and dissect successful response to configure request >>> pkt = HICPReconfigured(source="11:00:00:00:00:00") >>> assert(pkt.source == "11:00:00:00:00:00") >>> assert(raw(pkt) == b"Reconfigured: 11-00-00-00-00-00\x00") >>> pkt = HICP(b"\x52\x65\x63\x6f\x6e\x66\x69\x67\x75\x72\x65\x64\x3a\x20\x31\x31" \ ... b"\x2d\x30\x30\x2d\x30\x30\x2d\x30\x30\x2d\x30\x30\x2d\x30\x30\x00") >>> assert(pkt.hicp_command == b"Reconfigured") >>> assert(pkt.source == "11:00:00:00:00:00") ###### ## HICP Configure error ###### ###(006)=[passed] Build and dissect error response to configure request >>> pkt = HICPInvalidConfiguration(source="00:11:00:00:00:00") >>> assert(pkt.source == "00:11:00:00:00:00") >>> assert(raw(pkt) == b"Invalid Configuration: 00-11-00-00-00-00\x00") >>> pkt = HICP( ... b"\x49\x6e\x76\x61\x6c\x69\x64\x20\x43\x6f\x6e\x66\x69\x67\x75\x72" \ ... b"\x61\x74\x69\x6f\x6e\x3a\x20\x30\x30\x2d\x31\x31\x2d\x30\x30\x2d" \ ... b"\x30\x30\x2d\x30\x30\x2d\x30\x30\x00" ... ) >>> assert(pkt.hicp_command == b"Invalid Configuration") >>> assert(pkt.source == "00:11:00:00:00:00") ###### ## HICP Configure invalid password ###### ###(007)=[passed] Build and dissect invalid password response to configure request >>> pkt = HICPInvalidPassword(source="00:00:11:00:00:00") >>> assert(pkt.source == "00:00:11:00:00:00") >>> assert(raw(pkt) == b"Invalid Password: 00-00-11-00-00-00\x00") >>> pkt = HICP(b"\x49\x6e\x76\x61\x6c\x69" \ ... b"\x64\x20\x50\x61\x73\x73\x77\x6f\x72\x64\x3a\x20\x30\x30\x2d\x30" \ ... b"\x30\x2d\x31\x31\x2d\x30\x30\x2d\x30\x30\x2d\x30\x30\x00") >>> assert(pkt.hicp_command == b"Invalid Password") >>> assert(pkt.source == "00:00:11:00:00:00") Regression tests for Scapy ━ Run at 01:42:38 from [test/contrib/homeplugav.uts] by UTscapy in 0.03807711601257324 └ Passed=5 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the homeplugav layer >>> from scapy.contrib.homeplugav import * ###### ## Basic tests ###### Those test are here mainly to check nothing has been broken ###(001)=[passed] Building packets packet >>> HomePlugAV() ] |> >>> HomePlugAV()/GetDeviceVersion() ] |> >>> HomePlugAV()/StartMACRequest() ] |> >>> HomePlugAV()/StartMACConfirmation() ] |> >>> HomePlugAV()/ResetDeviceRequest() ] |> >>> HomePlugAV()/ResetDeviceConfirmation() ] |> >>> HomePlugAV()/NetworkInformationRequest() ] |> >>> HomePlugAV()/ReadMACMemoryRequest() ] |> >>> HomePlugAV()/ReadMACMemoryConfirmation() ] |> >>> HomePlugAV()/ReadModuleDataRequest() ] |> >>> HomePlugAV()/ReadModuleDataConfirmation() ] |> >>> HomePlugAV()/WriteModuleDataRequest() ] |> >>> HomePlugAV()/WriteModuleData2NVMRequest() ] |> >>> HomePlugAV()/WriteModuleData2NVMConfirmation() ] |> >>> HomePlugAV()/NetworkInfoConfirmationV10() ] |> >>> HomePlugAV()/NetworkInfoConfirmationV11() > >>> HomePlugAV()/NetworkInfoConfirmationV10()/NetworkInfoV10() ] |>> >>> HomePlugAV()/NetworkInfoConfirmationV11()/NetworkInfoV11() >> >>> HomePlugAV()/HostActionRequired() ] |> >>> HomePlugAV()/LoopbackRequest() ] |> >>> HomePlugAV()/LoopbackConfirmation() ] |> >>> HomePlugAV()/SetEncryptionKeyRequest() ] |> >>> HomePlugAV()/SetEncryptionKeyConfirmation() ] |> >>> HomePlugAV()/ReadConfBlockRequest() ] |> >>> HomePlugAV()/ReadConfBlockConfirmation() ] |> >>> HomePlugAV()/QUAResetFactoryConfirm() ] |> >>> HomePlugAV()/GetNVMParametersRequest() ] |> >>> HomePlugAV()/GetNVMParametersConfirmation() ] |> >>> HomePlugAV()/SnifferRequest() ] |> >>> HomePlugAV()/SnifferConfirmation() ] |> >>> HomePlugAV()/SnifferIndicate() ] |> ###(002)=[passed] Some important manipulations >>> pkt = HomePlugAV()/SetEncryptionKeyRequest() >>> pkt.NMK = "A" * 16 >>> pkt.DAK = "B" * 16 >>> assert raw(pkt) == b'\x00P\xa0\x00\xb0R\x00AAAAAAAAAAAAAAAA\x00\xff\xff\xff\xff\xff\xffBBBBBBBBBBBBBBBB' >>> >>> pkt = HomePlugAV()/ReadMACMemoryRequest() >>> pkt.Address = 0x31337 >>> pkt.Length = 0x666 >>> assert raw(pkt) == b'\x00\x08\xa0\x00\xb0R7\x13\x03\x00f\x06\x00\x00' >>> >>> pkt = HomePlugAV()/ReadModuleDataRequest() >>> pkt.Length = 0x666 >>> pkt.Offset = 0x1337 >>> assert raw(pkt) == b'\x00$\xa0\x00\xb0R\x02\x00f\x067\x13\x00\x00' >>> >>> pkt = HomePlugAV()/SnifferRequest() >>> pkt.SnifferControl = 0x1 >>> assert raw(pkt) == b"\x004\xa0\x00\xb0R\x01" ###(003)=[passed] Some important fields parsing >>> _xstr = b"\x00%\xa0\x00\xb0R\x00\x00\x00\x00\x02\x00\x00\x04\x00\x00\x00\x00`\x8d\x05\xf9\x04\x01\x00\x00\x88)\x00\x00\x87`[\x14\x00$\xd4okm\x1f\xedHu\x85\x16>\x86\x1aKM\xd2\xe91\xfc6\x00\x00603506A112119017\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00z]\xa9\xe2]\xedR\x8b\x85\\\xdf\xe8~\xe9\xb2\x14637000A112139290\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00FREEPLUG_LC_6400_4-1_1.0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbb\xcb\x0e\x10 \xad\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00`\xe5\x16\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x03\x02\x80\x84\x1e\x00\x80\x84\x1e\x00\xe0\x93\x04\x00\xe0\x93\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" >>> >>> pkt = HomePlugAV(_xstr) >>> assert ReadModuleDataConfirmation in pkt >>> assert pkt[ReadModuleDataConfirmation].ModuleID == 2 >>> assert pkt[ReadModuleDataConfirmation].checksum == 4177890656 >>> assert pkt[ReadModuleDataConfirmation].DataLen == 1024 >>> assert pkt[ReadModuleDataConfirmation].Offset == 0 >>> >>> p = ModulePIB(pkt.ModuleData, pkt.Offset, pkt.DataLen) >>> assert p.NMK == b"z]\xa9\xe2]\xedR\x8b\x85\\\xdf\xe8~\xe9\xb2\x14" >>> assert p.DAK == b"\x1f\xedHu\x85\x16>\x86\x1aKM\xd2\xe91\xfc6" ###(004)=[passed] Testing length and checksum on a generated Write Module Data Request >>> string = b"goodchoucroute\x00\x00" >>> pkt = WriteModuleDataRequest(ModuleData=string) >>> pkt = WriteModuleDataRequest(pkt.build()) >>> pkt.show() ###[ WriteModuleDataRequest ]### ModuleID = PIB reserved_1= 0x0 DataLen = 16 Offset = 0 checksum = 2609967084 ModuleData= b'goodchoucroute\x00\x00' >>> a = pkt.checksum == chksum32(pkt.ModuleData) >>> b = pkt.DataLen == len(pkt.ModuleData) >>> a, b (True, True) >>> assert a and b Regression tests for Scapy ━ Run at 01:42:38 from [test/contrib/homepluggp.uts] by UTscapy in 0.018082141876220703 └ Passed=4 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the homeplugg layer >>> from scapy.contrib.homepluggp import * >>> import binascii ###### ## Basic tests ###### Those test are here mainly to check nothing has been broken ###(001)=[passed] Most important packet to intrude a HPGP network >>> _xstr = binascii.unhexlify("0108600000010000000000000000040000000227cfe35f01e50a01c8a074ad04537cb54b88b62d49b35b51000000c1f2") >>> pkt = HomePlugAV(_xstr) >>> assert pkt.NewKey == b'\xc8\xa0t\xad\x04S|\xb5K\x88\xb6-I\xb3[Q' >>> assert pkt.NetworkID == b"'\xcf\xe3_\x01\xe5\n" ###(002)=[passed] Some other important parsing tests >>> _xstr = b'\x01\x08`\x00\x00\x01\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x04\x00\x00\x00\x00\x96F`Y\xbf\xf8\x05\x0164\xc5\xdf.nO}r\x05\xf5\x8d9)S\xc0\x00\x00\x00' >>> pkt = HomePlugAV(_xstr) >>> assert pkt.MyNonce == 0xaaaaaaaa >>> assert pkt.YourNonce == 0x0 >>> assert pkt.PID == 4 >>> assert pkt.NetworkID == b'\x96F`Y\xbf\xf8\x05' >>> assert pkt.NewKey == b'64\xc5\xdf.nO}r\x05\xf5\x8d9)S\xc0' >>> >>> _xstr = b'\x01e`\x00\x00\xff\xff\xff\xff\xff\xff\n\x06\x01\xbc\xf2\xaf\xf1\x00\x04\x00\x00=\x83\xfb\xe2\xbb\x0b\xb8\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> pkt = HomePlugAV(_xstr) >>> assert pkt.MSoundTargetMAC == 'ff:ff:ff:ff:ff:ff' >>> assert pkt.NumberMSounds == 10 >>> assert pkt.TimeOut == 6 >>> assert pkt.ResponseType == 1 >>> assert pkt.ForwardingSTA == 'bc:f2:af:f1:00:04' >>> assert pkt.SecurityType == 0 >>> assert pkt.RunID == b'=\x83\xfb\xe2\xbb\x0b\xb8\x8a' >>> >>> _xstr = b'\x01n`\x00\x00\x00\x00\xbc\xf2\xaf\xf1\x00\x04=\x83\xfb\xe2\xbb\x0b\xb8\x8a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n:!\t\t\n\x06\x06\x0e\x07\x07\t\t\n\n\x0b\x0b\x0b\x0b\x0c\r\x0e\x0e\x0e\x0f\x0f\x0f\x0f\x11\x11\x11\x12\x12\x12\x12\x12\x13\x12\x12\x11\x11\x11\x10\x12\x12\x12\x11\x10\x0f\x0f\x10\x14\x12\x10\x10\x11\x12\x14\x16;' >>> pkt = HomePlugAV(_xstr) >>> assert len(pkt.Groups) == pkt.NumberOfGroups >>> assert pkt.NumberOfSounds == 10 >>> >>> _xstr = b'\x01v`\x00\x00\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\t\xe8jdY,w\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> pkt = HomePlugAV(_xstr) >>> assert pkt.SenderID == b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa' ###(003)=[passed] Some important manipulations >>> pkt = HomePlugAV(version=0x01)/CM_MNBC_SOUND_IND() >>> pkt.RandomValue="AAAAAAAAAA" >>> assert raw(pkt) == b'\x01v`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00AAAAAAAAAA\x00\x00\x00\x00\x00\x00' >>> >>> pkt = HomePlugAV()/CM_SET_KEY_REQ(YourNonce=0xaaaa, NewKey="b" * 16) >>> assert raw(pkt) == b'\x00\x08`\x00\xb0R\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00bbbbbbbbbbbbbbbb' Regression tests for Scapy ━ Run at 01:42:38 from [test/contrib/homeplugsg.uts] by UTscapy in 0.00409388542175293 └ Passed=2 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the homepluggq layer >>> from scapy.contrib.homeplugsg import * >>> import binascii ###### ## Basic tests ###### Those test are here mainly to check nothing has been broken ###(001)=[passed] Some important manipulations >>> pkt=HomePlugAV(version=0x01)/VS_UART_CMD_REQ() >>> pkt.UData = "AT+LOG?" >>> assert raw(pkt) == b'\x01\x00\xa4\x00\x00\x00\x01AT+LOG?' HTTP/2 Campaign ━ Run at 01:42:43 from [test/contrib/http2.uts] by UTscapy in 4.740136384963989 └ Passed=106 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Configuring Scapy >>> import scapy.config >>> scapy.config.conf.debug_dissector=True >>> import scapy.packet >>> import scapy.fields >>> import scapy.contrib.http2 as h2 >>> import re >>> flags_bit_pattern = re.compile(r'''^\s+flags\s+=\s+\[.*['"]bit [0-9]+['"].*\]$''', re.M) >>> def expect_exception(e, c): ... try: ... eval(c) ... return False ... except e: ... return True ... ###### ## HTTP/2 UVarIntField Test Suite ###### ###(001)=[passed] HTTP/2 UVarIntField.any2i >>> f = h2.UVarIntField('value', 0, 5) >>> expect_exception(AssertionError, 'f.any2i(None, None)') True >>> assert f.any2i(None, 0) == 0 >>> assert f.any2i(None, 3) == 3 >>> assert f.any2i(None, 1<<5) == 1<<5 >>> assert f.any2i(None, 1<<16) == 1<<16 >>> f = h2.UVarIntField('value', 0, 8) >>> assert f.any2i(None, b'\x1E') == 30 ###(002)=[passed] HTTP/2 UVarIntField.m2i on full byte >>> f = h2.UVarIntField('value', 0, 8) >>> assert f.m2i(None, b'\x00') == 0 >>> assert f.m2i(None, b'\x03') == 3 >>> assert f.m2i(None, b'\xFE') == 254 >>> assert f.m2i(None, b'\xFF\x00') == 255 >>> assert f.m2i(None, b'\xFF\xFF\x03') == 766 #0xFF + (0xFF ^ 0x80) + (3<<7 ###(003)=[passed] HTTP/2 UVarIntField.m2i on partial byte >>> f = h2.UVarIntField('value', 0, 5) >>> assert f.m2i(None, (b'\x00', 3)) == 0 >>> assert f.m2i(None, (b'\x03', 3)) == 3 >>> assert f.m2i(None, (b'\x1e', 3)) == 30 >>> assert f.m2i(None, (b'\x1f\x00', 3)) == 31 >>> assert f.m2i(None, (b'\x1f\xe1\xff\x03', 3)) == 65536 ###(004)=[passed] HTTP/2 UVarIntField.getfield on full byte >>> f = h2.UVarIntField('value', 0, 8) >>> >>> r = f.getfield(None, b'\x00\x00') >>> assert r[0] == b'\x00' >>> assert r[1] == 0 >>> >>> r = f.getfield(None, b'\x03\x00') >>> assert r[0] == b'\x00' >>> assert r[1] == 3 >>> >>> r = f.getfield(None, b'\xFE\x00') >>> assert r[0] == b'\x00' >>> assert r[1] == 254 >>> >>> r = f.getfield(None, b'\xFF\x00\x00') >>> assert r[0] == b'\x00' >>> assert r[1] == 255 >>> >>> r = f.getfield(None, b'\xFF\xFF\x03\x00') >>> assert r[0] == b'\x00' >>> assert r[1] == 766 ###(005)=[passed] HTTP/2 UVarIntField.getfield on partial byte >>> f = h2.UVarIntField('value', 0, 5) >>> >>> r = f.getfield(None, (b'\x00\x00', 3)) >>> assert r[0] == b'\x00' >>> assert r[1] == 0 >>> >>> r = f.getfield(None, (b'\x03\x00', 3)) >>> assert r[0] == b'\x00' >>> assert r[1] == 3 >>> >>> r = f.getfield(None, (b'\x1e\x00', 3)) >>> assert r[0] == b'\x00' >>> assert r[1] == 30 >>> >>> r = f.getfield(None, (b'\x1f\x00\x00', 3)) >>> assert r[0] == b'\x00' >>> assert r[1] == 31 >>> >>> r = f.getfield(None, (b'\x1f\xe1\xff\x03\x00', 3)) >>> assert r[0] == b'\x00' >>> assert r[1] == 65536 ###(006)=[passed] HTTP/2 UVarIntField.i2m on full byte >>> f = h2.UVarIntField('value', 0, 8) >>> assert f.i2m(None, 0) == b'\x00' >>> assert f.i2m(None, 3) == b'\x03' >>> assert f.i2m(None, 254).lower() == b'\xfe' >>> assert f.i2m(None, 255).lower() == b'\xff\x00' >>> assert f.i2m(None, 766).lower() == b'\xff\xff\x03' ###(007)=[passed] HTTP/2 UVarIntField.i2m on partial byte >>> f = h2.UVarIntField('value', 0, 5) >>> assert f.i2m(None, 0) == b'\x00' >>> assert f.i2m(None, 3) == b'\x03' >>> assert f.i2m(None, 30).lower() == b'\x1e' >>> assert f.i2m(None, 31).lower() == b'\x1f\x00' >>> assert f.i2m(None, 65536).lower() == b'\x1f\xe1\xff\x03' ###(008)=[passed] HTTP/2 UVarIntField.addfield on full byte >>> f = h2.UVarIntField('value', 0, 8) >>> >>> assert f.addfield(None, b'Toto', 0) == b'Toto\x00' >>> assert f.addfield(None, b'Toto', 3) == b'Toto\x03' >>> assert f.addfield(None, b'Toto', 254).lower() == b'toto\xfe' >>> assert f.addfield(None, b'Toto', 255).lower() == b'toto\xff\x00' >>> assert f.addfield(None, b'Toto', 766).lower() == b'toto\xff\xff\x03' ###(009)=[passed] HTTP/2 UVarIntField.addfield on partial byte >>> f = h2.UVarIntField('value', 0, 5) >>> >>> assert f.addfield(None, (b'Toto', 3, 4), 0) == b'Toto\x80' >>> assert f.addfield(None, (b'Toto', 3, 4), 3) == b'Toto\x83' >>> assert f.addfield(None, (b'Toto', 3, 4), 30).lower() == b'toto\x9e' >>> assert f.addfield(None, (b'Toto', 3, 4), 31).lower() == b'toto\x9f\x00' >>> assert f.addfield(None, (b'Toto', 3, 4), 65536).lower() == b'toto\x9f\xe1\xff\x03' ###(010)=[passed] HTTP/2 UVarIntField.i2len on full byte >>> f = h2.UVarIntField('value', 0, 8) >>> >>> assert f.i2len(None, 0) == 1 >>> assert f.i2len(None, 3) == 1 >>> assert f.i2len(None, 254) == 1 >>> assert f.i2len(None, 255) == 2 >>> assert f.i2len(None, 766) == 3 ###(011)=[passed] HTTP/2 UVarIntField.i2len on partial byte >>> f = h2.UVarIntField('value', 0, 5) >>> >>> assert f.i2len(None, 0) == 1 >>> assert f.i2len(None, 3) == 1 >>> assert f.i2len(None, 30) == 1 >>> assert f.i2len(None, 31) == 2 >>> assert f.i2len(None, 65536) == 4 ###### ## HTTP/2 FieldUVarLenField Test Suite ###### ###(012)=[passed] HTTP/2 FieldUVarLenField.i2m without adjustment >>> f = h2.FieldUVarLenField('len', None, 8, length_of='data') >>> class TrivialPacket(Packet): ... name = 'Trivial Packet' ... fields_desc= [ ... f, ... StrField('data', '') ... ] ... >>> assert f.i2m(TrivialPacket(data='a'*5), None) == b'\x05' >>> assert f.i2m(TrivialPacket(data='a'*255), None).lower() == b'\xff\x00' >>> assert f.i2m(TrivialPacket(data='a'), 2) == b'\x02' >>> assert f.i2m(None, 2) == b'\x02' >>> assert f.i2m(None, 0) == b'\x00' ###(013)=[passed] HTTP/2 FieldUVarLenField.i2m with adjustment >>> class TrivialPacket(Packet): ... name = 'Trivial Packet' ... fields_desc= [ ... f, ... StrField('data', '') ... ] ... >>> f = h2.FieldUVarLenField('value', None, 8, length_of='data', adjust=lambda x: x-1) >>> assert f.i2m(TrivialPacket(data='a'*5), None) == b'\x04' >>> assert f.i2m(TrivialPacket(data='a'*255), None).lower() == b'\xfe' >>> assert f.i2m(TrivialPacket(data='a'*3), 2) == b'\x02' ###### ## HTTP/2 HPackZString Test Suite ###### ###(014)=[passed] HTTP/2 HPackZString Compression >>> string = 'Test' >>> s = h2.HPackZString(string) >>> assert len(s) == 3 >>> assert raw(s) == b"\xdeT'" >>> assert s.origin() == string >>> >>> string = 'a'*65535 >>> s = h2.HPackZString(string) >>> assert len(s) == 40960 >>> assert raw(s) == (b'\x18\xc61\x8cc' * 8191) + b'\x18\xc61\x8c\x7f' >>> assert s.origin() == string ###(015)=[passed] HTTP/2 HPackZString Decompression >>> s = b"\xdeT'" >>> i, ibl = h2.HPackZString.huffman_conv2bitstring(s) >>> assert b'Test' == h2.HPackZString.huffman_decode(i, ibl) >>> >>> s = (b'\x18\xc61\x8cc' * 8191) + b'\x18\xc61\x8c\x7f' >>> i, ibl = h2.HPackZString.huffman_conv2bitstring(s) >>> assert b'a'*65535 == h2.HPackZString.huffman_decode(i, ibl) >>> >>> assert( ... expect_exception(h2.InvalidEncodingException, ... 'h2.HPackZString.huffman_decode(*h2.HPackZString.huffman_conv2bitstring(b"\\xdeT"))') ... ) ###### ## HTTP/2 HPackStrLenField Test Suite ###### ###(016)=[passed] HTTP/2 HPackStrLenField.m2i >>> f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type') >>> class TrivialPacket(Packet): ... name = 'Trivial Packet' ... fields_desc = [ ... IntField('type', None), ... IntField('len', None), ... f ... ] ... >>> s = f.m2i(TrivialPacket(type=0, len=4), b'Test') >>> assert isinstance(s, h2.HPackLiteralString) >>> assert s.origin() == 'Test' >>> >>> s = f.m2i(TrivialPacket(type=1, len=3), b"\xdeT'") >>> assert isinstance(s, h2.HPackZString) >>> assert s.origin() == 'Test' ###(017)=[passed] HTTP/2 HPackStrLenField.any2i >>> f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type') >>> class TrivialPacket(Packet): ... name = 'Trivial Packet' ... fields_desc = [ ... IntField('type', None), ... IntField('len', None), ... f ... ] ... >>> s = f.any2i(TrivialPacket(type=0, len=4), b'Test') >>> assert isinstance(s, h2.HPackLiteralString) >>> assert s.origin() == 'Test' >>> >>> s = f.any2i(TrivialPacket(type=1, len=3), b"\xdeT'") >>> assert isinstance(s, h2.HPackZString) >>> assert s.origin() == 'Test' >>> >>> s = h2.HPackLiteralString('Test') >>> s2 = f.any2i(TrivialPacket(type=0, len=4), s) >>> assert s.origin() == s2.origin() >>> >>> s = h2.HPackZString('Test') >>> s2 = f.any2i(TrivialPacket(type=1, len=3), s) >>> assert s.origin() == s2.origin() >>> >>> s = h2.HPackLiteralString('Test') >>> s2 = f.any2i(None, s) >>> assert s.origin() == s2.origin() >>> >>> s = h2.HPackZString('Test') >>> s2 = f.any2i(None, s) >>> assert s.origin() == s2.origin() >>> >>> s = h2.HPackLiteralString('Test') >>> s2 = f.any2i(TrivialPacket(type=1, len=1), s) >>> assert s.origin() == s2.origin() ###(018)=[passed] HTTP/2 HPackStrLenField.i2m >>> f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type') >>> >>> s = b'Test' >>> s2 = f.i2m(None, h2.HPackLiteralString(s)) >>> assert s == s2 >>> >>> s = b'Test' >>> s2 = f.i2m(None, h2.HPackZString(s)) >>> assert s2 == b"\xdeT'" ###(019)=[passed] HTTP/2 HPackStrLenField.addfield >>> f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type') >>> >>> s = b'Test' >>> s2 = f.addfield(None, b'Toto', h2.HPackLiteralString(s)) >>> assert b'Toto' + s == s2 >>> >>> s = b'Test' >>> s2 = f.addfield(None, b'Toto', h2.HPackZString(s)) >>> assert s2 == b"Toto\xdeT'" ###(020)=[passed] HTTP/2 HPackStrLenField.getfield >>> f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type') >>> class TrivialPacket(Packet): ... name = 'Trivial Packet' ... fields_desc = [ ... IntField('type', None), ... IntField('len', None), ... f ... ] ... >>> r = f.getfield(TrivialPacket(type=0, len=4), b'TestToto') >>> assert isinstance(r, tuple) >>> assert r[0] == b'Toto' >>> assert isinstance(r[1], h2.HPackLiteralString) >>> assert r[1].origin() == 'Test' >>> >>> r = f.getfield(TrivialPacket(type=1, len=3), b"\xdeT'Toto") >>> assert isinstance(r, tuple) >>> assert r[0] == b'Toto' >>> assert isinstance(r[1], h2.HPackZString) >>> assert r[1].origin() == 'Test' ###(021)=[passed] HTTP/2 HPackStrLenField.i2h / i2repr >>> f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type') >>> >>> s = b'Test' >>> assert f.i2h(None, h2.HPackLiteralString(s)) == 'HPackLiteralString(Test)' >>> assert f.i2repr(None, h2.HPackLiteralString(s)) == repr('HPackLiteralString(Test)') >>> >>> assert f.i2h(None, h2.HPackZString(s)) == 'HPackZString(Test)' >>> assert f.i2repr(None, h2.HPackZString(s)) == repr('HPackZString(Test)') ###(022)=[passed] HTTP/2 HPackStrLenField.i2len >>> f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type') >>> >>> s = b'Test' >>> assert f.i2len(None, h2.HPackLiteralString(s)) == 4 >>> assert f.i2len(None, h2.HPackZString(s)) == 3 ###### ## HTTP/2 HPackMagicBitField Test Suite ###### ###(023)=[passed] HTTP/2 HPackMagicBitField.addfield >>> f = h2.HPackMagicBitField('value', 3, 2) >>> r = f.addfield(None, b'Toto', 3) >>> assert isinstance(r, tuple) >>> assert r[0] == b'Toto' >>> assert r[1] == 2 >>> assert r[2] == 3 >>> >>> r = f.addfield(None, (b'Toto', 2, 1) , 3) >>> assert isinstance(r, tuple) >>> assert r[0] == b'Toto' >>> assert r[1] == 4 >>> assert r[2] == 7 >>> >>> assert expect_exception(AssertionError, 'f.addfield(None, "toto", 2)') ###(024)=[passed] HTTP/2 HPackMagicBitField.getfield >>> f = h2.HPackMagicBitField('value', 3, 2) >>> >>> r = f.getfield(None, b'\xc0') >>> assert isinstance(r, tuple) >>> assert len(r) == 2 >>> assert isinstance(r[0], tuple) >>> assert len(r[0]) == 2 >>> assert r[0][0] == b'\xc0' >>> assert r[0][1] == 2 >>> assert r[1] == 3 >>> >>> r = f.getfield(None, (b'\x03', 6)) >>> assert isinstance(r, tuple) >>> assert len(r) == 2 >>> assert isinstance(r[0], bytes) >>> assert r[0] == b'' >>> assert r[1] == 3 >>> >>> expect_exception(AssertionError, 'f.getfield(None, b"\\x80")') True ###(025)=[passed] HTTP/2 HPackMagicBitField.h2i >>> f = h2.HPackMagicBitField('value', 3, 2) >>> assert f.h2i(None, 3) == 3 >>> expect_exception(AssertionError, 'f.h2i(None, 2)') True ###(026)=[passed] HTTP/2 HPackMagicBitField.m2i >>> f = h2.HPackMagicBitField('value', 3, 2) >>> assert f.m2i(None, 3) == 3 >>> expect_exception(AssertionError, 'f.m2i(None, 2)') True ###(027)=[passed] HTTP/2 HPackMagicBitField.i2m >>> f = h2.HPackMagicBitField('value', 3, 2) >>> assert f.i2m(None, 3) == 3 >>> expect_exception(AssertionError, 'f.i2m(None, 2)') True ###(028)=[passed] HTTP/2 HPackMagicBitField.any2i >>> f = h2.HPackMagicBitField('value', 3, 2) >>> assert f.any2i(None, 3) == 3 >>> expect_exception(AssertionError, 'f.any2i(None, 2)') True ###### ## HTTP/2 HPackHdrString Test Suite ###### ###(029)=[passed] HTTP/2 Dissect HPackHdrString >>> p = h2.HPackHdrString(b'\x04Test') >>> assert p.type == 0 >>> assert p.len == 4 >>> assert isinstance(p.getfieldval('data'), h2.HPackLiteralString) >>> assert p.getfieldval('data').origin() == 'Test' >>> >>> p = h2.HPackHdrString(b"\x83\xdeT'") >>> assert p.type == 1 >>> assert p.len == 3 >>> assert isinstance(p.getfieldval('data'), h2.HPackZString) >>> assert p.getfieldval('data').origin() == 'Test' ###(030)=[passed] HTTP/2 Build HPackHdrString >>> p = h2.HPackHdrString(data=h2.HPackLiteralString('Test')) >>> assert raw(p) == b'\x04Test' >>> >>> p = h2.HPackHdrString(data=h2.HPackZString('Test')) >>> assert raw(p) == b"\x83\xdeT'" >>> >>> p = h2.HPackHdrString(type=1, len=3, data=h2.HPackLiteralString('Test')) >>> assert raw(p) == b'\x83Test' ###### ## HTTP/2 HPackIndexedHdr Test Suite ###### ###(031)=[passed] HTTP/2 Dissect HPackIndexedHdr >>> p = h2.HPackIndexedHdr(b'\x80') >>> assert p.magic == 1 >>> assert p.index == 0 >>> >>> p = h2.HPackIndexedHdr(b'\xFF\x00') >>> assert p.magic == 1 >>> assert p.index == 127 ###(032)=[passed] HTTP/2 Build HPackIndexedHdr >>> p = h2.HPackIndexedHdr(index=0) >>> assert raw(p) == b'\x80' >>> >>> p = h2.HPackIndexedHdr(index=127) >>> assert raw(p) == b'\xFF\x00' ###### ## HTTP/2 HPackLitHdrFldWithIncrIndexing Test Suite ###### ###(033)=[passed] HTTP/2 Dissect HPackLitHdrFldWithIncrIndexing without indexed name >>> p = h2.HPackLitHdrFldWithIncrIndexing(b'\x40\x04Test\x04Toto') >>> assert p.magic == 1 >>> assert p.index == 0 >>> assert isinstance(p.hdr_name, h2.HPackHdrString) >>> assert p.hdr_name.type == 0 >>> assert p.hdr_name.len == 4 >>> assert p.hdr_name.getfieldval('data').origin() == 'Test' >>> assert isinstance(p.hdr_value, h2.HPackHdrString) >>> assert p.hdr_value.type == 0 >>> assert p.hdr_value.len == 4 >>> assert p.hdr_value.getfieldval('data').origin() == 'Toto' ###(034)=[passed] HTTP/2 Dissect HPackLitHdrFldWithIncrIndexing with indexed name >>> p = h2.HPackLitHdrFldWithIncrIndexing(b'\x41\x04Toto') >>> assert p.magic == 1 >>> assert p.index == 1 >>> assert p.hdr_name is None >>> assert isinstance(p.hdr_value, h2.HPackHdrString) >>> assert p.hdr_value.type == 0 >>> assert p.hdr_value.len == 4 >>> assert p.hdr_value.getfieldval('data').origin() == 'Toto' ###(035)=[passed] HTTP/2 Build HPackLitHdrFldWithIncrIndexing without indexed name >>> p = h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackLiteralString('Test')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString(b'Toto')) ... ) >>> assert raw(p) == b'\x40\x04Test\x04Toto' ###(036)=[passed] HTTP/2 Build HPackLitHdrFldWithIncrIndexing with indexed name >>> p = h2.HPackLitHdrFldWithIncrIndexing( ... index=1, ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString(b'Toto')) ... ) >>> assert raw(p) == b'\x41\x04Toto' ###### ## HTTP/2 HPackLitHdrFldWithoutIndexing Test Suite ###### ###(037)=[passed] HTTP/2 Dissect HPackLitHdrFldWithoutIndexing : don't index and no index >>> p = h2.HPackLitHdrFldWithoutIndexing(b'\x00\x04Test\x04Toto') >>> assert p.magic == 0 >>> assert p.never_index == 0 >>> assert p.index == 0 >>> assert isinstance(p.hdr_name, h2.HPackHdrString) >>> assert p.hdr_name.type == 0 >>> assert p.hdr_name.len == 4 >>> assert isinstance(p.hdr_name.getfieldval('data'), h2.HPackLiteralString) >>> assert p.hdr_name.getfieldval('data').origin() == 'Test' >>> assert isinstance(p.hdr_value, h2.HPackHdrString) >>> assert p.hdr_value.type == 0 >>> assert p.hdr_value.len == 4 >>> assert isinstance(p.hdr_value.getfieldval('data'), h2.HPackLiteralString) >>> assert p.hdr_value.getfieldval('data').origin() == 'Toto' ###(038)=[passed] HTTP/2 Dissect HPackLitHdrFldWithoutIndexing : never index index and no index >>> p = h2.HPackLitHdrFldWithoutIndexing(b'\x10\x04Test\x04Toto') >>> assert p.magic == 0 >>> assert p.never_index == 1 >>> assert p.index == 0 >>> assert isinstance(p.hdr_name, h2.HPackHdrString) >>> assert p.hdr_name.type == 0 >>> assert p.hdr_name.len == 4 >>> assert isinstance(p.hdr_name.getfieldval('data'), h2.HPackLiteralString) >>> assert p.hdr_name.getfieldval('data').origin() == 'Test' >>> assert isinstance(p.hdr_value, h2.HPackHdrString) >>> assert p.hdr_value.type == 0 >>> assert p.hdr_value.len == 4 >>> assert isinstance(p.hdr_value.getfieldval('data'), h2.HPackLiteralString) >>> assert p.hdr_value.getfieldval('data').origin() == 'Toto' ###(039)=[passed] HTTP/2 Dissect HPackLitHdrFldWithoutIndexing : never index and indexed name >>> p = h2.HPackLitHdrFldWithoutIndexing(b'\x11\x04Toto') >>> assert p.magic == 0 >>> assert p.never_index == 1 >>> assert p.index == 1 >>> assert p.hdr_name is None >>> assert isinstance(p.hdr_value, h2.HPackHdrString) >>> assert p.hdr_value.type == 0 >>> assert p.hdr_value.len == 4 >>> assert isinstance(p.hdr_value.getfieldval('data'), h2.HPackLiteralString) >>> assert p.hdr_value.getfieldval('data').origin() == 'Toto' ###(040)=[passed] HTTP/2 Build HPackLitHdrFldWithoutIndexing : don't index and no index >>> p = h2.HPackLitHdrFldWithoutIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackLiteralString('Test')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString(b'Toto')) ... ) >>> assert raw(p) == b'\x00\x04Test\x04Toto' ###(041)=[passed] HTTP/2 Build HPackLitHdrFldWithoutIndexing : never index index and no index >>> p = h2.HPackLitHdrFldWithoutIndexing( ... never_index=1, ... hdr_name=h2.HPackHdrString(data=h2.HPackLiteralString('Test')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString(b'Toto')) ... ) >>> assert raw(p) == b'\x10\x04Test\x04Toto' ###(042)=[passed] HTTP/2 Build HPackLitHdrFldWithoutIndexing : never index and indexed name >>> p = h2.HPackLitHdrFldWithoutIndexing( ... never_index=1, ... index=1, ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString(b'Toto')) ... ) >>> assert raw(p) == b'\x11\x04Toto' ###### ## HTTP/2 HPackDynamicSizeUpdate Test Suite ###### ###(043)=[passed] HTTP/2 Dissect HPackDynamicSizeUpdate >>> p = h2.HPackDynamicSizeUpdate(b'\x25') >>> assert p.magic == 1 >>> assert p.max_size == 5 >>> p = h2.HPackDynamicSizeUpdate(b'\x3F\x00') >>> assert p.magic == 1 >>> assert p.max_size == 31 ###(044)=[passed] HTTP/2 Build HPackDynamicSizeUpdate >>> p = h2.HPackDynamicSizeUpdate(max_size=5) >>> assert raw(p) == b'\x25' >>> p = h2.HPackDynamicSizeUpdate(max_size=31) >>> assert raw(p) == b'\x3F\x00' ###### ## HTTP/2 Data Frame Test Suite ###### ###(045)=[passed] HTTP/2 Dissect Data Frame: Simple data frame >>> pkt = h2.H2Frame(b'\x00\x00\x04\x00\x00\x00\x00\x00\x01ABCD') >>> assert pkt.type == 0 >>> assert pkt.len == 4 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2DataFrame) >>> assert pkt[h2.H2DataFrame] >>> assert pkt.payload.data == b'ABCD' >>> assert isinstance(pkt.payload.payload, scapy.packet.NoPayload) ###(046)=[passed] HTTP/2 Build Data Frame: Simple data frame >>> pkt = h2.H2Frame(stream_id = 1)/h2.H2DataFrame(data='ABCD') >>> assert raw(pkt) == b'\x00\x00\x04\x00\x00\x00\x00\x00\x01ABCD' >>> try: ... pkt.show2(dump=True) ... assert True ... except Exception: ... assert False ... "###[ HTTP/2 Frame ]###\n len = 0x4\n type = DataFrm\n flags = set()\n reserved = 0\n stream_id = 1\n###[ HTTP/2 Data Frame ]###\n data = b'ABCD'\n" ###(047)=[passed] HTTP/2 Dissect Data Frame: Simple data frame with padding >>> pkt = h2.H2Frame(b'\x00\x00\r\x00\x08\x00\x00\x00\x01\x08ABCD\x00\x00\x00\x00\x00\x00\x00\x00') #Padded data frame >>> assert pkt.type == 0 >>> assert pkt.len == 13 >>> assert len(pkt.flags) == 1 >>> assert 'P' in pkt.flags >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2PaddedDataFrame) >>> assert pkt[h2.H2PaddedDataFrame] >>> assert pkt.payload.padlen == 8 >>> assert pkt.payload.data == b'ABCD' >>> assert pkt.payload.padding == b'\x00'*8 >>> assert flags_bit_pattern.search(pkt.show(dump=True)) is None >>> assert isinstance(pkt.payload.payload, scapy.packet.NoPayload) ###(048)=[passed] HTTP/2 Build Data Frame: Simple data frame with padding >>> pkt = h2.H2Frame(flags = {'P'}, stream_id = 1)/h2.H2PaddedDataFrame(data='ABCD', padding=b'\x00'*8) >>> assert raw(pkt) == b'\x00\x00\r\x00\x08\x00\x00\x00\x01\x08ABCD\x00\x00\x00\x00\x00\x00\x00\x00' >>> try: ... pkt.show2(dump=True) ... assert True ... except Exception: ... assert False ... "###[ HTTP/2 Frame ]###\n len = 0xd\n type = DataFrm\n flags = {'Padded (P)'}\n reserved = 0\n stream_id = 1\n###[ HTTP/2 Padded Data Frame ]###\n padlen = 8\n data = b'ABCD'\n padding = b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\n" ###(049)=[passed] HTTP/2 Dissect Data Frame: Simple data frame with padding and end stream flag >>> pkt = h2.H2Frame(b'\x00\x00\r\x00\t\x00\x00\x00\x01\x08ABCD\x00\x00\x00\x00\x00\x00\x00\x00') #Padded data frame with end stream flag >>> assert pkt.type == 0 >>> assert pkt.len == 13 >>> assert len(pkt.flags) == 2 >>> assert 'P' in pkt.flags >>> assert 'ES' in pkt.flags >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2PaddedDataFrame) >>> assert pkt[h2.H2PaddedDataFrame] >>> assert pkt.payload.padlen == 8 >>> assert pkt.payload.data == b'ABCD' >>> assert pkt.payload.padding == b'\x00'*8 >>> assert flags_bit_pattern.search(pkt.show(dump=True)) is None >>> assert isinstance(pkt.payload.payload, scapy.packet.NoPayload) ###(050)=[passed] HTTP/2 Build Data Frame: Simple data frame with padding and end stream flag >>> pkt = h2.H2Frame(flags = {'P', 'ES'}, stream_id=1)/h2.H2PaddedDataFrame(data='ABCD', padding=b'\x00'*8) >>> assert raw(pkt) == b'\x00\x00\r\x00\t\x00\x00\x00\x01\x08ABCD\x00\x00\x00\x00\x00\x00\x00\x00' >>> try: ... pkt.show2(dump=True) ... assert True ... except Exception: ... assert False ... "###[ HTTP/2 Frame ]###\n len = 0xd\n type = DataFrm\n flags = {'Padded (P)', 'End Stream (ES)'}\n reserved = 0\n stream_id = 1\n###[ HTTP/2 Padded Data Frame ]###\n padlen = 8\n data = b'ABCD'\n padding = b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\n" ###### ## HTTP/2 Headers Frame Test Suite ###### ###(051)=[passed] HTTP/2 Dissect Headers Frame: Simple header frame >>> pkt = h2.H2Frame(b'\x00\x00\x0e\x01\x00\x00\x00\x00\x01\x88\x0f\x10\ntext/plain') #Header frame >>> assert pkt.type == 1 >>> assert pkt.len == 14 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2HeadersFrame) >>> assert pkt[h2.H2HeadersFrame] >>> hf = pkt[h2.H2HeadersFrame] >>> assert len(hf.hdrs) == 2 >>> assert isinstance(hf.hdrs[0], h2.HPackIndexedHdr) >>> assert hf.hdrs[0].magic == 1 >>> assert hf.hdrs[0].index == 8 >>> assert isinstance(hf.hdrs[1], h2.HPackLitHdrFldWithoutIndexing) >>> assert hf.hdrs[1].magic == 0 >>> assert hf.hdrs[1].never_index == 0 >>> assert hf.hdrs[1].index == 31 >>> assert hf.hdrs[1].hdr_name is None >>> assert expect_exception(AttributeError, 'hf.hdrs[1].non_existant') >>> assert isinstance(hf.hdrs[1].hdr_value, h2.HPackHdrString) >>> s = hf.hdrs[1].hdr_value >>> assert s.type == 0 >>> assert s.len == 10 >>> assert s.getfieldval('data').origin() == 'text/plain' >>> assert isinstance(hf.payload, scapy.packet.NoPayload) ###(052)=[passed] HTTP/2 Build Headers Frame: Simple header frame >>> p = h2.H2Frame(stream_id=1)/h2.H2HeadersFrame(hdrs=[ ... h2.HPackIndexedHdr(index=8), ... h2.HPackLitHdrFldWithoutIndexing( ... index=31, ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('text/plain')) ... ) ... ] ... ) >>> assert raw(p) == b'\x00\x00\x0e\x01\x00\x00\x00\x00\x01\x88\x0f\x10\ntext/plain' ###(053)=[passed] HTTP/2 Dissect Headers Frame: Header frame with padding >>> pkt = h2.H2Frame(b'\x00\x00\x17\x01\x08\x00\x00\x00\x01\x08\x88\x0f\x10\ntext/plain\x00\x00\x00\x00\x00\x00\x00\x00') #Header frame with padding >>> assert pkt.type == 1 >>> assert pkt.len == 23 >>> assert len(pkt.flags) == 1 >>> assert 'P' in pkt.flags >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2PaddedHeadersFrame) >>> assert flags_bit_pattern.search(pkt.show(dump=True)) is None >>> assert pkt[h2.H2PaddedHeadersFrame] >>> hf = pkt[h2.H2PaddedHeadersFrame] >>> assert hf.padlen == 8 >>> assert hf.padding == b'\x00' * 8 >>> assert len(hf.hdrs) == 2 >>> assert isinstance(hf.hdrs[0], h2.HPackIndexedHdr) >>> assert hf.hdrs[0].magic == 1 >>> assert hf.hdrs[0].index == 8 >>> assert isinstance(hf.hdrs[1], h2.HPackLitHdrFldWithoutIndexing) >>> assert hf.hdrs[1].magic == 0 >>> assert hf.hdrs[1].never_index == 0 >>> assert hf.hdrs[1].index == 31 >>> assert hf.hdrs[1].hdr_name is None >>> assert expect_exception(AttributeError, 'hf.hdrs[1].non_existant') >>> assert isinstance(hf.hdrs[1].hdr_value, h2.HPackHdrString) >>> s = hf.hdrs[1].hdr_value >>> assert s.type == 0 >>> assert s.len == 10 >>> assert s.getfieldval('data').origin() == 'text/plain' >>> assert isinstance(hf.payload, scapy.packet.NoPayload) ###(054)=[passed] HTTP/2 Build Headers Frame: Header frame with padding >>> p = h2.H2Frame(flags={'P'}, stream_id=1)/h2.H2PaddedHeadersFrame( ... hdrs=[ ... h2.HPackIndexedHdr(index=8), ... h2.HPackLitHdrFldWithoutIndexing( ... index=31, ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('text/plain')) ... ) ... ], ... padding=b'\x00'*8, ... ) >>> assert raw(p) == b'\x00\x00\x17\x01\x08\x00\x00\x00\x01\x08\x88\x0f\x10\ntext/plain\x00\x00\x00\x00\x00\x00\x00\x00' ###(055)=[passed] HTTP/2 Dissect Headers Frame: Header frame with priority >>> pkt = h2.H2Frame(b'\x00\x00\x13\x01 \x00\x00\x00\x01\x00\x00\x00\x02d\x88\x0f\x10\ntext/plain') #Header frame with priority >>> assert pkt.type == 1 >>> assert pkt.len == 19 >>> assert len(pkt.flags) == 1 >>> assert '+' in pkt.flags >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2PriorityHeadersFrame) >>> assert flags_bit_pattern.search(pkt.show(dump=True)) is None >>> assert pkt[h2.H2PriorityHeadersFrame] >>> hf = pkt[h2.H2PriorityHeadersFrame] >>> assert hf.exclusive == 0 >>> assert hf.stream_dependency == 2 >>> assert hf.weight == 100 >>> assert len(hf.hdrs) == 2 >>> assert isinstance(hf.hdrs[0], h2.HPackIndexedHdr) >>> assert hf.hdrs[0].magic == 1 >>> assert hf.hdrs[0].index == 8 >>> assert isinstance(hf.hdrs[1], h2.HPackLitHdrFldWithoutIndexing) >>> assert hf.hdrs[1].magic == 0 >>> assert hf.hdrs[1].never_index == 0 >>> assert hf.hdrs[1].index == 31 >>> assert hf.hdrs[1].hdr_name is None >>> assert expect_exception(AttributeError, 'hf.hdrs[1].non_existant') >>> assert isinstance(hf.hdrs[1].hdr_value, h2.HPackHdrString) >>> s = hf.hdrs[1].hdr_value >>> assert s.type == 0 >>> assert s.len == 10 >>> assert s.getfieldval('data').origin() == 'text/plain' >>> assert isinstance(hf.payload, scapy.packet.NoPayload) ###(056)=[passed] HTTP/2 Build Headers Frame: Header frame with priority >>> p = h2.H2Frame(flags={'+'}, stream_id=1)/h2.H2PriorityHeadersFrame( ... exclusive=0, ... stream_dependency=2, ... weight=100, ... hdrs=[ ... h2.HPackIndexedHdr(index=8), ... h2.HPackLitHdrFldWithoutIndexing( ... index=31, ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('text/plain')) ... ) ... ] ... ) >>> assert raw(p) == b'\x00\x00\x13\x01 \x00\x00\x00\x01\x00\x00\x00\x02d\x88\x0f\x10\ntext/plain' ###(057)=[passed] HTTP/2 Dissect Headers Frame: Header frame with priority and padding and flags >>> pkt = h2.H2Frame(b'\x00\x00\x1c\x01-\x00\x00\x00\x01\x08\x00\x00\x00\x02d\x88\x0f\x10\ntext/plain\x00\x00\x00\x00\x00\x00\x00\x00') #Header frame with priority and padding and flags ES|EH >>> assert pkt.type == 1 >>> assert pkt.len == 28 >>> assert len(pkt.flags) == 4 >>> assert '+' in pkt.flags >>> assert 'P' in pkt.flags >>> assert 'ES' in pkt.flags >>> assert 'EH' in pkt.flags >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2PaddedPriorityHeadersFrame) >>> assert flags_bit_pattern.search(pkt.show(dump=True)) is None >>> assert pkt[h2.H2PaddedPriorityHeadersFrame] >>> hf = pkt[h2.H2PaddedPriorityHeadersFrame] >>> assert hf.padlen == 8 >>> assert hf.padding == b'\x00' * 8 >>> assert hf.exclusive == 0 >>> assert hf.stream_dependency == 2 >>> assert hf.weight == 100 >>> assert len(hf.hdrs) == 2 >>> assert isinstance(hf.hdrs[0], h2.HPackIndexedHdr) >>> assert hf.hdrs[0].magic == 1 >>> assert hf.hdrs[0].index == 8 >>> assert isinstance(hf.hdrs[1], h2.HPackLitHdrFldWithoutIndexing) >>> assert hf.hdrs[1].magic == 0 >>> assert hf.hdrs[1].never_index == 0 >>> assert hf.hdrs[1].index == 31 >>> assert hf.hdrs[1].hdr_name is None >>> assert expect_exception(AttributeError, 'hf.hdrs[1].non_existant') >>> assert isinstance(hf.hdrs[1].hdr_value, h2.HPackHdrString) >>> s = hf.hdrs[1].hdr_value >>> assert s.type == 0 >>> assert s.len == 10 >>> assert s.getfieldval('data').origin() == 'text/plain' >>> assert isinstance(hf.payload, scapy.packet.NoPayload) ###(058)=[passed] HTTP/2 Build Headers Frame: Header frame with priority and padding and flags >>> p = h2.H2Frame(flags={'P', '+', 'ES', 'EH'}, stream_id=1)/h2.H2PaddedPriorityHeadersFrame( ... exclusive=0, ... stream_dependency=2, ... weight=100, ... padding=b'\x00'*8, ... hdrs=[ ... h2.HPackIndexedHdr(index=8), ... h2.HPackLitHdrFldWithoutIndexing( ... index=31, ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('text/plain')) ... ) ... ] ... ) ###### ## HTTP/2 Priority Frame Test Suite ###### ###(059)=[passed] HTTP/2 Dissect Priority Frame >>> pkt = h2.H2Frame(b'\x00\x00\x05\x02\x00\x00\x00\x00\x03\x80\x00\x00\x01d') >>> assert pkt.type == 2 >>> assert pkt.len == 5 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 3 >>> assert isinstance(pkt.payload, h2.H2PriorityFrame) >>> assert pkt[h2.H2PriorityFrame] >>> pp = pkt[h2.H2PriorityFrame] >>> assert pp.stream_dependency == 1 >>> assert pp.exclusive == 1 >>> assert pp.weight == 100 ###(060)=[passed] HTTP/2 Build Priority Frame >>> p = h2.H2Frame(stream_id=3)/h2.H2PriorityFrame( ... exclusive=1, ... stream_dependency=1, ... weight=100 ... ) >>> assert raw(p) == b'\x00\x00\x05\x02\x00\x00\x00\x00\x03\x80\x00\x00\x01d' ###### ## HTTP/2 Reset Stream Frame Test Suite ###### ###(061)=[passed] HTTP/2 Dissect Reset Stream Frame: Protocol Error >>> pkt = h2.H2Frame(b'\x00\x00\x04\x03\x00\x00\x00\x00\x01\x00\x00\x00\x01') #Reset stream with protocol error >>> assert pkt.type == 3 >>> assert pkt.len == 4 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2ResetFrame) >>> assert pkt[h2.H2ResetFrame] >>> rf = pkt[h2.H2ResetFrame] >>> assert rf.error == 1 >>> assert isinstance(rf.payload, scapy.packet.NoPayload) ###(062)=[passed] HTTP/2 Build Reset Stream Frame: Protocol Error >>> p = h2.H2Frame(stream_id=1)/h2.H2ResetFrame(error='Protocol error') >>> assert raw(p) == b'\x00\x00\x04\x03\x00\x00\x00\x00\x01\x00\x00\x00\x01' >>> >>> p = h2.H2Frame(stream_id=1)/h2.H2ResetFrame(error=1) >>> assert raw(p) == b'\x00\x00\x04\x03\x00\x00\x00\x00\x01\x00\x00\x00\x01' ###(063)=[passed] HTTP/2 Dissect Reset Stream Frame: Raw 123456 error >>> pkt = h2.H2Frame(b'\x00\x00\x04\x03\x00\x00\x00\x00\x01\x00\x01\xe2@') #Reset stream with raw error >>> assert pkt.type == 3 >>> assert pkt.len == 4 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2ResetFrame) >>> assert pkt[h2.H2ResetFrame] >>> rf = pkt[h2.H2ResetFrame] >>> assert rf.error == 123456 >>> assert isinstance(rf.payload, scapy.packet.NoPayload) ###(064)=[passed] HTTP/2 Dissect Reset Stream Frame: Raw 123456 error >>> p = h2.H2Frame(stream_id=1)/h2.H2ResetFrame(error=123456) >>> assert raw(p) == b'\x00\x00\x04\x03\x00\x00\x00\x00\x01\x00\x01\xe2@' ###### ## HTTP/2 Settings Frame Test Suite ###### ###(065)=[passed] HTTP/2 Dissect Settings Frame: Settings Frame >>> pkt = h2.H2Frame(b'\x00\x00$\x04\x00\x00\x00\x00\x00\x00\x01\x07[\xcd\x15\x00\x02\x00\x00\x00\x01\x00\x03\x00\x00\x00{\x00\x04\x00\x12\xd6\x87\x00\x05\x00\x01\xe2@\x00\x06\x00\x00\x00{') #Settings frame >>> assert pkt.type == 4 >>> assert pkt.len == 36 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 0 >>> assert isinstance(pkt.payload, h2.H2SettingsFrame) >>> assert pkt[h2.H2SettingsFrame] >>> sf = pkt[h2.H2SettingsFrame] >>> assert len(sf.settings) == 6 >>> assert isinstance(sf.settings[0], h2.H2Setting) >>> assert sf.settings[0].id == 1 >>> assert sf.settings[0].value == 123456789 >>> assert isinstance(sf.settings[1], h2.H2Setting) >>> assert sf.settings[1].id == 2 >>> assert sf.settings[1].value == 1 >>> assert isinstance(sf.settings[2], h2.H2Setting) >>> assert sf.settings[2].id == 3 >>> assert sf.settings[2].value == 123 >>> assert isinstance(sf.settings[3], h2.H2Setting) >>> assert sf.settings[3].id == 4 >>> assert sf.settings[3].value == 1234567 >>> assert isinstance(sf.settings[4], h2.H2Setting) >>> assert sf.settings[4].id == 5 >>> assert sf.settings[4].value == 123456 >>> assert isinstance(sf.settings[5], h2.H2Setting) >>> assert sf.settings[5].id == 6 >>> assert sf.settings[5].value == 123 >>> assert isinstance(sf.payload, scapy.packet.NoPayload) ###(066)=[passed] HTTP/2 Build Settings Frame: Settings Frame >>> p = h2.H2Frame()/h2.H2SettingsFrame(settings=[ ... h2.H2Setting(id='Header table size',value=123456789), ... h2.H2Setting(id='Enable push', value=1), ... h2.H2Setting(id='Max concurrent streams', value=123), ... h2.H2Setting(id='Initial window size', value=1234567), ... h2.H2Setting(id='Max frame size', value=123456), ... h2.H2Setting(id='Max header list size', value=123) ... ] ... ) >>> assert raw(p) == b'\x00\x00$\x04\x00\x00\x00\x00\x00\x00\x01\x07[\xcd\x15\x00\x02\x00\x00\x00\x01\x00\x03\x00\x00\x00{\x00\x04\x00\x12\xd6\x87\x00\x05\x00\x01\xe2@\x00\x06\x00\x00\x00{' ###(067)=[passed] HTTP/2 Dissect Settings Frame: Incomplete Settings Frame >>> assert expect_exception(AssertionError, 'h2.H2Frame(bytes_hex("0000240400000000000001075bcd1500020000000100030000007b00040012d68700050001e2400006000000"))') ###(068)=[passed] HTTP/2 Dissect Settings Frame: Settings Frame acknowledgement >>> pkt = h2.H2Frame(b'\x00\x00\x00\x04\x01\x00\x00\x00\x00') #Settings frame w/ ack flag >>> assert pkt.type == 4 >>> assert pkt.len == 0 >>> assert len(pkt.flags) == 1 >>> assert 'A' in pkt.flags >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 0 >>> assert flags_bit_pattern.search(pkt.show(dump=True)) is None >>> assert isinstance(pkt.payload, scapy.packet.NoPayload) ###(069)=[passed] HTTP/2 Build Settings Frame: Settings Frame acknowledgement >>> p = h2.H2Frame(type=h2.H2SettingsFrame.type_id, flags={'A'}) >>> assert raw(p) == b'\x00\x00\x00\x04\x01\x00\x00\x00\x00' ###### ## HTTP/2 Push Promise Frame Test Suite ###### ###(070)=[passed] HTTP/2 Dissect Push Promise Frame: no flag & headers with compression and hdr_name >>> pkt = h2.H2Frame(b'\x00\x00\x15\x05\x00\x00\x00\x00\x01\x00\x00\x00\x03@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me') >>> assert pkt.type == 5 >>> assert pkt.len == 21 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2PushPromiseFrame) >>> assert pkt[h2.H2PushPromiseFrame] >>> pf = pkt[h2.H2PushPromiseFrame] >>> assert pf.reserved == 0 >>> assert pf.stream_id == 3 >>> assert len(pf.hdrs) == 1 >>> assert isinstance(pf.payload, scapy.packet.NoPayload) >>> hdr = pf.hdrs[0] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.type == 1 >>> assert hdr.hdr_name.len == 12 >>> assert hdr.hdr_name.getfieldval('data').origin() == 'X-Requested-With' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.type == 0 >>> assert hdr.hdr_value.len == 2 >>> assert hdr.hdr_value.getfieldval('data').origin() == 'Me' ###(071)=[passed] HTTP/2 Build Push Promise Frame: no flag & headers with compression and hdr_name >>> p = h2.H2Frame(stream_id=1)/h2.H2PushPromiseFrame(stream_id=3,hdrs=[ ... h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Requested-With')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('Me')), ... ) ... ]) >>> assert raw(p) == b'\x00\x00\x15\x05\x00\x00\x00\x00\x01\x00\x00\x00\x03@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me' ###(072)=[passed] HTTP/2 Dissect Push Promise Frame: with padding, the flag END_Header & headers with compression and hdr_name >>> pkt = h2.H2Frame(b'\x00\x00\x1e\x05\x0c\x00\x00\x00\x01\x08\x00\x00\x00\x03@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me\x00\x00\x00\x00\x00\x00\x00\x00') >>> assert pkt.type == 5 >>> assert pkt.len == 30 >>> assert len(pkt.flags) == 2 >>> assert 'P' in pkt.flags >>> assert 'EH' in pkt.flags >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert flags_bit_pattern.search(pkt.show(dump=True)) is None >>> assert isinstance(pkt.payload, h2.H2PaddedPushPromiseFrame) >>> assert pkt[h2.H2PaddedPushPromiseFrame] >>> pf = pkt[h2.H2PaddedPushPromiseFrame] >>> assert pf.padlen == 8 >>> assert pf.padding == b'\x00'*8 >>> assert pf.stream_id == 3 >>> assert len(pf.hdrs) == 1 >>> hdr = pf.hdrs[0] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.type == 1 >>> assert hdr.hdr_name.len == 12 >>> assert hdr.hdr_name.getfieldval('data').origin() == 'X-Requested-With' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.type == 0 >>> assert hdr.hdr_value.len == 2 >>> assert hdr.hdr_value.getfieldval('data').origin() == 'Me' ###(073)=[passed] HTTP/2 Build Push Promise Frame: with padding, the flag END_Header & headers with compression and hdr_name >>> p = h2.H2Frame(flags={'P', 'EH'}, stream_id=1)/h2.H2PaddedPushPromiseFrame( ... stream_id=3, ... hdrs=[ ... h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Requested-With')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('Me')) ... ) ... ], ... padding=b'\x00'*8 ... ) >>> assert raw(p) == b'\x00\x00\x1e\x05\x0c\x00\x00\x00\x01\x08\x00\x00\x00\x03@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me\x00\x00\x00\x00\x00\x00\x00\x00' ###### ## HTTP/2 Ping Frame Test Suite ###### ###(074)=[passed] HTTP/2 Dissect Ping Frame: Ping frame >>> pkt = h2.H2Frame(b'\x00\x00\x08\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe2@') #Ping frame with payload >>> assert pkt.type == 6 >>> assert pkt.len == 8 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 0 >>> assert isinstance(pkt.payload, h2.H2PingFrame) >>> assert pkt[h2.H2PingFrame] >>> pf = pkt[h2.H2PingFrame] >>> assert pf.opaque == 123456 >>> assert isinstance(pf.payload, scapy.packet.NoPayload) ###(075)=[passed] HTTP/2 Build Ping Frame: Ping frame >>> p = h2.H2Frame()/h2.H2PingFrame(opaque=123456) >>> assert raw(p) == b'\x00\x00\x08\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe2@' ###(076)=[passed] HTTP/2 Dissect Ping Frame: Pong frame >>> pkt = h2.H2Frame(b'\x00\x00\x08\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe2@') #Pong frame >>> assert pkt.type == 6 >>> assert pkt.len == 8 >>> assert len(pkt.flags) == 1 >>> assert 'A' in pkt.flags >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 0 >>> assert isinstance(pkt.payload, h2.H2PingFrame) >>> assert flags_bit_pattern.search(pkt.show(dump=True)) is None >>> assert pkt[h2.H2PingFrame] >>> pf = pkt[h2.H2PingFrame] >>> assert pf.opaque == 123456 >>> assert isinstance(pf.payload, scapy.packet.NoPayload) ###(077)=[passed] HTTP/2 Dissect Ping Frame: Pong frame >>> p = h2.H2Frame(flags={'A'})/h2.H2PingFrame(opaque=123456) >>> assert raw(p) == b'\x00\x00\x08\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe2@' ###### ## HTTP/2 Go Away Frame Test Suite ###### ###(078)=[passed] HTTP/2 Dissect Go Away Frame: No error >>> pkt = h2.H2Frame(b'\x00\x00\x08\x07\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00') #Go Away for no particular reason :) >>> assert pkt.type == 7 >>> assert pkt.len == 8 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 0 >>> assert isinstance(pkt.payload, h2.H2GoAwayFrame) >>> assert pkt[h2.H2GoAwayFrame] >>> gf = pkt[h2.H2GoAwayFrame] >>> assert gf.reserved == 0 >>> assert gf.last_stream_id == 1 >>> assert gf.error == 0 >>> assert len(gf.additional_data) == 0 >>> assert isinstance(gf.payload, scapy.packet.NoPayload) ###(079)=[passed] HTTP/2 Build Go Away Frame: No error >>> p = h2.H2Frame()/h2.H2GoAwayFrame(last_stream_id=1, error='No error') >>> assert raw(p) == b'\x00\x00\x08\x07\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00' ###(080)=[passed] HTTP/2 Dissect Go Away Frame: Arbitrary error with additional data >>> pkt = h2.H2Frame(b'\x00\x00\x10\x07\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\xe2@\x00\x00\x00\x00\x00\x00\x00\x00') #Go Away with debug data >>> assert pkt.type == 7 >>> assert pkt.len == 16 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 0 >>> assert isinstance(pkt.payload, h2.H2GoAwayFrame) >>> assert pkt[h2.H2GoAwayFrame] >>> gf = pkt[h2.H2GoAwayFrame] >>> assert gf.reserved == 0 >>> assert gf.last_stream_id == 2 >>> assert gf.error == 123456 >>> assert gf.additional_data == 8*b'\x00' >>> assert isinstance(gf.payload, scapy.packet.NoPayload) ###(081)=[passed] HTTP/2 Build Go Away Frame: Arbitrary error with additional data >>> p = h2.H2Frame()/h2.H2GoAwayFrame( ... last_stream_id=2, ... error=123456, ... additional_data=b'\x00'*8 ... ) >>> assert raw(p) == b'\x00\x00\x10\x07\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\xe2@\x00\x00\x00\x00\x00\x00\x00\x00' ###### ## HTTP/2 Window Update Frame Test Suite ###### ###(082)=[passed] HTTP/2 Dissect Window Update Frame: global >>> pkt = h2.H2Frame(b'\x00\x00\x04\x08\x00\x00\x00\x00\x00\x00\x01\xe2@') #Window update with increment for connection >>> assert pkt.type == 8 >>> assert pkt.len == 4 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 0 >>> assert isinstance(pkt.payload, h2.H2WindowUpdateFrame) >>> assert pkt[h2.H2WindowUpdateFrame] >>> wf = pkt[h2.H2WindowUpdateFrame] >>> assert wf.reserved == 0 >>> assert wf.win_size_incr == 123456 >>> assert isinstance(wf.payload, scapy.packet.NoPayload) ###(083)=[passed] HTTP/2 Build Window Update Frame: global >>> p = h2.H2Frame()/h2.H2WindowUpdateFrame(win_size_incr=123456) >>> assert raw(p) == b'\x00\x00\x04\x08\x00\x00\x00\x00\x00\x00\x01\xe2@' ###(084)=[passed] HTTP/2 Dissect Window Update Frame: a stream >>> pkt = h2.H2Frame(b'\x00\x00\x04\x08\x00\x00\x00\x00\x01\x00\x01\xe2@') #Window update with increment for a stream >>> assert pkt.type == 8 >>> assert pkt.len == 4 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2WindowUpdateFrame) >>> assert pkt[h2.H2WindowUpdateFrame] >>> wf = pkt[h2.H2WindowUpdateFrame] >>> assert wf.reserved == 0 >>> assert wf.win_size_incr == 123456 >>> assert isinstance(wf.payload, scapy.packet.NoPayload) ###(085)=[passed] HTTP/2 Build Window Update Frame: a stream >>> p = h2.H2Frame(stream_id=1)/h2.H2WindowUpdateFrame(win_size_incr=123456) >>> assert raw(p) == b'\x00\x00\x04\x08\x00\x00\x00\x00\x01\x00\x01\xe2@' ###### ## HTTP/2 Continuation Frame Test Suite ###### ###(086)=[passed] HTTP/2 Dissect Continuation Frame: no flag & headers with compression and hdr_name >>> pkt = h2.H2Frame(b'\x00\x00\x11\t\x00\x00\x00\x00\x01@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me') >>> assert pkt.type == 9 >>> assert pkt.len == 17 >>> assert len(pkt.flags) == 0 >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert isinstance(pkt.payload, h2.H2ContinuationFrame) >>> assert pkt[h2.H2ContinuationFrame] >>> hf = pkt[h2.H2ContinuationFrame] >>> assert len(hf.hdrs) == 1 >>> assert isinstance(hf.payload, scapy.packet.NoPayload) >>> hdr = hf.hdrs[0] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.type == 1 >>> assert hdr.hdr_name.len == 12 >>> assert hdr.hdr_name.getfieldval('data').origin() == 'X-Requested-With' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.type == 0 >>> assert hdr.hdr_value.len == 2 >>> assert hdr.hdr_value.getfieldval('data').origin() == 'Me' ###(087)=[passed] HTTP/2 Build Continuation Frame: no flag & headers with compression and hdr_name >>> p = h2.H2Frame(stream_id=1)/h2.H2ContinuationFrame( ... hdrs=[ ... h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Requested-With')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('Me')) ... ) ... ] ... ) >>> assert raw(p) == b'\x00\x00\x11\t\x00\x00\x00\x00\x01@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me' ###(088)=[passed] HTTP/2 Dissect Continuation Frame: flag END_Header & headers with compression, sensitive flag and hdr_name >>> pkt = h2.H2Frame(b'\x00\x00\x11\t\x04\x00\x00\x00\x01\x10\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me') >>> assert pkt.type == 9 >>> assert pkt.len == 17 >>> assert len(pkt.flags) == 1 >>> assert 'EH' in pkt.flags >>> assert pkt.reserved == 0 >>> assert pkt.stream_id == 1 >>> assert flags_bit_pattern.search(pkt.show(dump=True)) is None >>> assert isinstance(pkt.payload, h2.H2ContinuationFrame) >>> assert pkt[h2.H2ContinuationFrame] >>> hf = pkt[h2.H2ContinuationFrame] >>> assert len(hf.hdrs) == 1 >>> assert isinstance(hf.payload, scapy.packet.NoPayload) >>> hdr = hf.hdrs[0] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 1 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.type == 1 >>> assert hdr.hdr_name.len == 12 >>> assert hdr.hdr_name.getfieldval('data').origin() == 'X-Requested-With' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.type == 0 >>> assert hdr.hdr_value.len == 2 >>> assert hdr.hdr_value.getfieldval('data').origin() == 'Me' ###(089)=[passed] HTTP/2 Build Continuation Frame: flag END_Header & headers with compression, sensitive flag and hdr_name >>> p = h2.H2Frame(flags={'EH'}, stream_id=1)/h2.H2ContinuationFrame( ... hdrs=[ ... h2.HPackLitHdrFldWithoutIndexing( ... never_index=1, ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Requested-With')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('Me')) ... ) ... ] ... ) >>> assert raw(p) == b'\x00\x00\x11\t\x04\x00\x00\x00\x01\x10\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me' ###### ## HTTP/2 HPackHdrTable Test Suite ###### ###(090)=[passed] HTTP/2 HPackHdrEntry Tests >>> n = 'X-Requested-With' >>> v = 'Me' >>> h = h2.HPackHdrEntry(n, v) >>> assert len(h) == 32 + len(n) + len(v) >>> assert h.name() == n.lower() >>> assert h.value() == v >>> assert str(h) == '{}: {}'.format(n.lower(), v) >>> >>> n = ':status' >>> v = '200' >>> h = h2.HPackHdrEntry(n, v) >>> assert len(h) == 32 + len(n) + len(v) >>> assert h.name() == n.lower() >>> assert h.value() == v >>> assert str(h) == '{} {}'.format(n.lower(), v) ###(091)=[passed] HTTP/2 HPackHdrTable : Querying Static Entries >>> assert expect_exception(KeyError, 'h2.HPackHdrTable()[0]') >>> >>> h = h2.HPackHdrTable() >>> assert h[1].name() == ':authority' >>> assert h[7].name() == ':scheme' >>> assert h[7].value() == 'https' >>> assert str(h[14]) == ':status 500' >>> assert str(h[16]) == 'accept-encoding: gzip, deflate' >>> >>> assert expect_exception(KeyError, 'h2.HPackHdrTable()[h2.HPackHdrTable._static_entries_last_idx+1]') ###(092)=[passed] HTTP/2 HPackHdrTable : Addind Dynamic Entries without overflowing the table >>> tbl = h2.HPackHdrTable(dynamic_table_max_size=1<<32, dynamic_table_cap_size=1<<32) >>> hdr = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString('PHPSESSID=abcdef0123456789')) ... ) >>> tbl.register(hdr) >>> >>> tbl = h2.HPackHdrTable(dynamic_table_max_size=1<<32, dynamic_table_cap_size=1<<32) >>> hdr2 = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString('JSESSID=abcdef0123456789')) ... ) >>> tbl.register([hdr,hdr2]) >>> >>> tbl = h2.HPackHdrTable(dynamic_table_max_size=1<<32, dynamic_table_cap_size=1<<32) >>> hdr3 = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString('Test=abcdef0123456789')) ... ) >>> frm = h2.H2Frame(stream_id=1)/h2.H2HeadersFrame(hdrs=[hdr, hdr2, hdr3]) >>> tbl.register(frm) ###(093)=[passed] HTTP/2 HPackHdrTable : Querying Dynamic Entries >>> tbl = h2.HPackHdrTable(dynamic_table_max_size=1<<32, dynamic_table_cap_size=1<<32) >>> hdrv = 'PHPSESSID=abcdef0123456789' >>> hdr = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv)) ... ) >>> tbl.register(hdr) >>> >>> hdrv2 = 'JSESSID=abcdef0123456789' >>> hdr2 = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv2)) ... ) >>> tbl.register(hdr2) >>> >>> hdr3 = h2.HPackLitHdrFldWithIncrIndexing( ... index=0, ... hdr_name=h2.HPackHdrString(data=h2.HPackLiteralString('x-requested-by')), ... hdr_value=h2.HPackHdrString(data=h2.HPackZString('me')) ... ) >>> tbl.register(hdr3) >>> >>> assert tbl.get_idx_by_name('x-requested-by') == h2.HPackHdrTable._static_entries_last_idx+1 >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv2 >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+3].value() == hdrv ###(094)=[passed] HTTP/2 HPackHdrTable : Addind already registered Dynamic Entries without overflowing the table >>> tbl = h2.HPackHdrTable(dynamic_table_max_size=1<<32, dynamic_table_cap_size=1<<32) >>> >>> assert len(tbl) == 0 >>> >>> hdrv = 'PHPSESSID=abcdef0123456789' >>> hdr = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv)) ... ) >>> tbl.register(hdr) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv >>> >>> hdr2v = 'JSESSID=abcdef0123456789' >>> hdr2 = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdr2v)) ... ) >>> tbl.register(hdr2) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdr2v >>> >>> l = len(tbl) >>> tbl.register(hdr) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdr2v >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+3].value() == hdrv ###(095)=[passed] HTTP/2 HPackHdrTable : Addind Dynamic Entries and overflowing the table >>> tbl = h2.HPackHdrTable(dynamic_table_max_size=80, dynamic_table_cap_size=80) >>> hdrv = 'PHPSESSID=abcdef0123456789' >>> hdr = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv)) ... ) >>> tbl.register(hdr) >>> assert len(tbl) <= 80 >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv >>> >>> hdrv2 = 'JSESSID=abcdef0123456789' >>> hdr2 = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv2)) ... ) >>> tbl.register(hdr2) >>> assert len(tbl) <= 80 >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2 >>> try: ... tbl[h2.HPackHdrTable._static_entries_last_idx+2] ... ret = False ... except Exception: ... ret = True ... >>> assert ret ###(096)=[passed] HTTP/2 HPackHdrTable : Resizing >>> tbl = h2.HPackHdrTable() >>> hdrv = 'PHPSESSID=abcdef0123456789' >>> hdr = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv)) ... ) >>> tbl.register(hdr) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv >>> >>> hdrv2 = 'JSESSID=abcdef0123456789' >>> hdr2 = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv2)) ... ) >>> tbl.register(hdr2) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2 >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv >>> >>> try: ... tbl.resize(8192) ... ret = False ... except AssertionError: ... ret = True ... >>> assert ret >>> tbl.resize(1024) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2 >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv >>> tbl.resize(2048) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2 >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv >>> tbl.resize(80) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2 >>> try: ... tbl[h2.HPackHdrTable._static_entries_last_idx+2] ... ret = False ... except Exception: ... ret = True ... >>> assert ret ###(097)=[passed] HTTP/2 HPackHdrTable : Recapping >>> tbl = h2.HPackHdrTable() >>> hdrv = 'PHPSESSID=abcdef0123456789' >>> hdr = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv)) ... ) >>> tbl.register(hdr) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv >>> >>> hdrv2 = 'JSESSID=abcdef0123456789' >>> hdr2 = h2.HPackLitHdrFldWithIncrIndexing( ... index=32, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv2)) ... ) >>> tbl.register(hdr2) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2 >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv >>> >>> tbl.recap(8192) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2 >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv >>> >>> tbl.recap(1024) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2 >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv >>> >>> tbl.recap(80) >>> assert tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2 >>> try: ... tbl[h2.HPackHdrTable._static_entries_last_idx+2] ... ret = False ... except Exception: ... ret = True ... >>> assert ret ###(098)=[passed] HTTP/2 HPackHdrTable : Generating Textual Representation >>> h = h2.HPackHdrTable() >>> h.register(h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11')) ... )) >>> >>> hdrs_lst = [ ... h2.HPackIndexedHdr(index=2), #Method Get ... h2.HPackLitHdrFldWithIncrIndexing( ... index=h.get_idx_by_name(':path'), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('/index.php')) ... ), ... h2.HPackIndexedHdr(index=7), #Scheme HTTPS ... h2.HPackIndexedHdr(index=h2.HPackHdrTable._static_entries_last_idx+2), ... h2.HPackLitHdrFldWithIncrIndexing( ... index=58, ... hdr_value=h2.HPackHdrString(data=h2.HPackZString('Mozilla/5.0 Generated by hand')) ... ), ... h2.HPackLitHdrFldWithoutIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generated-By')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('Me')) ... ) ... ] >>> >>> p = h2.H2Frame(stream_id = 1)/h2.H2HeadersFrame(hdrs=hdrs_lst) >>> >>> expected_output = ''':method GET ... :path /index.php ... :scheme https ... x-generation-date: 2016-08-11 ... user-agent: Mozilla/5.0 Generated by hand ... X-Generated-By: Me''' >>> >>> assert h.gen_txt_repr(p) == expected_output ###(099)=[passed] HTTP/2 HPackHdrTable : Parsing Textual Representation >>> body = b'login=titi&passwd=toto' >>> hdrs = ''':method POST ... :path /login.php ... :scheme https ... content-type: application/x-www-form-urlencoded ... content-length: {} ... user-agent: Mozilla/5.0 Generated by hand ... x-generated-by: Me ... x-generation-date: 2016-08-11 ... x-generation-software: scapy ... '''.format(len(body)) >>> >>> h = h2.HPackHdrTable() >>> h.register(h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11')) ... )) >>> seq = h.parse_txt_hdrs( ... hdrs, ... stream_id=1, ... body=body, ... should_index=lambda name: name in ['user-agent', 'x-generation-software'], ... is_sensitive=lambda name, value: name in ['x-generated-by', ':path'] ... ) >>> assert isinstance(seq, h2.H2Seq) >>> assert len(seq.frames) == 2 >>> p = seq.frames[0] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 1 >>> assert len(p.flags) == 1 >>> assert 'EH' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2HeadersFrame) >>> hdrs_frm = p[h2.H2HeadersFrame] >>> assert len(p.hdrs) == 9 >>> hdr = p.hdrs[0] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 3 >>> hdr = p.hdrs[1] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 1 >>> assert hdr.index in [4, 5] >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(/login.php)' >>> hdr = p.hdrs[2] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 7 >>> hdr = p.hdrs[3] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 31 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)' >>> hdr = p.hdrs[4] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 28 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(22)' >>> hdr = p.hdrs[5] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index == 58 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)' >>> hdr = p.hdrs[6] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 1 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-generated-by)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(Me)' >>> hdr = p.hdrs[7] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 63 >>> hdr = p.hdrs[8] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-generation-software)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(scapy)' >>> >>> p = seq.frames[1] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 0 >>> assert len(p.flags) == 1 >>> assert 'ES' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2DataFrame) >>> pay = p[h2.H2DataFrame] >>> assert pay.data == body >>> >>> h = h2.HPackHdrTable() >>> h.register(h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11')) ... )) >>> seq = h.parse_txt_hdrs( ... hdrs.encode(), ... stream_id=1, ... body=body, ... should_index=lambda name: name in ['user-agent', 'x-generation-software'], ... is_sensitive=lambda name, value: name in ['x-generated-by', ':path'] ... ) >>> assert isinstance(seq, h2.H2Seq) >>> assert len(seq.frames) == 2 >>> p = seq.frames[0] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 1 >>> assert len(p.flags) == 1 >>> assert 'EH' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2HeadersFrame) >>> hdrs_frm = p[h2.H2HeadersFrame] >>> assert len(p.hdrs) == 9 >>> hdr = p.hdrs[0] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 3 >>> hdr = p.hdrs[1] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 1 >>> assert hdr.index in [4, 5] >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(/login.php)' >>> hdr = p.hdrs[2] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 7 >>> hdr = p.hdrs[3] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 31 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)' >>> hdr = p.hdrs[4] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 28 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(22)' >>> hdr = p.hdrs[5] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index == 58 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)' >>> hdr = p.hdrs[6] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 1 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-generated-by)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(Me)' >>> hdr = p.hdrs[7] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 63 >>> hdr = p.hdrs[8] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-generation-software)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(scapy)' >>> >>> p = seq.frames[1] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 0 >>> assert len(p.flags) == 1 >>> assert 'ES' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2DataFrame) >>> pay = p[h2.H2DataFrame] >>> assert pay.data == body ###(100)=[passed] HTTP/2 HPackHdrTable : Parsing Textual Representation without body >>> hdrs = b''':method POST ... :path /login.php ... :scheme https ... user-agent: Mozilla/5.0 Generated by hand ... x-generated-by: Me ... x-generation-date: 2016-08-11 ... ''' >>> >>> h = h2.HPackHdrTable() >>> h.register(h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11')) ... )) >>> >>> seq = h.parse_txt_hdrs(hdrs, stream_id=1) >>> assert isinstance(seq, h2.H2Seq) >>> assert len(seq.frames) == 1 >>> p = seq.frames[0] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 1 >>> assert len(p.flags) == 2 >>> assert 'EH' in p.flags >>> assert 'ES' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2HeadersFrame) >>> hdrs_frm = p[h2.H2HeadersFrame] >>> assert len(p.hdrs) == 6 >>> hdr = p.hdrs[0] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 3 >>> hdr = p.hdrs[1] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index in [4, 5] >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(/login.php)' >>> hdr = p.hdrs[2] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 7 >>> hdr = p.hdrs[3] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 58 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)' >>> hdr = p.hdrs[4] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-generated-by)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(Me)' >>> hdr = p.hdrs[5] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 62 ###(101)=[passed] HTTP/2 HPackHdrTable : Parsing Textual Representation with too small max frame >>> body = b'login=titi&passwd=toto' >>> hdrs = ''':method POST ... :path /login.php ... :scheme https ... content-type: application/x-www-form-urlencoded ... content-length: {} ... user-agent: Mozilla/5.0 Generated by hand ... x-generated-by: Me ... x-generation-date: 2016-08-11 ... x-long-header: {} ... '''.format(len(body), 'a'*5000).encode() >>> >>> h = h2.HPackHdrTable() >>> h.register(h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11')) ... )) >>> >>> expect_exception(Exception, "seq = h.parse_txt_hdrs('''{}''', stream_id=1".format(hdrs)) True ###(102)=[passed] HTTP/2 HPackHdrTable : Parsing Textual Representation with very large header and a large authorized frame size >>> body = b'login=titi&passwd=toto' >>> hdrs = ''':method POST ... :path /login.php ... :scheme https ... content-type: application/x-www-form-urlencoded ... content-length: {} ... user-agent: Mozilla/5.0 Generated by hand ... x-generated-by: Me ... x-generation-date: 2016-08-11 ... x-long-header: {} ... '''.format(len(body), 'a'*5000).encode() >>> >>> h = h2.HPackHdrTable() >>> h.register(h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11')) ... )) >>> >>> seq = h.parse_txt_hdrs(hdrs, stream_id=1, max_frm_sz=8192) >>> assert isinstance(seq, h2.H2Seq) >>> assert len(seq.frames) == 1 >>> p = seq.frames[0] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 1 >>> assert len(p.flags) == 2 >>> assert 'EH' in p.flags >>> assert 'ES' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2HeadersFrame) >>> hdrs_frm = p[h2.H2HeadersFrame] >>> assert len(p.hdrs) == 9 >>> hdr = p.hdrs[0] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 3 >>> hdr = p.hdrs[1] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index in [4, 5] >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(/login.php)' >>> hdr = p.hdrs[2] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 7 >>> hdr = p.hdrs[3] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 31 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)' >>> hdr = p.hdrs[4] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 28 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(22)' >>> hdr = p.hdrs[5] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 58 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)' >>> hdr = p.hdrs[6] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-generated-by)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(Me)' >>> hdr = p.hdrs[7] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 62 >>> hdr = p.hdrs[8] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-long-header)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString({})'.format('a'*5000) ###(103)=[passed] HTTP/2 HPackHdrTable : Parsing Textual Representation with two very large headers and a large authorized frame size >>> body = b'login=titi&passwd=toto' >>> hdrs = ''':method POST ... :path /login.php ... :scheme https ... content-type: application/x-www-form-urlencoded ... content-length: {} ... user-agent: Mozilla/5.0 Generated by hand ... x-generated-by: Me ... x-generation-date: 2016-08-11 ... x-long-header: {} ... x-long-header: {} ... '''.format(len(body), 'a'*5000, 'b'*5000).encode() >>> >>> h = h2.HPackHdrTable() >>> h.register(h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11')) ... )) >>> >>> seq = h.parse_txt_hdrs(hdrs, stream_id=1, max_frm_sz=8192) >>> assert isinstance(seq, h2.H2Seq) >>> assert len(seq.frames) == 2 >>> p = seq.frames[0] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 1 >>> assert len(p.flags) == 1 >>> assert 'ES' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2HeadersFrame) >>> hdrs_frm = p[h2.H2HeadersFrame] >>> assert len(p.hdrs) == 9 >>> hdr = p.hdrs[0] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 3 >>> hdr = p.hdrs[1] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index in [4, 5] >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(/login.php)' >>> hdr = p.hdrs[2] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 7 >>> hdr = p.hdrs[3] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 31 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)' >>> hdr = p.hdrs[4] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 28 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(22)' >>> hdr = p.hdrs[5] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 58 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)' >>> hdr = p.hdrs[6] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-generated-by)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(Me)' >>> hdr = p.hdrs[7] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 62 >>> hdr = p.hdrs[8] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-long-header)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString({})'.format('a'*5000) >>> p = seq.frames[1] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 9 >>> assert len(p.flags) == 1 >>> assert 'EH' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2ContinuationFrame) >>> hdrs_frm = p[h2.H2ContinuationFrame] >>> assert len(p.hdrs) == 1 >>> hdr = p.hdrs[0] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-long-header)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString({})'.format('b'*5000) ###(104)=[passed] HTTP/2 HPackHdrTable : Parsing Textual Representation with two very large headers, a large authorized frame size and a "small" max header list size >>> body = b'login=titi&passwd=toto' >>> hdrs = ''':method POST ... :path /login.php ... :scheme https ... content-type: application/x-www-form-urlencoded ... content-length: {} ... user-agent: Mozilla/5.0 Generated by hand ... x-generated-by: Me ... x-generation-date: 2016-08-11 ... x-long-header: {} ... x-long-header: {} ... '''.format(len(body), 'a'*5000, 'b'*5000).encode() >>> >>> h = h2.HPackHdrTable() >>> h.register(h2.HPackLitHdrFldWithIncrIndexing( ... hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')), ... hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11')) ... )) >>> >>> seq = h.parse_txt_hdrs(hdrs, stream_id=1, max_frm_sz=8192, max_hdr_lst_sz=5050) >>> assert isinstance(seq, h2.H2Seq) >>> assert len(seq.frames) == 3 >>> p = seq.frames[0] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 1 >>> assert len(p.flags) == 1 >>> assert 'ES' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2HeadersFrame) >>> hdrs_frm = p[h2.H2HeadersFrame] >>> assert len(p.hdrs) == 8 >>> hdr = p.hdrs[0] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 3 >>> hdr = p.hdrs[1] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index in [4, 5] >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(/login.php)' >>> hdr = p.hdrs[2] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 7 >>> hdr = p.hdrs[3] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 31 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)' >>> hdr = p.hdrs[4] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 28 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(22)' >>> hdr = p.hdrs[5] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 58 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)' >>> hdr = p.hdrs[6] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-generated-by)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(Me)' >>> hdr = p.hdrs[7] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 62 >>> p = seq.frames[1] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 9 >>> assert len(p.flags) == 0 >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2ContinuationFrame) >>> hdrs_frm = p[h2.H2ContinuationFrame] >>> assert len(p.hdrs) == 1 >>> hdr = p.hdrs[0] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-long-header)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString({})'.format('a'*5000) >>> p = seq.frames[2] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 9 >>> assert len(p.flags) == 1 >>> assert 'EH' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2ContinuationFrame) >>> hdrs_frm = p[h2.H2ContinuationFrame] >>> assert len(p.hdrs) == 1 >>> hdr = p.hdrs[0] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-long-header)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString({})'.format('b'*5000) ###(105)=[passed] HTTP/2 HPackHdrTable : Parsing Textual Representation with sensitive headers and non-indexable ones >>> hdrs = ''':method POST ... :path /login.php ... :scheme https ... content-type: application/x-www-form-urlencoded ... content-length: {} ... user-agent: Mozilla/5.0 Generated by hand ... x-generated-by: Me ... x-generation-date: 2016-08-11 ... '''.format(len(body)).encode() >>> >>> h = h2.HPackHdrTable() >>> seq = h.parse_txt_hdrs(hdrs, stream_id=1, body=body, is_sensitive=lambda n,v: n in ['x-generation-date'], should_index=lambda x: x != 'x-generated-by') >>> assert isinstance(seq, h2.H2Seq) >>> assert len(seq.frames) == 2 >>> p = seq.frames[0] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 1 >>> assert len(p.flags) == 1 >>> assert 'EH' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2HeadersFrame) >>> hdrs_frm = p[h2.H2HeadersFrame] >>> assert len(p.hdrs) == 8 >>> hdr = p.hdrs[0] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 3 >>> hdr = p.hdrs[1] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index in [4, 5] >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(/login.php)' >>> hdr = p.hdrs[2] >>> assert isinstance(hdr, h2.HPackIndexedHdr) >>> assert hdr.magic == 1 >>> assert hdr.index == 7 >>> hdr = p.hdrs[3] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index == 31 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)' >>> hdr = p.hdrs[4] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index == 28 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(22)' >>> hdr = p.hdrs[5] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing) >>> assert hdr.magic == 1 >>> assert hdr.index == 58 >>> assert hdr.hdr_name is None >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)' >>> hdr = p.hdrs[6] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 0 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-generated-by)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackLiteralString(Me)' >>> hdr = p.hdrs[7] >>> assert isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing) >>> assert hdr.magic == 0 >>> assert hdr.never_index == 1 >>> assert hdr.index == 0 >>> assert isinstance(hdr.hdr_name, h2.HPackHdrString) >>> assert hdr.hdr_name.data == 'HPackZString(x-generation-date)' >>> assert isinstance(hdr.hdr_value, h2.HPackHdrString) >>> assert hdr.hdr_value.data == 'HPackZString(2016-08-11)' >>> p = seq.frames[1] >>> assert isinstance(p, h2.H2Frame) >>> assert p.type == 0 >>> assert len(p.flags) == 1 >>> assert 'ES' in p.flags >>> assert p.stream_id == 1 >>> assert isinstance(p.payload, h2.H2DataFrame) >>> pay = p[h2.H2DataFrame] >>> assert pay.data == body iBeacon unit tests ━ Run at 01:42:43 from [test/contrib/ibeacon.uts] by UTscapy in 0.030899763107299805 └ Passed=6 └ Failed=0 ###### ## iBeacon tests ###### ###(000)=[passed] Presence check >>> Apple_BLE_Frame >>> IBeacon_Data >>> Apple_BLE_Submessage ###(001)=[passed] Apple multiple submessages >>> d = hex_bytes('D6BE898E4024320CFB574D5A02011A1AFF4C000C0E009C6B8F40440F1583EC895148B410050318C0B525B8F7D4') >>> p = BTLE(d) >>> >>> assert len(p[Apple_BLE_Frame].plist) == 2 >>> assert p[Apple_BLE_Frame].plist[0].subtype == 0x0c # handoff >>> assert (raw(p[Apple_BLE_Frame].plist[0].payload) == ... hex_bytes('009c6b8f40440f1583ec895148b4')) >>> assert p[Apple_BLE_Frame].plist[1].subtype == 0x10 # nearby >>> assert raw(p[Apple_BLE_Frame].plist[1].payload) == hex_bytes('0318c0b525') ###(002)=[passed] iBeacon (decode LE Set Advertising Data) >>> d = hex_bytes('1E02011A1AFF4C000215FB0B57A2822844CD913A94A122BA120600010002D100') >>> p = HCI_Cmd_LE_Set_Advertising_Data(d) >>> >>> assert len(p[Apple_BLE_Frame].plist) == 1 >>> assert p[IBeacon_Data].uuid == UUID("fb0b57a2-8228-44cd-913a-94a122ba1206") >>> assert p[IBeacon_Data].major == 1 >>> assert p[IBeacon_Data].minor == 2 >>> assert p[IBeacon_Data].tx_power == -47 >>> >>> d2 = raw(p) >>> assert d == d2 ###(003)=[passed] iBeacon (encode LE Set Advertising Data) >>> d = hex_bytes('1E0201061AFF4C000215FB0B57A2822844CD913A94A122BA120600010002D100') >>> p = Apple_BLE_Submessage()/IBeacon_Data( ... uuid='fb0b57a2-8228-44cd-913a-94a122ba1206', ... major=1, minor=2, tx_power=-47) >>> >>> sap = p.build_set_advertising_data()[HCI_Cmd_LE_Set_Advertising_Data] >>> assert d == raw(sap) >>> >>> pa = Apple_BLE_Frame(plist=[p]) >>> sapa = pa.build_set_advertising_data()[HCI_Cmd_LE_Set_Advertising_Data] >>> assert d == raw(sapa) >>> >>> sapa = p.build_set_advertising_data()[HCI_Cmd_LE_Set_Advertising_Data] >>> assert d == raw(sapa) ###(004)=[passed] iBeacon (decode advertising frame) >>> d = hex_bytes('043E2A02010001FCED16D4EED61E0201061AFF4C000215B9407F30F5F8466EAFF925556B57FE6DEDFCD416B6B4') >>> p = HCI_Hdr(d) >>> >>> assert p[HCI_LE_Meta_Advertising_Report].addr == 'd6:ee:d4:16:ed:fc' >>> assert len(p[Apple_BLE_Frame].plist) == 1 >>> assert p[IBeacon_Data].uuid == UUID('b9407f30-f5f8-466e-aff9-25556b57fe6d') ###### ## Overflow area ###### ###(005)=[passed] Basic overflow area packet >>> d = hex_bytes('14ff4c000100000000000000000000000000000080') >>> p = EIR_Hdr(d) >>> >>> assert raw(p) == d >>> assert len(p[Apple_BLE_Frame].plist) == 1 >>> assert p[Apple_BLE_Submessage].subtype == 0x01 >>> assert p[Apple_BLE_Submessage].len == None >>> >>> payload = p[Apple_BLE_Submessage].payload >>> assert isinstance(payload, Raw) >>> assert raw(payload) == hex_bytes('00000000000000000000000000000080') IEC 60870-5-104 test campaign ━ Run at 01:42:43 from [test/contrib/iec104.uts] by UTscapy in 0.49350547790527344 └ Passed=25 └ Failed=0 ###### ## iec104 infrastructure ###### ###(000)=[passed] load the iec104 layer >>> load_contrib('scada.iec104') ###(001)=[passed] class attribute generator >>> assert IEC104_IE_QOC.QU_FLAG_RESERVED_COMPATIBLE_4 == 4 >>> assert IEC104_IE_QOC.QU_FLAG_RESERVED_COMPATIBLE_8 == 8 >>> assert IEC104_IE_QOC.QU_FLAG_RESERVED_PREDEFINED_FUNCTION_9 == 9 >>> assert IEC104_IE_QOC.QU_FLAG_RESERVED_PREDEFINED_FUNCTION_15 == 15 ###(002)=[passed] IEC60870_5_4_NormalizedFixPoint >>> test_data = [ ... (b'\x9c\x84', -0.963989, -31588), ... (b'\x46\xf6', -0.075989, -2490), ... (b'\xc9\xf6', -0.071991, -2359), ... (b'\x40\xf5', -0.083984, -2752), ... (b'\x89\x01', 0.011993, 393), ... (b'\xd2\x0d', 0.107971, 3538), ... (b'\xd7\x23', 0.279999, 9175), ... (b'\x76\x3e', 0.487976, 15990), ... (b'\x08\x6c', 0.843994, 27656), ... (b'\xff\x7f', 0.999969, 32767) ... ] >>> >>> nfp = IEC60870_5_4_NormalizedFixPoint('foo', 0) >>> >>> for num_raw, num_fp, num_ss in test_data: ... i_val = nfp.getfield(None, num_raw)[1] ... assert i_val == num_ss ... assert round(nfp.i2h(None, i_val), 6) == round(num_fp, 6) ... ###(003)=[passed] Iec104SequenceNumber field >>> iec104_seq_num = IEC104SequenceNumber('rx_seq', 0) >>> >>> test_data = { ... 1: b'\x02\x00', ... 2: b'\x04\x00', ... 14 : b'\x1c\x00', ... 16 : b'\x20\x00', ... 73 : b'\x92\x00', ... 127: b'\xfe\x00', ... 128: b'\x00\x01', ... 129: b'\x02\x01', ... 253: b'\xfa\x01', ... 254: b'\xfc\x01', ... 255: b'\xfe\x01', ... 5912: b'\x30\x2e', ... 31282: b'\x64\xf4', ... 32767: b'\xfe\xff' ... } >>> >>> for key in test_data: ... assert iec104_seq_num.getfield(None, test_data[key])[1] == key ... assert iec104_seq_num.addfield(None, b'', key) == test_data[key] ... ###### ## raw layer dissection ###### ###(004)=[passed] IEC104_U_Message >>> raw_u_msg = b'\x68\x04\x83\x00\x00\x00' >>> >>> lyr = iec104_decode(b'\x68\x04\x83\x00\x00\x00') >>> assert lyr.__class__ == IEC104_U_Message ###(005)=[passed] IEC104_S_Message >>> raw_s_msg = b'\x68\x04\x01\x00\xa6\x17' >>> >>> lyr = iec104_decode(raw_s_msg) >>> assert lyr.__class__ == IEC104_S_Message ###(006)=[passed] IEC104_I_Message_SeqIOA >>> raw_i_msg_seq_ioa = b'\x68\x1f\x2c\x00\x04\x00' # APCI >>> raw_i_msg_seq_ioa += b'\x01\x92\x14\x00\x23\x00\x12\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' # ASDU >>> >>> lyr = iec104_decode(raw_i_msg_seq_ioa) >>> assert lyr.__class__ == IEC104_I_Message_SeqIOA ###(007)=[passed] IEC104_I_Message_SingleIOA >>> raw_i_msg_single_ioa = b'\x68\x0e\x00\x00\x00\x00\x64\x01\x06\x00\x0a\x00\x00\x00\x00\x14' >>> >>> lyr = iec104_decode(raw_i_msg_single_ioa) >>> assert lyr.__class__ == IEC104_I_Message_SingleIOA ###### ## IEC104 S Message ###### ###(008)=[passed] single IEC104 S Message >>> s_msg = b'\x68\x04\x01\x00\xa6\x17' >>> >>> s_msg = IEC104_S_Message(s_msg) >>> >>> assert s_msg.rx_seq_num == 3027 >>> >>> raw_s_message = b'\x00\x14\xab\x00\x3c\x13\x00\x1b\x8d\xf1\xdc\x12\x08\x00\x45\x10\x00\x3a\x8d\xdb\x40\x00\x3d\x06\x54\x46\x1a\x52\x01\xde\xc1\x28\x15\x5c\xaa\x56\x09\x64\x16\x67\x6c\xd7\x53\x07\x28\x98\x80\x18\x79\x5e\x9b\x14\x00\x00\x01\x01\x08\x0a\x9e\x08\xaa\x23\x73\xe8\x6c\xc3\x68\x04\x01\x00\xc2\x3a' >>> >>> frm = Ether(raw_s_message) >>> >>> s_msg = frm.getlayer(IEC104_S_Message) >>> assert s_msg >>> assert s_msg.rx_seq_num == 7521 >>> >>> frm = Ether(frm.do_build()) >>> >>> s_msg = frm.getlayer(IEC104_S_Message) >>> assert s_msg >>> assert s_msg.rx_seq_num == 7521 ###(009)=[passed] double IEC104 S Message (test layer binding) >>> raw_double_s_message = b'\x00\x14\xab\x00\x3c\x13\x00\x1b\x8d\xf1\xdc\x12\x08\x00\x45\x10\x00\x40\x8d\xdb\x40\x00\x3d\x06\x54\x46\x0c\x35\x1b\x33\xc1\x28\x15\x44\xaa\x56\x09\x64\x16\x67\x6c\xd7\x53\x07\x28\x98\x80\x18\x79\x5e\x9b\x14\x00\x00\x01\x01\x08\x0a\x9e\x08\xaa\x23\x73\xe8\x6c\xc3\x68\x04\x01\x00\xc2\x3a\x68\x04\x01\x00\xc2\x3b' >>> >>> frm = Ether(raw_double_s_message) >>> >>> s_msg = frm.getlayer(IEC104_S_Message) >>> assert s_msg >>> assert s_msg.rx_seq_num == 7521 >>> >>> s_msg = frm.getlayer(IEC104_S_Message, nb=2) >>> assert s_msg >>> assert s_msg.rx_seq_num == 7649 >>> >>> frm = Ether(frm.do_build()) >>> >>> s_msg = frm.getlayer(IEC104_S_Message) >>> assert s_msg >>> assert s_msg.rx_seq_num == 7521 >>> >>> s_msg = frm.getlayer(IEC104_S_Message, nb=2) >>> assert s_msg >>> assert s_msg.rx_seq_num == 7649 ###### ## IEC104 U Message ###### ###(010)=[passed] single IEC104 U Message >>> frm = Ether()/IP()/TCP()/IEC104_U_Message(startdt_act = 1, stopdt_con = 1, testfr_act=1) >>> frm = Ether(frm.do_build()) >>> u_msg = frm.getlayer(IEC104_U_Message) >>> assert u_msg >>> assert u_msg.startdt_act == 1 >>> assert u_msg.startdt_con == 0 >>> assert u_msg.stopdt_con == 1 >>> assert u_msg.stopdt_act == 0 >>> assert u_msg.testfr_act == 1 >>> assert u_msg.testfr_con == 0 >>> >>> u_msg_tst_act = b'\x68\x04\x43\x00\x00\x00' >>> u_msg = IEC104_U_Message(u_msg_tst_act) >>> assert u_msg.testfr_act == 1 >>> >>> u_msg_tst_con = b'\x68\x04\x83\x00\x00\x00' >>> u_msg = IEC104_U_Message(u_msg_tst_con) >>> assert u_msg.testfr_con == 1 >>> >>> u_msg_startdt_act = b'\x68\x04\x07\x00\x00\x00' >>> u_msg = IEC104_U_Message(u_msg_startdt_act) >>> assert u_msg.startdt_act == 1 >>> >>> u_msg_startdt_con = b'\x68\x04\x0b\x00\x00\x00' >>> u_msg = IEC104_U_Message(u_msg_startdt_con) >>> assert u_msg.startdt_con == 1 >>> >>> u_msg_stopdt_act = b'\x68\x04\x13\x00\x00\x00' >>> u_msg = IEC104_U_Message(u_msg_stopdt_act) >>> assert u_msg.stopdt_act == 1 >>> >>> u_msg_stopdt_con = b'\x68\x04\x23\x00\x00\x00' >>> u_msg = IEC104_U_Message(u_msg_stopdt_con) >>> assert u_msg.stopdt_con == 1 ###(011)=[passed] double IEC104 U Message >>> frm = Ether()/IP()/TCP()/\ ... IEC104_U_Message(startdt_act = 1, stopdt_con = 1, testfr_act=1)/\ ... IEC104_U_Message(startdt_con = 1, stopdt_act = 1, testfr_con=1) >>> >>> frm = Ether(frm.do_build()) >>> u_msg = frm.getlayer(IEC104_U_Message) >>> assert u_msg >>> assert u_msg.startdt_act == 1 >>> assert u_msg.stopdt_con == 1 >>> assert u_msg.testfr_act == 1 >>> >>> u_msg = frm.getlayer(IEC104_U_Message, nb=2) >>> assert u_msg >>> assert u_msg.startdt_con == 1 >>> assert u_msg.stopdt_act == 1 >>> assert u_msg.testfr_con == 1 ###### ## IEC104 I Message ###### ###(012)=[passed] Sequence IOA, single IO - information object types dissection >>> for io_id in IEC104_IO_CLASSES: ... io_class = IEC104_IO_CLASSES[io_id] ... frm = Ether()/IP()/TCP(sport=IEC_104_IANA_PORT, dport=56780)/IEC104_I_Message_SeqIOA(io=io_class()) ... frm = Ether(frm.do_build()) ... io_layer = frm.getlayer(io_class) ... assert io_layer ... ###(013)=[passed] Single IOA, single IO - information object types dissection >>> for io_id in IEC104_IO_WITH_IOA_CLASSES: ... io_class = IEC104_IO_WITH_IOA_CLASSES[io_id] ... frm = Ether()/IP()/TCP(sport=IEC_104_IANA_PORT, dport=56780)/IEC104_I_Message_SingleIOA(io=io_class()) ... frm = Ether(frm.do_build()) ... io_layer = frm.getlayer(io_class) ... assert io_layer ... ###(014)=[passed] Sequence IOA, multiple IOs - information object types dissection >>> frm = Ether()/IP()/TCP(sport=IEC_104_IANA_PORT, dport=56780)/IEC104_I_Message_SeqIOA(information_object_address=1234, io=[IEC104_IO_C_RC_TA_1(minutes = 1, sec_milli = 2),IEC104_IO_C_RC_TA_1(minutes = 3, sec_milli = 4)]) >>> frm = Ether(frm.do_build()) >>> >>> i_msg_lyr = frm.getlayer(IEC104_I_Message_SeqIOA) >>> assert i_msg_lyr >>> >>> assert i_msg_lyr.information_object_address == 1234 >>> >>> m_sp_ta_1_lyr = i_msg_lyr.io[0] >>> assert (m_sp_ta_1_lyr.minutes == 1) >>> assert (m_sp_ta_1_lyr.sec_milli == 2) >>> >>> m_sp_ta_1_lyr = i_msg_lyr.io[1] >>> assert (m_sp_ta_1_lyr.minutes == 3) >>> assert (m_sp_ta_1_lyr.sec_milli == 4) ###(015)=[passed] Single IOA, multiple IOs - information object types dissection >>> frm = Ether()/IP()/TCP(sport=IEC_104_IANA_PORT, dport=56780)/\ ... IEC104_I_Message_SingleIOA(io=[IEC104_IO_C_RC_TA_1_IOA(information_object_address=1111, minutes = 1, sec_milli = 2), ... IEC104_IO_C_RC_TA_1_IOA(information_object_address=2222,minutes = 3, sec_milli = 4)]) >>> frm = Ether(frm.do_build()) >>> >>> i_msg_lyr = frm.getlayer(IEC104_I_Message_SingleIOA) >>> assert i_msg_lyr >>> >>> m_sp_ta_1_lyr = i_msg_lyr.io[0] >>> assert (m_sp_ta_1_lyr.information_object_address==1111) >>> assert (m_sp_ta_1_lyr.minutes == 1) >>> assert (m_sp_ta_1_lyr.sec_milli == 2) >>> >>> >>> m_sp_ta_1_lyr = i_msg_lyr.io[1] >>> assert (m_sp_ta_1_lyr.information_object_address==2222) >>> assert (m_sp_ta_1_lyr.minutes == 3) >>> assert (m_sp_ta_1_lyr.sec_milli == 4) ###(016)=[passed] Sequence IOA, multiple APDUs >>> frm = Ether()/IP()/TCP(sport=IEC_104_IANA_PORT, dport=56780)/\ ... IEC104_I_Message_SeqIOA(information_object_address=1234, ... io=[IEC104_IO_C_RC_TA_1(minutes = 1, sec_milli = 2), ... IEC104_IO_C_RC_TA_1(minutes = 3, sec_milli = 4)])/ \ ... IEC104_I_Message_SeqIOA(information_object_address=5432, ... io=[IEC104_IO_C_RC_TA_1(minutes = 5, sec_milli = 6), ... IEC104_IO_C_RC_TA_1(minutes = 7, sec_milli = 8)]) >>> >>> frm = Ether(frm.do_build()) >>> i_msg_lyr = frm.getlayer(IEC104_I_Message_SeqIOA, nb=1) >>> assert i_msg_lyr >>> assert (i_msg_lyr.information_object_address == 1234) >>> assert len(i_msg_lyr.io) == 2 >>> assert i_msg_lyr.io[0].minutes == 1 >>> assert i_msg_lyr.io[0].sec_milli == 2 >>> assert i_msg_lyr.io[1].minutes == 3 >>> assert i_msg_lyr.io[1].sec_milli == 4 >>> >>> i_msg_lyr = frm.getlayer(IEC104_I_Message_SeqIOA, nb=2) >>> assert i_msg_lyr >>> assert (i_msg_lyr.information_object_address == 5432) >>> assert len(i_msg_lyr.io) == 2 >>> assert i_msg_lyr.io[0].minutes == 5 >>> assert i_msg_lyr.io[0].sec_milli == 6 >>> assert i_msg_lyr.io[1].minutes == 7 >>> assert i_msg_lyr.io[1].sec_milli == 8 ###(017)=[passed] Single IOA, multiple APDUs >>> frm = Ether()/IP()/TCP(sport=IEC_104_IANA_PORT, dport=56780)/\ ... IEC104_I_Message_SingleIOA(io=[IEC104_IO_C_RC_TA_1_IOA(information_object_address=1111, ... minutes = 1, sec_milli = 2), ... IEC104_IO_C_RC_TA_1_IOA(information_object_address=2222, ... minutes = 3, sec_milli = 4)])/ \ ... IEC104_I_Message_SingleIOA(io=[IEC104_IO_C_RC_TA_1_IOA(information_object_address=3333, ... minutes = 5, sec_milli = 6), ... IEC104_IO_C_RC_TA_1_IOA(information_object_address=4444, ... minutes = 7, sec_milli = 8)]) >>> >>> frm = Ether(frm.do_build()) >>> i_msg_lyr = frm.getlayer(IEC104_I_Message_SingleIOA, nb=1) >>> assert i_msg_lyr >>> assert len(i_msg_lyr.io) == 2 >>> assert (i_msg_lyr.io[0].information_object_address == 1111) >>> assert i_msg_lyr.io[0].minutes == 1 >>> assert i_msg_lyr.io[0].sec_milli == 2 >>> assert (i_msg_lyr.io[1].information_object_address == 2222) >>> assert i_msg_lyr.io[1].minutes == 3 >>> assert i_msg_lyr.io[1].sec_milli == 4 >>> >>> i_msg_lyr = frm.getlayer(IEC104_I_Message_SingleIOA, nb=2) >>> assert i_msg_lyr >>> assert len(i_msg_lyr.io) == 2 >>> assert (i_msg_lyr.io[0].information_object_address == 3333) >>> assert i_msg_lyr.io[0].minutes == 5 >>> assert i_msg_lyr.io[0].sec_milli == 6 >>> assert (i_msg_lyr.io[1].information_object_address == 4444) >>> assert i_msg_lyr.io[1].minutes == 7 >>> assert i_msg_lyr.io[1].sec_milli == 8 ###(018)=[passed] Mixed Single and Sequence IOA, multiple APDU >>> frm = Ether()/IP()/TCP(sport=IEC_104_IANA_PORT, dport=56780)/\ ... IEC104_I_Message_SeqIOA(information_object_address=1111, ... io=[IEC104_IO_C_RC_TA_1_IOA(minutes = 1, sec_milli = 2), ... IEC104_IO_C_RC_TA_1_IOA(minutes = 3, sec_milli = 4)])/ \ ... IEC104_I_Message_SingleIOA(io=[IEC104_IO_C_RC_TA_1_IOA(information_object_address=3333, ... minutes = 5, sec_milli = 6), ... IEC104_IO_C_RC_TA_1_IOA(information_object_address=4444, ... minutes = 7, sec_milli = 8)])/ \ ... IEC104_I_Message_SeqIOA(information_object_address=5555, ... io=[IEC104_IO_C_RC_TA_1_IOA(minutes = 1, sec_milli = 9), ... IEC104_IO_C_RC_TA_1_IOA(minutes = 3, sec_milli = 10)])/ \ ... IEC104_I_Message_SingleIOA(io=IEC104_IO_C_RP_NA_1_IOA(information_object_address=5555)) >>> >>> frm = Ether(frm.do_build()) >>> >>> i_msg_lyr = frm.getlayer(IEC104_I_Message_SeqIOA, nb=1) >>> assert i_msg_lyr >>> assert (i_msg_lyr.information_object_address == 1111) >>> >>> i_msg_lyr = frm.getlayer(IEC104_I_Message_SeqIOA, nb=2) >>> assert i_msg_lyr >>> assert (i_msg_lyr.information_object_address == 5555) >>> >>> i_msg_lyr = frm.getlayer(IEC104_I_Message_SingleIOA, nb=1) >>> assert i_msg_lyr >>> assert (i_msg_lyr.io[0].information_object_address == 3333) ###### ## mixed APDU types in one packet ###### ###(019)=[passed] I/U/S Message sequence (mixed APDUs) >>> frm = Ether()/IP()/TCP(sport=IEC_104_IANA_PORT, dport=56780)/\ ... IEC104_I_Message_SeqIOA(information_object_address=1111, ... rx_seq_num=1234, ... tx_seq_num=6789, ... io=[IEC104_IO_C_RC_TA_1_IOA(minutes = 1, sec_milli = 2), ... IEC104_IO_C_RC_TA_1_IOA(minutes = 3, sec_milli = 4)])/\ ... IEC104_U_Message()/ \ ... IEC104_S_Message(rx_seq_num=666) >>> >>> frm = Ether(frm.do_build()) >>> i_msg = frm.getlayer(IEC104_I_Message_SeqIOA) >>> assert i_msg >>> u_msg = frm.getlayer(IEC104_U_Message) >>> assert u_msg >>> s_msg = frm.getlayer(IEC104_S_Message) >>> assert s_msg ###### ## information elements & objects ###### ###(020)=[passed] ASDU allowed in given standard (examples) >>> layer = IEC104_IO_M_SP_NA_1() >>> assert layer.defined_for_iec_101() is True >>> assert layer.defined_for_iec_104() is True >>> >>> layer = IEC104_IO_M_DP_TA_1() >>> assert layer.defined_for_iec_101() is True >>> assert layer.defined_for_iec_104() is False >>> >>> layer = IEC104_IO_C_SC_TA_1() >>> assert layer.defined_for_iec_101() is False >>> assert layer.defined_for_iec_104() is True ###(021)=[passed] BCR - binary counter reading / IEC104_IO_M_IT_NA_1 - integrated totals >>> values = [(1, 1), (1111, 17), (23456, 21), (31234, 30), (32767, 31)] >>> m_it_na = [] >>> for value, sequence in values: ... m_it_na.append(IEC104_IO_M_IT_NA_1(counter_value=value, sq=sequence)) ... >>> frm = Ether()/IP()/TCP()/IEC104_I_Message_SeqIOA(io=m_it_na) >>> frm = Ether(frm.do_build()) >>> i_msg = frm.getlayer(IEC104_I_Message_SeqIOA) >>> assert i_msg >>> >>> for idx, value in enumerate(values): ... value, sequence = value ... assert i_msg.io[idx].counter_value == value ... assert (i_msg.io[idx].sq == sequence) ... ###(022)=[passed] DIQ - double-point information with quality descriptor / IEC104_IO_M_DP_NA_1 - double-point information without time tag >>> frm = Ether() / IP() / TCP() / IEC104_I_Message_SeqIOA(io=IEC104_IO_M_DP_NA_1(dpi_value=IEC104_IE_DIQ.DPI_FLAG_STATE_UNDEFINED)) >>> frm = Ether(frm.do_build()) >>> >>> i_msg = frm.getlayer(IEC104_I_Message_SeqIOA) >>> assert i_msg >>> assert i_msg.io[0].dpi_value==IEC104_IE_DIQ.DPI_FLAG_STATE_UNDEFINED ###(023)=[passed] VTI - value with transient state indication / IEC104_IO_M_ST_NA_1 - step position information >>> values = [0, 1, 2, 62, 63, -1, -2, -63, -64] >>> m_st_na_1 = [] >>> for value in values: ... m_st_na_1.append(IEC104_IO_M_ST_NA_1(value=value)) ... >>> frm = Ether() / IP() / TCP() / IEC104_I_Message_SeqIOA(io=m_st_na_1) >>> frm = Ether(frm.do_build()) >>> >>> i_msg = frm.getlayer(IEC104_I_Message_SeqIOA) >>> assert (i_msg) >>> >>> for idx, value in enumerate(values): ... assert (i_msg.io[idx].value == value) ... ###(024)=[passed] IEC104_IO_C_RD_NA_1 - read command (zero byte field) >>> frm = Ether() / IP() / TCP() / IEC104_I_Message_SeqIOA(information_object_address=0x112233, ... io=[ ... IEC104_IO_C_RD_NA_1(), ... IEC104_IO_C_RD_NA_1() ... ])/ \ ... IEC104_I_Message_SeqIOA(information_object_address=0x445566, ... io=[IEC104_IO_M_DP_NA_1(dpi_value=IEC104_IE_DIQ.DPI_FLAG_STATE_UNDEFINED)])/ \ ... IEC104_I_Message_SeqIOA(information_object_address=0x445567, ... io=[IEC104_IO_C_RD_NA_1()]) >>> >>> frm = Ether(frm.do_build()) >>> >>> i_msg = frm.getlayer(IEC104_I_Message_SeqIOA) >>> assert (i_msg) >>> assert (i_msg.information_object_address == 0x112233) >>> assert (len(i_msg.io) == 2) >>> >>> i_msg = frm.getlayer(IEC104_I_Message_SeqIOA, nb=2) >>> assert (i_msg) >>> assert (i_msg.information_object_address == 0x445566) IFE test campaign ━ Run at 01:42:43 from [test/contrib/ife.uts] by UTscapy in 0.011783599853515625 └ Passed=3 └ Failed=0 ###### ## Basic layer handling ###### ###(000)=[passed] build basic IFE frames >>> frm = Ether()/IFE(tlvs=[IFESKBMark(value=3), IFETCIndex(value=5)]) >>> >>> frm = Ether(bytes(frm)) MAC address to reach destination not found. Using broadcast. >>> >>> assert IFE in frm >>> assert frm[IFE].tlvs[0].type == 1 >>> assert frm[IFE].tlvs[0].length == 8 >>> assert frm[IFE].tlvs[0].value == 3 >>> assert frm[IFE].tlvs[1].type == 5 >>> assert frm[IFE].tlvs[1].length == 6 >>> assert frm[IFE].tlvs[1].value == 5 ###(001)=[passed] add padding if required >>> frm = Ether()/IFE(tlvs=[IFETCIndex()]) >>> assert len(raw(frm)) == 24 MAC address to reach destination not found. Using broadcast. >>> >>> frm = Ether()/IFE(tlvs=[IFESKBMark(), IFETCIndex()]) >>> assert len(raw(frm)) == 32 more MAC address to reach destination not found. Using broadcast. ###(002)=[passed] variable payload >>> frm = Ether(src="aa:aa:aa:aa:aa:aa", dst="bb:bb:bb:bb:bb:bb")/IFE(tlvs=[IFETlvStr(b"testsr")]) >>> assert bytes(frm) == b'\xbb\xbb\xbb\xbb\xbb\xbb\xaa\xaa\xaa\xaa\xaa\xaa\xed>\x00\x08testsr' IGMP tests ━ Run at 01:42:43 from [test/contrib/igmp.uts] by UTscapy in 0.028272628784179688 └ Passed=6 └ Failed=0 ###### ## Basic IGMP tests ###### ###(000)=[passed] Build IGMP - Basic >>> a=Ether(src="00:01:02:03:04:05") >>> b=IP(src="1.2.3.4") >>> c=IGMP(gaddr="0.0.0.0") >>> x = a/b/c >>> x[IGMP].igmpize() True >>> assert x.mrcode == 20 >>> assert x[IP].dst == "224.0.0.1" ###(001)=[passed] Build IGMP - Custom membership >>> a=Ether(src="00:01:02:03:04:05") >>> b=IP(src="1.2.3.4") >>> c=IGMP(gaddr="224.0.1.2") >>> x = a/b/c >>> x[IGMP].igmpize() True >>> assert x.mrcode == 20 >>> assert x[IP].dst == "224.0.1.2" ###(002)=[passed] Build IGMP - LG >>> a=Ether(src="00:01:02:03:04:05") >>> b=IP(src="1.2.3.4") >>> c=IGMP(type=0x17, gaddr="224.2.3.4") >>> x = a/b/c >>> x[IGMP].igmpize() True >>> assert x.dst == "01:00:5e:00:00:02" >>> assert x.mrcode == 0 >>> assert x[IP].dst == "224.0.0.2" ###(003)=[passed] Change IGMP params >>> x = Ether(src="00:01:02:03:04:05")/IP()/IGMP() >>> x[IGMP].igmpize() True >>> assert x.mrcode == 20 >>> assert x[IP].dst == "224.0.0.1" >>> >>> x = Ether(src="00:01:02:03:04:05")/IP()/IGMP(gaddr="224.2.3.4", type=0x12) >>> x.mrcode = 1 >>> x[IGMP].igmpize() True >>> x = Ether(raw(x)) >>> assert x.mrcode == 0 >>> >>> x.gaddr = "224.3.2.4" >>> x[IGMP].igmpize() True >>> assert x.dst == "01:00:5e:03:02:04" >>> >>> x.ttl = 64 >>> x[IGMP].igmpize() True >>> assert x.ttl == 1 ###(004)=[passed] Test mysummary >>> x = Ether(src="00:01:02:03:04:05")/IP(src="192.168.0.1")/IGMP(gaddr="224.0.0.2", type=0x17) >>> x[IGMP].igmpize() True >>> assert x[IGMP].mysummary() == "IGMP: 192.168.0.1 > 224.0.0.2 Leave Group 224.0.0.2" >>> >>> assert IGMP().mysummary() == "IGMP Group Membership Query 0.0.0.0" ###(005)=[passed] IGMP - misc >>> x = Ether(src="00:01:02:03:04:05")/IP(dst="192.168.0.1")/IGMP(gaddr="www.google.fr", type=0x11) >>> x = Ether(raw(x)) getmacbyip failed on [Errno 1] Operation not permitted >>> assert not x[IGMP].igmpize() Invalid IGMP Group Address detected ! >>> assert x[IP].dst == "192.168.0.1" >>> >>> x = Ether(src="00:01:02:03:04:05")/IP(dst="192.168.0.1")/IGMP(gaddr="124.0.2.1", type=0x00) >>> assert not x[IGMP].igmpize() Invalid IGMP Type detected ! >>> assert x[IP].dst == "192.168.0.1" IGMPv3 tests ━ Run at 01:42:43 from [test/contrib/igmpv3.uts] by UTscapy in 0.029658079147338867 └ Passed=7 └ Failed=0 ###### ## Basic IGMPv3 tests ###### ###(000)=[passed] Build IGMPv3 - Basic >>> a=Ether(src="00:01:02:03:04:05") >>> b=IP(src="1.2.3.4") >>> c=IGMPv3(mrcode=154)/IGMPv3mq() >>> x = a/b/c >>> x[IGMPv3].igmpize() True >>> assert x.mrcode == 131 >>> assert x[IP].dst == "224.0.0.1" >>> assert isinstance(IGMP(raw(x[IGMPv3])), IGMPv3) ###(001)=[passed] Build IGMPv3 - igmpize >>> a=Ether(src="00:01:02:03:04:05") >>> b=IP(src="1.2.3.4") >>> c=IGMPv3()/IGMPv3mr(records = [IGMPv3gr(maddr = "232.1.1.10", srcaddrs = ["10.0.0.10"])]) >>> x = a/b/c >>> ret = x[IGMPv3].igmpize() >>> assert ret ###(002)=[passed] Dissect IGMPv3 - IGMPv3mq >>> x = Ether(b'\x14\x0cv\x8f\xfe(\x00\x01\x02\x03\x04\x05\x08\x00F\xc0\x00$\x00\x01\x00\x00\x01\x02\xe4h\xc0\xa8\x00\x01\xe0\x00\x00\x16\x94\x04\x00\x00\x11\x14\x0e\xe9\xe6\x00\x00\x02\x00\x00\x00\x00') >>> assert IGMPv3 in x >>> assert IGMPv3mq in x >>> assert x[IGMPv3mq].gaddr == "230.0.0.2" >>> assert x.summary() == "Ether / IP / IGMPv3: 192.168.0.1 > 224.0.0.22 Membership Query / IGMPv3mq" >>> assert isinstance(IGMP(raw(x[IGMPv3])), IGMPv3) ###(003)=[passed] Dissect IGMPv3 - IGMPv3mr >>> x = Ether(b'\x01\x00^\x00\x00\x16\xa8\xf9K\x00\x00\x01\x08\x00E\xc0\x00D\x00\x01\x00\x00\x01\x02\xd6\xdf\x01\x01\x01\x01\xe0\x00\x00\x16"\x00;\xa6\x00\x00\x00\x04\x01\x00\x00\x02\xe6\x00\x00\x00\xc0\xa8\x00\x01\xc0\xa8\x84\xf7\x01\x00\x00\x00\xe6\x00\x00\x01\x01\x00\x00\x00\xe6\x00\x00\x02\x01\x00\x00\x00\xe6\x00\x00\x03') >>> assert IGMPv3 in x >>> assert IGMPv3mr in x >>> assert len(x[IGMPv3mr].records) == 4 >>> assert x[IGMPv3mr].records[0].srcaddrs == ["192.168.0.1", "192.168.132.247"] >>> assert x[IGMPv3mr].records[1].maddr == "230.0.0.1" >>> assert isinstance(IGMP(raw(x[IGMPv3])), IGMPv3) ###(004)=[passed] Dissect IGMPv3 - IGMPv3mra >>> x = Ether(b'\x14\x0cv\x8f\xfe(\x00\x01\x02\x03\x04\x05\x08\x00F\xc0\x00 \x00\x01\x00\x00\x01\x02\xe4l\xc0\xa8\x00\x01\x7f\x00\x00\x01\x94\x04\x00\x000\x14\xcf\xe6\x00\x03\x00\x02') >>> assert IGMPv3 in x >>> assert IGMPv3mra in x >>> assert x[IGMPv3mra].qryIntvl == 3 >>> assert x[IGMPv3mra].robust == 2 >>> assert isinstance(IGMP(raw(x[IGMPv3])), IGMPv3) ###(005)=[passed] IGMP vs IVMPv3 tests >>> assert isinstance(IGMPv3(raw(IGMP())), IGMP) >>> assert isinstance(IGMPv3(raw(IGMP(type=0x11))), IGMP) >>> assert isinstance(IGMP(raw(IGMPv3()/IGMPv3mra())), IGMPv3) >>> assert isinstance(IGMP(raw(IGMPv3()/IGMPv3mq())), IGMPv3) ###(006)=[passed] IGMPv3 - summaries >>> pkt = IGMPv3()/IGMPv3mr(records=[IGMPv3gr(maddr="127.0.0.1")]) >>> assert pkt.summary() == 'IGMPv3 Version 3 Membership Report / IGMPv3mr' Ikev2 unit tests ━ Run at 01:42:48 from [test/contrib/ikev2.uts] by UTscapy in 4.413611650466919 └ Passed=20 └ Failed=0 Tests for the Ikev2 layer ###### ## Basic Layer Tests ###### ###(000)=[passed] Ikev2 build >>> a = IKEv2() >>> assert raw(a) == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c' ###(001)=[passed] Ikev2 dissection >>> a = IKEv2(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00! \x00\x00\x00\x00\x00\x00\x00\x00\x000\x00\x00\x00\x14\x00\x00\x00\x10\x01\x01\x00\x00\x00\x00\x00\x08\x02\x00\x00\x03") >>> assert a[IKEv2_Transform].transform_type == 2 >>> assert a[IKEv2_Transform].transform_id == 3 >>> assert a.next_payload == 33 >>> assert a[IKEv2_SA].next_payload == 0 >>> assert a[IKEv2_Proposal].next_payload == 0 >>> assert a[IKEv2_Proposal].proposal == 1 >>> assert a[IKEv2_Transform].next_payload == 0 >>> a[IKEv2_Transform].show() ###[ IKEv2 Transform ]### next_payload= None flags = length = 8 transform_type= PRF res2 = 0 transform_id= PRF_HMAC_TIGER ###(002)=[passed] Build Ikev2 SA request packet >>> a = IKEv2(init_SPI="MySPI",exch_type=34)/IKEv2_SA(prop=IKEv2_Proposal()) >>> assert raw(a) == b'MySPI\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00! "\x00\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x0c\x00\x00\x00\x08\x01\x01\x00\x00' ###(003)=[passed] Build advanced IKEv2 >>> import binascii >>> >>> key_exchange = binascii.unhexlify('bb41bb41cfaf34e3b3209672aef1c51b9d52919f1781d0b4cd889d4aafe261688776000c3d9031505aefc0186967eaf5a7663725fb102c59c39b7a70d8d9161c3bd0eb445888b5028ea063ba0ae01f5b3f30808a6b6710dc9bab601e4116157d7f58cf835cb633c64abcb3a5c61c223e9332538bfc9f282cb62d1f00f4ee8802') >>> nonce = binascii.unhexlify('8dfcf8384c5c32f1b294c64eab69f98e9d8cf7e7f352971a91ff6777d47dffed') >>> nat_detection_source_ip = binascii.unhexlify('e64c81c4152ad83bd6e035009fbb900406be371f') >>> nat_detection_destination_ip = binascii.unhexlify('28cd99b9fa1267654b53f60887c9c35bcf67a8ff') >>> transform_1 = IKEv2_Transform(next_payload = 'Transform', transform_type = 'Encryption', transform_id = 12, length = 12, key_length = 0x80) >>> transform_2 = IKEv2_Transform(next_payload = 'Transform', transform_type = 'PRF', transform_id = 2) >>> transform_3 = IKEv2_Transform(next_payload = 'Transform', transform_type = 'Integrity', transform_id = 2) >>> transform_4 = IKEv2_Transform(next_payload = 'None', transform_type = 'GroupDesc', transform_id = 2) >>> packet = IP(dst = '192.168.1.10', src = '192.168.1.130') /\ ... UDP(dport = 500) /\ ... IKEv2(init_SPI = b'KWdxMhjA', next_payload = 'SA', exch_type = 'IKE_SA_INIT', flags='Initiator') /\ ... IKEv2_SA(next_payload = 'KE', prop = IKEv2_Proposal(trans_nb = 4, trans = transform_1 / transform_2 / transform_3 / transform_4, )) /\ ... IKEv2_KE(next_payload = 'Nonce', group = '1024MODPgr', ke = key_exchange) /\ ... IKEv2_Nonce(next_payload = 'Notify', nonce = nonce) /\ ... IKEv2_Notify(next_payload = 'Notify', type = 16388, notify = nat_detection_source_ip) /\ ... IKEv2_Notify(next_payload = 'None', type = 16389, notify = nat_detection_destination_ip) >>> >>> assert raw(packet) == b'E\x00\x01L\x00\x01\x00\x00@\x11\xf5\xc3\xc0\xa8\x01\x82\xc0\xa8\x01\n\x01\xf4\x01\xf4\x018\xa6\xc0KWdxMhjA\x00\x00\x00\x00\x00\x00\x00\x00! "\x08\x00\x00\x00\x00\x00\x00\x010"\x00\x000\x00\x00\x00,\x01\x01\x00\x04\x03\x00\x00\x0c\x01\x00\x00\x0c\x80\x0e\x00\x80\x03\x00\x00\x08\x02\x00\x00\x02\x03\x00\x00\x08\x03\x00\x00\x02\x00\x00\x00\x08\x04\x00\x00\x02(\x00\x00\x88\x00\x02\x00\x00\xbbA\xbbA\xcf\xaf4\xe3\xb3 \x96r\xae\xf1\xc5\x1b\x9dR\x91\x9f\x17\x81\xd0\xb4\xcd\x88\x9dJ\xaf\xe2ah\x87v\x00\x0c=\x901PZ\xef\xc0\x18ig\xea\xf5\xa7f7%\xfb\x10,Y\xc3\x9bzp\xd8\xd9\x16\x1c;\xd0\xebDX\x88\xb5\x02\x8e\xa0c\xba\n\xe0\x1f[?0\x80\x8akg\x10\xdc\x9b\xab`\x1eA\x16\x15}\x7fX\xcf\x83\\\xb63\xc6J\xbc\xb3\xa5\xc6\x1c">\x932S\x8b\xfc\x9f(,\xb6-\x1f\x00\xf4\xee\x88\x02)\x00\x00$\x8d\xfc\xf88L\\2\xf1\xb2\x94\xc6N\xabi\xf9\x8e\x9d\x8c\xf7\xe7\xf3R\x97\x1a\x91\xffgw\xd4}\xff\xed)\x00\x00\x1c\x00\x00@\x04\xe6L\x81\xc4\x15*\xd8;\xd6\xe05\x00\x9f\xbb\x90\x04\x06\xbe7\x1f\x00\x00\x00\x1c\x00\x00@\x05(\xcd\x99\xb9\xfa\x12geKS\xf6\x08\x87\xc9\xc3[\xcfg\xa8\xff' ###(004)=[passed] Dissect Initiator Request >>> a = Ether(b'\x00!k\x91#H\xb8\'\xeb\xa6XI\x08\x00E\x00\x01\x14u\xc2@\x00@\x11@\xb6\xc0\xa8\x01\x02\xc0\xa8\x01\x0e\x01\xf4\x01\xf4\x01\x00=8\xeahM!Yz\xfd6\x00\x00\x00\x00\x00\x00\x00\x00! "\x08\x00\x00\x00\x00\x00\x00\x00\xf8"\x00\x00(\x00\x00\x00$\x01\x01\x00\x03\x03\x00\x00\x0c\x01\x00\x00\x0f\x80\x0e\x00\x80\x03\x00\x00\x08\x02\x00\x00\x05\x00\x00\x00\x08\x04\x00\x00\x13(\x00\x00H\x00\x13\x00\x002\xc6\xdf\xfe\\C\xb0\xd5\x81\x1f~\xaa\xa8L\x9fx\xbf\x99\xb9\x06\x9c+\x07.\x0b\x82\xf4k\xf6\xf6m\xd4_\x97\xef\x89\xee(_\xd5\xdfRzDwkR\x9f\xc9\xd8\xa9\t\xd8B\xa6\xfbY\xb9j\tS\x95ar)\x00\x00$\xb6UF-oKf\xf8r\xcc\xd7\xf0\xf4\xb4\x85w2\x92\x139\xcb\xaaR7\xed\xba$O&+h#)\x00\x00\x1c\x00\x00@\x04\x94\x9c\x9d\xb5s\x9du\xa9t\xa4\x9c\x18F\x186\x9b4\xb7\xf9B)\x00\x00\x1c\x00\x00@\x05>r\x1bF\xbe\x07\xd51\x11B]\x7f\x80\xd2\xc6\xe2 \xc6\x07.\x00\x00\x00\x10\x00\x00@/\x00\x01\x00\x02\x00\x03\x00\x04') >>> assert a[IKEv2_SA].prop.trans.transform_id == 15 >>> assert a[IKEv2_Notify].next_payload == 41 >>> assert IP(a[IKEv2_Notify].notify).src == "70.24.54.155" >>> assert IP(a[IKEv2_Notify].payload.notify).dst == "32.198.7.46" ###(005)=[passed] Dissect Responder Response >>> b = Ether(b'\xb8\'\xeb\xa6XI\x00!k\x91#H\x08\x00E\x00\x01\x0c\xd2R@\x00@\x11\xe4-\xc0\xa8\x01\x0e\xc0\xa8\x01\x02\x01\xf4\x01\xf4\x00\xf8\x07\xdd\xeahM!Yz\xfd6\xd9\xfe*\xb2-\xac#\xac! " \x00\x00\x00\x00\x00\x00\x00\xf0"\x00\x00(\x00\x00\x00$\x01\x01\x00\x03\x03\x00\x00\x0c\x01\x00\x00\x0f\x80\x0e\x00\x80\x03\x00\x00\x08\x02\x00\x00\x05\x00\x00\x00\x08\x04\x00\x00\x13(\x00\x00H\x00\x13\x00\x00,f\xbe\xad\xb6\xce\x855\xd6!\x8c\xb4\x01\xaaZ\x1e\xb4\x03[\x97\xca\xdd\xaf67J\x97\x9c\x04F\xb8\x80\x05\x06\xbf\x9do\x95\tR2k\xf3\x01\x19\x13\xda\x93\xbb\x8e@\xf8\x157k\xe1\xa0h\x01\xc0\xa6>;T)\x00\x00$\x9e]&sy\xe6\x81\xe7\xd3\x8d\x81\xc7\x10\xd3\x83@\x1d\xe7\xe3`{\x92m\x90\xa9\x95\x8a\xdc\xb5(1\xaa)\x00\x00\x1c\x00\x00@\x04z\x07\x85\'=Y 8)\xa6\x97U\x0f1\xcb\xb9N\xb7+C)\x00\x00\x1c\x00\x00@\x05\xc3\xe5\x8a\x8c\xc9\x93<\xe0\xb7\x8f*P\xe8\xde\x80\x13N\x12\xce1\x00\x00\x00\x08\x00\x00@\x14') >>> assert b[UDP].dport == 500 >>> assert b[IKEv2_KE].ke == b',f\xbe\xad\xb6\xce\x855\xd6!\x8c\xb4\x01\xaaZ\x1e\xb4\x03[\x97\xca\xdd\xaf67J\x97\x9c\x04F\xb8\x80\x05\x06\xbf\x9do\x95\tR2k\xf3\x01\x19\x13\xda\x93\xbb\x8e@\xf8\x157k\xe1\xa0h\x01\xc0\xa6>;T' >>> assert b[IKEv2_Nonce].payload.type == 16388 >>> assert b[IKEv2_Nonce].payload.payload.payload.next_payload == 0 ###(006)=[passed] Dissect Encrypted Initiator Request >>> a = Ether(b"\x00!k\x91#H\xb8'\xeb\xa6XI\x08\x00E\x00\x00Yu\xe2@\x00@\x11AQ\xc0\xa8\x01\x02\xc0\xa8\x01\x0e\x01\xf4\x01\xf4\x00E}\xe0\xeahM!Yz\xfd6\xd9\xfe*\xb2-\xac#\xac. %\x08\x00\x00\x00\x02\x00\x00\x00=*\x00\x00!\xcc\xa0\xb3]\xe5\xab\xc5\x1c\x99\x87\xcb\xf1\xf5\xec\xff!\x0e\xb7g\xcd\xb8Qy8;\x96Mx\xe2") >>> assert a[IKEv2_Encrypted].next_payload == 42 >>> assert a[IKEv2_Encrypted].load == b'\xcc\xa0\xb3]\xe5\xab\xc5\x1c\x99\x87\xcb\xf1\xf5\xec\xff!\x0e\xb7g\xcd\xb8Qy8;\x96Mx\xe2' ###(007)=[passed] Dissect Encrypted Responder Response >>> b = Ether(b"\xb8'\xeb\xa6XI\x00!k\x91#H\x08\x00E\x00\x00Q\xd5y@\x00@\x11\xe1\xc1\xc0\xa8\x01\x0e\xc0\xa8\x01\x02\x01\xf4\x01\xf4\x00=\xf9F\xeahM!Yz\xfd6\xd9\xfe*\xb2-\xac#\xac. % \x00\x00\x00\x02\x00\x00\x005\x00\x00\x00\x19\xa8\x0c\x95{\xac\x15\xc3\xf8\xaf\xdf1Z\x81\xccK|@\xe8f\rD") >>> assert b[IKEv2].init_SPI == b'\xeahM!Yz\xfd6' >>> assert b[IKEv2].resp_SPI == b'\xd9\xfe*\xb2-\xac#\xac' >>> assert b[IKEv2].next_payload == 46 >>> assert b[IKEv2_Encrypted].load == b'\xa8\x0c\x95{\xac\x15\xc3\xf8\xaf\xdf1Z\x81\xccK|@\xe8f\rD' ###(008)=[passed] Test Certs detection >>> a = IKEv2_CERT(raw(IKEv2_CERT(cert_encoding = "X.509 Certificate - Signature"))) >>> b = IKEv2_CERT(raw(IKEv2_CERT(cert_encoding ="Certificate Revocation List (CRL)"))) >>> c = IKEv2_CERT(raw(IKEv2_CERT(cert_encoding = 0))) >>> >>> assert a.cert_encoding == 4 >>> assert isinstance(a.cert_data, X509_Cert) >>> assert b.cert_encoding == 7 >>> assert isinstance(b.cert_data, X509_CRL) >>> assert c.cert_encoding == 0 >>> assert isinstance(c.cert_data, bytes) ###(009)=[passed] Test Certs length calculations >>> assert a.length == len(a.cert_data) + 5 >>> assert b.length == len(b.cert_data) + 5 >>> assert c.length == len(c.cert_data) + 5 ###(010)=[passed] Test TrafficSelector detection >>> a = TrafficSelector(raw(IPv4TrafficSelector())) >>> b = TrafficSelector(raw(IPv6TrafficSelector())) >>> c = TrafficSelector(raw(EncryptedTrafficSelector())) >>> >>> assert isinstance(a, IPv4TrafficSelector) >>> assert isinstance(b, IPv6TrafficSelector) >>> assert isinstance(c, EncryptedTrafficSelector) ###(011)=[passed] Test TSi with multiple TrafficSelector dissection >>> a = IKEv2_TSi() >>> a.traffic_selector.extend(IPv4TrafficSelector() * 2) >>> a.traffic_selector.extend(IPv6TrafficSelector() * 3) >>> assert len(a.traffic_selector) == 5 >>> >>> b = IKEv2_TSi(raw(a)) >>> assert len(b.traffic_selector) == 5 ###(012)=[passed] Test automatic calculation of number_of_TSs field >>> a = IKEv2_TSi(traffic_selector=IPv4TrafficSelector() * 2) >>> b = IKEv2_TSi(raw(a)) >>> assert b.number_of_TSs == 2 >>> >>> c = IKEv2_TSr(traffic_selector=IPv4TrafficSelector() * 2) >>> d = IKEv2_TSr(raw(c)) >>> assert d.number_of_TSs == 2 ###(013)=[passed] IKEv2_Encrypted_Fragment, simple tests >>> s = b"\x00\x00\x00\x08\x00\x01\x00\x01" >>> assert raw(IKEv2_Encrypted_Fragment()) == s >>> >>> p = IKEv2_Encrypted_Fragment(s) >>> assert p.length == 8 and p.frag_number == 1 ###(014)=[passed] Build and dissect UDP encapsulated IKEv1 packets >>> pkt = Ether() / IP() / UDP() / NON_ESP() / ISAKMP(init_cookie = b'\x01\x02\x03\x04\x05\x06\x07\x08', resp_cookie = b'\x08\x07\x06\x05\x04\x03\x02\x01') >>> pkt.show() ###[ Ethernet ]### dst = None src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = None src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = ipsec_nat_t dport = ipsec_nat_t len = None chksum = None ###[ NON_ESP ]### non_esp = 0x0 ###[ ISAKMP ]### init_cookie= 0102030405060708 resp_cookie= 0807060504030201 next_payload= None version = 0x10 exch_type = None flags = id = 0 length = None >>> assert pkt[UDP].sport == 4500 >>> assert pkt[UDP].dport == 4500 >>> assert pkt[NON_ESP].non_esp == 0x00 >>> assert pkt[ISAKMP].version == 0x10 >>> assert pkt[ISAKMP].init_cookie == b'\x01\x02\x03\x04\x05\x06\x07\x08' >>> assert pkt[ISAKMP].resp_cookie == b'\x08\x07\x06\x05\x04\x03\x02\x01' >>> >>> pkt = Ether(raw(pkt)) >>> pkt.show() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 60 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7cae src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = ipsec_nat_t dport = ipsec_nat_t len = 40 chksum = 0xba23 ###[ NON_ESP ]### non_esp = 0x0 ###[ ISAKMP ]### init_cookie= 0102030405060708 resp_cookie= 0807060504030201 next_payload= None version = 0x10 exch_type = None flags = id = 0 length = 28 >>> assert pkt[UDP].sport == 4500 >>> assert pkt[UDP].dport == 4500 >>> assert pkt[NON_ESP].non_esp == 0x00 >>> assert pkt[ISAKMP].version == 0x10 >>> assert pkt[ISAKMP].init_cookie == b'\x01\x02\x03\x04\x05\x06\x07\x08' >>> assert pkt[ISAKMP].resp_cookie == b'\x08\x07\x06\x05\x04\x03\x02\x01' >>> >>> >>> pkt[ISAKMP].version = 0x20 >>> pkt = Ether(raw(pkt)) >>> pkt.show() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 60 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7cae src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = ipsec_nat_t dport = ipsec_nat_t len = 40 chksum = 0xba23 ###[ NON_ESP ]### non_esp = 0x0 ###[ IKEv2 ]### init_SPI = 0102030405060708 resp_SPI = 0807060504030201 next_payload= None version = 0x20 exch_type = 0 flags = id = 0 length = 28 >>> assert pkt[UDP].sport == 4500 >>> assert pkt[UDP].dport == 4500 >>> assert pkt[NON_ESP].non_esp == 0x00 >>> assert pkt[IKEv2].version == 0x20 >>> assert pkt[IKEv2].init_SPI == b'\x01\x02\x03\x04\x05\x06\x07\x08' >>> assert pkt[IKEv2].resp_SPI == b'\x08\x07\x06\x05\x04\x03\x02\x01' ###(015)=[passed] Build and dissect UDP encapsulated IKEv2 packets >>> pkt = Ether() / IP() / UDP() / NON_ESP() / IKEv2(init_SPI = b'\x01\x02\x03\x04\x05\x06\x07\x08', resp_SPI = b'\x08\x07\x06\x05\x04\x03\x02\x01') >>> pkt.show() ###[ Ethernet ]### dst = None src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = None src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = ipsec_nat_t dport = ipsec_nat_t len = None chksum = None ###[ NON_ESP ]### non_esp = 0x0 ###[ IKEv2 ]### init_SPI = 0102030405060708 resp_SPI = 0807060504030201 next_payload= None version = 0x20 exch_type = 0 flags = id = 0 length = None >>> assert pkt[UDP].sport == 4500 >>> assert pkt[UDP].dport == 4500 >>> assert pkt[NON_ESP].non_esp == 0x00 >>> assert pkt[IKEv2].version == 0x20 >>> assert pkt[IKEv2].init_SPI == b'\x01\x02\x03\x04\x05\x06\x07\x08' >>> assert pkt[IKEv2].resp_SPI == b'\x08\x07\x06\x05\x04\x03\x02\x01' >>> >>> pkt = Ether(raw(pkt)) >>> pkt.show() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 60 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7cae src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = ipsec_nat_t dport = ipsec_nat_t len = 40 chksum = 0xba13 ###[ NON_ESP ]### non_esp = 0x0 ###[ IKEv2 ]### init_SPI = 0102030405060708 resp_SPI = 0807060504030201 next_payload= None version = 0x20 exch_type = 0 flags = id = 0 length = 28 >>> assert pkt[UDP].sport == 4500 >>> assert pkt[UDP].dport == 4500 >>> assert pkt[NON_ESP].non_esp == 0x00 >>> assert pkt[IKEv2].version == 0x20 >>> assert pkt[IKEv2].init_SPI == b'\x01\x02\x03\x04\x05\x06\x07\x08' >>> assert pkt[IKEv2].resp_SPI == b'\x08\x07\x06\x05\x04\x03\x02\x01' >>> >>> pkt[IKEv2].version = 0x10 >>> pkt = Ether(raw(pkt)) >>> pkt.show() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 60 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7cae src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = ipsec_nat_t dport = ipsec_nat_t len = 40 chksum = 0xba13 ###[ NON_ESP ]### non_esp = 0x0 ###[ ISAKMP ]### init_cookie= 0102030405060708 resp_cookie= 0807060504030201 next_payload= None version = 0x10 exch_type = None flags = id = 0 length = 28 >>> assert pkt[UDP].sport == 4500 >>> assert pkt[UDP].dport == 4500 >>> assert pkt[NON_ESP].non_esp == 0x00 >>> assert pkt[ISAKMP].version == 0x10 >>> assert pkt[ISAKMP].init_cookie == b'\x01\x02\x03\x04\x05\x06\x07\x08' >>> assert pkt[ISAKMP].resp_cookie == b'\x08\x07\x06\x05\x04\x03\x02\x01' ###(016)=[passed] Build and dissect UDP encapsulated ESP packets >>> pkt = Ether() / IP() / UDP() / ESP(spi = 0x01020304) >>> pkt.show() ###[ Ethernet ]### dst = None src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = None src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = ipsec_nat_t dport = ipsec_nat_t len = None chksum = None ###[ ESP ]### spi = 0x1020304 seq = 0 data = None >>> assert pkt[UDP].sport == 4500 >>> assert pkt[UDP].dport == 4500 >>> assert pkt[ESP].spi == 0x01020304 >>> >>> pkt = Ether(raw(pkt)) >>> pkt.show() ###[ Ethernet ]### dst = ff:ff:ff:ff:ff:ff src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 36 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x7cc6 src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = ipsec_nat_t dport = ipsec_nat_t len = 16 chksum = 0xda9d ###[ ESP ]### spi = 0x1020304 seq = 0 data = >>> assert pkt[UDP].sport == 4500 >>> assert pkt[UDP].dport == 4500 >>> assert pkt[ESP].spi == 0x01020304 ###(017)=[passed] Build and dissect UDP encapsulated NAT-keepalive packets >>> pkt = Ether() / IP() / UDP() / NAT_KEEPALIVE() >>> pkt.show() ###[ Ethernet ]### dst = None src = 00:00:00:00:00:00 type = IPv4 ###[ IP ]### version = 4 ihl = None tos = 0x0 len = None id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = None src = 127.0.0.1 dst = 127.0.0.1 \options \ ###[ UDP ]### sport = ipsec_nat_t dport = ipsec_nat_t len = None chksum = None ###[ NAT_KEEPALIVE ]### nat_keepalive= 0xff >>> assert pkt[UDP].sport == 4500 >>> assert pkt[UDP].dport == 4500 >>> assert pkt[NAT_KEEPALIVE].nat_keepalive == 0xFF >>> >>> pkt = Ether(b'DNm\xa4\xf6G`W\x18\x93\x9c\x7f\x08\x00E\x00\x00\x1d\xfb.\x00\x00\x80\x11\x9a\x16\xc0\xa8\x01\x1c>\x99\xa5-*\xca\x11\x94\x00\t\x1e\xf2\xff') >>> pkt.show() ###[ Ethernet ]### dst = 44:4e:6d:a4:f6:47 src = 60:57:18:93:9c:7f type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 29 id = 64302 flags = frag = 0 ttl = 128 proto = udp chksum = 0x9a16 src = 192.168.1.28 dst = 62.153.165.45 \options \ ###[ UDP ]### sport = 10954 dport = ipsec_nat_t len = 9 chksum = 0x1ef2 ###[ NAT_KEEPALIVE ]### nat_keepalive= 0xff >>> assert pkt[UDP].dport == 4500 >>> assert pkt[NAT_KEEPALIVE].nat_keepalive == 0xFF ###### ## Wireshark Captures ###### ###(018)=[passed] IKEv2 key exchange with NAT-traversal Loads and dissects the four frames of the key exchange from a Wireshark capture and compares them with manually built scapy packets. >>> pcap = rdpcap(scapy_path("/test/pcaps/ikev2_nat_t.pcapng"), count=4) >>> >>> ike_auth_request_encrypted_payload = binascii.unhexlify(''.join(""" ... be11 14ab1abe02954640 ce512b03d6527a50 ... dd17707ff420b9b5 b02d2874c57afdd3 fa95b15693017a12 8333c8d694f2cd61 ... e98b0717f65e1860 430f0699a4174af6 a6c929ff4114b686 f201f471ff9b191e ... 4d4cbd43dd994ef6 d5179b6845843d2d 1502f16d4356dc3b ad819c1b0549296b ... dbe479878dbc8a8b e71f9017946bc198 ef010f83a69a5d81 a312be0df9afa949 ... e3f0807bd2785498 c0c492f0bcde5085 b2df1187657cbf23 e11c25558af278d0 ... 1bceadf5548a8990 a6adea270410cb16 1786e0798ed8f047 3442b43399e42122 ... 6f2ee1e2b0787dfc f56b7b32f3d0b02d 038764ce8ffee757 b94896763c68c2bb ... 2a94dec851dcf7e4 489ba8e431d1c63c f5d19a097674b513 58e6b5052a87dd48 ... bb3be834b06ab704 579fcac6f6bf647c 87b4c5c0b7353df6 0b55e32a75ac4ced ... 3c1724d32a068207 226769352b08eefb 195da55e29c3eea1 05f0fd024029e0d7 ... 8b83757bd1b6052a 64febad6779cfca3 5b9a2529dc15d2a5 ee8825a2ab3e72ed ... e84aaeb86e8debd6 2a9b3d6503dd6c1a 7e03b87b81578dc0 fb087a5ad2d6bf6b ... d149d108defcabb5 721f8b4ebf1b9b78 80bdd2fc93856afe 4f54a32125964bbc ... fd917239f5af1db9 cd3d188ab7165826 7a445c13d2147169 5da3f3a674c2baaf ... 5fd7636cc8ca4b43 142fd2588bb31fdd d6a42b20ebc03b01 04e8beb1356fc863 ... 0bd95de8574e16fe 14cfa9a6455e20e9 eb08bf632cea53e7 c614277e32fa81d9 ... cb2efed29b04377a 748bfab753058349 f21a03fa5c5f478b c0bd993ca3e982b9 ... d19fa8d24306e46a b41d9bbfd1d2e2da 112b6c840cc7b86b 8e005aa71b5339d1 ... ff2eabb0124df2bf 910173c17380a7e3 85d22f94fa6e3f78 bce897a9a37e08c1 ... 1124661701dfd643 bba0c4ab4d8e19bb 95478e272d61c1a1 6d4e562f25c3c0a1 ... 69d39a84045183e2 684ac80ab6e18f20 dc4cc8d5b1d83293 07766d58695eff56 ... 14c207e045152933 07f9dbeb621e1c25 665f75f55e1ae90c aa43a500fa1ecf18 ... 3d7e7d46db8eae03 e1bc7a3aefab0c00 9884ca11e7889841 8459936a02699e5f ... 7f798d3c81de4933 a7f14f62aa5c31ae 2693089ca1df68a5 2cd338d5d2539053 ... 5099dd4f0646318f 079822b43f5a47b7 db9eba75ef843a42 98fb9e695a349824 ... bef5ee441997f7c5 303c4f8288bb8be1 6cc72fc348c777ec 7ce8b0f032633890 ... f01fbeef028f3bb5 ffd1ec663e9304cf 745d4659fc67f32d cffffa9deae65066 ... 5a2779b742057d71 86bd2603ce0946c4 1589d63fae9c404d 6c7f793a436c775a ... d7d34f2dd609a272 4ac70b514a76d248 8eefb6fc2f3bd196 4dfc1a0d652e89a9 ... e0b3278bc2c4c961 19df82bdc3b1f99d 399b0dbf62d23ea3 a7e940177525130b ... df5960b33b3d2d73 28d98a5fd9bbec2e 71404b77facc8053 a14feafd49bf150f ... 450384b99d392549 31f06ac18d225368 5c52b4ee6ad50337 dbce7f72bf56e4bf ... 55fdf3fd42c39c7d 65a48987ad84d1e0 c4e4543463c95a8e 646744240fdc00b6 ... 0c009f4afd15b800 182a5004e4062557 e7b20115e01d1cc3 5eb8d01e22f0bf2d ... bb2db84a970934d0 5f9b0d5e5350a45f 733a747e229eca56 087886a5c09efac8 ... 0c9545e6d849189b 40d7e7b9da4a9f04 9fb0273c3a2ad370 a84d5e7db14c362c ... c84483bbe70f2573 8116b11b877a7939 628a2dec6a590056 fdc7ce849770f12d ... 0f63a701e672cf93 75c68c4325e60e3e ae46c7dd014df09d 4594339fa5e82ab3 ... 9de316df933694da e20120886403 ... """.split())) >>> >>> >>> ike_auth_response_encrypted_payload = binascii.unhexlify(''.join(""" ... 0fb3 4e8905b03a3d9b97 70f3e63428ab00be ... 1bc29397bec721ef 9bd02e6cc64a309b 0c0dd67e4442f235 c201ccb5f6b8c8b0 ... 26baaaf0dce597c0 dd610ebbc4aa2d07 8cbd6fdc2dd879a9 f3216edaabd965d8 ... 5fe04a202615c5c6 08b0caf7db24dc08 4d0d86e560ccb75e 209941a2945bab45 ... 0795b96cc4f03752 163825f1be62d009 038f29f25956f3e9 3648ea647af4fbea ... 52a19bbf16074ed3 9161cfd1a1695176 059cbfc48c57755f b1b1b397155171a0 ... b11e10d3f476512b 73687912265ccb6f 1fef5aa5dee1ffc3 a5ecc574a76d529b ... 884f819f859c015a a3977230a69657d7 1d54b5cfebcc135a 4010294fdc98db45 ... e933cfeca0d638b1 f3f42c863be5501c 105ebc0efc4a8dd2 e48fdc4f35a59068 ... 5b1c073f6dd368fa 4ac1af60469f5ac0 d209445259a5ec1c e1ce59fad2dd60bb ... 11eae2a678095d99 7b69733553933371 b083e1f94d5bd71d b9fc9167068f4565 ... 1f9de7b7cfa30e6f 54f65e2c9f1a6d88 ff7beff94532af43 ce9067db85fd3679 ... 5a8ad841889285f4 f27d740d8da1429b 0764f789f314e20f 5a08258b4bdfd75d ... 7b7b9cb4b0bb7c2b a469ac24545f2fbe 0621bdaa76898cb6 cb3bbd334c6b6394 ... ef7e1cf31df2dd0b 86089a654b942f6e fb7ee5ba401200e0 d727791fc3f978dc ... f446067cd054e664 69ea05784e61ce67 a1fe98a73d22962d 703ad51ff1091920 ... f111c2f1535197f8 72471fc2b482b55b 15bfb7525c4c1b4d 8b9a1b98534dcea5 ... 8343e35e0ecb0164 953604b8687315b8 86509cc26b8730be f8ef669e77466628 ... 2da94192b67f0c4a 56ff1f7b3a080e4f 0e9ed767d497e8d3 1807169a7c62b80c ... c27c8e4907d59b02 a9d5fd0b9aa8ed96 7bd26a1ad6bce39b 562382ccfc6102d3 ... 5d4cefd222eadfc4 cffff96f16e69c4a 7b7367dbf48a13c2 1c95ef3b3bf7e1fb ... b240854e6c40b8a8 a8e957919e088d36 4e1da0c0130ae87b 83e980f6f14a9cfa ... fe8e956d489a03aa c365767ec06cee58 04ed81cfe559a8a5 ed00e0ae964e2705 ... d2c9011390ba6afd 262b4527144ce8b6 4d438ebddd94eb2c e39c6c254547f0d4 ... 27b4abf5217c9588 f96dc393517bfab2 50153321ddced8e2 dbb52454e342a483 ... 1af575c5420b5d37 42aa9ae79e3e7187 3117fd36c856e1c0 317b4ad2d1d3fe38 ... b528eb3438210e14 d10e5d2d9feff9d8 1f6fdefde57da710 db7f72e03d154aba ... 61bacccd26c0a80f e710f55eb5bb59db 2c0aec7f1003fb4f 1ffd219932bc8e7f ... 4f7ced086f6c3067 7610e78a6e8e04dc 330cd2da1ffb181a e09b5b52b9ea366b ... ea88329e2c2d6f51 68b1b2b7ac118861 a56cdc43402d89d6 26344a127a7cb39a ... 3f2e1a8ae35b72fa c0b8eb83622cd944 fe86bc8f340ea1a0 81fb980c9e6baa8e ... f9c1b37d11b13d51 e0cf72aac6dbfab9 49f8443d4f3098f9 b022ea0fa25dd418 ... f9cc26d0b8358ddd 778204fd9da6374a 46c4cc1777485acc b9c3975a1c12d9f3 ... ac326a8e37ca3c17 31a0b6f163a4335c 1c589d52d8b82699 c0c1b31b6b58a7d6 ... 76d3eeca77a0b4ee 289b11494a217031 d464e32c28e7c109 5afdad0297c5dd65 ... 1ad1a856f330647a 4ba7be0eee67eace e4a8137709b1234e 07909fb464b5b4fe ... f63e8829a9f066dc ecb8c12cf91836cd 7b7300b86ecea0f7 467b2991832c8380 ... 3e5f02e1b663e064 e4bd991caa1bcadb 38d984595233f6aa 5c7079217ea5405e ... 72a515e9f787d3d9 0a48cb098216f8ff a94ddd0bd8634d48 2f4ffcb96dd81e66 ... 0a4324eb34f6 ... """.split())) >>> >>> >>> frames = [ ... ( ... # i: frame number ... 0, ... # title: ... "IKE_SA_INIT request", ... # data: raw frame data ... binascii.unhexlify(''.join(""" ... 005056eddb32000c 2930109e08004500 014cedc240004011 da45c0a8f583ac10 ... 0f5c2aca11940138 97c9000000008992 2c915f35570e0000 0000000000002120 ... 2208000000000000 012c220000280000 0024010100030300 000c01000014800e ... 0100030000080200 0005000000080400 0013280000480013 0000db253178440c ... e776a794133cb8b6 9e5eb07473353657 0c64d7b630549c89 9c0712d828b37168 ... 500885e051024578 afc75c101f73b894 3cad62d74a30f2be 1fca2b00002c09cb ... 538b2c3dbd4d0bb0 eec8d318cb801a9b 4715b207828d9b5f f1f4ec64ed588637 ... 07bcf14ccf052b00 0014eb4c1b788afd 4a9cb7730a68d56c 53212b000014c61b ... aca1f1a60cc10800 0000000000002b00 00184048b7d56ebc e88525e7de7f00d6 ... c2d3c00000002900 00144048b7d56ebc e88525e7de7f00d6 c2d3290000080000 ... 402e290000080000 4016000000100000 402f000100020003 0004 ... """.split())), ... # packet: Ether / IP / UDP / NON_ESP / IKEv2 / ... ... Ether(dst='00:50:56:ed:db:32', src='00:0c:29:30:10:9e', type='IPv4') / ... IP(version=4, ihl=5, tos=0x0, len=332, id=60866, flags='DF', frag=0, ttl=64, proto='udp', chksum=0xda45, src='192.168.245.131', dst='172.16.15.92') / ... UDP(sport=10954, dport=4500, len=312, chksum=0x97c9) / ... NON_ESP() / ... IKEv2( ... init_SPI=b'\x89\x92\x2c\x91\x5f\x35\x57\x0e', ... resp_SPI=b'\x00\x00\x00\x00\x00\x00\x00\x00', ... next_payload='SA', ... version=0x20, ... exch_type='IKE_SA_INIT', ... flags='Initiator', ... id=0, ... length=300 ... ) / ... IKEv2_SA( ... next_payload='KE', ... flags='', ... length=40, ... prop=IKEv2_Proposal( ... next_payload='None', ... flags='', ... length=36, ... proposal=1, ... proto='IKE', ... trans_nb=3, ... trans=( ... IKEv2_Transform( ... next_payload='Transform', ... flags='', ... length=12, ... transform_type='Encryption', ... res2=0, ... transform_id='AES-GCM-16ICV', ... key_length=256 ... ) / ... IKEv2_Transform( ... next_payload='Transform', ... flags='', ... length=8, ... transform_type='PRF', ... res2=0, ... transform_id='PRF_HMAC_SHA2_256' ... ) / ... IKEv2_Transform( ... next_payload='None', ... flags='', ... length=8, ... transform_type='GroupDesc', ... res2=0, ... transform_id='256randECPgr' ... ) ... ) ... ) ... ) / ... IKEv2_KE( ... next_payload='Nonce', ... flags='', ... length=72, ... group='256randECPgr', ... res2=0, ... ke=b'\xdb%1xD\x0c\xe7v\xa7\x94\x13<\xb8\xb6\x9e^\xb0ts56W\x0cd\xd7\xb60T\x9c\x89\x9c\x07\x12\xd8(\xb3qhP\x08\x85\xe0Q\x02Ex\xaf\xc7\\\x10\x1fs\xb8\x94<\xadb\xd7J0\xf2\xbe\x1f\xca' ... ) / ... IKEv2_Nonce( ... next_payload='VendorID', ... flags='', ... length=44, ... nonce=b'\t\xcbS\x8b,=\xbdM\x0b\xb0\xee\xc8\xd3\x18\xcb\x80\x1a\x9bG\x15\xb2\x07\x82\x8d\x9b_\xf1\xf4\xecd\xedX\x867\x07\xbc\xf1L\xcf\x05' ... ) / ... IKEv2_VendorID( ... next_payload='VendorID', ... flags='', ... length=20, ... vendorID=b'\xebL\x1bx\x8a\xfdJ\x9c\xb7s\nh\xd5lS!' ... ) / ... IKEv2_VendorID( ... next_payload='VendorID', ... flags='', ... length=20, ... vendorID=b'\xc6\x1b\xac\xa1\xf1\xa6\x0c\xc1\x08\x00\x00\x00\x00\x00\x00\x00' ... ) / ... IKEv2_VendorID( ... next_payload='VendorID', ... flags='', ... length=24, ... vendorID=b'@H\xb7\xd5n\xbc\xe8\x85%\xe7\xde\x7f\x00\xd6\xc2\xd3\xc0\x00\x00\x00' ... ) / ... IKEv2_VendorID( ... next_payload='Notify', ... flags='', ... length=20, ... vendorID=b'@H\xb7\xd5n\xbc\xe8\x85%\xe7\xde\x7f\x00\xd6\xc2\xd3' ... ) / ... IKEv2_Notify( ... next_payload='Notify', ... flags='', ... length=8, ... type='IKEV2_FRAGMENTATION_SUPPORTED', ... ) / ... IKEv2_Notify( ... next_payload='Notify', ... flags='', ... length=8, ... type='REDIRECT_SUPPORTED', ... ) / ... IKEv2_Notify( ... next_payload='None', ... flags='', ... length=16, ... type='SIGNATURE_HASH_ALGORITHMS', ... notify=b'\x00\x01\x00\x02\x00\x03\x00\x04' ... ) ... ), ... ( ... # i: frame number ... 1, ... # title: ... "IKE_SA_INIT response", ... # data: raw frame data ... binascii.unhexlify(''.join(""" ... 000c2930109e0050 56eddb3208004500 0151a5dc00008011 2227ac100f5cc0a8 ... f58311942aca013d af99000000008992 2c915f35570e98d5 6d32e2a047422120 ... 2220000000000000 0131220000280000 0024010100030300 000c01000014800e ... 0100030000080200 0005000000080400 0013280000480013 00001d9cd5974c95 ... 0c95e0544483fb1f 7a9132f5fe8959c0 9ab3a54c779ff2bc f4522a030dc33b9d ... 5ddfeb99e028c0e8 ba7d80dfdcf12b15 16dbe180e6aec664 428b2600002c1d10 ... 7dc5a7463da7d761 014139fb381af9cd 3b8c0181e6cd36a8 ae105e55aa7fe71f ... 5db1d36c29152b00 0005042b00001840 48b7d56ebce88525 e7de7f00d6c2d3c0 ... 0000002b00001440 48b7d56ebce88525 e7de7f00d6c2d32b 000014c6f57ac398 ... f493208145b7581e 8789832900001485 817703c6e320d2ae 5a4dd02056c6d729 ... 0000080000402e29 0000100000402f00 0100020003000400 00000800004014 ... """.split())), ... # packet: Ether / IP / UDP / NON_ESP / IKEv2 / ... ... Ether(dst='00:0c:29:30:10:9e', src='00:50:56:ed:db:32', type='IPv4') / ... IP(version=4, ihl=5, tos=0x0, len=337, id=42460, flags='', frag=0, ttl=128, ... proto='udp', chksum=0x2227, src='172.16.15.92', dst='192.168.245.131') / ... UDP(sport=4500, dport=10954, len=317, chksum=0xaf99) / ... NON_ESP() / ... IKEv2( ... init_SPI=b'\x89\x92\x2c\x91\x5f\x35\x57\x0e', ... resp_SPI=b'\x98\xd5\x6d\x32\xe2\xa0\x47\x42', ... next_payload='SA', ... version=0x20, ... exch_type='IKE_SA_INIT', ... flags='Response', ... id=0, ... length=305 ... ) / ... IKEv2_SA( ... next_payload='KE', ... flags='', ... length=40, ... prop=IKEv2_Proposal( ... next_payload='None', ... flags='', ... length=36, ... proposal=1, ... proto='IKE', ... trans_nb=3, ... trans=( ... IKEv2_Transform( ... next_payload='Transform', ... flags='', ... length=12, ... transform_type='Encryption', ... res2=0, ... transform_id='AES-GCM-16ICV', ... key_length=256 ... ) / ... IKEv2_Transform( ... next_payload='Transform', ... flags='', ... length=8, ... transform_type='PRF', ... res2=0, ... transform_id='PRF_HMAC_SHA2_256' ... ) / ... IKEv2_Transform( ... next_payload='None', ... flags='', ... length=8, ... transform_type='GroupDesc', ... res2=0, ... transform_id='256randECPgr' ... ) ... ) ... ) ... ) / ... IKEv2_KE( ... next_payload='Nonce', ... flags='', ... length=72, ... group='256randECPgr', ... res2=0, ... ke=b'\x1d\x9c\xd5\x97L\x95\x0c\x95\xe0TD\x83\xfb\x1fz\x912\xf5\xfe\x89Y\xc0\x9a\xb3\xa5Lw\x9f\xf2\xbc\xf4R*\x03\r\xc3;\x9d]\xdf\xeb\x99\xe0(\xc0\xe8\xba}\x80\xdf\xdc\xf1+\x15\x16\xdb\xe1\x80\xe6\xae\xc6dB\x8b' ... ) / ... IKEv2_Nonce( ... next_payload='CERTREQ', ... flags='', ... length=44, ... nonce=b'\x1d\x10}\xc5\xa7F=\xa7\xd7a\x01A9\xfb8\x1a\xf9\xcd;\x8c\x01\x81\xe6\xcd6\xa8\xae\x10^U\xaa\x7f\xe7\x1f]\xb1\xd3l)\x15' ... ) / ... IKEv2_CERTREQ( ... next_payload='VendorID', ... flags='', ... length=5, ... cert_encoding='X.509 Certificate - Signature', ... cert_authority=b'' ... ) / ... IKEv2_VendorID( ... next_payload='VendorID', ... flags='', ... length=24, ... vendorID=b'@H\xb7\xd5n\xbc\xe8\x85%\xe7\xde\x7f\x00\xd6\xc2\xd3\xc0\x00\x00\x00' ... ) / ... IKEv2_VendorID( ... next_payload='VendorID', ... flags='', ... length=20, ... vendorID=b'@H\xb7\xd5n\xbc\xe8\x85%\xe7\xde\x7f\x00\xd6\xc2\xd3' ... ) / ... IKEv2_VendorID( ... next_payload='VendorID', ... flags='', ... length=20, ... vendorID=b'\xc6\xf5z\xc3\x98\xf4\x93 \x81E\xb7X\x1e\x87\x89\x83' ... ) / ... IKEv2_VendorID( ... next_payload='Notify', ... flags='', ... length=20, ... vendorID=b'\x85\x81w\x03\xc6\xe3 \xd2\xaeZM\xd0 V\xc6\xd7' ... ) / ... IKEv2_Notify( ... next_payload='Notify', ... flags='', ... length=8, ... type='IKEV2_FRAGMENTATION_SUPPORTED', ... ) / ... IKEv2_Notify( ... next_payload='Notify', ... flags='', ... length=16, ... type='SIGNATURE_HASH_ALGORITHMS', ... notify=b'\x00\x01\x00\x02\x00\x03\x00\x04' ... ) / ... IKEv2_Notify( ... next_payload='None', ... flags='', ... length=8, ... type='MULTIPLE_AUTH_SUPPORTED' ... ) ... ), ... ( ... # i: frame number ... 2, ... # title: ... "IKE_AUTH request", ... # data: raw frame data ... binascii.unhexlify(''.join(""" ... 005056eddb32000c 2930109e08004500 0520edc640004011 d66dc0a8f583ac10 ... 0f5c2aca1194050c 8eb0000000008992 2c915f35570e98d5 6d32e2a047422e20 ... 2308000000010000 0500230004e4 ... """.split())) + ike_auth_request_encrypted_payload, ... # packet: Ether / IP / UDP / NON_ESP / IKEv2 / ... ... Ether(dst='00:50:56:ed:db:32', src='00:0c:29:30:10:9e', type='IPv4') / ... IP(version=4, ihl=5, tos=0x0, len=1312, id=60870, flags='DF', frag=0, ttl=64, ... proto='udp', chksum=0xd66d, src='192.168.245.131', dst='172.16.15.92') / ... UDP(sport=10954, dport=4500, len=1292, chksum=0x8eb0) / ... NON_ESP() / ... IKEv2( ... init_SPI=b'\x89\x92\x2c\x91\x5f\x35\x57\x0e', ... resp_SPI=b'\x98\xd5\x6d\x32\xe2\xa0\x47\x42', ... next_payload='Encrypted', ... version=0x20, ... exch_type='IKE_AUTH', ... flags='Initiator', ... id=1, ... length=1280 ... ) / ... IKEv2_Encrypted( ... next_payload='IDi', ... flags='', ... length=1252, ... load = ike_auth_request_encrypted_payload ... ) ... ), ... ( ... # i: frame number ... 3, ... # title: ... "IKE_AUTH response", ... # data: raw frame data ... binascii.unhexlify(''.join(""" ... 000c2930109e0050 56eddb3208004500 0518a5dd00008011 1e5fac100f5cc0a8 ... f58311942aca0504 886e000000008992 2c915f35570e98d5 6d32e2a047422e20 ... 2320000000010000 04f8240004dc ... """.split())) + ike_auth_response_encrypted_payload, ... # packet: Ether / IP / UDP / NON_ESP / IKEv2 / ... ... Ether(dst='00:0c:29:30:10:9e', src='00:50:56:ed:db:32', type='IPv4') / ... IP(version=4, ihl=5, tos=0x0, len=1304, id=42461, flags='', frag=0, ttl=128, ... proto='udp', chksum=0x1e5f, src='172.16.15.92', dst='192.168.245.131') / ... UDP(sport=4500, dport=10954, len=1284, chksum=0x886e) / ... NON_ESP() / ... IKEv2( ... init_SPI=b'\x89\x92\x2c\x91\x5f\x35\x57\x0e', ... resp_SPI=b'\x98\xd5\x6d\x32\xe2\xa0\x47\x42', ... next_payload='Encrypted', ... version=0x20, ... exch_type='IKE_AUTH', ... flags='Response', ... id=1, ... length=1272 ... ) / ... IKEv2_Encrypted( ... next_payload='IDr', ... flags='', ... length=1244, ... load=ike_auth_response_encrypted_payload ... ) ... ), ... ( ... # i: frame number ... -2, ... # title: ... "IKE_AUTH request, decrypted", ... binascii.unhexlify(''.join(""" ... 005056eddb32000c 2930109e08004500 0520edc640004011 d66dc0a8f583ac10 ... 0f5c2aca1194050c 8eb0000000008992 2c915f35570e98d5 6d32e2a047422320 ... 2308000000010000 0500250000120300 0000696b6576322d 63657274290002dc ... 04308202d3308202 79a0030201020204 01000013300a0608 2a8648ce3d040302 ... 304b310b30090603 5504061302444531 0f300d0603550408 130642617965726e ... 310c300a06035504 0a13034e4350311d 301b060355040313 144e43502044656d ... 6f20434120454343 2032303530302218 0f32303136303830 343038303031335a ... 180f323035303038 3035303830303133 5a3074310b300906 0355040613024445 ... 311a301806035504 0a0c1144656d6f20 4f7267616e697a61 74696f6e3110300e ... 060355040b0c0744 656d6f204f553110 300e06035504030c 07436c69656e7431 ... 3125302306092a86 4886f70d01090116 16636c69656e7431 4064656d6f2e6e63 ... 702d652e636f6d30 59301306072a8648 ce3d020106082a86 48ce3d0301070342 ... 0004b74572a1b5dd 1c4cafdab7f06a92 913cab7ee2a55106 efa4056e2dc17369 ... 600510553454e37e 69e9a08c5abae5a0 5a77e01ebb04e4b2 72fe349f12a34088 ... ceeaa382011c3082 011830090603551d 1304023000300b06 03551d0f04040302 ... 05a0301d0603551d 250416301406082b 0601050507030206 082b060105050703 ... 07301d0603551d0e 041604145a5e6aa2 9f89959131c17018 ef64dc2a8a4a4a6a ... 30750603551d2304 6e306c801425db6d 44dec7a03eb5f862 3ab18784546a0f04 ... 09a14fa44d304b31 0b30090603550406 13024445310f300d 0603550408130642 ... 617965726e310c30 0a060355040a1303 4e4350311d301b06 0355040313144e43 ... 502044656d6f2043 4120454343203230 3530820302000230 490603551d110442 ... 3040a026060a2b06 0104018237140203 a0180c16436c6965 6e74314064656d6f ... 2e6e63702d652e63 6f6d8116436c6965 6e74314064656d6f 2e6e63702d652e63 ... 6f6d300a06082a86 48ce3d0403020348 0030450220602d76 6db7e07b70d88e38 ... 10acc6cd350ccdda 1e60d77bd36ed6e6 0f869ef371022100 d1e3d278fcacf41c ... d8380691363ad393 3d6bc293fae9c847 ddf6187bb0f06f49 2900000801004000 ... 2600000801004008 270000410491c1dc 0f2a8f0e3bd7da99 1a43a39226355e42 ... 29bcb62a0e9de979 fda864e3f06460dc aaff850759f48956 233865214e9a10e6 ... 376f4c59b5c02f36 6d2f00005c0e0000 000c300a06082a86 48ce3d0403023045 ... 022100c1486ab5b3 db4c8b08f3ae0613 20104c826fb0803b a1e6e30d58c8000b ... ac514202205865ea 41bc99e0adfa2856 770efaff530f2e85 50da1d86f8504df0 ... 04025fb12d210000 8001000000000100 0000020000000300 00000400004e2200 ... 0000080000000900 00000a0000001900 0000070000700000 0070010000700200 ... 004e2600004e2700 0070030000700400 0070050000700600 0070070000700800 ... 00700900004e2300 004e240000700a00 004e250006646562 69616e700a000664 ... 656269616e2c0000 2400000020010304 02c1a9656b030000 0c01000014800e00 ... 8000000008050000 002d000018010000 00070000100000ff ff00000000ffffff ... ff2b000018010000 00070000100000ff ffc0a8e100c0a8e1 ff2b000014afcad7 ... 1368a1f1c96b8696 fc775701002b0000 14c61baca1f1a60c c208000000000000 ... 002900001c4e6350 0a09b8e83c80b693 36268ec8f6000c29 30109e0000290000 ... 080000400c000000 0800004014 ... """.split())), ... Ether(dst='00:50:56:ed:db:32', src='00:0c:29:30:10:9e', type='IPv4') / ... IP(version=4, ihl=5, tos=0x0, len=1312, id=60870, flags='DF', frag=0, ttl=64, proto='udp', chksum=0xd66d, src='192.168.245.131', dst='172.16.15.92') / ... UDP(sport=10954, dport=4500, len=1292, chksum=0x8eb0) / ... NON_ESP(non_esp=0x0) / ... IKEv2( ... init_SPI=b'\x89\x92\x2c\x91\x5f\x35\x57\x0e', ... resp_SPI=b'\x98\xd5m2\xe2\xa0GB', ... next_payload='IDi', ... version=0x20, ... exch_type='IKE_AUTH', ... flags='Initiator', ... id=1, ... length=1280 ... ) / ... IKEv2_IDi( ... next_payload='CERT', ... flags='', ... length=18, ... IDtype='Email_addr', ... res2=0x0, ... ID='ikev2-cert' ... ) / ... IKEv2_CERT( ... next_payload='Notify', flags='', length=732, ... cert_encoding='X.509 Certificate - Signature', ... cert_data=X509_Cert( ... tbsCertificate=X509_TBSCertificate( ... version=ASN1_INTEGER(2), ... serialNumber=ASN1_INTEGER(0x1000013), ... signature=X509_AlgorithmIdentifier( ... algorithm=ASN1_OID('ecdsa-with-SHA256'), ... parameters=None ... ), ... issuer=[ ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('countryName'), value=ASN1_PRINTABLE_STRING(b'DE'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('stateOrProvinceName'), value=ASN1_PRINTABLE_STRING(b'Bayern'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('organizationName'), value=ASN1_PRINTABLE_STRING(b'NCP'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('commonName'), value=ASN1_PRINTABLE_STRING(b'NCP Demo CA ECC 2050'))) ... ], ... validity=X509_Validity( ... not_before=ASN1_GENERALIZED_TIME('20160804080013Z'), ... not_after=ASN1_GENERALIZED_TIME('20500805080013Z') ... ), ... subject=[ ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('countryName'), value=ASN1_PRINTABLE_STRING(b'DE'))), ... X509_RDN(rdn=(X509_AttributeTypeAndValue(type=ASN1_OID('organizationName'), value=ASN1_UTF8_STRING(b'Demo Organization')))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('organizationUnitName'), value=ASN1_UTF8_STRING(b'Demo OU'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('commonName'), value=ASN1_UTF8_STRING(b'Client1'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('emailAddress'), value=ASN1_IA5_STRING(b'client1@demo.ncp-e.com'))) ... ], ... subjectPublicKeyInfo=X509_SubjectPublicKeyInfo( ... signatureAlgorithm=X509_AlgorithmIdentifier( ... algorithm=ASN1_OID('ecPublicKey'), ... parameters=ASN1_OID('prime256v1')), ... subjectPublicKey=ECDSAPublicKey( ... ecPoint=ASN1_BIT_STRING( ... '000001001011011101000101011100101010000110110101110111010001110' ... '001001100101011111101101010110111111100000110101010010010100100' ... '010011110010101011011111101110001010100101010100010000011011101' ... '111101001000000010101101110001011011100000101110011011010010110' ... '000000000101000100000101010100110100010101001110001101111110011' ... '010011110100110100000100011000101101010111010111001011010000001' ... '011010011101111110000000011110101110110000010011100100101100100' ... '111001011111110001101001001111100010010101000110100000010001000' ... '1100111011101010'))), ... issuerUniqueID=None, ... subjectUniqueID=None, ... extensions=[ ... X509_Extension( ... extnID=ASN1_OID('basicConstraints'), ... critical=None, ... extnValue=X509_ExtBasicConstraints(cA=None, pathLenConstraint=None) ... ), ... X509_Extension( ... extnID=ASN1_OID('keyUsage'), ... critical=None, ... extnValue=X509_ExtKeyUsage(keyUsage=ASN1_BIT_STRING('101')) ... ), ... X509_Extension( ... extnID=ASN1_OID('extKeyUsage'), ... critical=None, ... extnValue=X509_ExtExtendedKeyUsage( ... extendedKeyUsage=[ ... ASN1P_OID(oid=ASN1_OID('clientAuth')), ... ASN1P_OID(oid=ASN1_OID('ipsecUser')) ... ] ... ) ... ), ... X509_Extension( ... extnID=ASN1_OID('subjectKeyIdentifier'), ... critical=None, ... extnValue=X509_ExtSubjectKeyIdentifier( ... keyIdentifier=ASN1_STRING(b'Z^j\xa2\x9f\x89\x95\x911\xc1p\x18\xefd\xdc*\x8aJJj') ... ) ... ), ... X509_Extension( ... extnID=ASN1_OID('authorityKeyIdentifier'), ... critical=None, ... extnValue=X509_ExtAuthorityKeyIdentifier( ... keyIdentifier=ASN1_STRING(b'%\xdbmD\xde\xc7\xa0>\xb5\xf8b:\xb1\x87\x84Tj\x0f\x04\t'), ... authorityCertIssuer=X509_GeneralName( ... generalName=X509_DirectoryName( ... directoryName=[ ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('countryName'), value=ASN1_PRINTABLE_STRING(b'DE'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('stateOrProvinceName'), value=ASN1_PRINTABLE_STRING(b'Bayern'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('organizationName'), value=ASN1_PRINTABLE_STRING(b'NCP'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('commonName'), value=ASN1_PRINTABLE_STRING(b'NCP Demo CA ECC 2050'))) ... ] ... ) ... ), ... authorityCertSerialNumber=ASN1_INTEGER(0x20002) ... ) ... ), ... X509_Extension( ... extnID=ASN1_OID('subjectAltName'), ... critical=None, ... extnValue=X509_ExtSubjectAltName( ... subjectAltName=[ ... X509_GeneralName( ... generalName=X509_OtherName( ... type_id=ASN1_OID('.1.3.6.1.4.1.311.20.2.3'), ... value=ASN1_UTF8_STRING(b'Client1@demo.ncp-e.com') ... ) ... ), ... X509_GeneralName( ... generalName=X509_RFC822Name( ... rfc822Name=ASN1_IA5_STRING(b'Client1@demo.ncp-e.com') ... ) ... ) ... ] ... ) ... ) ... ] ... ), ... signatureAlgorithm=X509_AlgorithmIdentifier( ... algorithm=ASN1_OID('ecdsa-with-SHA256'), ... parameters=None ... ), ... signatureValue=ECDSASignature( ... r=ASN1_INTEGER(0x602d766db7e07b70d88e3810acc6cd350ccdda1e60d77bd36ed6e60f869ef371), ... s=ASN1_INTEGER(0xd1e3d278fcacf41cd8380691363ad3933d6bc293fae9c847ddf6187bb0f06f49) ... ) ... ) ... ) / ... IKEv2_Notify( ... next_payload='Notify', ... flags='', ... length=8, ... proto='IKE', ... type='INITIAL_CONTACT', ... notify='' ... ) / ... IKEv2_Notify( ... next_payload='CERTREQ', ... flags='', ... length=8, ... proto='IKE', ... type='HTTP_CERT_LOOKUP_SUPPORTED', ... notify='' ... ) / ... IKEv2_CERTREQ( ... next_payload='AUTH', ... flags='', ... length=65, ... cert_encoding='X.509 Certificate - Signature', ... cert_authority=b'\x91\xc1\xdc\x0f*\x8f\x0e;\xd7\xda\x99\x1aC\xa3\x92&5^B)\xbc\xb6*\x0e\x9d\xe9y\xfd\xa8d\xe3\xf0d`\xdc\xaa\xff\x85\x07Y\xf4\x89V#8e!N\x9a\x10\xe67oLY\xb5\xc0/6m' ... ) / ... IKEv2_AUTH( ... next_payload='CP', ... flags='', ... length=92, ... auth_type='Digital Signature', ... res2=0x0, ... load=b'\x0c0\n\x06\x08*\x86H\xce=\x04\x03\x020E\x02!\x00\xc1Hj\xb5\xb3\xdbL\x8b\x08\xf3\xae\x06\x13 \x10L\x82o\xb0\x80;\xa1\xe6\xe3\rX\xc8\x00\x0b\xacQB\x02 Xe\xeaA\xbc\x99\xe0\xad\xfa(Vw\x0e\xfa\xffS\x0f.\x85P\xda\x1d\x86\xf8PM\xf0\x04\x02_\xb1-' ... ) / ... IKEv2_CP( ... next_payload='SA', ... flags='', ... length=128, ... CFGType='CFG_REQUEST', ... res2=0x0, ... attributes=[ ... ConfigurationAttribute(type='INTERNAL_IP4_ADDRESS', length=0, value=''), ... ConfigurationAttribute(type='INTERNAL_IP4_NETMASK', length=0, value=''), ... ConfigurationAttribute(type='INTERNAL_IP4_DNS', length=0, value=''), ... ConfigurationAttribute(type='INTERNAL_IP4_NBNS', length=0, value=''), ... ConfigurationAttribute(type=20002, length=0, value=''), ... ConfigurationAttribute(type='INTERNAL_IP6_ADDRESS', length=0, value=''), ... ConfigurationAttribute(type=9, length=0, value=''), ... ConfigurationAttribute(type='INTERNAL_IP6_DNS', length=0, value=''), ... ConfigurationAttribute(type='INTERNAL_DNS_DOMAIN', length=0, value=''), ... ConfigurationAttribute(type='APPLICATION_VERSION', length=0, value=''), ... ConfigurationAttribute(type=28672, length=0, value=''), ... ConfigurationAttribute(type=28673, length=0, value=''), ... ConfigurationAttribute(type=28674, length=0, value=''), ... ConfigurationAttribute(type=20006, length=0, value=''), ... ConfigurationAttribute(type=20007, length=0, value=''), ... ConfigurationAttribute(type=28675, length=0, value=''), ... ConfigurationAttribute(type=28676, length=0, value=''), ... ConfigurationAttribute(type=28677, length=0, value=''), ... ConfigurationAttribute(type=28678, length=0, value=''), ... ConfigurationAttribute(type=28679, length=0, value=''), ... ConfigurationAttribute(type=28680, length=0, value=''), ... ConfigurationAttribute(type=28681, length=0, value=''), ... ConfigurationAttribute(type=20003, length=0, value=''), ... ConfigurationAttribute(type=20004, length=0, value=''), ... ConfigurationAttribute(type=28682, length=0, value=''), ... ConfigurationAttribute(type=20005, length=6, value='debian'), ... ConfigurationAttribute(type=28682, length=6, value='debian') ... ] ... ) / ... IKEv2_SA( ... next_payload='TSi', ... flags='', ... length=36, ... prop=IKEv2_Proposal( ... next_payload='None', ... flags='', ... length=32, ... proposal=1, ... proto='ESP', ... SPIsize=4, ... trans_nb=2, ... SPI=b'\xc1\xa9ek', ... trans=IKEv2_Transform(flags='', length=12, transform_type='Encryption', res2=0, transform_id='AES-GCM-16ICV', key_length=128) / ... IKEv2_Transform(flags='', length=8, transform_type='Extended Sequence Number', res2=0, transform_id='No ESN') ... ) ... ) / ... IKEv2_TSi( ... next_payload='TSr', ... flags='', ... length=24, ... number_of_TSs=1, ... res2=0x0, ... traffic_selector=[ ... IPv4TrafficSelector(TS_type='TS_IPV4_ADDR_RANGE', ... IP_protocol_ID='All protocols', ... length=16, ... start_port=0, ... end_port=65535, ... starting_address_v4='0.0.0.0', ... ending_address_v4='255.255.255.255') ... ] ... ) / ... IKEv2_TSr( ... next_payload='VendorID', ... flags='', ... length=24, ... number_of_TSs=1, ... res2=0x0, ... traffic_selector=[ ... IPv4TrafficSelector( ... TS_type='TS_IPV4_ADDR_RANGE', ... IP_protocol_ID='All protocols', ... length=16, ... start_port=0, ... end_port=65535, ... starting_address_v4='192.168.225.0', ... ending_address_v4='192.168.225.255') ... ] ... ) / ... IKEv2_VendorID( ... next_payload='VendorID', ... flags='', ... length=20, ... vendorID=b'\xaf\xca\xd7\x13h\xa1\xf1\xc9k\x86\x96\xfcwW\x01\x00' ... ) / ... IKEv2_VendorID( ... next_payload='VendorID', ... flags='', ... length=20, ... vendorID=b'\xc6\x1b\xac\xa1\xf1\xa6\x0c\xc2\x08\x00\x00\x00\x00\x00\x00\x00' ... ) / ... IKEv2_VendorID( ... next_payload='Notify', ... flags='', ... length=28, ... vendorID=b'NcP\n\t\xb8\xe8<\x80\xb6\x936&\x8e\xc8\xf6\x00\x0c)0\x10\x9e\x00\x00' ... ) / ... IKEv2_Notify( ... next_payload='Notify', ... flags='', ... length=8, ... type='MOBIKE_SUPPORTED', ... notify='' ... ) / ... IKEv2_Notify( ... next_payload=None, ... flags='', ... length=8, ... type='MULTIPLE_AUTH_SUPPORTED' ... ) ... ), ... # IKE_AUTH response, decrypted ... ( ... # i: frame number ... -3, ... # title: ... "IKE_AUTH response, decrypted", ... binascii.unhexlify(''.join(""" ... 000c2930109e0050 56eddb3208004500 0518a5dd00008011 1e5fac100f5cc0a8 ... f58311942aca0504 886e000000008992 2c915f35570e98d5 6d32e2a047422420 ... 2320000000010000 04f82500007e0900 00003074310b3009 0603550406130244 ... 45311a3018060355 040a0c1144656d6f 204f7267616e697a 6174696f6e311030 ... 0e060355040b0c07 44656d6f204f5531 10300e0603550403 0c07536572766572 ... 313125302306092a 864886f70d010901 1616736572766572 314064656d6f2e6e ... 63702d652e636f6d 270002e604308202 dd30820283a00302 0102020401000016 ... 300a06082a8648ce 3d040302304b310b 3009060355040613 024445310f300d06 ... 0355040813064261 7965726e310c300a 060355040a13034e 4350311d301b0603 ... 55040313144e4350 2044656d6f204341 2045434320323035 303022180f323031 ... 3630383034303830 3031355a180f3230 3530303830353038 303031355a307431 ... 0b30090603550406 13024445311a3018 060355040a0c1144 656d6f204f726761 ... 6e697a6174696f6e 3110300e06035504 0b0c0744656d6f20 4f553110300e0603 ... 5504030c07536572 7665723131253023 06092a864886f70d 0109011616736572 ... 766572314064656d 6f2e6e63702d652e 636f6d3059301306 072a8648ce3d0201 ... 06082a8648ce3d03 010703420004dec7 f4b2c8b2dc4d6345 ea1bc875c1076b55 ... d9dbc87d069d189b 3fd6bdffec3ec40a fc74a88583cc541b 46ada5e4040ce77d ... 6ab7745987296ec1 d236a878f394a382 0126308201223009 0603551d13040230 ... 00300b0603551d0f 0404030205a03027 0603551d25042030 1e06082b06010505 ... 07030106082b0601 050507030206082b 0601050507030630 1d0603551d0e0416 ... 0414a54698574719 a02a49f01a2c9484 d482d94c27233075 0603551d23046e30 ... 6c801425db6d44de c7a03eb5f8623ab1 8784546a0f0409a1 4fa44d304b310b30 ... 0906035504061302 4445310f300d0603 5504081306426179 65726e310c300a06 ... 0355040a13034e43 50311d301b060355 040313144e435020 44656d6f20434120 ... 4543432032303530 8203020002304906 03551d1104423040 a026060a2b060104 ... 018237140203a018 0c16536572766572 314064656d6f2e6e 63702d652e636f6d ... 8116536572766572 314064656d6f2e6e 63702d652e636f6d 300a06082a8648ce ... 3d04030203480030 4502205387d21afa 1bab56fc406f8176 8ae73fe18b93b4cf ... f191fd01cda6fd92 020e95022100ee5f 6735a9f6d6b377e7 13cacdddd72fc7fb ... a5d48258479ee1ed f2af2da848502f00 005c0e0000000c30 0a06082a8648ce3d ... 0403023045022078 d6a7e8b366bde8f9 c12f269f2bf64116 9511ce621a90059a ... ed0fea47538b0e02 21008cf30813d135 aafe8e4dc0fdf2fd 595a9867f1a6083d ... 1e01a149c905ecf9 bfe62100005c0200 000000010004c0a8 e10a00020004ffff ... ff004e240004c0a8 e101000300040000 0000000300040000 00004e220004ac10 ... 0f5c4e2200040000 0000000400040000 0000000400040000 00004e2300040000 ... 0000700200002800 0024000000200103 0402ac0faf030300 000c01000014800e ... 0080000000080500 00002c00002ccf0e 7950765db7f7371d bbdfa1720493c83c ... 1ba4dc3617c3192a 57b9285d9a630ac7 164611fdf42c2d00 0018010000000700 ... 00100000ffffc0a8 e10ac0a8e10a2b00 0018010000000700 00100000ffffc0a8 ... e100c0a8e1ff2900 0014afcad71368a1 f1c96b8696fc7757 0100000000080000 ... 400c ... """.split())), ... Ether(dst='00:0c:29:30:10:9e', src='00:50:56:ed:db:32', type='IPv4') / ... IP(version=4, ihl=5, tos=0x0, len=1304, id=42461, flags='', frag=0, ttl=128, proto='udp', chksum=0x1e5f, src='172.16.15.92', dst='192.168.245.131') / ... UDP(sport=4500, dport=10954, len=1284, chksum=0x886e) / ... NON_ESP(non_esp=0x0) / ... IKEv2( ... init_SPI=b'\x89\x92\x2c\x91\x5f\x35\x57\x0e', ... resp_SPI=b'\x98\xd5m2\xe2\xa0GB', ... next_payload='IDr', ... version=0x20, ... exch_type='IKE_AUTH', ... flags='Response', ... id=1, ... length=1272 ... ) / ... IKEv2_IDr( ... next_payload='CERT', ... flags='', ... length=126, ... IDtype=9, ... res2=0x0, ... ID=b'0t1\x0b0\t\x06\x03U\x04\x06\x13\x02DE1\x1a0\x18\x06\x03U\x04\n\x0c\x11Demo Organization1\x100\x0e\x06\x03U\x04\x0b\x0c\x07Demo OU1\x100\x0e\x06\x03U\x04\x03\x0c\x07Server11%0#\x06\t*\x86H\x86\xf7\r\x01\t\x01\x16\x16server1@demo.ncp-e.com' ... ) / ... IKEv2_CERT( ... next_payload='AUTH', ... flags='', ... length=742, ... cert_encoding='X.509 Certificate - Signature', ... cert_data=X509_Cert( ... tbsCertificate=X509_TBSCertificate( ... version=ASN1_INTEGER(2), ... serialNumber=ASN1_INTEGER(0x1000016), ... signature=X509_AlgorithmIdentifier( ... algorithm=ASN1_OID('ecdsa-with-SHA256'), ... parameters=None ... ), ... issuer=[ ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('countryName'), value=ASN1_PRINTABLE_STRING(b'DE'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('stateOrProvinceName'), value=ASN1_PRINTABLE_STRING(b'Bayern'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('organizationName'), value=ASN1_PRINTABLE_STRING(b'NCP'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('commonName'), value=ASN1_PRINTABLE_STRING(b'NCP Demo CA ECC 2050'))) ... ], ... validity=X509_Validity( ... not_before=ASN1_GENERALIZED_TIME('20160804080015Z'), ... not_after=ASN1_GENERALIZED_TIME('20500805080015Z') ... ), ... subject=[ ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('countryName'), value=ASN1_PRINTABLE_STRING(b'DE'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('organizationName'), value=ASN1_UTF8_STRING(b'Demo Organization'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('organizationUnitName'), value=ASN1_UTF8_STRING(b'Demo OU'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('commonName'), value=ASN1_UTF8_STRING(b'Server1'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('emailAddress'), value=ASN1_IA5_STRING(b'server1@demo.ncp-e.com'))) ... ], ... subjectPublicKeyInfo=X509_SubjectPublicKeyInfo( ... signatureAlgorithm=X509_AlgorithmIdentifier( ... algorithm=ASN1_OID('ecPublicKey'), ... parameters=ASN1_OID('prime256v1') ... ), ... subjectPublicKey=ECDSAPublicKey( ... ecPoint=ASN1_BIT_STRING( ... '000001001101111011000111111101001011001011001000101100101101110' ... '001001101011000110100010111101010000110111100100001110101110000' ... '010000011101101011010101011101100111011011110010000111110100000' ... '110100111010001100010011011001111111101011010111101111111111110' ... '110000111110110001000000101011111100011101001010100010000101100' ... '000111100110001010100000110110100011010101101101001011110010000' ... '000100000011001110011101111101011010101011011101110100010110011' ... '000011100101001011011101100000111010010001101101010100001111000' ... '1111001110010100' ... ) ... ) ... ), ... issuerUniqueID=None, ... subjectUniqueID=None, ... extensions=[ ... X509_Extension( ... extnID=ASN1_OID('basicConstraints'), ... critical=None, ... extnValue=X509_ExtBasicConstraints(cA=None, pathLenConstraint=None) ... ), ... X509_Extension( ... extnID=ASN1_OID('keyUsage'), ... critical=None, ... extnValue=X509_ExtKeyUsage(keyUsage=ASN1_BIT_STRING('101')) ... ), ... X509_Extension( ... extnID=ASN1_OID('extKeyUsage'), ... critical=None, ... extnValue=X509_ExtExtendedKeyUsage( ... extendedKeyUsage=[ ... ASN1P_OID(oid=ASN1_OID('serverAuth')), ... ASN1P_OID(oid=ASN1_OID('clientAuth')), ... ASN1P_OID(oid=ASN1_OID('ipsecTunnel')) ... ] ... ) ... ), ... X509_Extension( ... extnID=ASN1_OID('subjectKeyIdentifier'), ... critical=None, ... extnValue=X509_ExtSubjectKeyIdentifier( ... keyIdentifier=ASN1_STRING(b"\xa5F\x98WG\x19\xa0*I\xf0\x1a,\x94\x84\xd4\x82\xd9L'#") ... ) ... ), ... X509_Extension( ... extnID=ASN1_OID('authorityKeyIdentifier'), ... critical=None, ... extnValue=X509_ExtAuthorityKeyIdentifier( ... keyIdentifier=ASN1_STRING(b'%\xdbmD\xde\xc7\xa0>\xb5\xf8b:\xb1\x87\x84Tj\x0f\x04\t'), ... authorityCertIssuer=X509_GeneralName( ... generalName=X509_DirectoryName( ... directoryName=[ ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('countryName'), value=ASN1_PRINTABLE_STRING(b'DE'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('stateOrProvinceName'), value=ASN1_PRINTABLE_STRING(b'Bayern'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('organizationName'), value=ASN1_PRINTABLE_STRING(b'NCP'))), ... X509_RDN(rdn=X509_AttributeTypeAndValue(type=ASN1_OID('commonName'), value=ASN1_PRINTABLE_STRING(b'NCP Demo CA ECC 2050'))) ... ] ... ) ... ), ... authorityCertSerialNumber=ASN1_INTEGER(0x20002) ... ) ... ), ... X509_Extension( ... extnID=ASN1_OID('subjectAltName'), ... critical=None, ... extnValue=X509_ExtSubjectAltName( ... subjectAltName=[ ... X509_GeneralName( ... generalName=X509_OtherName( ... type_id=ASN1_OID('.1.3.6.1.4.1.311.20.2.3'), ... value=ASN1_UTF8_STRING(b'Server1@demo.ncp-e.com') ... ) ... ), ... X509_GeneralName( ... generalName=X509_RFC822Name( ... rfc822Name=ASN1_IA5_STRING(b'Server1@demo.ncp-e.com') ... ) ... ) ... ] ... ) ... ) ... ] ... ), ... signatureAlgorithm=X509_AlgorithmIdentifier( ... algorithm=ASN1_OID('ecdsa-with-SHA256'), ... parameters=None ... ), ... signatureValue=ECDSASignature( ... r=ASN1_INTEGER(0x5387d21afa1bab56fc406f81768ae73fe18b93b4cff191fd01cda6fd92020e95), ... s=ASN1_INTEGER(0xee5f6735a9f6d6b377e713cacdddd72fc7fba5d48258479ee1edf2af2da84850) ... ) ... ) ... ) / ... IKEv2_AUTH( ... next_payload='CP', ... flags='', ... length=92, ... auth_type='Digital Signature', ... res2=0x0, ... load=b'\x0c0\n\x06\x08*\x86H\xce=\x04\x03\x020E\x02 x\xd6\xa7\xe8\xb3f\xbd\xe8\xf9\xc1/&\x9f+\xf6A\x16\x95\x11\xceb\x1a\x90\x05\x9a\xed\x0f\xeaGS\x8b\x0e\x02!\x00\x8c\xf3\x08\x13\xd15\xaa\xfe\x8eM\xc0\xfd\xf2\xfdYZ\x98g\xf1\xa6\x08=\x1e\x01\xa1I\xc9\x05\xec\xf9\xbf\xe6' ... ) / ... IKEv2_CP( ... next_payload='SA', ... flags='', ... length=92, ... CFGType='CFG_REPLY', ... res2=0x0, ... attributes=[ ... ConfigurationAttribute(type='INTERNAL_IP4_ADDRESS', length=4, value='192.168.225.10'), ... ConfigurationAttribute(type='INTERNAL_IP4_NETMASK', length=4, value='255.255.255.0'), ... ConfigurationAttribute(type=20004, length=4, value=b'\xc0\xa8\xe1\x01'), ... ConfigurationAttribute(type='INTERNAL_IP4_DNS', length=4, value='0.0.0.0'), ... ConfigurationAttribute(type='INTERNAL_IP4_DNS', length=4, value='0.0.0.0'), ... ConfigurationAttribute(type=20002, length=4, value=b'\xac\x10\x0f\x5c'), ... ConfigurationAttribute(type=20002, length=4, value='\x00\x00\x00\x00'), ... ConfigurationAttribute(type='INTERNAL_IP4_NBNS', length=4, value='0.0.0.0'), ... ConfigurationAttribute(type='INTERNAL_IP4_NBNS', length=4, value='0.0.0.0'), ... ConfigurationAttribute(type=20003, length=4, value=b'\x00\x00\x00\x00'), ... ConfigurationAttribute(type=28674, length=0) ... ] ... ) / ... IKEv2_SA( ... next_payload='Nonce', ... flags='', ... length=36, ... prop=IKEv2_Proposal( ... flags='', ... length=32, ... proposal=1, ... proto='ESP', ... SPIsize=4, ... trans_nb=2, ... SPI=b'\xac\x0f\xaf\x03', ... trans=IKEv2_Transform(flags='', length=12, transform_type='Encryption', res2=0, transform_id='AES-GCM-16ICV', key_length=128) / ... IKEv2_Transform(flags='', length=8, transform_type='Extended Sequence Number', res2=0, transform_id='No ESN') ... ) ... ) / ... IKEv2_Nonce( ... next_payload='TSi', ... flags='', ... length=44, ... nonce=b'\xcf\x0eyPv]\xb7\xf77\x1d\xbb\xdf\xa1r\x04\x93\xc8<\x1b\xa4\xdc6\x17\xc3\x19*W\xb9(]\x9ac\n\xc7\x16F\x11\xfd\xf4,' ... ) / ... IKEv2_TSi( ... next_payload='TSr', ... flags='', ... length=24, ... number_of_TSs=1, ... res2=0x0, ... traffic_selector=[ ... IPv4TrafficSelector( ... TS_type='TS_IPV4_ADDR_RANGE', ... IP_protocol_ID='All protocols', ... length=16, ... start_port=0, ... end_port=65535, ... starting_address_v4='192.168.225.10', ... ending_address_v4='192.168.225.10' ... ) ... ] ... ) / ... IKEv2_TSr( ... next_payload='VendorID', ... flags='', ... length=24, ... number_of_TSs=1, ... res2=0x0, ... traffic_selector=[ ... IPv4TrafficSelector( ... TS_type='TS_IPV4_ADDR_RANGE', ... IP_protocol_ID='All protocols', ... length=16, ... start_port=0, ... end_port=65535, ... starting_address_v4='192.168.225.0', ... ending_address_v4='192.168.225.255' ... ) ... ] ... ) / ... IKEv2_VendorID( ... next_payload='Notify', ... flags='', ... length=20, ... vendorID=b'\xaf\xca\xd7\x13h\xa1\xf1\xc9k\x86\x96\xfcwW\x01\x00' ... ) / ... IKEv2_Notify( ... next_payload='None', ... flags='', ... length=8, ... type='MOBIKE_SUPPORTED' ... ) ... ), ... # CREATE_CHILD_SA request, decrypted ... ( ... # i: frame number ... -4, ... # title: ... "CREATE_CHILD_SA request, decrypted", ... binascii.unhexlify(''.join(""" ... 00 50 56 99 bf d5 00 50 56 99 69 93 08 00 45 00 ... 01 38 60 32 40 00 40 11 c1 0f 0a 05 02 36 0a 05 ... 02 34 b8 99 11 94 01 24 19 a9 00 00 00 00 46 b3 ... f6 88 4d 37 5f 9a f5 38 82 35 ea 87 5e 8a 29 20 ... 24 00 00 00 00 00 00 00 01 18 ... ... 21 00 00 0c 03 04 40 09 5f c7 ff 5a 28 00 00 2c ... 00 00 00 28 01 03 04 03 6b 21 88 20 03 00 00 0c ... 01 00 00 14 80 0e 00 80 03 00 00 08 04 00 00 1c ... 00 00 00 08 05 00 00 00 22 00 00 2c ea 7e 88 57 ... 4a 36 64 cd 67 e3 3c 42 46 66 59 4d df 70 25 03 ... b2 00 a3 3f 87 82 f2 3c 94 c0 60 0e ae 7e d9 50 ... d7 67 e9 6e 2c 00 00 48 00 1c 00 00 8e 15 b1 f4 ... 9a cc 04 ff 12 e3 2f bc 3a f0 57 14 81 f3 b9 6c ... 21 1a f7 36 97 6d c2 23 80 74 ef 75 59 d1 99 65 ... 5a a5 80 00 87 4a bf 1f 13 f7 e1 6f de 34 80 94 ... 28 1c 93 cb 5a ee 30 24 d9 3e b9 55 2d 00 00 18 ... 01 00 00 00 07 00 00 10 00 00 ff ff c0 a8 e1 0b ... c0 a8 e1 0b 00 00 00 18 01 00 00 00 07 00 00 10 ... 00 00 ff ff c0 a8 e1 00 c0 a8 e1 ff ... """.split())), ... Ether(dst='00:50:56:99:bf:d5', src='00:50:56:99:69:93', type=2048) /\ ... IP(version=4, ihl=5, tos=0, len=312, id=24626, flags=2, frag=0, ttl=64, proto=17, chksum=49423, src='10.5.2.54', dst='10.5.2.52') /\ ... UDP(sport=47257, dport=4500, len=292, chksum=6569) /\ ... NON_ESP(non_esp=0) /\ ... IKEv2( ... init_SPI=b'F\xb3\xf6\x88M7_\x9a', ... resp_SPI=b'\xf58\x825\xea\x87^\x8a', ... next_payload=41, ... version=32, ... exch_type=36, ... flags=0, ... id=0, ... length=280 ... ) /\ ... IKEv2_Notify( ... next_payload=33, ... flags=0, ... length=12, ... proto=3, ... SPIsize=4, ... type=16393, ... SPI=b'_\xc7\xffZ', ... notify=b'' ... ) /\ ... IKEv2_SA( ... prop=IKEv2_Proposal( ... trans=( ... IKEv2_Transform(next_payload=3, flags=0, length=12, transform_type=1, res2=0, transform_id=20, key_length=128) /\ ... IKEv2_Transform(next_payload=3, flags=0, length=8, transform_type=4, res2=0, transform_id=28) /\ ... IKEv2_Transform(next_payload=0, flags=0, length=8, transform_type=5, res2=0, transform_id=0) ... ), ... next_payload=0, flags=0, length=40, proposal=1, proto=3, SPIsize=4, trans_nb=3, SPI=b'k!\x88 '), ... next_payload=40, ... flags=0, ... length=44 ... ) /\ ... IKEv2_Nonce( ... next_payload=34, ... flags=0, ... length=44, ... nonce=b'\xea~\x88WJ6d\xcdg\xe3\xb9U' ... ) /\ ... IKEv2_TSi( ... traffic_selector=[ ... IPv4TrafficSelector( ... TS_type=7, ... IP_protocol_ID=0, ... length=16, ... start_port=0, ... end_port=65535, ... starting_address_v4='192.168.225.11', ... ending_address_v4='192.168.225.11' ... ) ... ], ... next_payload=45, ... flags=0, ... length=24, ... number_of_TSs=1, ... res2=0 ... ) /\ ... IKEv2_TSr( ... traffic_selector=[ ... IPv4TrafficSelector( ... TS_type=7, ... IP_protocol_ID=0, ... length=16, ... start_port=0, ... end_port=65535, ... starting_address_v4='192.168.225.0', ... ending_address_v4='192.168.225.255' ... ) ... ], ... next_payload=0, ... flags=0, ... length=24, ... number_of_TSs=1, ... res2=0 ... ) ... ), ... ] >>> >>> >>> for i, title, data, packet in frames: ... print(title) ... if i >= 0: ... # the raw frame data coincides with the frame from the packet capture ... assert data == raw(pcap[i]) ... # the scapy packet correctly describes the frame ... assert raw(packet) == data ... # reassembling the dissected frame yields the original frame ... assert raw(Ether(data)) == data ... IKE_SA_INIT request IKE_SA_INIT response IKE_AUTH request IKE_AUTH response IKE_AUTH request, decrypted IKE_AUTH response, decrypted CREATE_CHILD_SA request, decrypted ###(019)=[passed] IKEv2 key exchange with REDIRECT Loads and dissects the four frames of the key exchange from a Wireshark capture and compares them with manually built scapy packets. >>> pcap = rdpcap(scapy_path("/test/pcaps/ikev2_notify_redirect.pcap")) >>> >>> >>> frames = [ ... ( ... # i: frame number ... 0, ... # title: ... "IKE_SA_INIT request (redirect_supported)", ... # data: raw frame data ... binascii.unhexlify(''.join(""" ... 00505699bfd50050 56991bcc08004500 012cb73300007f11 6aac0a05023c0a05 ... 02342ac801f40118 62b8886948814975 28ad000000000000 0000212022080000 ... 0000000001102200 0028000000240101 00030300000c0100 0014800e01000300 ... 0008020000050000 00080400001c2800 0048001c00002895 d48e470d8cb88196 ... 62f3370c57b26cd3 49c16f5ec1b31959 f9ef695480bc7323 52f96d0a7c4a54f1 ... d596bb4fcc2f368e 31985a76ea5a7c77 d4310d372d962900 002c4bf3ea6cd0c6 ... afe702c567fe7db3 ff973424bb5e9de6 af123a41975a6ffb 266e9c5b4c915795 ... 132b2900001c0100 4005509b01b43dc2 8c9df849fd765c64 8a512959ac502900 ... 001c010040045312 0985399e14cf2b79 211f375b439bd030 31ac290000080000 ... 402e290000080000 4016000000100000 402f000100020003 0004 ... """.split())), ... # packet: Ether / IP / UDP / IKEv2 / ... ... Ether(dst='00:50:56:99:bf:d5', src='00:50:56:99:1b:cc', type=2048) /\ ... IP(version=4, ihl=5, tos=0, id=46899, flags=0, frag=0, ttl=127, proto=17, chksum=27308, src='10.5.2.60', dst='10.5.2.52') /\ ... UDP(sport=10952, dport=500, chksum=25272) /\ ... IKEv2( ... init_SPI=b'\x88iH\x81Iu(\xad', ... resp_SPI=b'\x00\x00\x00\x00\x00\x00\x00\x00', ... next_payload=33, ... version=32, ... exch_type=34, ... flags=8, ... id=0 ... ) /\ ... IKEv2_SA( ... prop=IKEv2_Proposal( ... trans=( ... IKEv2_Transform(next_payload=3, flags=0, length=12, transform_type=1, res2=0, transform_id=20, key_length=256) /\ ... IKEv2_Transform(next_payload=3, flags=0, length=8, transform_type=2, res2=0, transform_id=5) /\ ... IKEv2_Transform(next_payload=0, flags=0, length=8, transform_type=4, res2=0, transform_id=28) ... ), ... next_payload=0, flags=0, length=36, proposal=1, proto='IKE', trans_nb=3), ... next_payload=34, ... flags=0, ... length=40 ... ) /\ ... IKEv2_KE( ... next_payload=40, ... flags=0, ... length=72, ... group=28, ... res2=0, ... ke=b'(\x95\xd4\x8eG\r\x8c\xb8\x81\x96b\xf37\x0cW\xb2l\xd3I\xc1o^\xc1\xb3\x19Y\xf9\xefiT\x80\xbcs#R\xf9m\n|JT\xf1\xd5\x96\xbbO\xcc/6\x8e1\x98Zv\xeaZ|w\xd41\r7-\x96' ... ) /\ ... IKEv2_Nonce( ... next_payload=41, ... flags=0, ... length=44, ... nonce=b'K\xf3\xeal\xd0\xc6\xaf\xe7\x02\xc5g\xfe}\xb3\xff\x974$\xbb^\x9d\xe6\xaf\x12:A\x97Zo\xfb&n\x9c[L\x91W\x95\x13+' ... ) /\ ... IKEv2_Notify( ... next_payload=41, ... flags=0, ... length=28, ... proto='IKE', ... type='NAT_DETECTION_DESTINATION_IP', ... notify=b'P\x9b\x01\xb4=\xc2\x8c\x9d\xf8I\xfdv\\d\x8aQ)Y\xacP' ... ) /\ ... IKEv2_Notify( ... next_payload=41, ... flags=0, ... length=28, ... proto='IKE', ... type='NAT_DETECTION_SOURCE_IP', ... notify=b'S\x12\t\x859\x9e\x14\xcf+y!\x1f7[C\x9b\xd001\xac' ... ) /\ ... IKEv2_Notify( ... next_payload=41, ... flags=0, ... length=8, ... type='IKEV2_FRAGMENTATION_SUPPORTED', ... ) /\ ... IKEv2_Notify( ... next_payload=41, ... flags=0, ... length=8, ... type='REDIRECT_SUPPORTED', ... ) /\ ... IKEv2_Notify( ... next_payload=0, ... flags=0, ... length=16, ... type='SIGNATURE_HASH_ALGORITHMS', ... notify=b'\x00\x01\x00\x02\x00\x03\x00\x04' ... ) ... ), ... ( ... # i: frame number ... 1, ... # title: ... "IKE_SA_INIT response (redirect)", ... # data: raw frame data ... # data: raw frame data ... binascii.unhexlify(''.join(""" ... 005056991bcc0050 5699bfd508004500 0086c4d300004011 9d1a0a0502340a05 ... 023c01f42ac80072 c9bc886948814975 28ad000000000000 0000292022200000 ... 00000000006a0000 004e01004017031c 6d6f6e657962696e 2e6475636b627572 ... 672e6469736e6579 2e636f6d4bf3ea6c d0c6afe702c567fe 7db3ff973424bb5e ... 9de6af123a41975a 6ffb266e9c5b4c91 5795132b ... """.split())), ... # packet: Ether / IP / UDP / IKEv2 / ... ... Ether(dst='00:50:56:99:1b:cc', src='00:50:56:99:bf:d5', type=2048) /\ ... IP(version=4, ihl=5, tos=0, id=50387, flags=0, frag=0, ttl=64, proto=17, src='10.5.2.52', dst='10.5.2.60') /\ ... UDP(sport=500, dport=10952) /\ ... IKEv2( ... init_SPI=b'\x88iH\x81Iu(\xad', ... resp_SPI=b'\x00\x00\x00\x00\x00\x00\x00\x00', ... next_payload=41, ... version=32, ... exch_type=34, ... flags=32, ... id=0 ... ) /\ ... IKEv2_Notify( ... next_payload=0, ... flags=0, ... length=78, ... proto='IKE', ... type='REDIRECT', ... gw_id_type=3, ... gw_id=b'moneybin.duckburg.disney.com', ... nonce=b'K\xf3\xeal\xd0\xc6\xaf\xe7\x02\xc5g\xfe}\xb3\xff\x974$\xbb^\x9d\xe6\xaf\x12:A\x97Zo\xfb&n\x9c[L\x91W\x95\x13+' ... ) ... ), ... ( ... # i: frame number ... 2, ... # title: ... "IKE_SA_INIT request (redirected_from)", ... # data: raw frame data ... binascii.unhexlify(''.join(""" ... 0050569907660050 56991bcc08004500 013290ac00007f11 91940a05023c0a05 ... 02352ac801f4011e cba11c88ee0b7793 d52e000000000000 0000212022080000 ... 0000000001162200 0028000000240101 00030300000c0100 0014800e01000300 ... 0008020000050000 00080400001c2800 0048001c00004616 8482fe53233fc1e2 ... 2f9726b7adfe0dfc f53d1558fd663168 24ceec32d4d33f57 7941d3d52e929b3b ... ed0b2eef12886117 cd358655f2f6ffd6 fb54fd48bbc52900 002ca573e33f62cf ... 2893f80abed1677c a303249bf90aae99 980052cbdfd9cc6b 6e70605869ef142b ... cdfd2900001c0100 40052c07d7519ad8 df23a23027e9e7c2 654b32c4e0f32900 ... 001c010040041a1d 001cd4d06f42d1ce 836f7ced61c683b1 87ef290000080000 ... 402e2900000e0000 401801040a050234 000000100000402f 0001000200030004 ... """.split())), ... # packet: Ether / IP / UDP / IKEv2 / ... ... Ether(dst='00:50:56:99:07:66', src='00:50:56:99:1b:cc', type=2048) /\ ... IP(version=4, ihl=5, tos=0, id=37036, flags=0, frag=0, ttl=127, proto=17, src='10.5.2.60', dst='10.5.2.53') /\ ... UDP(sport=10952, dport=500) /\ ... IKEv2( ... init_SPI=b'\x1c\x88\xee\x0bw\x93\xd5.', ... resp_SPI=b'\x00\x00\x00\x00\x00\x00\x00\x00', ... next_payload=33, ... version=32, ... exch_type=34, ... flags=8, ... id=0) /\ ... IKEv2_SA( ... prop=IKEv2_Proposal( ... trans=( ... IKEv2_Transform(next_payload=3, flags=0, length=12, transform_type=1, res2=0, transform_id=20, key_length=256) /\ ... IKEv2_Transform(next_payload=3, flags=0, length=8, transform_type=2, res2=0, transform_id=5) /\ ... IKEv2_Transform(next_payload=0, flags=0, length=8, transform_type=4, res2=0, transform_id=28) ... ), ... next_payload=0, ... flags=0, ... length=36, ... proposal=1, ... proto='IKE', ... trans_nb=3, ... ), ... next_payload=34, ... flags=0, ... length=40 ... ) /\ ... IKEv2_KE( ... next_payload=40, ... flags=0, ... length=72, ... group=28, ... res2=0, ... ke=b'F\x16\x84\x82\xfeS#?\xc1\xe2/\x97&\xb7\xad\xfe\r\xfc\xf5=\x15X\xfdf1h$\xce\xec2\xd4\xd3?\x57\x79\x41\xd3\xd5.\x92\x9b;\xed\x0b.\xef\x12\x88a\x17\xcd5\x86U\xf2\xf6\xff\xd6\xfbT\xfdH\xbb\xc5' ... ) /\ ... IKEv2_Nonce( ... next_payload=41, ... flags=0, ... length=44, ... nonce=b'\xa5s\xe3?b\xcf(\x93\xf8\n\xbe\xd1g|\xa3\x03$\x9b\xf9\n\xae\x99\x98\x00R\xcb\xdf\xd9\xccknp`Xi\xef\x14+\xcd\xfd' ... ) /\ ... IKEv2_Notify( ... next_payload=41, ... flags=0, ... length=28, ... proto='IKE', ... type='NAT_DETECTION_DESTINATION_IP', ... notify=b",\x07\xd7Q\x9a\xd8\xdf#\xa20'\xe9\xe7\xc2eK2\xc4\xe0\xf3" ... ) /\ ... IKEv2_Notify( ... next_payload=41, ... flags=0, ... length=28, ... proto='IKE', ... type='NAT_DETECTION_SOURCE_IP', ... notify=b'\x1a\x1d\x00\x1c\xd4\xd0oB\xd1\xce\x83o|\xeda\xc6\x83\xb1\x87\xef' ... ) /\ ... IKEv2_Notify( ... next_payload=41, ... flags=0, ... length=8, ... type='IKEV2_FRAGMENTATION_SUPPORTED' ... ) /\ ... IKEv2_Notify( ... next_payload=41, ... flags=0, ... length=14, ... type='REDIRECTED_FROM', ... gw_id_type=1, ... gw_id_len=4, ... gw_id='10.5.2.52' ... ) /\ ... IKEv2_Notify( ... next_payload=0, ... flags=0, ... length=16, ... type='SIGNATURE_HASH_ALGORITHMS', ... notify=b'\x00\x01\x00\x02\x00\x03\x00\x04' ... ) ... ), ... ( ... # i: frame number ... 3, ... # title: ... "IKE_SA_INIT response (no_proposal_chosen)", ... # data: raw frame data ... binascii.unhexlify(''.join(""" ... 005056991bcc0050 5699076608004500 0040f24c00004011 6fe60a0502350a05 ... 023c01f42ac8002c c8e31c88ee0b7793 d52e63cc9c1919de 33e7292022200000 ... 0000000000240000 00080100000e ... """.split())), ... # packet: Ether / IP / UDP / IKEv2 / ... ... Ether(dst='00:50:56:99:1b:cc', src='00:50:56:99:07:66', type=2048) /\ ... IP(version=4, ihl=5, tos=0, id=62028, flags=0, frag=0, ttl=64, proto=17, src='10.5.2.53', dst='10.5.2.60') /\ ... UDP(sport=500, dport=10952) /\ ... IKEv2( ... init_SPI=b'\x1c\x88\xee\x0bw\x93\xd5.', ... resp_SPI=b'c\xcc\x9c\x19\x19\xde3\xe7', ... next_payload=41, ... version=32, ... exch_type=34, ... flags=32, ... id=0 ... ) /\ ... IKEv2_Notify( ... next_payload=0, ... flags=0, ... length=8, ... proto='IKE', ... type='NO_PROPOSAL_CHOSEN' ... ) ... ), ... ] >>> >>> >>> for i, title, data, packet in frames: ... print(title) ... if i >= 0: ... # the raw frame data coincides with the frame from the packet capture ... assert data == raw(pcap[i]) ... # the scapy packet correctly describes the frame ... assert raw(packet) == data ... # reassembling the dissected frame yields the original frame ... assert raw(Ether(data)) == data ... IKE_SA_INIT request (redirect_supported) IKE_SA_INIT response (redirect) IKE_SA_INIT request (redirected_from) IKE_SA_INIT response (no_proposal_chosen) IS-IS Tests ━ Run at 01:42:48 from [test/contrib/isis.uts] by UTscapy in 0.15085530281066895 └ Passed=5 └ Failed=0 Tests for the IS-IS layer ###### ## Syntax check ###### ###(000)=[passed] Import the isis layer >>> from scapy.contrib.isis import * ###### ## Basic Layer Tests ###### ###(001)=[passed] Layer Binding >>> p = Dot3()/LLC()/ISIS_CommonHdr()/ISIS_P2P_Hello() >>> assert p[LLC].dsap == 0xfe >>> assert p[LLC].ssap == 0xfe >>> assert p[LLC].ctrl == 0x03 >>> assert p[ISIS_CommonHdr].nlpid == 0x83 >>> assert p[ISIS_CommonHdr].pdutype == 17 >>> assert p[ISIS_CommonHdr].hdrlen == 20 ###### ## Package Tests ###### ###(002)=[passed] P2P Hello >>> p = Dot3(dst="09:00:2b:00:00:05",src="00:00:00:aa:00:8c")/LLC()/ISIS_CommonHdr()/ISIS_P2P_Hello( ... holdingtime=40, sourceid="1720.1600.8016", ... tlvs=[ ... ISIS_ProtocolsSupportedTlv(nlpids=["IPv4", "IPv6"]) ... ]) >>> p = p.__class__(raw(p)) >>> assert p[ISIS_P2P_Hello].pdulength == 24 >>> assert network_layer_protocol_ids[p[ISIS_ProtocolsSupportedTlv].nlpids[1]] == "IPv6" ###(003)=[passed] LSP >>> p = Dot3(dst="09:00:2b:00:00:05",src="00:00:00:aa:00:8c")/LLC()/ISIS_CommonHdr()/ISIS_L2_LSP( ... lifetime=863, lspid="1720.1600.8016.00-00", seqnum=0x1f0, typeblock="L1+L2", ... tlvs=[ ... ISIS_AreaTlv( ... areas=[ISIS_AreaEntry(areaid="49.1000")] ... ), ... ISIS_ProtocolsSupportedTlv( ... nlpids=["IPv4", "IPv6"] ... ), ... ISIS_DynamicHostnameTlv( ... hostname="BR-HH" ... ), ... ISIS_IpInterfaceAddressTlv( ... addresses=["172.16.8.16"] ... ), ... ISIS_GenericTlv( ... type=134, ... val=b"\xac\x10\x08\x10" ... ), ... ISIS_ExtendedIpReachabilityTlv( ... pfxs=[ ... ISIS_ExtendedIpPrefix(metric=0, pfx="172.16.8.16/32"), ... ISIS_ExtendedIpPrefix(metric=10, pfx="10.1.0.109/30"), ... ISIS_ExtendedIpPrefix(metric=10, pfx="10.1.0.181/30") ... ] ... ), ... ISIS_Ipv6ReachabilityTlv( ... pfxs=[ ... ISIS_Ipv6Prefix(metric=0, pfx="fe10:1::10/128"), ... ISIS_Ipv6Prefix(metric=10, pfx="fd1f:1::/64"), ... ISIS_Ipv6Prefix(metric=10, pfx="fd1f:1:12::/64") ... ] ... ), ... ISIS_ExtendedIsReachabilityTlv( ... neighbours=[ISIS_ExtendedIsNeighbourEntry(neighbourid="1720.1600.8004.00", metric=10)] ... ) ... ]) >>> p = p.__class__(raw(p)) >>> assert p[ISIS_L2_LSP].pdulength == 150 >>> assert p[ISIS_L2_LSP].checksum == 0x8701 ###(004)=[passed] LSP with Sub-TLVs >>> p = Dot3(dst="09:00:2b:00:00:05",src="00:00:00:aa:00:8c")/LLC()/ISIS_CommonHdr()/ISIS_L2_LSP( ... lifetime=863, lspid="1720.1600.8016.00-00", seqnum=0x1f0, typeblock="L1+L2", ... tlvs=[ ... ISIS_AreaTlv( ... areas=[ISIS_AreaEntry(areaid="49.1000")] ... ), ... ISIS_ProtocolsSupportedTlv( ... nlpids=["IPv4", "IPv6"] ... ), ... ISIS_DynamicHostnameTlv( ... hostname="BR-HH" ... ), ... ISIS_IpInterfaceAddressTlv( ... addresses=["172.16.8.16"] ... ), ... ISIS_GenericTlv( ... type=134, ... val=b"\xac\x10\x08\x10" ... ), ... ISIS_ExtendedIpReachabilityTlv( ... pfxs=[ ... ISIS_ExtendedIpPrefix(metric=0, pfx="172.16.8.16/32"), ... ISIS_ExtendedIpPrefix(metric=10, pfx="10.1.0.109/30", subtlvindicator=1, ... subtlvs=[ ... ISIS_32bitAdministrativeTagSubTlv(tags=[321, 123]), ... ISIS_64bitAdministrativeTagSubTlv(tags=[54321, 4294967311]), ... ISIS_PrefixSegmentIdentifierSubTlv(flags="P", algorithm=0, idx=20) ... ]), ... ISIS_ExtendedIpPrefix(metric=10, pfx="10.20.30.40/32", subtlvindicator=1, ... subtlvs=[ ... ISIS_PrefixSegmentIdentifierSubTlv(flags=["L", "V", "N"], algorithm=0, sid=1000) ... ]), ... ISIS_ExtendedIpPrefix(metric=10, pfx="10.1.0.181/30", subtlvindicator=1, ... subtlvs=[ ... ISIS_GenericSubTlv(type=123, val=b"\x11\x1f\x01\x1c") ... ]) ... ] ... ), ... ISIS_Ipv6ReachabilityTlv( ... pfxs=[ ... ISIS_Ipv6Prefix(metric=0, pfx="fe10:1::10/128"), ... ISIS_Ipv6Prefix(metric=10, pfx="fd1f:1::/64", subtlvindicator=1, ... subtlvs=[ ... ISIS_GenericSubTlv(type=99, val=b"\x1f\x01\x1f\x01\x11\x1f\x01\x1c") ... ]), ... ISIS_Ipv6Prefix(metric=10, pfx="fd1f:1:12::/64") ... ] ... ), ... ISIS_ExtendedIsReachabilityTlv( ... neighbours=[ ... ISIS_ExtendedIsNeighbourEntry(neighbourid="1720.1600.8004.00", metric=10, ... subtlvs=[ ... ISIS_IPv4InterfaceAddressSubTlv(address="172.16.8.4"), ... ISIS_LinkLocalRemoteIdentifiersSubTlv(localid=418, remoteid=54321), ... ISIS_IPv6NeighborAddressSubTlv(address="fe10:1::5"), ... ISIS_MaximumLinkBandwidthSubTlv(maxbw=125000000), ... ISIS_UnreservedBandwidthSubTlv(unrsvbw=[125000000, 125000000, 125000000, 125000000, 125000000, 125000000, 125000000, 125000000]), ... ISIS_TEDefaultMetricSubTlv(temetric=16777214) ... ]) ... ] ... ), ... ISIS_ExternalIpReachabilityTlv( ... type=130 ... ), ... ISIS_RouterCapabilityTlv( ... type=242, ... routerid="10.20.30.40", ... subtlvs=[ ... ISIS_SRCapabilitiesSubTLV( ... flags='I', ... srgb_ranges=[ ... ISIS_SRGBDescriptorEntry( ... range=1000, ... sid_label=ISIS_SIDLabelSubTLV( ... sid=10 ... ) ... ), ... ISIS_SRGBDescriptorEntry( ... range=5000, ... sid_label=ISIS_SIDLabelSubTLV( ... idx=20 ... ) ... ), ... ] ... ), ... ISIS_SRAlgorithmSubTLV(algorithms=[0, 1]) ... ] ... ) ... ]) >>> p = p.__class__(raw(p)) >>> assert p[ISIS_L2_LSP].pdulength == 332 >>> assert p[ISIS_L2_LSP].checksum == 0x074f >>> assert p[ISIS_ExtendedIpReachabilityTlv].pfxs[1].subtlvs[1].tags[0]==54321 >>> assert p[ISIS_ExtendedIpReachabilityTlv].pfxs[2].subtlvs[0].sid==1000 >>> assert p[ISIS_Ipv6ReachabilityTlv].pfxs[1].subtlvs[0].len==8 >>> assert p[ISIS_ExtendedIsReachabilityTlv].neighbours[0].subtlvs[0].address=='172.16.8.4' >>> assert p[ISIS_ExtendedIsReachabilityTlv].neighbours[0].subtlvs[1].localid==418 >>> assert p[ISIS_ExtendedIsReachabilityTlv].neighbours[0].subtlvs[3].maxbw==125000000 >>> assert p[ISIS_ExtendedIsReachabilityTlv].neighbours[0].subtlvs[4].unrsvbw[0]==125000000 >>> assert p[ISIS_ExtendedIsReachabilityTlv].neighbours[0].subtlvs[5].temetric==16777214 >>> assert p[ISIS_ExternalIpReachabilityTlv].type==130 >>> assert p[ISIS_RouterCapabilityTlv].type==242 >>> assert p[ISIS_RouterCapabilityTlv].subtlvs[0].srgb_ranges[0].range==1000 >>> assert p[ISIS_RouterCapabilityTlv].subtlvs[0].srgb_ranges[0].sid_label.sid==10 >>> assert p[ISIS_RouterCapabilityTlv].subtlvs[1].algorithms==[0, 1] Regression tests for ISOTP Message Builder ━ Run at 01:42:48 from [test/contrib/isotp_message_builder.uts] by UTscapy in 0.07926011085510254 └ Passed=20 └ Failed=0 ###### ## Configuration ###### ###(000)=[passed] Definition of utility functions >>> dhex = bytes.fromhex ###(001)=[passed] Import isotp >>> conf.contribs['ISOTP'] = {'use-can-isotp-kernel-module': False} >>> >>> load_layer("can", globals_dict=globals()) >>> load_contrib("isotp", globals_dict=globals()) /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback ###### ## Testing ISOTPMessageBuilder ###### ###(002)=[passed] Create ISOTPMessageBuilder >>> m = ISOTPMessageBuilder() ###(003)=[passed] Feed packets to machine >>> ff = CAN(identifier=0x241, data=dhex("10 28 01 02 03 04 05 06")) >>> ff.time = 1000 >>> m.feed(ff) >>> m.feed(CAN(identifier=0x641, data=dhex("30 03 00" ))) >>> m.feed(CAN(identifier=0x241, data=dhex("21 07 08 09 0A 0B 0C 0D"))) >>> m.feed(CAN(identifier=0x241, data=dhex("22 0E 0F 10 11 12 13 14"))) >>> m.feed(CAN(identifier=0x241, data=dhex("23 15 16 17 18 19 1A 1B"))) >>> m.feed(CAN(identifier=0x641, data=dhex("30 03 00" ))) >>> m.feed(CAN(identifier=0x241, data=dhex("24 1C 1D 1E 1F 20 21 22"))) >>> m.feed(CAN(identifier=0x241, data=dhex("25 23 24 25 26 27 28" ))) ###(004)=[passed] Verify there is a ready message in the machine >>> assert m.count == 1 ###(005)=[passed] Extract the message from the machine >>> msg = m.pop() >>> assert m.count == 0 >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address is None >>> assert msg.tx_id == 0x641 >>> assert msg.ext_address is None >>> assert msg.time == 1000 >>> expected = dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") >>> assert msg.data == expected ###(006)=[passed] Verify that no error happens when there is not enough data >>> m = ISOTPMessageBuilder() >>> m.feed(CAN(identifier=0x241, data=dhex("04 AB CD EF"))) >>> msg = m.pop() >>> assert msg is None ###(007)=[passed] Verify that no error happens when there is no data >>> m = ISOTPMessageBuilder() >>> m.feed(CAN(identifier=0x241, data=dhex(""))) >>> msg = m.pop() >>> assert msg is None ###(008)=[passed] Verify a single frame without EA >>> m = ISOTPMessageBuilder() >>> m.feed(CAN(identifier=0x241, data=dhex("04 AB CD EF 04"))) >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address is None >>> assert msg.data == dhex("AB CD EF 04") ###(009)=[passed] Single frame without EA, with excessive bytes in CAN frame >>> m = ISOTPMessageBuilder() >>> m.feed(CAN(identifier=0x241, data=dhex("03 AB CD EF AB CD EF AB"))) >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address is None >>> assert msg.data == dhex("AB CD EF") ###(010)=[passed] Verify a single frame with EA >>> m = ISOTPMessageBuilder() >>> m.feed(CAN(identifier=0x241, data=dhex("E2 04 01 02 03 04"))) >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0xE2 >>> assert msg.data == dhex("01 02 03 04") ###(011)=[passed] Single CAN frame that has 2 valid interpretations >>> m = ISOTPMessageBuilder() >>> m.feed(CAN(identifier=0x241, data=dhex("04 01 02 03 04"))) >>> msg = m.pop(0x241, None) >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address is None >>> assert msg.data == dhex("01 02 03 04") >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0x04 >>> assert msg.data == dhex("02") ###(012)=[passed] Verify multiple frames with EA >>> m = ISOTPMessageBuilder() >>> ff = CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")) >>> ff.time = 1005 >>> m.feed(ff) >>> m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00" ))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17"))) >>> m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00" ))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28" ))) >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0xEA >>> assert msg.tx_id == 0x641 >>> assert msg.ext_address == 0xEA >>> assert msg.time == 1005 >>> assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") ###(013)=[passed] Verify multiple frames with EA 2 >>> m = ISOTPMessageBuilder() >>> m.feed(CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05"))) >>> m.feed(CAN(identifier=0x641, data=dhex("AE 30 03 00" ))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17"))) >>> m.feed(CAN(identifier=0x641, data=dhex("AE 30 03 00" ))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28" ))) >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0xEA >>> assert msg.tx_id == 0x641 >>> assert msg.ext_address == 0xAE >>> assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") ###(014)=[passed] Verify that an EA starting with 1 will still work >>> m = ISOTPMessageBuilder() >>> m.feed(CAN(identifier=0x241, data=dhex("1A 10 14 01 02 03 04 05"))) >>> m.feed(CAN(identifier=0x641, data=dhex("1A 30 03 00" ))) >>> m.feed(CAN(identifier=0x241, data=dhex("1A 21 06 07 08 09 0A 0B"))) >>> m.feed(CAN(identifier=0x241, data=dhex("1A 22 0C 0D 0E 0F 10 11"))) >>> m.feed(CAN(identifier=0x241, data=dhex("1A 23 12 13 14 15 16 17"))) >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0x1A >>> assert msg.tx_id == 0x641 >>> assert msg.ext_address == 0x1A >>> assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14") ###(015)=[passed] Verify that an EA of 07 will still work >>> m = ISOTPMessageBuilder() >>> m.feed(CAN(identifier=0x241, data=dhex("07 10 0A 01 02 03 04 05"))) >>> m.feed(CAN(identifier=0x641, data=dhex("07 30 03 00" ))) >>> m.feed(CAN(identifier=0x241, data=dhex("07 21 06 07 08 09 0A 0B"))) >>> msg = m.pop(0x241, 0x07) >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0x07 >>> assert msg.tx_id == 0x641 >>> assert msg.ext_address == 0x07 >>> assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A") ###(016)=[passed] Verify that three interleaved messages can be sniffed simultaneously on the same identifier and extended address (very unrealistic) >>> m = ISOTPMessageBuilder() >>> ff = CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")) >>> ff.time = 300 >>> m.feed(ff) # start of message A >>> m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00" ))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17"))) >>> ff = CAN(identifier=0x241, data=dhex("EA 10 10 31 32 33 34 35")) >>> ff.time = 400 >>> m.feed(ff) # start of message B >>> m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00" ))) >>> sf = CAN(identifier=0x241, data=dhex("EA 03 A6 A7 A8" )) >>> sf.time = 200 >>> m.feed(sf) # single-frame message C >>> m.feed(CAN(identifier=0x641, data=dhex("EA 30 03 00" ))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 21 36 37 38 39 3A 3B"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 22 3C 3D 3E 3F 40" ))) # end of message B >>> m.feed(CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23"))) >>> m.feed(CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28" ))) # end of message A >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0xEA >>> assert msg.data == dhex("A6 A7 A8") >>> assert msg.time == 200 >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0xEA >>> assert msg.tx_id == 0x641 >>> assert msg.ext_address == 0xEA >>> assert msg.time == 400 >>> assert msg.data == dhex("31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40") >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0xEA >>> assert msg.tx_id == 0x641 >>> assert msg.ext_address == 0xEA >>> assert msg.time == 300 >>> assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") ###(017)=[passed] Verify multiple frames with EA from list >>> m = ISOTPMessageBuilder() >>> msgs = [ ... CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")), ... CAN(identifier=0x641, data=dhex("EA 30 03 00" )), ... CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B")), ... CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11")), ... CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17")), ... CAN(identifier=0x641, data=dhex("EA 30 03 00" )), ... CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D")), ... CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23")), ... CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28" ))] >>> m.feed(msgs) >>> msg = m.pop() >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0xEA >>> assert msg.tx_id == 0x641 >>> assert msg.ext_address == 0xEA >>> assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") ###(018)=[passed] Verify multiple frames with EA from list and iterator >>> m = ISOTPMessageBuilder() >>> msgs = [ ... CAN(identifier=0x241, data=dhex("EA 10 28 01 02 03 04 05")), ... CAN(identifier=0x641, data=dhex("EA 30 03 00" )), ... CAN(identifier=0x241, data=dhex("EA 21 06 07 08 09 0A 0B")), ... CAN(identifier=0x241, data=dhex("EA 22 0C 0D 0E 0F 10 11")), ... CAN(identifier=0x241, data=dhex("EA 23 12 13 14 15 16 17")), ... CAN(identifier=0x641, data=dhex("EA 30 03 00" )), ... CAN(identifier=0x241, data=dhex("EA 24 18 19 1A 1B 1C 1D")), ... CAN(identifier=0x241, data=dhex("EA 25 1E 1F 20 21 22 23")), ... CAN(identifier=0x241, data=dhex("EA 26 24 25 26 27 28" )), ... CAN(identifier=0x241, data=dhex("EA 03 A6 A7 A8" )), ... CAN(identifier=0x241, data=dhex("EA 03 A6 A7 A8"))] >>> m.feed(msgs) >>> assert m.count == 3 >>> assert len(m) == 3 >>> >>> isotpmsgs = [x for x in m] >>> assert len(isotpmsgs) == 3 >>> msg = isotpmsgs[0] >>> assert msg.rx_id == 0x241 >>> assert msg.rx_ext_address == 0xEA >>> assert msg.tx_id == 0x641 >>> assert msg.ext_address == 0xEA >>> assert msg.data == dhex("01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28") >>> >>> assert isotpmsgs[1] == isotpmsgs[2] ###(019)=[passed] Verify a single frame without EA and different basecls >>> m = ISOTPMessageBuilder(basecls=Raw) >>> m.feed(CAN(identifier=0x241, data=dhex("04 AB CD EF 04"))) >>> msg = m.pop() >>> assert msg.load == dhex("AB CD EF 04") >>> assert type(msg) == Raw Regression tests for ISOTPNativeSocket ━ Run at 01:42:48 from [test/contrib/isotp_native_socket.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for ISOTP packet definitions ━ Run at 01:42:48 from [test/contrib/isotp_packet.uts] by UTscapy in 0.26929426193237305 └ Passed=59 └ Failed=0 ###### ## Configuration ###### ###(000)=[passed] Import isotp >>> conf.contribs['ISOTP'] = {'use-can-isotp-kernel-module': False} >>> >>> load_layer("can", globals_dict=globals()) >>> load_contrib("isotp", globals_dict=globals()) >>> from scapy.contrib.isotp.isotp_scanner import get_isotp_packet ###(001)=[passed] Define helpers >>> dhex = bytes.fromhex ###### ## ISOTP packet check ###### ###(002)=[passed] Creation of an empty ISOTP packet >>> p = ISOTP() >>> assert p.data == b"" >>> assert p.tx_id is None and p.rx_id is None and p.ext_address is None and p.rx_ext_address is None >>> assert bytes(p) == b"" ###(003)=[passed] Creation of a simple ISOTP packet with tx_id >>> p = ISOTP(b"eee", tx_id=0x241) >>> assert p.tx_id == 0x241 >>> assert p.data == b"eee" >>> assert bytes(p) == b"eee" ###(004)=[passed] Creation of a simple ISOTP packet with ext_address >>> p = ISOTP(b"eee", ext_address=0x41) >>> assert p.ext_address == 0x41 >>> assert p.data == b"eee" >>> assert bytes(p) == b"eee" ###(005)=[passed] Creation of a simple ISOTP packet with rx_id >>> p = ISOTP(b"eee", rx_id=0x241) >>> assert p.rx_id == 0x241 >>> assert p.data == b"eee" >>> assert bytes(p) == b"eee" ###(006)=[passed] Creation of a simple ISOTP packet with rx_ext_address >>> p = ISOTP(b"eee", rx_ext_address=0x41) >>> assert p.rx_ext_address == 0x41 >>> assert p.data == b"eee" >>> assert bytes(p) == b"eee" ###(007)=[passed] Creation of a simple ISOTP packet with tx_id, rx_id, ext_address, rx_ext_address >>> p = ISOTP(b"eee", tx_id=1, rx_id=2, ext_address=3, rx_ext_address=4) >>> assert p.rx_id == 2 >>> assert p.rx_ext_address == 4 >>> assert p.tx_id == 1 >>> assert p.ext_address == 3 >>> assert p.data == b"eee" >>> assert bytes(p) == b"eee" ###(008)=[passed] ISOTP answers test >>> p = ISOTP() >>> r = ISOTP() >>> assert p.data == b"" >>> assert p.answers(r) >>> assert not p.answers(Raw()) ###(009)=[passed] Creation of a simple ISOTP packet with tx_id validation error >>> ex = False >>> try: ... p = ISOTP(b"eee", tx_id=0x1000000000, rx_id=2, ext_address=3, rx_ext_address=4) ... except Scapy_Exception: ... ex = True ... >>> assert ex ###(010)=[passed] Creation of a simple ISOTP packet with rx_id validation error >>> ex = False >>> try: ... p = ISOTP(b"eee", tx_id=0x10, rx_id=0x20000000000, ext_address=3, rx_ext_address=4) ... except Scapy_Exception: ... ex = True ... >>> assert ex ###(011)=[passed] Creation of a simple ISOTP packet with ext_address validation error >>> ex = False >>> try: ... p = ISOTP(b"eee", tx_id=0x10, rx_id=2, ext_address=3000, rx_ext_address=4) ... except Scapy_Exception: ... ex = True ... >>> assert ex ###(012)=[passed] Creation of a simple ISOTP packet with rx_ext_address validation error >>> ex = False >>> try: ... p = ISOTP(b"eee", tx_id=0x10, rx_id=2, ext_address=30, rx_ext_address=400) ... except Scapy_Exception: ... ex = True ... >>> assert ex ###### ## ISOTPFrame related checks ###### ###(013)=[passed] Build a packet with extended addressing >>> pkt = CAN(identifier=0x123, data=b'\x42\x10\xff\xde\xea\xdd\xaa\xaa') >>> isotpex = ISOTPHeaderEA(bytes(pkt)) >>> assert isotpex.type == 1 >>> assert isotpex.message_size == 0xff >>> assert isotpex.extended_address == 0x42 >>> assert isotpex.identifier == 0x123 >>> assert isotpex.length == 8 ###(014)=[passed] Build a packet with normal addressing >>> pkt = CAN(identifier=0x123, data=b'\x10\xff\xde\xea\xdd\xaa\xaa') >>> isotpno = ISOTPHeader(bytes(pkt)) >>> assert isotpno.type == 1 >>> assert isotpno.message_size == 0xff >>> assert isotpno.identifier == 0x123 >>> assert isotpno.length == 7 ###(015)=[passed] Compare both isotp payloads >>> assert isotpno.data == isotpex.data >>> assert isotpno.message_size == isotpex.message_size ###(016)=[passed] Dissect multiple packets >>> frames = \ ... [b'\x00\x00\x00\x00\x08\x00\x00\x00\x10(\xde\xad\xbe\xef\xde\xad', ... b'\x00\x00\x00\x00\x08\x00\x00\x00!\xbe\xef\xde\xad\xbe\xef\xde', ... b'\x00\x00\x00\x00\x08\x00\x00\x00"\xad\xbe\xef\xde\xad\xbe\xef', ... b'\x00\x00\x00\x00\x08\x00\x00\x00#\xde\xad\xbe\xef\xde\xad\xbe', ... b'\x00\x00\x00\x00\x08\x00\x00\x00$\xef\xde\xad\xbe\xef\xde\xad', ... b'\x00\x00\x00\x00\x07\x00\x00\x00%\xbe\xef\xde\xad\xbe\xef'] >>> >>> isotpframes = [ISOTPHeader(x) for x in frames] >>> >>> assert isotpframes[0].type == 1 >>> assert isotpframes[0].message_size == 40 >>> assert isotpframes[0].length == 8 >>> assert isotpframes[1].type == 2 >>> assert isotpframes[1].index == 1 >>> assert isotpframes[1].length == 8 >>> assert isotpframes[2].type == 2 >>> assert isotpframes[2].index == 2 >>> assert isotpframes[2].length == 8 >>> assert isotpframes[3].type == 2 >>> assert isotpframes[3].index == 3 >>> assert isotpframes[3].length == 8 >>> assert isotpframes[4].type == 2 >>> assert isotpframes[4].index == 4 >>> assert isotpframes[4].length == 8 >>> assert isotpframes[5].type == 2 >>> assert isotpframes[5].index == 5 >>> assert isotpframes[5].length == 7 ###(017)=[passed] Build SF frame with constructor, check for correct length assignments >>> p = ISOTPHeader(bytes(ISOTPHeader()/ISOTP_SF(data=b'\xad\xbe\xad\xff'))) >>> assert p.length == 5 >>> assert p.message_size == 4 >>> assert len(p.data) == 4 >>> assert p.data == b'\xad\xbe\xad\xff' >>> assert p.type == 0 >>> assert p.identifier == 0 ###(018)=[passed] Build SF frame EA with constructor, check for correct length assignments >>> p = ISOTPHeaderEA(bytes(ISOTPHeaderEA()/ISOTP_SF(data=b'\xad\xbe\xad\xff'))) >>> assert p.extended_address == 0 >>> assert p.length == 6 >>> assert p.message_size == 4 >>> assert len(p.data) == 4 >>> assert p.data == b'\xad\xbe\xad\xff' >>> assert p.type == 0 >>> assert p.identifier == 0 ###(019)=[passed] Build FF frame with constructor, check for correct length assignments >>> p = ISOTPHeader(bytes(ISOTPHeader()/ISOTP_FF(message_size=10, data=b'\xad\xbe\xad\xff'))) >>> assert p.length == 6 >>> assert p.message_size == 10 >>> assert len(p.data) == 4 >>> assert p.data == b'\xad\xbe\xad\xff' >>> assert p.type == 1 >>> assert p.identifier == 0 ###(020)=[passed] Build FF frame EA with constructor, check for correct length assignments >>> p = ISOTPHeaderEA(bytes(ISOTPHeaderEA()/ISOTP_FF(message_size=10, data=b'\xad\xbe\xad\xff'))) >>> assert p.extended_address == 0 >>> assert p.length == 7 >>> assert p.message_size == 10 >>> assert len(p.data) == 4 >>> assert p.data == b'\xad\xbe\xad\xff' >>> assert p.type == 1 >>> assert p.identifier == 0 ###(021)=[passed] Build FF frame EA, extended size, with constructor, check for correct length assignments >>> p = ISOTPHeaderEA(bytes(ISOTPHeaderEA()/ISOTP_FF_FD(message_size=2000, data=b'\xad'))) >>> assert p.extended_address == 0 >>> assert p.length == 8 >>> assert p.message_size == 2000 >>> assert len(p.data) == 1 >>> assert p.data == b'\xad' >>> assert p.type == 1 >>> assert p.identifier == 0 ###(022)=[passed] Build FF frame, extended size, with constructor, check for correct length assignments >>> p = ISOTPHeader(bytes(ISOTPHeader()/ISOTP_FF_FD(message_size=2000, data=b'\xad'))) >>> assert p.length == 7 >>> assert p.message_size == 2000 >>> assert len(p.data) == 1 >>> assert p.data == b'\xad' >>> assert p.type == 1 >>> assert p.identifier == 0 ###(023)=[passed] Build CF frame with constructor, check for correct length assignments >>> p = ISOTPHeader(bytes(ISOTPHeader()/ISOTP_CF(data=b'\xad'))) >>> assert p.length == 2 >>> assert p.index == 0 >>> assert len(p.data) == 1 >>> assert p.data == b'\xad' >>> assert p.type == 2 >>> assert p.identifier == 0 ###(024)=[passed] Build CF frame EA with constructor, check for correct length assignments >>> p = ISOTPHeaderEA(bytes(ISOTPHeaderEA()/ISOTP_CF(data=b'\xad'))) >>> assert p.length == 3 >>> assert p.index == 0 >>> assert len(p.data) == 1 >>> assert p.data == b'\xad' >>> assert p.type == 2 >>> assert p.identifier == 0 ###(025)=[passed] Build FC frame EA with constructor, check for correct length assignments >>> p = ISOTPHeaderEA(bytes(ISOTPHeaderEA()/ISOTP_FC())) >>> assert p.length == 4 >>> assert p.block_size == 0 >>> assert p.separation_time == 0 >>> assert p.type == 3 >>> assert p.identifier == 0 ###(026)=[passed] Build FC frame with constructor, check for correct length assignments >>> p = ISOTPHeader(bytes(ISOTPHeader()/ISOTP_FC())) >>> assert p.length == 3 >>> assert p.block_size == 0 >>> assert p.separation_time == 0 >>> assert p.type == 3 >>> assert p.identifier == 0 ###(027)=[passed] Construct some single frames >>> p = ISOTPHeader(identifier=0x123, length=5)/ISOTP_SF(message_size=4, data=b'abcd') >>> assert p.length == 5 >>> assert p.identifier == 0x123 >>> assert p.type == 0 >>> assert p.message_size == 4 >>> assert p.data == b'abcd' ###(028)=[passed] Construct some single frames EA >>> p = ISOTPHeaderEA(identifier=0x123, length=6, extended_address=42)/ISOTP_SF(message_size=4, data=b'abcd') >>> assert p.length == 6 >>> assert p.extended_address == 42 >>> assert p.identifier == 0x123 >>> assert p.type == 0 >>> assert p.message_size == 4 >>> assert p.data == b'abcd' ###(029)=[passed] Construct ISOTP_packet with extended can frame >>> p = get_isotp_packet(identifier=0x1234, extended=False, extended_can_id=True) >>> print(p) ISOTPHeader / ISOTP_FF >>> assert (p.identifier == 0x1234) >>> assert (p.flags == "extended") ###(030)=[passed] Construct ISOTPEA_Packet with extended can frame >>> p = get_isotp_packet(identifier=0x1234, extended=True, extended_can_id=True) >>> print(p) ISOTPHeaderEA / ISOTP_FF >>> assert (p.identifier == 0x1234) >>> assert (p.flags == "extended") ###### ## ISOTP fragment and defragment checks ###### ###(031)=[passed] Fragment an empty ISOTP message >>> fragments = ISOTP().fragment() >>> assert len(fragments) == 1 >>> assert fragments[0].data == b"\0" ###(032)=[passed] Fragment another empty ISOTP message >>> fragments = ISOTP(b"").fragment() >>> assert len(fragments) == 1 >>> assert fragments[0].data == b"\0" ###(033)=[passed] Fragment a 4 bytes long ISOTP message >>> fragments = ISOTP(b"data", tx_id=0x241).fragment() >>> assert len(fragments) == 1 >>> assert isinstance(fragments[0], CAN) >>> fragment = CAN(bytes(fragments[0])) >>> assert fragment.data == b"\x04data" >>> assert fragment.flags == 0 >>> assert fragment.length == 5 >>> assert fragment.reserved == 0 ###(034)=[passed] Fragment a 4 bytes long ISOTP message extended >>> fragments = ISOTP(b"data", rx_id=0x1fff0000).fragment() >>> assert len(fragments) == 1 >>> assert isinstance(fragments[0], CAN) >>> fragment = CAN(bytes(fragments[0])) >>> assert fragment.data == b"\x04data" >>> assert fragment.length == 5 >>> assert fragment.reserved == 0 >>> assert fragment.flags == 4 ###(035)=[passed] Fragment a 8 bytes long ISOTP message extended >>> fragments = ISOTP(b"datadata", rx_id=0x1fff0000).fragment() >>> assert len(fragments) == 2 >>> assert isinstance(fragments[0], CAN) >>> fragment = CAN(bytes(fragments[0])) >>> assert fragment.data == b"\x10\x08datada" >>> assert fragment.length == 8 >>> assert fragment.reserved == 0 >>> assert fragment.flags == 4 >>> fragment = CAN(bytes(fragments[1])) >>> assert fragment.data == b"\x21ta" >>> assert fragment.length == 3 >>> assert fragment.reserved == 0 >>> assert fragment.flags == 4 ###(036)=[passed] Fragment a 7 bytes long ISOTP message >>> fragments = ISOTP(b"abcdefg").fragment() >>> assert len(fragments) == 1 >>> assert fragments[0].data == b"\x07abcdefg" ###(037)=[passed] Fragment a 8 bytes long ISOTP message >>> fragments = ISOTP(b"abcdefgh").fragment() >>> assert len(fragments) == 2 >>> assert fragments[0].data == b"\x10\x08abcdef" >>> assert fragments[1].data == b"\x21gh" ###(038)=[passed] Fragment an ISOTP message with extended addressing >>> isotp = ISOTP(b"abcdef", rx_ext_address=ord('A')) >>> fragments = isotp.fragment() >>> assert len(fragments) == 1 >>> assert fragments[0].data == b"A\x06abcdef" ###(039)=[passed] Fragment a 7 bytes ISOTP message with destination identifier >>> isotp = ISOTP(b"abcdefg", rx_id=0x64f) >>> fragments = isotp.fragment() >>> assert len(fragments) == 1 >>> assert fragments[0].data == b"\x07abcdefg" >>> assert fragments[0].identifier == 0x64f ###(040)=[passed] Fragment a 16 bytes ISOTP message with extended addressing >>> isotp = ISOTP(b"abcdefghijklmnop", rx_id=0x64f, rx_ext_address=ord('A')) >>> fragments = isotp.fragment() >>> assert len(fragments) == 3 >>> assert fragments[0].data == b"A\x10\x10abcde" >>> assert fragments[1].data == b"A\x21fghijk" >>> assert fragments[2].data == b"A\x22lmnop" >>> assert fragments[0].identifier == 0x64f >>> assert fragments[1].identifier == 0x64f >>> assert fragments[2].identifier == 0x64f ###(041)=[passed] Fragment a huge ISOTP message, 4997 bytes long >>> data = b"T" * 4997 >>> isotp = ISOTP(b"T" * 4997, rx_id=0x345) >>> fragments = isotp.fragment() >>> assert len(fragments) == 715 >>> assert fragments[0].data == dhex("10 00 00 00 13 85") + b"TT" >>> assert fragments[1].data == b"\x21TTTTTTT" >>> assert fragments[-2].data == b"\x29TTTTTTT" >>> assert fragments[-1].data == b"\x2ATTTT" ###(042)=[passed] Defragment a single-frame ISOTP message >>> fragments = [CAN(identifier=0x641, data=b"\x04test")] >>> isotp = ISOTP.defragment(fragments) >>> isotp.show() ###[ ISOTP ]### data = b'test' >>> assert isotp.data == b"test" >>> assert isotp.rx_id == 0x641 ###(043)=[passed] Defragment non ISOTP message >>> fragments = [CAN(identifier=0x641, data=b"\xa4test")] >>> isotp = ISOTP.defragment(fragments) >>> assert isotp is None ###(044)=[passed] Defragment ISOTP message with warning >>> fragments = [CAN(identifier=0x641, data=b"\x04test"), CAN(identifier=0x642, data=b"\x04test")] >>> isotp = ISOTP.defragment(fragments) Not all CAN frames have the same identifier More than one ISOTP frame could be defragmented from the provided CAN frames, only returning the first one. >>> assert isotp.data == b"test" >>> assert isotp.rx_id == 0x641 ###(045)=[passed] Defragment exception >>> fragments = [] >>> ex = False >>> try: ... isotp = ISOTP.defragment(fragments) ... isotp.show() ... except Scapy_Exception: ... ex = True ... >>> assert ex ###(046)=[passed] Defragment an ISOTP message composed of multiple CAN frames >>> fragments = [ ... CAN(identifier=0x641, data=dhex("41 10 10 61 62 63 64 65")), ... CAN(identifier=0x641, data=dhex("41 21 66 67 68 69 6A 6B")), ... CAN(identifier=0x641, data=dhex("41 22 6C 6D 6E 6F 70 00")) ... ] >>> isotp = ISOTP.defragment(fragments) >>> isotp.show() ###[ ISOTP ]### data = b'abcdefghijklmnop' >>> assert isotp.data == dhex("61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70") >>> assert isotp.rx_id == 0x641 >>> assert isotp.rx_ext_address == 0x41 ###(047)=[passed] Check if fragmenting a message and defragmenting it back yields the original message >>> isotp1 = ISOTP(b"abcdef", rx_ext_address=ord('A')) >>> fragments = isotp1.fragment() >>> isotp2 = ISOTP.defragment(fragments) >>> isotp2.show() ###[ ISOTP ]### data = b'abcdef' >>> assert isotp1 == isotp2 >>> >>> isotp1 = ISOTP(b"abcdefghijklmnop") >>> fragments = isotp1.fragment() >>> isotp2 = ISOTP.defragment(fragments) >>> isotp2.show() ###[ ISOTP ]### data = b'abcdefghijklmnop' >>> assert isotp1 == isotp2 >>> >>> isotp1 = ISOTP(b"abcdefghijklmnop", rx_ext_address=ord('A')) >>> fragments = isotp1.fragment() >>> isotp2 = ISOTP.defragment(fragments) >>> isotp2.show() ###[ ISOTP ]### data = b'abcdefghijklmnop' >>> assert isotp1 == isotp2 >>> >>> isotp1 = ISOTP(b"T"*5000, rx_ext_address=ord('A')) >>> fragments = isotp1.fragment() >>> isotp2 = ISOTP.defragment(fragments) >>> isotp2.show() ###[ ISOTP ]### data = b'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT' >>> assert isotp1 == isotp2 ###(048)=[passed] Defragment an ambiguous CAN frame >>> fragments = [CAN(identifier=0x641, data=dhex("02 01 AA"))] >>> isotp = ISOTP.defragment(fragments, False) >>> isotp.show() ###[ ISOTP ]### data = b'\x01\xaa' >>> assert isotp.data == dhex("01 AA") >>> assert isotp.rx_ext_address == None >>> isotpex = ISOTP.defragment(fragments, True) >>> isotpex.show() ###[ ISOTP ]### data = b'\xaa' >>> assert isotpex.data == dhex("AA") >>> assert isotpex.rx_ext_address == 0x02 ###(049)=[passed] Build ISOTP_FF_FD >>> pkt = ISOTP_FF_FD(message_size=0xffff0000) >>> assert bytes(pkt) == bytes.fromhex("1000ffff0000") ###(050)=[passed] Build ISOTP_SF_FD >>> pkt = ISOTP_SF_FD(message_size=0xff) >>> assert bytes(pkt) == bytes.fromhex("00ff") ###(051)=[passed] Build ISOTP_FF_FD 2 >>> pkt = ISOTPHeaderEA_FD(identifier=0x7ff, extended_address=0xaf)/ISOTP_FF_FD(message_size=0xffff0000) >>> assert bytes(pkt) == bytes.fromhex("000007ff 07 04 00 00 af 1000ffff0000") ###(052)=[passed] Build ISOTP_SF_FD 2 >>> pkt = ISOTPHeaderEA_FD(identifier=0x7ff, extended_address=0xaf)/ISOTP_SF_FD(message_size=0xff) >>> assert bytes(pkt) == bytes.fromhex("000007ff 03 04 00 00 af 00ff") ###(053)=[passed] Build ISOTP_FF_FD 3 >>> pkt = ISOTPHeader_FD(identifier=0x7ff)/ISOTP_FF_FD(message_size=0xffff0000) >>> assert bytes(pkt) == bytes.fromhex("000007ff 06 04 00 00 1000ffff0000") ###(054)=[passed] Build ISOTP_SF_FD 3 >>> pkt = ISOTPHeader_FD(identifier=0x7ff)/ISOTP_SF_FD(message_size=0xff) >>> assert bytes(pkt) == bytes.fromhex("000007ff 02 04 00 00 00ff") ###(055)=[passed] Dissect ISOTPFD 1 >>> pkt = ISOTPHeaderEA_FD(bytes.fromhex("000007ff 07 04 00 00 af 1000ffff0000")) >>> pkt.show() ###[ ISOTPHeaderExtendedAddressFD ]### flags = identifier= 0x7ff length = 7 fd_flags = fd_frame reserved = 0 extended_address= 0xaf ###[ ISOTPFirstFrame ]### type = first zero_field= 0 message_size= 4294901760 data = b'' >>> sub_pkt = pkt[ISOTP_FF_FD] >>> assert pkt.identifier == 0x7ff >>> assert pkt.length == 0x7 >>> assert pkt.fd_flags == 0x4 >>> assert pkt.extended_address == 0xaf >>> assert sub_pkt.message_size == 0xffff0000 ###(056)=[passed] Dissect ISOTPFD 2 >>> pkt = ISOTPHeaderEA_FD(bytes.fromhex("000007ff 07 04 00 00 af 00ff00000000")) >>> pkt.show() ###[ ISOTPHeaderExtendedAddressFD ]### flags = identifier= 0x7ff length = 7 fd_flags = fd_frame reserved = 0 extended_address= 0xaf ###[ ISOTPSingleFrameFD ]### type = single zero_field= 0 message_size= 255 data = b'\x00\x00\x00\x00' >>> sub_pkt = pkt[ISOTP_SF_FD] >>> assert pkt.identifier == 0x7ff >>> assert pkt.length == 0x7 >>> assert pkt.fd_flags == 0x4 >>> assert pkt.extended_address == 0xaf >>> assert sub_pkt.message_size == 0xff ###(057)=[passed] Dissect ISOTPFD 3 >>> pkt = ISOTPHeader_FD(bytes.fromhex("000007ff 06 04 00 00 1000ffff0000")) >>> pkt.show() ###[ ISOTPHeaderFD ]### flags = identifier= 0x7ff length = 6 fd_flags = fd_frame reserved = 0 ###[ ISOTPFirstFrame ]### type = first zero_field= 0 message_size= 4294901760 data = b'' >>> sub_pkt = pkt[ISOTP_FF_FD] >>> assert pkt.identifier == 0x7ff >>> assert pkt.length == 0x6 >>> assert pkt.fd_flags == 0x4 >>> assert sub_pkt.message_size == 0xffff0000 ###(058)=[passed] Dissect ISOTPFD 4 >>> pkt = ISOTPHeader_FD(bytes.fromhex("000007ff 06 04 00 00 00ff00000000")) >>> pkt.show() ###[ ISOTPHeaderFD ]### flags = identifier= 0x7ff length = 6 fd_flags = fd_frame reserved = 0 ###[ ISOTPSingleFrameFD ]### type = single zero_field= 0 message_size= 255 data = b'\x00\x00\x00\x00' >>> sub_pkt = pkt[ISOTP_SF_FD] >>> assert pkt.identifier == 0x7ff >>> assert pkt.length == 0x6 >>> assert pkt.fd_flags == 0x4 >>> assert sub_pkt.message_size == 0xff Regression tests for ISOTPSoftSocket ━ Run at 01:42:48 from [test/contrib/isotp_soft_socket.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for isotp_scan ━ Run at 01:42:48 from [test/contrib/isotpscan.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 knx layer test campaign ━ Run at 01:42:48 from [test/contrib/knx.uts] by UTscapy in 0.03145551681518555 └ Passed=18 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the knx layer >>> from scapy.contrib.knx import * ###### ## Test KNX Header ###### ###(001)=[passed] Header default values >>> pkt = KNX() >>> assert raw(pkt) == b'\x06\x10\x00\x00\x00\x06' ###(002)=[passed] KNX Header payload length calculation >>> pkt = KNX(service_identifier=0x0203)/KNXDescriptionRequest() >>> assert raw(pkt)[4:6] == b'\x00\x0e' ###(003)=[passed] KNX Header Guess Payload KNXSearchRequest >>> p = KNX(b'\x06\x10\x02\x01\x00\x0e\x08\x01\x00\x00\x00\x00\x00\x00') >>> assert isinstance(p.payload, KNXSearchRequest) ###(004)=[passed] KNX Header Guess Payload KNXSearchResponse >>> p = KNX(b'\x06\x10\x02\x02\x00F\x08\x01\x00\x00\x00\x00\x00\x006\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02') >>> assert isinstance(p.payload, KNXSearchResponse) ###(005)=[passed] KNX Header Guess Payload KNXDescriptionRequest >>> p = KNX(b'\x06\x10\x02\x03\x00\x0e\x08\x01\x00\x00\x00\x00\x00\x00') >>> assert isinstance(p.payload, KNXDescriptionRequest) ###(006)=[passed] KNX Header Guess Payload KNXDescriptionResponse >>> p = KNX(b'\x06\x10\x02\x04\x00>6\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02') >>> assert isinstance(p.payload, KNXDescriptionResponse) ###(007)=[passed] KNX Header Guess Payload KNXConnectRequest >>> p = KNX(b'\x06\x10\x02\x05\x00\x18\x08\x01\x00\x00\x00\x00\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\x02\x03') >>> assert isinstance(p.payload, KNXConnectRequest) ###(008)=[passed] KNX Header Guess Payload KNXConnectResponse >>> p = KNX(b'\x06\x10\x02\x06\x00\x12\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\x02\x03') >>> assert isinstance(p.payload, KNXConnectResponse) ###(009)=[passed] KNX Header Guess Payload KNXConnectionstateRequest >>> p = KNX(b'\x06\x10\x02\x07\x00\x10\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00') >>> assert isinstance(p.payload, KNXConnectionstateRequest) ###(010)=[passed] KNX Header Guess Payload KNXConnectionstateResponse >>> p = KNX(b'\x06\x10\x02\x08\x00\x08\x00\x00') >>> assert isinstance(p.payload, KNXConnectionstateResponse) ###(011)=[passed] KNX Header Guess Payload KNXDisconnectRequest >>> p = KNX(b'\x06\x10\x02\t\x00\x10\x01\x00\x08\x01\x00\x00\x00\x00\x00\x00') >>> assert isinstance(p.payload, KNXDisconnectRequest) ###(012)=[passed] KNX Header Guess Payload KNXDisconnectResponse >>> p = KNX(b'\x06\x10\x02\n\x00\x08\x00\x00') >>> assert isinstance(p.payload, KNXDisconnectResponse) ###(013)=[passed] KNX Header Guess Payload KNXConfigurationRequest >>> p = KNX(b'\x06\x10\x03\x10\x00\x15\x04\x01\x00\x00\x00\x00\xbc\xe0\x00\x00\n\x03\x01\x00\x80') >>> assert isinstance(p.payload, KNXConfigurationRequest) ###(014)=[passed] KNX Header Guess Payload KNXConfigurationACK >>> p = KNX(b'\x06\x10\x03\x11\x00\n\x04\x01\x00\x00') >>> assert isinstance(p.payload, KNXConfigurationACK) ###(015)=[passed] KNX Header Guess Payload KNXTunnelingRequest >>> p = KNX(b'\x06\x10\x04 \x00\x15\x04\x01\x00\x00\x00\x00\xbc\xe0\x00\x00\n\x03\x01\x00\x80') >>> assert isinstance(p.payload, KNXTunnelingRequest) ###(016)=[passed] KNX Header Guess Payload KNXTunnelingACK >>> p = KNX(b'\x06\x10\x04!\x00\n\x04\x01\x00\x00') >>> assert isinstance(p.payload, KNXTunnelingACK) ###### ## Test layer binding ###### ###(017)=[passed] Destination port >>> LACP unit tests ━ Run at 01:42:48 from [test/contrib/lacp.uts] by UTscapy in 0.010452508926391602 └ Passed=2 └ Failed=0 ###### ## LACP ###### ###(000)=[passed] Build & dissect LACP >>> params = dict( ... actor_system_priority=32768, ... actor_system='00:13:c4:12:0f:00', ... actor_key=13, ... actor_port_priority=32768, ... actor_port_number=22, ... actor_state=0x85, ... partner_system_priority=32768, ... partner_system='00:0e:83:16:f5:00', ... partner_key=13, ... partner_port_priority=32768, ... partner_port_number=25, ... partner_state=0x36, ... collector_max_delay=32768, ... ) >>> pkt = Ether(src="00:13:c4:12:0f:0d") / SlowProtocol() / LACP(**params) >>> s = raw(pkt) >>> raw_pkt = b'\x01\x80\xc2\x00\x00\x02\x00\x13\xc4\x12\x0f\x0d\x88\x09\x01\x01\x01\x14\x80' \ ... b'\x00\x00\x13\xc4\x12\x0f\x00\x00\x0d\x80\x00\x00\x16\x85\x00\x00\x00\x02\x14' \ ... b'\x80\x00\x00\x0e\x83\x16\xf5\x00\x00\x0d\x80\x00\x00\x19\x36\x00\x00\x00\x03' \ ... b'\x10\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \ ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \ ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \ ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> assert s == raw_pkt >>> >>> p = Ether(s) >>> assert SlowProtocol in p and LACP in p >>> assert raw(p) == raw_pkt ###(001)=[passed] Marker sanity >>> pkt = Ether(src="00:13:c4:12:0f:0d") / SlowProtocol() / MarkerProtocol() >>> pkt.show() ###[ Ethernet ]### dst = 01:80:c2:00:00:02 src = 00:13:c4:12:0f:0d type = 0x8809 ###[ SlowProtocol ]### subtype = Marker Protocol ###[ MarkerProtocol ]### version = 1 marker_type= Marker Request marker_length= 16 requester_port= 0 requester_system= None requester_transaction_id= 0 marker_reserved= terminator_type= 0 terminator_length= 0 reserved = 0 >>> s = raw(pkt) >>> p = Ether(s) >>> assert SlowProtocol in p and MarkerProtocol in p >>> assert raw(p) == s Regression tests for the ldp module ━ Run at 01:42:49 from [test/contrib/ldp.uts] by UTscapy in 0.025782108306884766 └ Passed=5 └ Failed=0 ###### ## Basic LDP test ###### ###(000)=[passed] Default build >>> load_contrib("ldp") >>> base = Ether()/IP()/UDP()/LDP() >>> pkt1 = base/LDPNotification() >>> pkt2 = base/LDPKeepAlive() >>> pkt3 = base/LDPLabelWM() >>> pkt4 = base/LDPHello() >>> pkt5 = base/LDPAddressWM() >>> pkt6 = base/LDPLabelMM() >>> >>> pkt1 = Ether(raw(pkt1)) >>> pkt2 = Ether(raw(pkt2)) >>> pkt3 = Ether(raw(pkt3)) >>> pkt4 = Ether(raw(pkt4)) >>> pkt5 = Ether(raw(pkt5)) >>> pkt6 = Ether(raw(pkt6)) >>> >>> assert LDPNotification in pkt1 >>> assert LDPKeepAlive in pkt2 >>> assert LDPLabelWM in pkt3 >>> assert LDPHello in pkt4 >>> assert LDPAddressWM in pkt5 >>> assert LDPLabelMM in pkt6 ###(001)=[passed] Basic dissection >>> pkt = Ether(b'AJH\x18\x07\xfa\xd0P\x99V\xdd\xf9\x08\x00E\x00\x006\x00\x01\x00\x00@\x11:\x96(\x9d\r\xd3\xc1\x1eq\x10\x02\x86\x02\x86\x00"5\xa1\x00\x01\x00\x16\x7f\x00\x00\x01\x00\x00\x01\x00\x00\x0c\x00\x00\x00\x00\x04\x00\x00\x04\x00\xb4\x00\x00') >>> assert LDPHello in pkt >>> assert pkt[LDP].id == "127.0.0.1" >>> assert pkt[LDPHello].params == [180, 0, 0] ###(002)=[passed] Build advanced LDPInit() >>> pkti = LDPInit(u=0, id=11, params=[180, 0, 0, 0, 0, '1.1.2.2', 0])/LDPKeepAlive() >>> assert raw(pkti) == b'\x02\x00\x00\x16\x00\x00\x00\x0b\x05\x00\x00\x0e\x00\x01\x00\xb4\x00\x00\x00\x00\x01\x01\x02\x02\x00\x00\x02\x01\x00\x04\x00\x00\x00\x00' >>> pkti = LDPInit(raw(pkti)) >>> assert pkti.params == [180, 0, 0, 0, 0, '1.1.2.2', 0] ###(003)=[passed] Build advanced LDPAddress() with LDPLabelMM() >>> pkta = LDPAddress(address=['1.1.2.2', '172.16.2.1'])/LDPLabelMM(fec=[('172.16.2.0', 31)])/LDPLabelMM(fec=[('1.1.2.2', 32)])/LDPLabelMM(fec=[('1.1.2.1', 32)]) ###(004)=[passed] Advanced dissection - complex LDP >>> load_contrib("mpls") >>> pkt = Ether(b"\xcc\x04\x04\xdc\x00\x10\xcc\x03\x04\xdc\x00\x10\x88G\x00\x01-\xfeE\xc0\x014\xfe\x84\x00\x00\xff\x06\xb5z\x01\x01\x02\x02\x01\x01\x02\x01\xe4\xe4\x02\x86\xbf\xfb'\xe4\xb9\xb3\xe4GP\x10\x0e\xb6v\x9f\x00\x00\x00\x01\x01\x08\x01\x01\x02\x02\x00\x00\x03\x00\x00\x12\x00\x00\x00\x0e\x01\x01\x00\n\x00\x01\x01\x01\x02\x02\xac\x10\x02\x01\x04\x00\x00\x18\x00\x00\x00\x0f\x01\x00\x00\x08\x02\x00\x01\x1f\xac\x10\x02\x00\x02\x00\x00\x04\x00\x00\x00\x03\x04\x00\x00\x18\x00\x00\x00\x10\x01\x00\x00\x08\x02\x00\x01 \x01\x01\x02\x02\x02\x00\x00\x04\x00\x00\x00\x03\x04\x00\x00\x18\x00\x00\x00\x11\x01\x00\x00\x08\x02\x00\x01 \x01\x01\x02\x01\x02\x00\x00\x04\x00\x00\x00\x12\x04\x00\x00\x18\x00\x00\x00\x12\x01\x00\x00\x08\x02\x00\x01 \x01\x01\x01\x02\x02\x00\x00\x04\x00\x00\x00\x13\x04\x00\x00\x18\x00\x00\x00\x13\x01\x00\x00\x08\x02\x00\x01 \x01\x01\x01\x01\x02\x00\x00\x04\x00\x00\x00\x14\x04\x00\x00\x18\x00\x00\x00\x14\x01\x00\x00\x08\x02\x00\x01\x1f\xac\x10\x01\x00\x02\x00\x00\x04\x00\x00\x00\x15\x04\x00\x00\x18\x00\x00\x00\x15\x01\x00\x00\x08\x02\x00\x01\x1f\xac\x10\x00\x00\x02\x00\x00\x04\x00\x00\x00\x16\x04\x00\x00$\x00\x00\x00\x16\x01\x00\x00\x14\x80\x80\x05\x0c\x00\x00\x00\x00\x00\x00\x00\n\x01\x04\x05\xdc\x0c\x04\x03\x02\x02\x00\x00\x04\x00\x00\x00\x10") >>> assert pkt.getlayer(LDPLabelMM, 8).fec == [('0.0.0.0', 12), ('0.0.0.0', 0), ('5.0.0.0', 4), ('2.0.0.0', 3)] LLDP test campaign ━ Run at 01:42:59 from [test/contrib/lldp.uts] by UTscapy in 10.094008207321167 └ Passed=17 └ Failed=0 ###### ## Basic layer handling ###### ###(000)=[passed] build basic LLDP frames >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/ \ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01') / \ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUSystemName(system_name='mate')/\ ... LLDPDUSystemCapabilities(telephone_available=1, router_available=1, telephone_enabled=1)/\ ... LLDPDUManagementAddress( ... management_address_subtype=LLDPDUManagementAddress.SUBTYPE_MANAGEMENT_ADDRESS_IPV4, ... management_address='1.2.3.4', ... interface_numbering_subtype=LLDPDUManagementAddress.SUBTYPE_INTERFACE_NUMBER_IF_INDEX, ... interface_number=23, ... object_id='abcd') / \ ... LLDPDUEndOfLLDPDU() >>> >>> frm = frm.build() >>> frm = Ether(frm) ###(001)=[passed] build: check length calculation (#GH3107) >>> frame = Ether(src='aa:bb:cc:dd:ee:ff', dst='11:22:33:44:55:66') / \ ... LLDPDUChassisID(subtype=0x04, id='aa:bb:cc:dd:ee:ff') / \ ... LLDPDUPortID(subtype=0x05, id='1') / \ ... LLDPDUTimeToLive(ttl=5) / \ ... LLDPDUManagementAddress(management_address_subtype=0x01, management_address=socket.inet_aton('192.168.0.10')) >>> data = b'\x11"3DUf\xaa\xbb\xcc\xdd\xee\xff\x88\xcc\x02\x07\x04\xaa\xbb\xcc\xdd\xee\xff\x04\x02\x051\x06\x02\x00\x05\x10\x0c\x05\x01\xc0\xa8\x00\n\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> assert bytes(frame) == data ###(002)=[passed] add padding if required >>> conf.contribs['LLDP'].strict_mode_disable() >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC) / \ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_INTERFACE_NAME, id='eth0') / \ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id='06:05:04:03:02:01') / \ ... LLDPDUTimeToLive() / \ ... LLDPDUEndOfLLDPDU() >>> assert len(raw(frm)) == 60 >>> assert len(raw(Ether(raw(frm))[Padding])) == 24 >>> >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC) / \ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_INTERFACE_NAME, id='eth012345678901234567890123') / \ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id='06:05:04:03:02:01') / \ ... LLDPDUTimeToLive() / \ ... LLDPDUEndOfLLDPDU() >>> assert (len(raw(frm)) == 60) >>> assert (len(raw(Ether(raw(frm))[Padding])) == 1) >>> >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC) / \ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_INTERFACE_NAME, id='eth0123456789012345678901234') / \ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id='06:05:04:03:02:01') / \ ... LLDPDUTimeToLive() / \ ... LLDPDUEndOfLLDPDU() >>> assert (len(raw(frm)) == 60) >>> try: ... Ether(raw(frm))[Padding] ... assert False ... except IndexError: ... pass ... ###(003)=[passed] Dissection: PtopoChassisIdType == chasIdPtopoGenAddr(5) >>> data = hex_bytes("0180c200000e00192fa7b28d88cc0206050101020304040d0155706c696e6b20746f205331060200780a0c53322e636973636f2e636f6d0cbe436973636f20494f5320536f6674776172652c20433335363020536f667477617265202843333536302d414456495053455256494345534b392d4d292c2056657273696f6e2031322e322834342953452c2052454c4541534520534f4654574152452028666331290a436f707972696768742028632920313938362d3230303820627920436973636f2053797374656d732c20496e632e0a436f6d70696c6564205361742030352d4a616e2d30382030303a3135206279207765696c697508134769676162697445746865726e6574302f31330e0400140004fe060080c2010001fe0900120f0103c03600100000") >>> pkt = Ether(data) >>> >>> assert pkt.family == 1 >>> assert pkt.id == "1.2.3.4" ###(004)=[passed] Advanced test: check definitions and length of complex IDs >>> pkt = Ether()/LLDPDUChassisID(id="ff:dd:ee:bb:aa:99", subtype=0x04)/LLDPDUPortID(subtype=0x03, id="aa:bb:cc:dd:ee:ff")/LLDPDUTimeToLive(ttl=120)/LLDPDUEndOfLLDPDU() >>> pkt = Ether(raw(pkt)) MAC address to reach destination not found. Using broadcast. >>> assert pkt[LLDPDUChassisID].fields_desc[2].i2s == LLDPDUChassisID.LLDP_CHASSIS_ID_TLV_SUBTYPES >>> assert pkt[LLDPDUPortID].fields_desc[2].i2s == LLDPDUPortID.LLDP_PORT_ID_TLV_SUBTYPES >>> assert pkt[LLDPDUChassisID]._length == 7 >>> assert pkt[LLDPDUPortID]._length == 7 ###(005)=[passed] Network families / addresses in IDs >>> pkt = Ether()/LLDPDUChassisID(subtype=0x05, family=1, id="1.1.1.1")/LLDPDUPortID(subtype=0x04, family=1, id="2.2.2.2")/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() >>> pkt = Ether(raw(pkt)) MAC address to reach destination not found. Using broadcast. >>> assert pkt[LLDPDUChassisID].id == "1.1.1.1" >>> assert pkt[LLDPDUPortID].id == "2.2.2.2" >>> >>> pkt = Ether(hex_bytes(b'ffffffffffff0242ac11000288cc02060501010101010406040102020202060200140000')) >>> assert pkt[LLDPDUChassisID].id == "1.1.1.1" >>> assert pkt[LLDPDUPortID].id == "2.2.2.2" >>> >>> try: ... pkt = Ether()/LLDPDUChassisID(subtype=0x05, family=1, id="2001::abcd")/LLDPDUPortID()/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() ... assert False ... except (socket.gaierror, AssertionError): ... pass ... >>> try: ... pkt = Ether()/LLDPDUChassisID()/LLDPDUPortID(subtype=0x04, family=1, id="2001::abcd")/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() ... assert False ... except (socket.gaierror, AssertionError): ... pass ... >>> >>> pkt = Ether()/LLDPDUChassisID(subtype=0x05, family=2, id="1111::2222")/LLDPDUPortID(subtype=0x04, family=2, id="2001::abcd")/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() >>> pkt = Ether(raw(pkt)) more MAC address to reach destination not found. Using broadcast. >>> assert pkt[LLDPDUChassisID].id == "1111::2222" >>> assert pkt[LLDPDUPortID].id == "2001::abcd" >>> >>> pkt = Ether(hex_bytes(b'ffffffffffff0242ac11000288cc0212050211110000000000000000000000002222041204022001000000000000000000000000abcd060200140000')) >>> assert pkt[LLDPDUChassisID].id == "1111::2222" >>> assert pkt[LLDPDUPortID].id == "2001::abcd" >>> >>> try: ... pkt = Ether()/LLDPDUChassisID(subtype=0x05, family=2, id="1.1.1.1")/LLDPDUPortID()/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() ... assert False ... except (socket.gaierror, AssertionError): ... pass ... >>> try: ... pkt = Ether()/LLDPDUChassisID()/LLDPDUPortID(subtype=0x04, family=2, id="1.1.1.1")/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() ... assert False ... except (socket.gaierror, AssertionError): ... pass ... >>> >>> pkt = Ether()/LLDPDUChassisID(subtype=0x05, id=b"\x00\x07\xab")/LLDPDUPortID(subtype=0x04, id=b"\x07\xaa\xbb\xcc")/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() >>> pkt = Ether(raw(pkt)) >>> assert pkt[LLDPDUChassisID].id == b"\x00\x07\xab" >>> assert pkt[LLDPDUPortID].id == b"\x07\xaa\xbb\xcc" >>> >>> pkt = Ether(hex_bytes(b'ffffffffffff0242ac11000288cc020505000007ab0406040007aabbcc060200140000')) >>> assert pkt[LLDPDUChassisID].id == b"\x00\x07\xab" >>> assert pkt[LLDPDUPortID].id == b"\x07\xaa\xbb\xcc" ###### ## strict mode handling - build ###### ###(006)=[passed] basic frame structure >>> conf.contribs['LLDP'].strict_mode_enable() >>> >>> try: ... frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU(_length=8) ... frm.build() ... assert False ... except LLDPInvalidLengthField: ... pass ... >>> try: ... frm = Ether()/LLDPDUChassisID()/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() ... frm.build() ... assert False ... except LLDPInvalidLengthField: ... pass ... >>> try: ... frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUManagementAddress()/LLDPDUEndOfLLDPDU() ... frm.build() ... assert False ... except LLDPInvalidLengthField: ... pass ... ###### ## strict mode handling - dissect ###### ###(007)=[passed] basic frame structure >>> conf.contribs['LLDP'].strict_mode_enable() >>> try: ... frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() ... Ether(frm.build()) ... assert False ... except LLDPInvalidFrameStructure: ... pass ... >>> try: ... frm = Ether() / LLDPDUPortID(id='42') / LLDPDUChassisID(id='slartibart') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() ... Ether(frm.build()) ... assert False ... except LLDPInvalidFrameStructure: ... pass ... >>> try: ... frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUPortID(id='23') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() ... Ether(frm.build()) ... assert False ... except LLDPInvalidFrameStructure: ... pass ... >>> try: ... frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / \ ... LLDPDUPortID(id='23') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() ... Ether(frm.build()) ... assert False ... except LLDPInvalidFrameStructure: ... pass ... >>> conf.contribs['LLDP'].strict_mode_disable() >>> frm = Ether()/LLDPDUChassisID()/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU() >>> frm = Ether(frm.build()) ###(008)=[passed] length fields / value sizes checks >>> conf.contribs['LLDP'].strict_mode_enable() >>> try: ... frm = Ether() / LLDPDUChassisID() / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() ... Ether(frm.build()) ... assert False ... except LLDPInvalidLengthField: ... pass ... >>> try: ... frm = Ether()/LLDPDUChassisID(id='slartibart')/LLDPDUPortID(id='42')/LLDPDUTimeToLive()/LLDPDUEndOfLLDPDU(_length=8) ... Ether(frm.build()) ... assert False ... except LLDPInvalidLengthField: ... pass ... >>> try: ... frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUManagementAddress() / LLDPDUEndOfLLDPDU() ... Ether(frm.build()) ... assert False ... except LLDPInvalidLengthField: ... pass ... >>> conf.contribs['LLDP'].strict_mode_disable() >>> >>> frm = Ether() / LLDPDUChassisID(id='slartibart') / LLDPDUPortID(id='42') / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU() >>> frm = Ether(frm.build()) >>> >>> frm = Ether() / LLDPDUChassisID() / LLDPDUPortID() / LLDPDUTimeToLive() / LLDPDUEndOfLLDPDU(_length=8) >>> frm = Ether(frm.build()) ###(009)=[passed] test attribute values >>> conf.contribs['LLDP'].strict_mode_enable() >>> >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/ \ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id='06:05:04:03:02:01') / \ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id='01:02:03:04:05:06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUSystemName(system_name='things will')/\ ... LLDPDUSystemCapabilities(telephone_available=1, ... router_available=1, ... telephone_enabled=1, ... router_enabled=1)/\ ... LLDPDUManagementAddress( ... management_address_subtype=LLDPDUManagementAddress.SUBTYPE_MANAGEMENT_ADDRESS_IPV4, ... management_address='1.2.3.4', ... interface_numbering_subtype=LLDPDUManagementAddress.SUBTYPE_INTERFACE_NUMBER_IF_INDEX, ... interface_number=23, ... object_id='burn') / \ ... LLDPDUSystemDescription(description='without tests.') / \ ... LLDPDUPortDescription(description='always!') / \ ... LLDPDUEndOfLLDPDU() >>> >>> frm = Ether(frm.build()) >>> >>> assert frm[LLDPDUChassisID].id == '06:05:04:03:02:01' >>> assert frm[LLDPDUPortID].id == '01:02:03:04:05:06' >>> sys_capabilities = frm[LLDPDUSystemCapabilities] >>> assert sys_capabilities.reserved_5_available == 0 >>> assert sys_capabilities.reserved_4_available == 0 >>> assert sys_capabilities.reserved_3_available == 0 >>> assert sys_capabilities.reserved_2_available == 0 >>> assert sys_capabilities.reserved_1_available == 0 >>> assert sys_capabilities.two_port_mac_relay_available == 0 >>> assert sys_capabilities.s_vlan_component_available == 0 >>> assert sys_capabilities.c_vlan_component_available == 0 >>> assert sys_capabilities.station_only_available == 0 >>> assert sys_capabilities.docsis_cable_device_available == 0 >>> assert sys_capabilities.telephone_available == 1 >>> assert sys_capabilities.router_available == 1 >>> assert sys_capabilities.wlan_access_point_available == 0 >>> assert sys_capabilities.mac_bridge_available == 0 >>> assert sys_capabilities.repeater_available == 0 >>> assert sys_capabilities.other_available == 0 >>> assert sys_capabilities.reserved_5_enabled == 0 >>> assert sys_capabilities.reserved_4_enabled == 0 >>> assert sys_capabilities.reserved_3_enabled == 0 >>> assert sys_capabilities.reserved_2_enabled == 0 >>> assert sys_capabilities.reserved_1_enabled == 0 >>> assert sys_capabilities.two_port_mac_relay_enabled == 0 >>> assert sys_capabilities.s_vlan_component_enabled == 0 >>> assert sys_capabilities.c_vlan_component_enabled == 0 >>> assert sys_capabilities.station_only_enabled == 0 >>> assert sys_capabilities.docsis_cable_device_enabled == 0 >>> assert sys_capabilities.telephone_enabled == 1 >>> assert sys_capabilities.router_enabled == 1 >>> assert sys_capabilities.wlan_access_point_enabled == 0 >>> assert sys_capabilities.mac_bridge_enabled == 0 >>> assert sys_capabilities.repeater_enabled == 0 >>> assert sys_capabilities.other_enabled == 0 >>> assert frm[LLDPDUManagementAddress].management_address == b'1.2.3.4' >>> assert frm[LLDPDUSystemName].system_name == b'things will' >>> assert frm[LLDPDUManagementAddress].object_id == b'burn' >>> assert frm[LLDPDUSystemDescription].description == b'without tests.' >>> assert frm[LLDPDUPortDescription].description == b'always!' ###### ## organisation specific layers ###### ###(010)=[passed] ThreeBytesEnumField tests >>> three_b_enum_field = ThreeBytesEnumField('test', 0x00, ... { ... 0x0e: 'fourteen', ... 0x00: 'zero', ... 0x5566: 'five-six', ... 0x0e0000: 'fourteen-zero-zero', ... 0x0e0100: 'fourteen-one-zero', ... 0x112233: '1#2#3' ... }) >>> >>> assert three_b_enum_field.i2repr(None, 0) == 'zero' >>> assert three_b_enum_field.i2repr(None, 0x0e) == 'fourteen' >>> assert three_b_enum_field.i2repr(None, 0x5566) == 'five-six' >>> assert three_b_enum_field.i2repr(None, 0x112233) == '1#2#3' >>> assert three_b_enum_field.i2repr(None, 0x0e0000) == 'fourteen-zero-zero' >>> assert three_b_enum_field.i2repr(None, 0x0e0100) == 'fourteen-one-zero' >>> assert three_b_enum_field.i2repr(None, 0x01) == '1' >>> assert three_b_enum_field.i2repr(None, 0x49763) == '300899' ###(011)=[passed] LLDPDUGenericOrganisationSpecific tests >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/\ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01')/\ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUGenericOrganisationSpecific(org_code=LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_PNO, ... subtype=0x42, ... data=b'FooBar'*5 ... )/\ ... LLDPDUEndOfLLDPDU() >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> org_spec_layer = frm[LLDPDUGenericOrganisationSpecific] >>> assert org_spec_layer >>> assert org_spec_layer._type == 127 >>> assert org_spec_layer.org_code == LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_PNO >>> assert org_spec_layer.subtype == 0x42 >>> assert org_spec_layer._length == 34 >>> >>> l="A" * 24 >>> c=LLDPDUChassisID.SUBTYPE_CHASSIS_COMPONENT >>> p=LLDPDUPortID.SUBTYPE_MAC_ADDRESS >>> frm = Ether(dst=LLDP_NEAREST_BRIDGE_MAC)/ \ ... LLDPDUChassisID(subtype=c, id=l)/ \ ... LLDPDUPortID(subtype=p, id=l)/ \ ... LLDPDUTimeToLive(ttl=2)/ \ ... LLDPDUEndOfLLDPDU() >>> >>> try: ... frm = frm.build() ... except: ... assert False ... ###### ## Power via MDI ###### ###(012)=[passed] Define check_tshark function >>> def check_tshark(pkt, frame_type, selector): ... import tempfile, os ... fd, pcapfilename = tempfile.mkstemp() ... wrpcap(pcapfilename, pkt) ... rv = tcpdump(pcapfilename, prog=conf.prog.tshark, getfd=True, ... args=['-Y', frame_type, '-T', 'fields', '-e', selector], dump=True, wait=True) ... os.close(fd) ... os.unlink(pcapfilename) ... return rv.decode("utf8").strip() ... ###(013)=[passed] Power via MDI tests >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/\ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01')/\ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUGenericOrganisationSpecific(org_code=LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_PNO, ... subtype=0x42, ... data=b'FooBar'*5 ... )/\ ... LLDPDUPowerViaMDI(MDI_power_support='PSE MDI power enabled+PSE MDI power supported', ... PSE_power_pair='alt B', ... power_class='class 3')/\ ... LLDPDUEndOfLLDPDU() >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> poe_layer = frm[LLDPDUPowerViaMDI] >>> assert poe_layer >>> assert poe_layer._type == 127 >>> assert int(check_tshark(frm, "lldp", "lldp.tlv.type").split(',')[-2], 0) == 127 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.org_code == LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_IEEE_802_3 >>> assert int(check_tshark(frm, "lldp", "lldp.orgtlv.oui").split(',')[-1], 0) == 4623 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.subtype == 2 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.subtype"), 0) == 0x02 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer._length == 7 >>> assert int(check_tshark(frm, "lldp", "lldp.tlv.len").split(',')[-2], 0) == 7 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.MDI_power_support == 6 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_support"), 0) == 6 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PSE_power_pair == 2 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_pse_pair"), 0) == 2 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_class == 4 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_class"), 0) == 4 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> >>> >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/\ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01')/\ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUGenericOrganisationSpecific(org_code=LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_PNO, ... subtype=0x42, ... data=b'FooBar'*5 ... ) >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDI(_length=8)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidLengthField: ... pass ... ###(014)=[passed] Power via MDI with DDL classification extension tests >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/\ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01')/\ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUGenericOrganisationSpecific(org_code=LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_PNO, ... subtype=0x42, ... data=b'FooBar'*5 ... )/\ ... LLDPDUPowerViaMDIDDL(MDI_power_support='PSE pairs controlled+PSE MDI power enabled', ... PSE_power_pair='alt A', ... power_class='class 4 and above', ... power_type_no='type 2', ... power_type_dir='PSE', ... power_source='backup source', ... power_prio='high', ... PD_requested_power=2.21111, ... PSE_allocated_power=1.521212121)/\ ... LLDPDUEndOfLLDPDU() >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> poe_layer = frm[LLDPDUPowerViaMDIDDL] >>> assert poe_layer >>> assert poe_layer._type == 127 >>> assert int(check_tshark(frm, "lldp", "lldp.tlv.type").split(',')[-2], 0) == 127 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.org_code == LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_IEEE_802_3 >>> assert int(check_tshark(frm, "lldp", "lldp.orgtlv.oui").split(',')[-1], 0) == 4623 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.subtype == 2 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.subtype"), 0) == 0x02 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer._length == 12 >>> assert int(check_tshark(frm, "lldp", "lldp.tlv.len").split(',')[-2], 0) == 12 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.MDI_power_support == 12 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_support"), 0) == 12 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PSE_power_pair == 1 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_pse_pair"), 0) == 1 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_class == 5 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_class"), 0) == 5 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_type_no == 0 >>> assert poe_layer.power_type_dir == 0 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_type"), 0) == 0 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_source == 0b10 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_source"), 0) == 0b10 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_prio == 0b10 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_priority"), 0) == 0b10 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PD_requested_power == 2.2 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_pde_requested"), 0) == 22 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PSE_allocated_power == 1.5 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_pse_allocated"), 0) == 15 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> >>> >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/\ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01')/\ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUGenericOrganisationSpecific(org_code=LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_PNO, ... subtype=0x42, ... data=b'FooBar'*5 ... ) >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIDDL(_length=8)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidLengthField: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIDDL(PD_requested_power=100)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIDDL(PSE_allocated_power=100)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... ###(015)=[passed] Power via MDI with DDL classification and Type 3 and 4 extensions tests >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/\ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01')/\ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUGenericOrganisationSpecific(org_code=LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_PNO, ... subtype=0x42, ... data=b'FooBar'*5 ... )/\ ... LLDPDUPowerViaMDIType34(MDI_power_support='port class PSE+PSE pairs controlled+PSE MDI power enabled', ... PSE_power_pair='alt B', ... power_class='class 2', ... power_type_no='type 1', ... power_type_dir='PD', ... power_source='PSE and local', ... PD_4PID='not supported', ... power_prio='low', ... PD_requested_power=12.21111, ... PSE_allocated_power=11.521212121, ... PD_requested_power_mode_A=2.3, ... PD_requested_power_mode_B=3.3, ... PD_allocated_power_alt_A=3.1, ... PD_allocated_power_alt_B=0.5, ... PSE_powering_status='4-pair powering single-signature PD', ... PD_powered_status='powered single-signature PD', ... PD_power_pair_ext='both alts', ... dual_signature_class_mode_A='class 4', ... dual_signature_class_mode_B='class 2', ... power_class_ext='dual-signature pd', ... power_type_ext='type 4 single-signature PD', ... PD_load='dual-signature and electrically isolated', ... PSE_max_available_power=33.333, ... autoclass='autoclass completed+autoclass request', ... power_down_req='power down', ... power_down_time=123)/\ ... LLDPDUEndOfLLDPDU() >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> poe_layer = frm[LLDPDUPowerViaMDIType34] >>> assert poe_layer >>> assert poe_layer._type == 127 >>> assert int(check_tshark(frm, "lldp", "lldp.tlv.type").split(',')[-2], 0) == 127 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.org_code == LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_IEEE_802_3 >>> assert int(check_tshark(frm, "lldp", "lldp.orgtlv.oui").split(',')[-1], 0) == 4623 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.subtype == 2 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.subtype"), 0) == 0x02 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer._length == 29 >>> assert int(check_tshark(frm, "lldp", "lldp.tlv.len").split(',')[-2], 0) == 29 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.MDI_power_support == 13 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_support"), 0) == 13 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PSE_power_pair == 2 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_pse_pair"), 0) == 2 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PD_4PID == 0 >>> assert poe_layer.power_class == 3 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_class"), 0) == 3 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_type_no == 1 >>> assert poe_layer.power_type_dir == 1 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_type"), 0) == 3 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_source == 0b11 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_source"), 0) == 0b11 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_prio == 0b11 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_power_priority"), 0) == 0b11 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PD_requested_power == 12.2 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_pde_requested"), 0) == 122 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PSE_allocated_power == 11.5 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.mdi_pse_allocated"), 0) == 115 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PD_requested_power_mode_A == 2.3 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_ds_pd_requested_power_value_mode_a"), 0) == 23 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PD_requested_power_mode_B == 3.3 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_ds_pd_requested_power_value_mode_b"), 0) == 33 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PD_allocated_power_alt_A == 3.1 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_ds_pse_allocated_power_value_alt_a"), 0) == 31 /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10099 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PD_allocated_power_alt_B == 0.5 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_ds_pse_allocated_power_value_alt_b"), 0) == 5 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PSE_powering_status == 2 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_pse_powering_status"), 0) == 2 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PD_powered_status == 1 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_pd_powered_status"), 0) == 1 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PD_power_pair_ext == 3 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_pse_power_pairs_ext"), 0) == 3 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.dual_signature_class_mode_A == 4 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_ds_pwr_class_ext_a"), 0) == 4 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.dual_signature_class_mode_B == 2 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_ds_pwr_class_ext_b"), 0) == 2 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_class_ext == 15 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_pwr_class_ext_"), 0) == 15 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_type_ext == 4 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_power_type_ext"), 0) == 4 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.PD_load == 1 >>> assert poe_layer.PSE_max_available_power == 33.3 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_pse_maximum_available_power_value"), 0) == 333 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.autoclass == 3 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_autoclass"), 0) == 3 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_down_req == 0x1d >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_power_down_request"), 0) == 0x1d :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> assert poe_layer.power_down_time == 123 >>> assert int(check_tshark(frm, "lldp", "lldp.ieee.802_3.bt_power_down_time"), 0) == 123 :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> >>> >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/\ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01')/\ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUGenericOrganisationSpecific(org_code=LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_PNO, ... subtype=0x42, ... data=b'FooBar'*5 ... ) >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIType34(_length=8)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidLengthField: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIType34(PD_requested_power=100)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIType34(PSE_allocated_power=100)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIType34(PD_requested_power_mode_A=50)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIType34(PD_requested_power_mode_B=50)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIType34(PD_allocated_power_alt_A=50)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIType34(PD_allocated_power_alt_B=50)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIType34(PSE_max_available_power=100)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIType34(power_down_time=(1<<18))/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... ###(016)=[passed] Power via MDI measurements tests >>> import struct >>> >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/\ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01')/\ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUGenericOrganisationSpecific(org_code=LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_PNO, ... subtype=0x42, ... data=b'FooBar'*5 ... )/\ ... LLDPDUPowerViaMDIMeasure(support='power+current', ... source='mode B', ... request='energy+voltage+current', ... valid='power', ... voltage_uncertainty=52.25, ... current_uncertainty=3.211, ... power_uncertainty=140, ... energy_uncertainty=2600, ... voltage_measurement=22.123, ... current_measurement=3.2121, ... power_measurement=123.12, ... energy_measurement=21123400, ... power_price_index='not available')/\ ... LLDPDUEndOfLLDPDU() >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> poe_layer = frm[LLDPDUPowerViaMDIMeasure] >>> poe_layer_raw = raw(poe_layer) >>> >>> >>> assert poe_layer >>> assert poe_layer._type == 127 >>> assert poe_layer.org_code == LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_IEEE_802_3 >>> assert poe_layer.subtype == 8 >>> assert poe_layer._length == 26 >>> assert poe_layer.support == 0b0110 >>> assert poe_layer.source == 0b10 >>> assert poe_layer.request == 0b1101 >>> assert poe_layer.valid == 0b0010 >>> assert poe_layer.voltage_uncertainty == 52.25 >>> assert struct.unpack(">H", poe_layer_raw[8:10])[0] == 52250 >>> assert poe_layer.current_uncertainty == 3.211 >>> assert struct.unpack(">H", poe_layer_raw[10:12])[0] == 32110 >>> assert poe_layer.power_uncertainty == 140 >>> assert struct.unpack(">H", poe_layer_raw[12:14])[0] == 14000 >>> assert poe_layer.energy_uncertainty == 2600 >>> assert struct.unpack(">H", poe_layer_raw[14:16])[0] == 26 >>> assert poe_layer.voltage_measurement == 22.123 >>> assert struct.unpack(">H", poe_layer_raw[16:18])[0] == 22123 >>> assert poe_layer.current_measurement == 3.2121 >>> assert struct.unpack(">H", poe_layer_raw[18:20])[0] == 32121 >>> assert poe_layer.power_measurement == 123.12 >>> assert struct.unpack(">H", poe_layer_raw[20:22])[0] == 12312 >>> assert poe_layer.energy_measurement == 21123400 >>> assert struct.unpack(">I", poe_layer_raw[22:26])[0] == 211234 >>> assert poe_layer.power_price_index == 0xffff >>> >>> frm = Ether(src='01:01:01:01:01:01', dst=LLDP_NEAREST_BRIDGE_MAC)/\ ... LLDPDUChassisID(subtype=LLDPDUChassisID.SUBTYPE_MAC_ADDRESS, id=b'\x06\x05\x04\x03\x02\x01')/\ ... LLDPDUPortID(subtype=LLDPDUPortID.SUBTYPE_MAC_ADDRESS, id=b'\x01\x02\x03\x04\x05\x06')/\ ... LLDPDUTimeToLive()/\ ... LLDPDUGenericOrganisationSpecific(org_code=LLDPDUGenericOrganisationSpecific.ORG_UNIQUE_CODE_PNO, ... subtype=0x42, ... data=b'FooBar'*5 ... ) >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIMeasure(_length=8)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidLengthField: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIMeasure(voltage_uncertainty=500)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIMeasure(voltage_measurement=500)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIMeasure(current_uncertainty=500)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIMeasure(current_measurement=500)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIMeasure(energy_uncertainty=66000000)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIMeasure(power_uncertainty=5000)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIMeasure(power_measurement=5000)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... >>> try: ... Ether((frm/ ... LLDPDUPowerViaMDIMeasure(power_price_index=150)/ ... LLDPDUEndOfLLDPDU()).build()) ... assert False ... except LLDPInvalidFieldValue: ... pass ... Regression tests for Scapy ━ Run at 01:42:59 from [test/contrib/loraphy2wan.uts] by UTscapy in 0.01908731460571289 └ Passed=6 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the loraphy2wan layer >>> from scapy.contrib.loraphy2wan import * >>> from scapy.compat import raw ###### ## Basic tests ###### Those test are here mainly to check nothing has been broken ###(001)=[passed] Packet decoding >>> p = b'\x00\x00\x00\x00lovecafemeeetoo\x00iiS\x02LI' >>> pkt = LoRa(p) >>> assert pkt.Join_Request_Field[0].DevEUI == b'meeetoo\x00' >>> assert pkt.Join_Request_Field[0].DevNonce == 26985 >>> >>> p = b'\x0f0P@\xad\x15\x00`\x80\x06\x00\t\xca\xfe\x0c\x1d\x8d\x04\\\xb5' >>> pkt = LoRa(p) >>> assert pkt.MType == 2 >>> assert pkt.DataPayload == b'\xca\xfe' >>> assert pkt.FCnt == 6 >>> assert pkt.FPort == 9 >>> assert pkt.FCtrl[0].ADR == 1 >>> assert pkt.DevAddr[0].NwkID == 0xad >>> assert pkt.DevAddr[0].NwkAddr == 0x600015 >>> >>> p = b'\x0f0P\x80\xad\x15\x00`\x00\x01\x00\t\xca\xfe:\x98\x89|\x8f\xd4' >>> pkt = LoRa(p) >>> assert pkt.MType == 4 ###(002)=[passed] Decoding an encrypted JA packet >>> LoRa.encrypted = True >>> p = b'\x00\x00\x00 \x086\xe2\x87\xa9\x80\\\xb7\xee\x9e_\xff|\x9e\xe9z' >>> pkt = LoRa(p) >>> assert pkt.Join_Accept_Encrypted == b'\x086\xe2\x87\xa9\x80\\\xb7\xee\x9e_\xff|\x9e\xe9z' ###(003)=[passed] Packet crafting: generating an unencrypted JA frame >>> ja = Join_Accept() >>> ja.JoinAppNonce=0x6fe14a >>> ja.NetID = 0x10203 >>> ja.DevAddr = 0x68e8cb1 >>> assert raw(ja) == b'J\xe1o\x03\x02\x01\xb1\x8c\x8e\x06\x00\x00' ###(004)=[passed] Generating an unencrypted LoRa JA packet >>> LoRa.encrypted = False >>> pkt = LoRa(MType=0b001) >>> pkt.Join_Accept_Field = [ja] >>> assert raw(pkt) == b'\x00\x00\x00 J\xe1o\x03\x02\x01\xb1\x8c\x8e\x06\x00\x00\x00\x00\x00\x00' ###(005)=[passed] Parsing Piggy back commands >>> p = b'\r0\xc0\x80\xad\x15\x00`\x01\x01\x00\x02\xc0\xe3N\xb7\xc7\xae' >>> pkt = LoRa(p) >>> assert pkt.FOpts_up[0].CID == 2 Licklider Transmission Protocol tests ━ Run at 01:42:59 from [test/contrib/ltp.uts] by UTscapy in 0.013017416000366211 └ Passed=1 └ Failed=0 ###### ## Licklider Transmission Protocol (LTP) basic tests ###### ###(000)=[passed] Build packets & dissect >>> load_contrib("ltp") >>> pkt = Ether(src="aa:aa:aa:aa:aa:aa", dst="bb:bb:bb:bb:bb:bb")/IP(src="192.168.0.1", dst="192.168.0.2")/UDP()/LTP(flags=8,\ ... SessionOriginator=2, ... SessionNumber=113, ... ReportCheckpointSerialNo=12, ... ReportUpperBound=0, ... ReportLowerBound=5, ... ReportReceptionClaims=[ ... LTPReceptionClaim(ReceptionClaimOffset=1, ReceptionClaimLength=4), ... LTPReceptionClaim(ReceptionClaimOffset=2, ReceptionClaimLength=3), ... ], ... HeaderExtensions=[ ... LTPex(ExTag=1, ExData=b"\x00"), ... ], ... TrailerExtensions=[ ... LTPex(ExTag=0, ExData=b"\x01"), ... LTPex(ExTag=1, ExData=b"\x02"), ... ]) >>> >>> pkt = Ether(raw(pkt)) >>> assert LTP in pkt >>> assert pkt[LTP].ReportLowerBound == 5 >>> assert pkt[LTP].ReportCheckpointSerialNo == 12 >>> assert pkt[LTP].ReportReceptionClaims[0].ReceptionClaimLength == 4 >>> assert pkt[LTP].ReportReceptionClaims[1].ReceptionClaimOffset == 2 >>> assert pkt[LTP].HeaderExtensions[0].ExTag == 1 >>> assert pkt[LTP].HeaderExtensions[0].ExData == b"\x00" >>> >>> s = pkt.summary() >>> s 'Ether / IP / UDP 192.168.0.1:ltp_deepspace > 192.168.0.2:ltp_deepspace / LTP 113' >>> assert s.replace("ltp_deepspace", "1113") == 'Ether / IP / UDP 192.168.0.1:1113 > 192.168.0.2:1113 / LTP 113' MACControl test campaign ━ Run at 01:42:59 from [test/contrib/mac_control.uts] by UTscapy in 0.049575090408325195 └ Passed=12 └ Failed=0 ###### ## Basic layer handling ###### ###(000)=[passed] pause frame >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ ... MACControlPause(pause_time=0x1234) >>> >>> frm = Ether(frm.do_build()) >>> >>> pause_layer = frm[MACControlPause] >>> assert pause_layer.pause_time == 0x1234 >>> assert pause_layer.get_pause_time(ETHER_SPEED_MBIT_10) == 0.238592 ###(001)=[passed] gate frame >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ ... MACControlGate(timestamp=0x12345678) >>> frm = Ether(frm.do_build()) >>> >>> gate_layer = frm[MACControlGate] >>> assert gate_layer.timestamp == 0x12345678 ###(002)=[passed] report frame >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ ... MACControlReport(timestamp=0x12345678, pending_grants=0x23) >>> >>> frm = Ether(frm.do_build()) >>> >>> report_layer = frm[MACControlReport] >>> >>> assert report_layer.timestamp == 0x12345678 >>> assert report_layer.pending_grants == 0x23 ###(003)=[passed] report frame flags (generic for all other register frame types) >>> for flag in MACControl.REGISTER_FLAGS: ... frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \ ... MACControlReport(timestamp=0x12345678, flags=flag) ... frm = Ether(frm.do_build()) ... report_layer = frm[MACControlReport] ... assert report_layer.flags == flag ... ###(004)=[passed] register_req frame >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ ... MACControlRegisterReq(timestamp=0x87654321, ... echoed_pending_grants=0x12, ... sync_time=0x3344, ... assigned_port=0x7766) >>> >>> frm = Ether(frm.do_build()) >>> register_req_layer = frm[MACControlRegisterReq] >>> >>> assert register_req_layer.timestamp == 0x87654321 >>> assert (register_req_layer.echoed_pending_grants == 0x12) >>> assert (register_req_layer.sync_time == 0x3344) >>> assert (register_req_layer.assigned_port == 0x7766) ###(005)=[passed] register frame >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ ... MACControlRegister(timestamp=0x11223344, ... echoed_assigned_port=0x2277, ... echoed_sync_time=0x3399) >>> >>> frm = Ether(frm.do_build()) >>> register_layer = frm[MACControlRegister] >>> assert register_layer.timestamp == 0x11223344 >>> assert register_layer.echoed_assigned_port == 0x2277 >>> assert register_layer.echoed_sync_time == 0x3399 ###(006)=[passed] register_ack frame >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/\ ... MACControlRegisterAck(timestamp=0x11223344, ... echoed_assigned_port=0x2277, ... echoed_sync_time=0x3399) >>> >>> frm = Ether(frm.do_build()) >>> register_ack_layer = frm[MACControlRegisterAck] >>> assert register_ack_layer.timestamp == 0x11223344 >>> assert register_ack_layer.echoed_assigned_port == 0x2277 >>> assert register_ack_layer.echoed_sync_time == 0x3399 ###(007)=[passed] class based flow control frame >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC)/ \ ... MACControlClassBasedFlowControl(c0_enabled=1, c0_pause_time=0x4321, ... c5_enabled=1, c5_pause_time=0x1234) >>> >>> frm = Ether(frm.do_build()) >>> cbfc_layer = frm[MACControlClassBasedFlowControl] >>> assert cbfc_layer.c0_enabled >>> assert cbfc_layer.c0_pause_time == 0x4321 >>> assert cbfc_layer.c5_enabled >>> assert cbfc_layer.c5_pause_time == 0x1234 >>> assert not cbfc_layer.c1_enabled >>> assert cbfc_layer.c1_pause_time == 0 >>> assert not cbfc_layer.c7_enabled >>> assert cbfc_layer.c7_pause_time == 0 >>> assert cbfc_layer._reserved == 0 ###### ## test padding ###### ###(008)=[passed] naked frame >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \ ... MACControlRegisterAck(timestamp=0x12345678) >>> >>> frm = frm.do_build() >>> assert len(frm) == 60 ###(009)=[passed] single vlan tag >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \ ... Dot1Q(vlan=42) / \ ... MACControlRegisterAck(timestamp=0x12345678) >>> >>> frm = frm.do_build() >>> assert len(frm) == 60 ###(010)=[passed] QinQ >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \ ... Dot1Q(vlan=42) / \ ... Dot1Q(vlan=42) / \ ... MACControlRegisterAck(timestamp=0x12345678) >>> >>> frm = frm.do_build() >>> assert len(frm) == 60 ###(011)=[passed] hand craftet payload (disabled auto padding) >>> frm = Ether(src='00:01:01:01:01:01', dst=MACControl.DEFAULT_DST_MAC) / \ ... MACControlRegisterAck(timestamp=0x12345678) / \ ... Raw(b'may pass devices') >>> >>> frm = Ether(frm.do_build()) >>> raw_layer = frm[Raw] >>> assert raw_layer.load == b'may pass devices' >>> assert len(frm) < 64 Test campaign ━ Run at 01:42:59 from [test/contrib/macsec.uts] by UTscapy in 0.2537541389465332 └ Passed=33 └ Failed=0 ###### ## MACsec ###### ###(000)=[passed] MACsec - basic encap - encrypted >>> sa = MACsecSA(sci=b'\x52\x54\x00\x13\x01\x56\x00\x01', an=0, pn=100, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=1, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/IP(src='192.168.0.1', dst='192.168.0.2')/ICMP(type='echo-request')/"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" >>> m = sa.encap(p) >>> assert m.type == ETH_P_MACSEC >>> assert m[MACsec].type == ETH_P_IP >>> assert len(m) == len(p) + 16 >>> assert m[MACsec].AN == 0 >>> assert m[MACsec].PN == 100 >>> assert m[MACsec].SL == 0 >>> assert m[MACsec].SC >>> assert m[MACsec].E >>> assert m[MACsec].C >>> assert m[MACsec].SCI == b'\x52\x54\x00\x13\x01\x56\x00\x01' >>> assert m[MACsec].mysummary() == r"AN=0, PN=100, SCI=b'RT\x00\x13\x01V\x00\x01', IPv4" ###(001)=[passed] MACsec - basic encryption - encrypted >>> sa = MACsecSA(sci=b'\x52\x54\x00\x13\x01\x56\x00\x01', an=0, pn=100, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=1, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/IP(src='192.168.0.1', dst='192.168.0.2')/ICMP(type='echo-request')/"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" >>> m = sa.encap(p) >>> e = sa.encrypt(m) >>> assert e.type == ETH_P_MACSEC >>> assert e[MACsec].type == None >>> assert len(e) == len(p) + 16 + 16 >>> assert e[MACsec].AN == 0 >>> assert e[MACsec].PN == 100 >>> assert e[MACsec].SL == 0 >>> assert e[MACsec].SC >>> assert e[MACsec].E >>> assert e[MACsec].C >>> assert e[MACsec].SCI == b'\x52\x54\x00\x13\x01\x56\x00\x01' ###(002)=[passed] MACsec - basic decryption - encrypted >>> sa = MACsecSA(sci=b'\x52\x54\x00\x13\x01\x56\x00\x01', an=0, pn=100, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=1, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/IP(src='192.168.0.1', dst='192.168.0.2')/ICMP(type='echo-request')/"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" >>> m = sa.encap(p) >>> e = sa.encrypt(m) >>> d = sa.decrypt(e) >>> assert d.type == ETH_P_MACSEC >>> assert d[MACsec].type == ETH_P_IP >>> assert len(d) == len(m) >>> assert d[MACsec].AN == 0 >>> assert d[MACsec].PN == 100 >>> assert d[MACsec].SL == 0 >>> assert d[MACsec].SC >>> assert d[MACsec].E >>> assert d[MACsec].C >>> assert d[MACsec].SCI == b'\x52\x54\x00\x13\x01\x56\x00\x01' >>> assert raw(d) == raw(m) ###(003)=[passed] MACsec - basic decap - decrypted >>> sa = MACsecSA(sci=b'\x52\x54\x00\x13\x01\x56\x00\x01', an=0, pn=100, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=1, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/IP(src='192.168.0.1', dst='192.168.0.2')/ICMP(type='echo-request')/"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" >>> m = sa.encap(p) >>> e = sa.encrypt(m) >>> d = sa.decrypt(e) >>> r = sa.decap(d) ICMP.guess_payload_class() returned [None] >>> assert raw(r) == raw(p) ###(004)=[passed] MACsec - basic encap - integrity only >>> sa = MACsecSA(sci=b'\x52\x54\x00\x13\x01\x56\x00\x01', an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/IP(src='192.168.0.1', dst='192.168.0.2')/ICMP(type='echo-request')/"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" >>> m = sa.encap(p) >>> assert m.type == ETH_P_MACSEC >>> assert m[MACsec].type == ETH_P_IP >>> assert len(m) == len(p) + 16 >>> assert m[MACsec].AN == 0 >>> assert m[MACsec].PN == 200 >>> assert m[MACsec].SL == 0 >>> assert m[MACsec].SC >>> assert not m[MACsec].E >>> assert not m[MACsec].C >>> assert m[MACsec].SCI == b'\x52\x54\x00\x13\x01\x56\x00\x01' ###(005)=[passed] MACsec - basic encryption - integrity only >>> sa = MACsecSA(sci=b'\x52\x54\x00\x13\x01\x56\x00\x01', an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/IP(src='192.168.0.1', dst='192.168.0.2')/ICMP(type='echo-request')/"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" >>> m = sa.encap(p) >>> e = sa.encrypt(m) >>> assert m.type == ETH_P_MACSEC >>> assert e[MACsec].type == None >>> assert len(e) == len(p) + 16 + 16 >>> assert e[MACsec].AN == 0 >>> assert e[MACsec].PN == 200 >>> assert e[MACsec].SL == 0 >>> assert e[MACsec].SC >>> assert not e[MACsec].E >>> assert not e[MACsec].C >>> assert e[MACsec].SCI == b'\x52\x54\x00\x13\x01\x56\x00\x01' >>> assert raw(e)[:-16] == raw(m) ###(006)=[passed] MACsec - basic decryption - integrity only >>> sa = MACsecSA(sci=b'\x52\x54\x00\x13\x01\x56\x00\x01', an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/IP(src='192.168.0.1', dst='192.168.0.2')/ICMP(type='echo-request')/"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" >>> m = sa.encap(p) >>> e = sa.encrypt(m) >>> d = sa.decrypt(e) >>> assert d.type == ETH_P_MACSEC >>> assert d[MACsec].type == ETH_P_IP >>> assert len(d) == len(m) >>> assert d[MACsec].AN == 0 >>> assert d[MACsec].PN == 200 >>> assert d[MACsec].SL == 0 >>> assert d[MACsec].SC >>> assert not d[MACsec].E >>> assert not d[MACsec].C >>> assert d[MACsec].SCI == b'\x52\x54\x00\x13\x01\x56\x00\x01' >>> assert raw(d) == raw(m) ###(007)=[passed] MACsec - basic decap - integrity only >>> sa = MACsecSA(sci=b'\x52\x54\x00\x13\x01\x56\x00\x01', an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/IP(src='192.168.0.1', dst='192.168.0.2')/ICMP(type='echo-request')/"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" >>> m = sa.encap(p) >>> e = sa.encrypt(m) >>> d = sa.decrypt(e) >>> r = sa.decap(d) ICMP.guess_payload_class() returned [None] >>> assert raw(r) == raw(p) ###(008)=[passed] MACsec - encap - shortlen 2 >>> sa = MACsecSA(sci=0x5254001301560001, an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd') >>> m = sa.encap(p) >>> assert m[MACsec].SL == 2 >>> assert len(m) == m[MACsec].SL + 20 + (8 if sa.send_sci else 0) ###(009)=[passed] MACsec - encap - shortlen 10 >>> sa = MACsecSA(sci=0x5254001301560001, an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/Raw("x" * 8) >>> m = sa.encap(p) >>> assert m[MACsec].SL == 10 >>> assert len(m) == m[MACsec].SL + 20 + (8 if sa.send_sci else 0) ###(010)=[passed] MACsec - encap - shortlen 18 >>> sa = MACsecSA(sci=0x5254001301560001, an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/Raw("x" * 16) >>> m = sa.encap(p) >>> assert m[MACsec].SL == 18 >>> assert len(m) == m[MACsec].SL + 20 + (8 if sa.send_sci else 0) ###(011)=[passed] MACsec - encap - shortlen 32 >>> sa = MACsecSA(sci=0x5254001301560001, an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/Raw("x" * 30) >>> m = sa.encap(p) >>> assert m[MACsec].SL == 32 >>> assert len(m) == m[MACsec].SL + 20 + (8 if sa.send_sci else 0) ###(012)=[passed] MACsec - encap - shortlen 40 >>> sa = MACsecSA(sci=0x5254001301560001, an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/Raw("x" * 38) >>> m = sa.encap(p) >>> assert m[MACsec].SL == 40 >>> assert len(m) == m[MACsec].SL + 20 + (8 if sa.send_sci else 0) ###(013)=[passed] MACsec - encap - shortlen 47 >>> sa = MACsecSA(sci=0x5254001301560001, an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/Raw("x" * 45) >>> m = sa.encap(p) >>> assert m[MACsec].SL == 47 >>> assert len(m) == m[MACsec].SL + 20 + (8 if sa.send_sci else 0) ###(014)=[passed] MACsec - encap - shortlen 0 (48) >>> sa = MACsecSA(sci=0x5254001301560001, an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/Raw("x" * 45 + "y") >>> m = sa.encap(p) >>> assert m[MACsec].SL == 0 ###(015)=[passed] MACsec - encap - shortlen 2/nosci >>> sa = MACsecSA(sci=0x5254001301560001, an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=0) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd') >>> m = sa.encap(p) >>> assert m[MACsec].SL == 2 >>> assert len(m) == m[MACsec].SL + 20 + (8 if sa.send_sci else 0) ###(016)=[passed] MACsec - encap - shortlen 32/nosci >>> sa = MACsecSA(sci=0x5254001301560001, an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=0) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/Raw("x" * 30) >>> m = sa.encap(p) >>> assert m[MACsec].SL == 32 >>> assert len(m) == m[MACsec].SL + 20 + (8 if sa.send_sci else 0) ###(017)=[passed] MACsec - encap - shortlen 47/nosci >>> sa = MACsecSA(sci=0x5254001301560001, an=0, pn=200, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=0) >>> p = Ether(src='aa:aa:aa:bb:bb:bb', dst='cc:cc:cc:dd:dd:dd')/Raw("x" * 45) >>> m = sa.encap(p) >>> assert m[MACsec].SL == 47 >>> assert len(m) == m[MACsec].SL + 20 + (8 if sa.send_sci else 0) ###(018)=[passed] MACsec - authenticate >>> tx = Ether(b"RT\x00\x12\x01V.\xbc\x84\xd5\xca\x13\x88\xe5 \x00\x00\x00\x00\rRT\x00\x13\x01V\x00\x01\x08\x00E\x00\x00T\x11:@\x00@\x01\xa6\x1b\xc0\xa8\x01\x01\xc0\xa8\x01\x02\x08\x00a\xeaG+\x00\x01\xc0~RY\x00\x00\x00\x00w>\x06\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\xf1\xb8\xe4,b\xb00\x98L\x85m1Q9\t:") >>> rx = Ether(b".\xbc\x84\xd5\xca\x13RT\x00\x12\x01V\x88\xe5 \x00\x00\x00\x00#RT\x00\x12\x01V\x00\x01\x08\x00E\x00\x00T\xd4\x1a\x00\x00@\x01#;\xc0\xa8\x01\x02\xc0\xa8\x01\x01\x00\x00i\xeaG+\x00\x01\xc0~RY\x00\x00\x00\x00w>\x06\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37z\x11\xf8S\xe5u\x81\xe8\x19\\nxX\x02\x13\x01") >>> rxsa = MACsecSA(sci=0x5254001201560001, an=0, pn=31, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=0, send_sci=1) >>> txsa = MACsecSA(sci=0x5254001301560001, an=0, pn=31, key=b'\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61', icvlen=16, encrypt=0, send_sci=1) >>> txdec = txsa.decap(txsa.decrypt(tx)) more ICMP.guess_payload_class() returned [None] >>> rxdec = rxsa.decap(rxsa.decrypt(rx)) >>> txref = b"RT\x00\x12\x01V.\xbc\x84\xd5\xca\x13\x08\x00E\x00\x00T\x11:@\x00@\x01\xa6\x1b\xc0\xa8\x01\x01\xc0\xa8\x01\x02\x08\x00a\xeaG+\x00\x01\xc0~RY\x00\x00\x00\x00w>\x06\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37" >>> rxref = b".\xbc\x84\xd5\xca\x13RT\x00\x12\x01V\x08\x00E\x00\x00T\xd4\x1a\x00\x00@\x01#;\xc0\xa8\x01\x02\xc0\xa8\x01\x01\x00\x00i\xeaG+\x00\x01\xc0~RY\x00\x00\x00\x00w>\x06\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37" >>> assert raw(txdec) == raw(txref) >>> assert raw(rxdec) == raw(rxref) ###(019)=[passed] MACsec - authenticate - invalid packet >>> rx = Ether(b".\xbc\x84\xd5\xca\x13RT\x00\x12\x01V\x88\xe5 \x00\x00\x00\x00#RT\x00\x12\x01V\x00\x01\x08\x00E\x00\x00T\xd4\x1a\x00\x00@\x01#;\xc0\xa8\x01\x02\xc0\xa8\x01\x01\x00\x00i\xeaG+\x00\x01\xc0~RY\x00\x00\x00\x00w>\x06\x00\x00\x00\x00\x00\xba\xdb\xba\xdb\xad\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37z\x11\xf8S\xe5u\x81\xe8\x19\\nxX\x02\x13\x01") >>> txsa = MACsecSA(sci=0x5254001301560001, an=0, pn=31, key=b'\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61', icvlen=16, encrypt=0, send_sci=1) >>> try: ... rxdec = rxsa.decap(rxsa.decrypt(rx)) ... assert not "This packet shouldn't have been authenticated as correct" ... except InvalidTag: ... pass ... ###(020)=[passed] MACsec - decrypt >>> tx = Ether(b"RT\x00\x12\x01V.\xbc\x84\xd5\xca\x13\x88\xe5,\x00\x00\x00\x00\x1fRT\x00\x13\x01V\x00\x01\xf1\xd6\xf7\x03\xf0%\x19\x8e\x88\xb0\xac\xa1\x82\x98\x94]\x85&\xc4U*\x84kX#O\xb6\x8f\xf1\x9d\xc5\xdc\xe0\x80,\x98\x8e_\xd53e\x16b0\xaf\xd9\x9e;A\x8aM\xfe\x16\xf6j\xe6\xea\xb7\x9c\xf3\x9bCc#,\x93\xf7\xc0\xdb\x9a\xd0\x0c\xfd?\xcbd\xe5D\xb7\xc9\xbb\xf5\x93M\xc5\x1d'LR\xed\xf3\xbc\xa0\xdf\x86\xf7\xc2JN\xcd\x19\xc1?\xf7\xd2\xbe\x00\x0f`\xe0\x04\xcfX5\xdc\xe7\xb6\xe6\x82\xc4\xac\xd7\x06\xe31\xbe|\x98l\xc8\xc1#*n+x|\xad\x0b<\xfd\xb8\xceoR\x1e") >>> rx = Ether(b".\xbc\x84\xd5\xca\x13RT\x00\x12\x01V\x88\xe5,\x00\x00\x00\x005RT\x00\x12\x01V\x00\x01\x04\xbaV\xe6\xcf\xcfbhy\x7f\xce\x12.\x80WI\xe5\xd5\x98)6\xe1vjVO@\x84\xde\x9b\x83\xbaw\xef\x13\xc3\xfd\xad\x81\xd4S?\x01\x01\xab\xa8 PzSq2\x905\xf6\x8cT\xd7\xb0P\xe2\xd04\xc7F\x88\x85\x10\xc3\x99\x80\xe3(\t\x10\x87\xa9{z\x22\xce>;Mr\xbe\xc1\xa0\x07%\x01\x96\xe5\xa3\x18]\xec\xbb\x7f\xde0\xa1\x99\xb2\xad\x93j\x97\xef\xf4\xee\xf0\xe4s\xb7h\x95\xc3\x8b[~hX\xbf|\xee\x99\x97\xe0;Q\x9aa\xb9\x13$\xd6\xe4\xb4\xce\njt\xc0\xa1.") >>> rxsa = MACsecSA(sci=0x5254001201560001, an=0, pn=31, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=1, send_sci=1) >>> txsa = MACsecSA(sci=0x5254001301560001, an=0, pn=31, key=b'\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61', icvlen=16, encrypt=1, send_sci=1) >>> txdec = txsa.decap(txsa.decrypt(tx)) >>> rxdec = rxsa.decap(rxsa.decrypt(rx)) >>> txref = b"RT\x00\x12\x01V.\xbc\x84\xd5\xca\x13\x08\x00E\x00\x00\x80#D@\x00@\x01\x93\xe5\xc0\xa8\x01\x01\xc0\xa8\x01\x02\x08\x00E\xd5\x0f\xb3\x00\x01SrSY\x00\x00\x00\x00\x8b\x1d\r\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abc" >>> rxref = b".\xbc\x84\xd5\xca\x13RT\x00\x12\x01V\x08\x00E\x00\x00\x80\x05\xab\x00\x00@\x01\xf1~\xc0\xa8\x01\x02\xc0\xa8\x01\x01\x00\x00M\xd5\x0f\xb3\x00\x01SrSY\x00\x00\x00\x00\x8b\x1d\r\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abc" >>> assert raw(txdec) == raw(txref) >>> assert raw(rxdec) == raw(rxref) ###(021)=[passed] MACsec - decrypt - invalid packet >>> rx = Ether(b".\xbc\x84\xd5\xca\x13RT\x00\x12\x01V\x88\xe5,\x00\x00\x00\x005RT\x00\x12\x01V\x00\x01\x04\xbaV\xe6\xcf\xcfbhy\x7f\xce\x12.\x80WI\xe5\xd5\x98)6\xe1vjVO@\x84\xde\x9b\x83\xbaw\xef\x13\xc3\xfd\xad\x81\xd4S?\x01\x01\xab\xa8 PzSq2\x905\xf6\x8cT\xd7\xb0P\xe2\xd04\xc7F\x88\x85\x10\xc3\x99\x80\xe3(\t\x10\x87\xa9{z\x22\xce>;Mr\xbe\xc1\xa0\x07%\x01\x96\xe5\xa3\x18]\xec\xbb\x7f\xde0\xa1\x99\xb2\xad\x93j\x97\xba\xdb\xad\xf0\xe4s\xb7h\x95\xc3\x8b[~hX\xbf|\xee\x99\x97\xe0;Q\x9aa\xb9\x13$\xd6\xe4\xb4\xce\njt\xc0\xa1.") >>> rxsa = MACsecSA(sci=0x5254001201560001, an=0, pn=31, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=1, send_sci=1) >>> try: ... rxdec = rxsa.decap(rxsa.decrypt(rx)) ... assert not "This packet shouldn't have been decrypted correctly" ... except InvalidTag: ... pass ... ###(022)=[passed] MACsec - decap - non-Ethernet >>> rxsa = MACsecSA(sci=0x5254001201560001, an=0, pn=31, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=1, send_sci=1) >>> try: ... rxsa.decap(IP()) ... except TypeError as e: ... assert str(e) == "cannot decapsulate MACsec packet, must be Ethernet/MACsec" ... ###(023)=[passed] MACsec - decap - non-MACsec >>> rxsa = MACsecSA(sci=0x5254001201560001, an=0, pn=31, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=1, send_sci=1) >>> try: ... rxsa.decap(Ether()/IP()) ... except TypeError as e: ... assert str(e) == "cannot decapsulate MACsec packet, must be Ethernet/MACsec" ... ###(024)=[passed] MACsec - encap - non-Ethernet >>> txsa = MACsecSA(sci=0x5254001201560001, an=0, pn=31, key=b'aaaaaaaaaaaaaaaa', icvlen=16, encrypt=1, send_sci=1) >>> try: ... txsa.encap(IP()) ... except TypeError as e: ... assert str(e) == "cannot encapsulate packet in MACsec, must be Ethernet" ... ###(025)=[passed] MACsec - Standard Test Vectors - C.1.1 GCM-AES-128 (54-octet frame integrity protection) >>> sa = MACsecSA(sci=b'\x12\x15\x35\x24\xC0\x89\x5E\x81', an=2, pn=0xB2C28465, key=b'\xAD\x7A\x2B\xD0\x3E\xAC\x83\x5A\x6F\x62\x0F\xDC\xB5\x06\xB3\x45', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='7A:0D:46:DF:99:8D', dst='D6:09:B1:F0:56:63', type=0x0800)/Raw(bytes.fromhex("0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233340001")) >>> m = sa.encap(p) >>> iv = sa.make_iv(m) >>> assert raw(iv) == raw(b'\x12\x15\x35\x24\xC0\x89\x5E\x81\xB2\xC2\x84\x65') >>> e = sa.encrypt(m) >>> ref = Raw(bytes.fromhex("D609B1F056637A0D46DF998D88E5222AB2C2846512153524C0895E8108000F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233340001F09478A9B09007D06F46E9B6A1DA25DD")) >>> assert raw(e) == raw(ref) >>> dt = sa.decrypt(e) >>> assert raw(dt) == raw(m) ###(026)=[passed] MACsec - Standard Test Vectors - C.1.2 GCM-AES-256 (54-octet frame integrity protection) >>> sa = MACsecSA(sci=b'\x12\x15\x35\x24\xC0\x89\x5E\x81', an=2, pn=0xB2C28465, key=b'\xE3\xC0\x8A\x8F\x06\xC6\xE3\xAD\x95\xA7\x05\x57\xB2\x3F\x75\x48\x3C\xE3\x30\x21\xA9\xC7\x2B\x70\x25\x66\x62\x04\xC6\x9C\x0B\x72', icvlen=16, encrypt=0, send_sci=1) >>> p = Ether(src='7A:0D:46:DF:99:8D', dst='D6:09:B1:F0:56:63', type=0x0800)/Raw(bytes.fromhex("0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233340001")) >>> m = sa.encap(p) >>> iv = sa.make_iv(m) >>> assert raw(iv) == raw(b'\x12\x15\x35\x24\xC0\x89\x5E\x81\xB2\xC2\x84\x65') >>> e = sa.encrypt(m) >>> ref = Raw(bytes.fromhex("D609B1F056637A0D46DF998D88E5222AB2C2846512153524C0895E8108000F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333400012F0BC5AF409E06D609EA8B7D0FA5EA50")) >>> assert raw(e) == raw(ref) >>> dt = sa.decrypt(e) >>> assert raw(dt) == raw(m) ###(027)=[passed] MACsec - Standard Test Vectors - C.1.3 GCM-AES-XPN-128 (54-octet frame integrity protection) >>> sa = MACsecSA(sci=b'\x12\x15\x35\x24\xC0\x89\x5E\x81', an=2, pn=0xB0DF459CB2C28465, key=b'\xAD\x7A\x2B\xD0\x3E\xAC\x83\x5A\x6F\x62\x0F\xDC\xB5\x06\xB3\x45', icvlen=16, encrypt=0, send_sci=1, xpn_en = True, ssci = 0x7A30C118, salt = b'\xE6\x30\xE8\x1A\x48\xDE\x86\xA2\x1C\x66\xFA\x6D') >>> p = Ether(src='7A:0D:46:DF:99:8D', dst='D6:09:B1:F0:56:63', type=0x0800)/Raw(bytes.fromhex("0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233340001")) >>> m = sa.encap(p) >>> iv = sa.make_iv(m) >>> assert raw(iv) == raw(b'\x9C\x00\x29\x02\xF8\x01\xC3\x3E\xAE\xA4\x7E\x08') >>> e = sa.encrypt(m) >>> ref = Raw(bytes.fromhex("D609B1F056637A0D46DF998D88E5222AB2C2846512153524C0895E8108000F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323334000117FE1981EBDD4AFC5062697E8BAA0C23")) >>> assert raw(e) == raw(ref) >>> dt = sa.decrypt(e) >>> assert raw(dt) == raw(m) ###(028)=[passed] MACsec - Standard Test Vectors - C.1.4 GCM-AES-XPN-256 (54-octet frame integrity protection) >>> sa = MACsecSA(sci=b'\x12\x15\x35\x24\xC0\x89\x5E\x81', an=2, pn=0xB0DF459CB2C28465, key=b'\xE3\xC0\x8A\x8F\x06\xC6\xE3\xAD\x95\xA7\x05\x57\xB2\x3F\x75\x48\x3C\xE3\x30\x21\xA9\xC7\x2B\x70\x25\x66\x62\x04\xC6\x9C\x0B\x72', icvlen=16, encrypt=0, send_sci=1, xpn_en = True, ssci = 0x7A30C118, salt = b'\xE6\x30\xE8\x1A\x48\xDE\x86\xA2\x1C\x66\xFA\x6D') >>> p = Ether(src='7A:0D:46:DF:99:8D', dst='D6:09:B1:F0:56:63', type=0x0800)/Raw(bytes.fromhex("0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233340001")) >>> m = sa.encap(p) >>> iv = sa.make_iv(m) >>> assert raw(iv) == raw(b'\x9C\x00\x29\x02\xF8\x01\xC3\x3E\xAE\xA4\x7E\x08') >>> e = sa.encrypt(m) >>> ref = Raw(bytes.fromhex("D609B1F056637A0D46DF998D88E5222AB2C2846512153524C0895E8108000F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333400014DBD2F6A754A6CF728CC129BA6931577")) >>> assert raw(e) == raw(ref) >>> dt = sa.decrypt(e) >>> assert raw(dt) == raw(m) ###(029)=[passed] MACsec - Standard Test Vectors - C.5.1 GCM-AES-128 (54-octet frame confidentiality protection) >>> sa = MACsecSA(sci=b'\xF0\x76\x1E\x8D\xCD\x3D\x00\x01', an=0, pn=0x76D457ED, key=b'\x07\x1B\x11\x3B\x0C\xA7\x43\xFE\xCC\xCF\x3D\x05\x1F\x73\x73\x82', icvlen=16, encrypt=1, send_sci=0) >>> p = Ether(src='F0:76:1E:8D:CD:3D', dst='E2:01:06:D7:CD:0D', type=0x0800)/Raw(bytes.fromhex("0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233340004")) >>> m = sa.encap(p) >>> m[MACsec].ES = 1 >>> iv = sa.make_iv(m) >>> assert raw(iv) == raw(b'\xF0\x76\x1E\x8D\xCD\x3D\x00\x01\x76\xD4\x57\xED') >>> e = sa.encrypt(m) >>> ref = Raw(bytes.fromhex("E20106D7CD0DF0761E8DCD3D88E54C2A76D457ED13B4C72B389DC5018E72A171DD85A5D3752274D3A019FBCAED09A425CD9B2E1C9B72EEE7C9DE7D52B3F3D6A5284F4A6D3FE22A5D6C2B960494C3")) >>> assert raw(e) == raw(ref) >>> dt = sa.decrypt(e) >>> assert raw(dt) == raw(m) ###(030)=[passed] MACsec - Standard Test Vectors - C.5.2 GCM-AES-256 (54-octet frame confidentiality protection) >>> sa = MACsecSA(sci=b'\xF0\x76\x1E\x8D\xCD\x3D\x00\x01', an=0, pn=0x76D457ED, key=b'\x69\x1D\x3E\xE9\x09\xD7\xF5\x41\x67\xFD\x1C\xA0\xB5\xD7\x69\x08\x1F\x2B\xDE\x1A\xEE\x65\x5F\xDB\xAB\x80\xBD\x52\x95\xAE\x6B\xE7', icvlen=16, encrypt=1, send_sci=0) >>> p = Ether(src='F0:76:1E:8D:CD:3D', dst='E2:01:06:D7:CD:0D', type=0x0800)/Raw(bytes.fromhex("0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233340004")) >>> m = sa.encap(p) >>> m[MACsec].ES = 1 >>> iv = sa.make_iv(m) >>> assert raw(iv) == raw(b'\xF0\x76\x1E\x8D\xCD\x3D\x00\x01\x76\xD4\x57\xED') >>> e = sa.encrypt(m) >>> ref = Raw(bytes.fromhex("E20106D7CD0DF0761E8DCD3D88E54C2A76D457EDC1623F55730C93533097ADDAD25664966125352B43ADACBD61C5EF3AC90B5BEE929CE4630EA79F6CE51912AF39C2D1FDC2051F8B7B3C9D397EF2")) >>> assert raw(e) == raw(ref) >>> dt = sa.decrypt(e) >>> assert raw(dt) == raw(m) ###(031)=[passed] MACsec - Standard Test Vectors - C.5.3 GCM-AES-XPN-128 (54-octet frame confidentiality protection) >>> sa = MACsecSA(sci=b'\xF0\x76\x1E\x8D\xCD\x3D\x00\x01', an=0, pn=0xB0DF459C76D457ED, key=b'\x07\x1B\x11\x3B\x0C\xA7\x43\xFE\xCC\xCF\x3D\x05\x1F\x73\x73\x82', icvlen=16, encrypt=1, send_sci=0, xpn_en = True, ssci = 0x7A30C118, salt = b'\xE6\x30\xE8\x1A\x48\xDE\x86\xA2\x1C\x66\xFA\x6D') >>> p = Ether(src='F0:76:1E:8D:CD:3D', dst='E2:01:06:D7:CD:0D', type=0x0800)/Raw(bytes.fromhex("0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233340004")) >>> m = sa.encap(p) >>> m[MACsec].ES = 1 >>> iv = sa.make_iv(m) >>> assert raw(iv) == raw(b'\x9C\x00\x29\x02\xF8\x01\xC3\x3E\x6A\xB2\xAD\x80') >>> e = sa.encrypt(m) >>> ref = Raw(bytes.fromhex("E20106D7CD0DF0761E8DCD3D88E54C2A76D457ED9CA46984430203ED416EBDC2FE2622BA3E5EAB6961C36383009E187E9B0C88564653B9ABD216441C6AB6F0A232E9E44C978CF7CD84D43484D101")) >>> assert raw(e) == raw(ref) >>> dt = sa.decrypt(e) >>> assert raw(dt) == raw(m) ###(032)=[passed] MACsec - Standard Test Vectors - C.5.4 GCM-AES-XPN-256 (54-octet frame confidentiality protection) >>> sa = MACsecSA(sci=b'\xF0\x76\x1E\x8D\xCD\x3D\x00\x01', an=0, pn=0xB0DF459C76D457ED, key=b'\x69\x1D\x3E\xE9\x09\xD7\xF5\x41\x67\xFD\x1C\xA0\xB5\xD7\x69\x08\x1F\x2B\xDE\x1A\xEE\x65\x5F\xDB\xAB\x80\xBD\x52\x95\xAE\x6B\xE7', icvlen=16, encrypt=1, send_sci=0, xpn_en = True, ssci = 0x7A30C118, salt = b'\xE6\x30\xE8\x1A\x48\xDE\x86\xA2\x1C\x66\xFA\x6D') >>> p = Ether(src='F0:76:1E:8D:CD:3D', dst='E2:01:06:D7:CD:0D', type=0x0800)/Raw(bytes.fromhex("0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233340004")) >>> m = sa.encap(p) >>> m[MACsec].ES = 1 >>> iv = sa.make_iv(m) >>> assert raw(iv) == raw(b'\x9C\x00\x29\x02\xF8\x01\xC3\x3E\x6A\xB2\xAD\x80') >>> e = sa.encrypt(m) >>> ref = Raw(bytes.fromhex("E20106D7CD0DF0761E8DCD3D88E54C2A76D457ED88D9F7D1F1578EE34BA7B1ABC89893EF1D3398C9F1DD3E47FBD8553E0FF786EF5699EB01EA10420D0EBD39A0E273C4C7F95ED843207D7A497DFA")) >>> assert raw(e) == raw(ref) >>> dt = sa.decrypt(e) >>> assert raw(dt) == raw(m) Test campaign ━ Run at 01:42:59 from [test/contrib/metawatch.uts] by UTscapy in 0.008355140686035156 └ Passed=2 └ Failed=0 ###### ## Metawatch ###### ###(000)=[passed] MetawatchEther, basic instantiation >>> m = MetawatchEther() >>> assert m.type == 0x9000 ###(001)=[passed] MetawatchEther, build & dissect >>> r = raw(MetawatchEther(dst="00:01:02:03:04:05", src="06:07:08:09:10:11")) >>> assert r == b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\x10\x11\x90\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> m = MetawatchEther(r) >>> assert m.dst == "00:01:02:03:04:05" and m.src == "06:07:08:09:10:11" and m.type == 0x9000 Modbus layer test campaign ━ Run at 01:42:59 from [test/contrib/modbus.uts] by UTscapy in 0.3666696548461914 └ Passed=164 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the modbus layer >>> from scapy.contrib.modbus import * ###### ## Test MBAP ###### ###(001)=[passed] MBAP default values >>> raw(ModbusADURequest()) == b'\x00\x00\x00\x00\x00\x01\xff' True ###(002)=[passed] MBAP payload length calculation >>> raw(ModbusADURequest() / b'\x00\x01\x02') == b'\x00\x00\x00\x00\x00\x04\xff\x00\x01\x02' True ###(003)=[passed] MBAP Guess Payload ModbusPDU01ReadCoilsRequest (simple case) >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x06\xff\x01\x00\x00\x00\x01') >>> assert isinstance(p.payload, ModbusPDU01ReadCoilsRequest) ###(004)=[passed] MBAP Guess Payload ModbusPDU01ReadCoilsResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x04\xff\x01\x01\x01') >>> assert isinstance(p.payload, ModbusPDU01ReadCoilsResponse) ###(005)=[passed] MBAP Guess Payload ModbusPDU01ReadCoilsError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x81\x02') >>> assert isinstance(p.payload, ModbusPDU01ReadCoilsError) ###(006)=[passed] MBAP Guess Payload ModbusPDU02ReadDiscreteInputsRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x06\xff\x02\x00\x00\x00\x01') >>> assert isinstance(p.payload, ModbusPDU02ReadDiscreteInputsRequest) ###(007)=[passed] MBAP Guess Payload ModbusPDU02ReadDiscreteInputsResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x04\xff\x02\x01\x00') >>> assert isinstance(p.payload, ModbusPDU02ReadDiscreteInputsResponse) ###(008)=[passed] MBAP Guess Payload ModbusPDU02ReadDiscreteInputsError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x82\x01') >>> assert isinstance(p.payload, ModbusPDU02ReadDiscreteInputsError) ###(009)=[passed] MBAP Guess Payload ModbusPDU03ReadHoldingRegistersRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x06\xff\x03\x00\x00\x00\x01') >>> assert isinstance(p.payload, ModbusPDU03ReadHoldingRegistersRequest) ###(010)=[passed] MBAP Guess Payload ModbusPDU03ReadHoldingRegistersResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x05\xff\x03\x02\x00\x00') >>> assert isinstance(p.payload, ModbusPDU03ReadHoldingRegistersResponse) ###(011)=[passed] MBAP Guess Payload ModbusPDU03ReadHoldingRegistersError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x83\x01') >>> assert isinstance(p.payload, ModbusPDU03ReadHoldingRegistersError) ###(012)=[passed] MBAP Guess Payload ModbusPDU04ReadInputRegistersRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x06\xff\x04\x00\x00\x00\x01') >>> assert isinstance(p.payload, ModbusPDU04ReadInputRegistersRequest) ###(013)=[passed] MBAP Guess Payload ModbusPDU04ReadInputRegistersResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x05\xff\x04\x02\x00\x00') >>> assert isinstance(p.payload, ModbusPDU04ReadInputRegistersResponse) ###(014)=[passed] MBAP Guess Payload ModbusPDU04ReadInputRegistersError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x84\x01') >>> assert isinstance(p.payload, ModbusPDU04ReadInputRegistersError) ###(015)=[passed] MBAP Guess Payload ModbusPDU05WriteSingleCoilRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x06\xff\x05\x00\x00\x00\x00') >>> assert isinstance(p.payload, ModbusPDU05WriteSingleCoilRequest) ###(016)=[passed] MBAP Guess Payload ModbusPDU05WriteSingleCoilResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x06\xff\x05\x00\x00\x00\x00') >>> assert isinstance(p.payload, ModbusPDU05WriteSingleCoilResponse) ###(017)=[passed] MBAP Guess Payload ModbusPDU05WriteSingleCoilError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x85\x01') >>> assert isinstance(p.payload, ModbusPDU05WriteSingleCoilError) ###(018)=[passed] MBAP Guess Payload ModbusPDU06WriteSingleRegisterRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x06\xff\x06\x00\x00\x00\x00') >>> assert isinstance(p.payload, ModbusPDU06WriteSingleRegisterRequest) ###(019)=[passed] MBAP Guess Payload ModbusPDU06WriteSingleRegisterResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x06\xff\x06\x00\x00\x00\x00') >>> assert isinstance(p.payload, ModbusPDU06WriteSingleRegisterResponse) ###(020)=[passed] MBAP Guess Payload ModbusPDU06WriteSingleRegisterError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x86\x01') >>> assert isinstance(p.payload, ModbusPDU06WriteSingleRegisterError) ###(021)=[passed] MBAP Guess Payload ModbusPDU07ReadExceptionStatusRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x02\xff\x07') >>> assert isinstance(p.payload, ModbusPDU07ReadExceptionStatusRequest) ###(022)=[passed] MBAP Guess Payload ModbusPDU07ReadExceptionStatusResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x07\x00') >>> assert isinstance(p.payload, ModbusPDU07ReadExceptionStatusResponse) ###(023)=[passed] MBAP Guess Payload ModbusPDU07ReadExceptionStatusError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x87\x01') >>> assert isinstance(p.payload, ModbusPDU07ReadExceptionStatusError) ###(024)=[passed] MBAP Guess Payload ModbusPDU08DiagnosticsRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x06\xff\x08\x00\x00\x00\x00') >>> assert isinstance(p.payload, ModbusPDU08DiagnosticsRequest) ###(025)=[passed] MBAP Guess Payload ModbusPDU08DiagnosticsResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x06\xff\x08\x00\x00\x00\x00') >>> assert isinstance(p.payload, ModbusPDU08DiagnosticsResponse) ###(026)=[passed] MBAP Guess Payload ModbusPDU08DiagnosticsError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x88\x01') >>> assert isinstance(p.payload, ModbusPDU08DiagnosticsError) ###(027)=[passed] MBAP Guess Payload ModbusPDU0BGetCommEventCounterRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x02\xff\x0b') >>> assert isinstance(p.payload, ModbusPDU0BGetCommEventCounterRequest) ###(028)=[passed] MBAP Guess Payload ModbusPDU0BGetCommEventCounterResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x06\xff\x0b\x00\x00\xff\xff') >>> assert isinstance(p.payload, ModbusPDU0BGetCommEventCounterResponse) ###(029)=[passed] MBAP Guess Payload ModbusPDU0BGetCommEventCounterError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x8b\x01') >>> assert isinstance(p.payload, ModbusPDU0BGetCommEventCounterError) ###(030)=[passed] MBAP Guess Payload ModbusPDU0CGetCommEventLogRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x02\xff\x0c') >>> assert isinstance(p.payload, ModbusPDU0CGetCommEventLogRequest) ###(031)=[passed] MBAP Guess Payload ModbusPDU0CGetCommEventLogResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x02\xff\x0c\x00\x00\x00\x00\x00\x00\x00') >>> assert isinstance(p.payload, ModbusPDU0CGetCommEventLogResponse) ###(032)=[passed] MBAP Guess Payload ModbusPDU0CGetCommEventLogError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x8c\x01') >>> assert isinstance(p.payload, ModbusPDU0CGetCommEventLogError) ###(033)=[passed] MBAP Guess Payload ModbusPDU0FWriteMultipleCoilsRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x08\xff\x0f\x00\x00\x00\x01\x01\x00') >>> assert isinstance(p.payload, ModbusPDU0FWriteMultipleCoilsRequest) ###(034)=[passed] MBAP Guess Payload ModbusPDU0FWriteMultipleCoilsResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x06\xff\x0f\x00\x00\x00\x01') >>> assert isinstance(p.payload, ModbusPDU0FWriteMultipleCoilsResponse) ###(035)=[passed] MBAP Guess Payload ModbusPDU0FWriteMultipleCoilsError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x8f\x01') >>> assert isinstance(p.payload, ModbusPDU0FWriteMultipleCoilsError) ###(036)=[passed] MBAP Guess Payload ModbusPDU10WriteMultipleRegistersRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\t\xff\x10\x00\x00\x00\x01\x02\x00\x00') >>> assert isinstance(p.payload, ModbusPDU10WriteMultipleRegistersRequest) ###(037)=[passed] MBAP Guess Payload ModbusPDU10WriteMultipleRegistersResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x06\xff\x10\x00\x00\x00\x01') >>> assert isinstance(p.payload, ModbusPDU10WriteMultipleRegistersResponse) ###(038)=[passed] MBAP Guess Payload ModbusPDU10WriteMultipleRegistersError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x90\x01') >>> assert isinstance(p.payload, ModbusPDU10WriteMultipleRegistersError) ###(039)=[passed] MBAP Guess Payload ModbusPDU11ReportSlaveIdRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x02\xff\x11') >>> assert isinstance(p.payload, ModbusPDU11ReportSlaveIdRequest) ###(040)=[passed] MBAP Guess Payload ModbusPDU11ReportSlaveIdResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x11\x00') >>> assert isinstance(p.payload, ModbusPDU11ReportSlaveIdResponse) ###(041)=[passed] MBAP Guess Payload ModbusPDU11ReportSlaveIdError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x91\x01') >>> assert isinstance(p.payload, ModbusPDU11ReportSlaveIdError) ###(042)=[passed] MBAP Guess Payload ModbusPDU14ReadFileRecordRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x03\xff\x14\x00') >>> assert isinstance(p.payload, ModbusPDU14ReadFileRecordRequest) ###(043)=[passed] MBAP Guess Payload ModbusPDU14ReadFileRecordResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x14\x00') >>> assert isinstance(p.payload, ModbusPDU14ReadFileRecordResponse) ###(044)=[passed] MBAP Guess Payload ModbusPDU14ReadFileRecordError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x91\x01') >>> assert isinstance(p.payload, ModbusPDU11ReportSlaveIdError) ###(045)=[passed] MBAP Guess Payload ModbusPDU15WriteFileRecordRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x03\xff\x15\x00') >>> assert isinstance(p.payload, ModbusPDU15WriteFileRecordRequest) ###(046)=[passed] MBAP Guess Payload ModbusPDU15WriteFileRecordResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x15\x00') >>> assert isinstance(p.payload, ModbusPDU15WriteFileRecordResponse) ###(047)=[passed] MBAP Guess Payload ModbusPDU15WriteFileRecordError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x95\x01') >>> assert isinstance(p.payload, ModbusPDU15WriteFileRecordError) ###(048)=[passed] MBAP Guess Payload ModbusPDU16MaskWriteRegisterRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x08\xff\x16\x00\x00\xff\xff\x00\x00') >>> assert isinstance(p.payload, ModbusPDU16MaskWriteRegisterRequest) ###(049)=[passed] MBAP Guess Payload ModbusPDU16MaskWriteRegisterResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x08\xff\x16\x00\x00\xff\xff\x00\x00') >>> assert isinstance(p.payload, ModbusPDU16MaskWriteRegisterResponse) ###(050)=[passed] MBAP Guess Payload ModbusPDU16MaskWriteRegisterError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x96\x01') >>> assert isinstance(p.payload, ModbusPDU16MaskWriteRegisterError) ###(051)=[passed] MBAP Guess Payload ModbusPDU16MaskWriteRegisterRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x08\xff\x16\x00\x00\xff\xff\x00\x00') >>> assert isinstance(p.payload, ModbusPDU16MaskWriteRegisterRequest) ###(052)=[passed] MBAP Guess Payload ModbusPDU16MaskWriteRegisterResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x08\xff\x16\x00\x00\xff\xff\x00\x00') >>> assert isinstance(p.payload, ModbusPDU16MaskWriteRegisterResponse) ###(053)=[passed] MBAP Guess Payload ModbusPDU16MaskWriteRegisterError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x96\x01') >>> assert isinstance(p.payload, ModbusPDU16MaskWriteRegisterError) ###(054)=[passed] MBAP Guess Payload ModbusPDU17ReadWriteMultipleRegistersRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\r\xff\x17\x00\x00\x00\x01\x00\x00\x00\x01\x02\x00\x00') >>> assert isinstance(p.payload, ModbusPDU17ReadWriteMultipleRegistersRequest) ###(055)=[passed] MBAP Guess Payload ModbusPDU17ReadWriteMultipleRegistersResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x05\xff\x17\x02\x00\x00') >>> assert isinstance(p.payload, ModbusPDU17ReadWriteMultipleRegistersResponse) ###(056)=[passed] MBAP Guess Payload ModbusPDU17ReadWriteMultipleRegistersError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x97\x01') >>> assert isinstance(p.payload, ModbusPDU17ReadWriteMultipleRegistersError) ###(057)=[passed] MBAP Guess Payload ModbusPDU18ReadFIFOQueueRequest >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x04\xff\x18\x00\x00') >>> assert isinstance(p.payload, ModbusPDU18ReadFIFOQueueRequest) ###(058)=[passed] MBAP Guess Payload ModbusPDU18ReadFIFOQueueResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x06\xff\x18\x00\x02\x00\x00') >>> assert isinstance(p.payload, ModbusPDU18ReadFIFOQueueResponse) ###(059)=[passed] MBAP Guess Payload ModbusPDU18ReadFIFOQueueError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\x98\x01') >>> assert isinstance(p.payload, ModbusPDU18ReadFIFOQueueError) ###(060)=[passed] MBAP Guess Payload ModbusPDU2B0EReadDeviceIdentificationRequest (2 level test) >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x04\xff+\x0e\x01\x00') >>> assert isinstance(p.payload, ModbusPDU2B0EReadDeviceIdentificationRequest) ###(061)=[passed] MBAP Guess Payload ModbusPDU2B0EReadDeviceIdentificationResponse >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x1b\xff+\x0e\x01\x83\x00\x00\x03\x00\x08Pymodbus\x01\x02PM\x02\x031.0') >>> assert isinstance(p.payload, ModbusPDU2B0EReadDeviceIdentificationResponse) ###(062)=[passed] MBAP Guess Payload ModbusPDU2B0EReadDeviceIdentificationError >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x03\xff\xab\x01') >>> assert isinstance(p.payload, ModbusPDU2B0EReadDeviceIdentificationError) ###(063)=[passed] MBAP Guess Payload Reserved Function Request (Invalid payload) >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x02\xff\x5b') >>> assert isinstance(p.payload,ModbusPDUReservedFunctionCodeRequest) ###(064)=[passed] MBAP Guess Payload Reserved Function Response (Invalid payload) >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x02\xff\x7e') >>> assert isinstance(p.payload, ModbusPDUReservedFunctionCodeResponse) ###(065)=[passed] MBAP Guess Payload Reserved Function Error (Invalid payload) >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x02\xff\x8a') >>> assert isinstance(p.payload, ModbusPDUReservedFunctionCodeError) ###(066)=[passed] MBAP Guess Payload ModbusPDU02ReadDiscreteInputsResponse >>> assert raw(ModbusPDU02ReadDiscreteInputsResponse()) == b'\x02\x01\x00' ###(067)=[passed] MBAP Guess Payload ModbusPDU02ReadDiscreteInputsResponse minimal parameters >>> assert raw(ModbusPDU02ReadDiscreteInputsResponse(inputStatus=[0x02, 0x01])) == b'\x02\x02\x02\x01' ###(068)=[passed] MBAP Guess Payload ModbusPDU02ReadDiscreteInputsRequest dissection >>> p = ModbusPDU02ReadDiscreteInputsResponse(b'\x02\x02\x02\x01') >>> p.byteCount == 2 and p.inputStatus == [0x02, 0x01] True ###(069)=[passed] ModbusPDU02ReadDiscreteInputsError >>> raw(ModbusPDU02ReadDiscreteInputsError()) == b'\x82\x01' True ###(070)=[passed] MBAP Guess Payload User-Defined Function Request (Invalid payload) >>> p = ModbusADURequest(b'\x00\x00\x00\x00\x00\x02\xff\x5b') >>> assert isinstance(p.payload, ModbusPDUReservedFunctionCodeRequest) ###(071)=[passed] MBAP Guess Payload User-Defined Function Response (Invalid payload) >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x02\xff\x7e') >>> assert isinstance(p.payload, ModbusPDUReservedFunctionCodeResponse) ###(072)=[passed] MBAP Guess Payload User-Defined Function Error (Invalid payload) >>> p = ModbusADUResponse(b'\x00\x00\x00\x00\x00\x02\xff\x8a') >>> assert isinstance(p.payload, ModbusPDUReservedFunctionCodeError) ###### ## Test layer binding ###### ###(073)=[passed] Destination port >>> p = TCP()/ModbusADURequest() >>> p[TCP].dport == 502 True ###(074)=[passed] Source port >>> p = TCP()/ModbusADUResponse() >>> p[TCP].sport == 502 True ###### ## Test PDU ###### Note on tests cases: dissection/minimal parameters will not be done for packets that does not perform calculation ###(075)=[passed] ModbusPDU01ReadCoilsRequest >>> raw(ModbusPDU01ReadCoilsRequest()) == b'\x01\x00\x00\x00\x01' True ###(076)=[passed] ModbusPDU01ReadCoilsRequest minimal parameters >>> raw(ModbusPDU01ReadCoilsRequest(startAddr=16, quantity=2)) == b'\x01\x00\x10\x00\x02' True ###(077)=[passed] ModbusPDU01ReadCoilsRequest dissection >>> p = ModbusPDU01ReadCoilsRequest(b'\x01\x00\x10\x00\x02') >>> assert p.startAddr == 16 >>> assert p.quantity == 2 ###(078)=[passed] ModbusPDU01ReadCoilsResponse >>> raw(ModbusPDU01ReadCoilsResponse()) == b'\x01\x01\x00' True ###(079)=[passed] ModbusPDU01ReadCoilsResponse minimal parameters >>> raw(ModbusPDU01ReadCoilsResponse(coilStatus=[0x10]*3)) == b'\x01\x03\x10\x10\x10' True ###(080)=[passed] ModbusPDU01ReadCoilsResponse dissection >>> p = ModbusPDU01ReadCoilsResponse(b'\x01\x03\x10\x10\x10') >>> assert p.coilStatus == [16, 16, 16] >>> assert p.byteCount == 3 ###(081)=[passed] ModbusPDU01ReadCoilsError >>> raw(ModbusPDU01ReadCoilsError()) == b'\x81\x01' True ###(082)=[passed] ModbusPDU81ReadCoilsError minimal parameters >>> raw(ModbusPDU01ReadCoilsError(exceptCode=2)) == b'\x81\x02' True ###(083)=[passed] ModbusPDU81ReadCoilsError dissection >>> p = ModbusPDU01ReadCoilsError(b'\x81\x02') >>> assert p.funcCode == 0x81 >>> assert p.exceptCode == 2 ###(084)=[passed] ModbusPDU02ReadDiscreteInputsRequest >>> raw(ModbusPDU02ReadDiscreteInputsRequest()) == b'\x02\x00\x00\x00\x01' True ###(085)=[passed] ModbusPDU02ReadDiscreteInputsRequest minimal parameters >>> raw(ModbusPDU02ReadDiscreteInputsRequest(startAddr=8, quantity=128)) == b'\x02\x00\x08\x00\x80' True ###(086)=[passed] ModbusPDU02ReadDiscreteInputsResponse >>> raw(ModbusPDU02ReadDiscreteInputsResponse()) == b'\x02\x01\x00' True ###(087)=[passed] ModbusPDU02ReadDiscreteInputsResponse minimal parameters >>> raw(ModbusPDU02ReadDiscreteInputsResponse(inputStatus=[0x02, 0x01])) == b'\x02\x02\x02\x01' True ###(088)=[passed] ModbusPDU02ReadDiscreteInputsRequest dissection >>> p = ModbusPDU02ReadDiscreteInputsResponse(b'\x02\x02\x02\x01') >>> assert p.byteCount == 2 >>> assert p.inputStatus == [0x02, 0x01] ###(089)=[passed] ModbusPDU02ReadDiscreteInputsError >>> raw(ModbusPDU02ReadDiscreteInputsError()) == b'\x82\x01' True ###(090)=[passed] ModbusPDU03ReadHoldingRegistersRequest >>> raw(ModbusPDU03ReadHoldingRegistersRequest()) == b'\x03\x00\x00\x00\x01' True ###(091)=[passed] ModbusPDU03ReadHoldingRegistersRequest minimal parameters >>> raw(ModbusPDU03ReadHoldingRegistersRequest(startAddr=2048, quantity=16)) == b'\x03\x08\x00\x00\x10' True ###(092)=[passed] ModbusPDU03ReadHoldingRegistersResponse >>> raw(ModbusPDU03ReadHoldingRegistersResponse()) == b'\x03\x02\x00\x00' True ###(093)=[passed] ModbusPDU03ReadHoldingRegistersResponse minimal parameters >>> 1==1 True ###(094)=[passed] ModbusPDU03ReadHoldingRegistersResponse dissection >>> p = ModbusPDU03ReadHoldingRegistersResponse(b'\x03\x06\x02+\x00\x00\x00d') >>> assert p.byteCount == 6 >>> assert p.registerVal == [555, 0, 100] ###(095)=[passed] ModbusPDU03ReadHoldingRegistersError >>> raw(ModbusPDU03ReadHoldingRegistersError()) == b'\x83\x01' True ###(096)=[passed] ModbusPDU04ReadInputRegistersRequest >>> raw(ModbusPDU04ReadInputRegistersRequest()) == b'\x04\x00\x00\x00\x01' True ###(097)=[passed] ModbusPDU04ReadInputRegistersResponse >>> raw(ModbusPDU04ReadInputRegistersResponse()) == b'\x04\x02\x00\x00' True ###(098)=[passed] ModbusPDU04ReadInputRegistersResponse minimal parameters >>> raw(ModbusPDU04ReadInputRegistersResponse(registerVal=[0x01, 0x02])) == b'\x04\x04\x00\x01\x00\x02' True ###(099)=[passed] ModbusPDU04ReadInputRegistersError >>> raw(ModbusPDU04ReadInputRegistersError()) == b'\x84\x01' True ###(100)=[passed] ModbusPDU05WriteSingleCoilRequest >>> raw(ModbusPDU05WriteSingleCoilRequest()) == b'\x05\x00\x00\x00\x00' True ###(101)=[passed] ModbusPDU05WriteSingleCoilResponse >>> raw(ModbusPDU05WriteSingleCoilResponse()) == b'\x05\x00\x00\x00\x00' True ###(102)=[passed] ModbusPDU05WriteSingleCoilError >>> raw(ModbusPDU05WriteSingleCoilError()) == b'\x85\x01' True ###(103)=[passed] ModbusPDU06WriteSingleRegisterRequest >>> raw(ModbusPDU06WriteSingleRegisterRequest()) == b'\x06\x00\x00\x00\x00' True ###(104)=[passed] ModbusPDU06WriteSingleRegisterResponse >>> raw(ModbusPDU06WriteSingleRegisterResponse()) == b'\x06\x00\x00\x00\x00' True ###(105)=[passed] ModbusPDU06WriteSingleRegisterError >>> raw(ModbusPDU06WriteSingleRegisterError()) == b'\x86\x01' True ###(106)=[passed] ModbusPDU07ReadExceptionStatusRequest >>> raw(ModbusPDU07ReadExceptionStatusRequest()) == b'\x07' True ###(107)=[passed] ModbusPDU07ReadExceptionStatusResponse >>> raw(ModbusPDU07ReadExceptionStatusResponse()) == b'\x07\x00' True ###(108)=[passed] ModbusPDU07ReadExceptionStatusError >>> raw(ModbusPDU07ReadExceptionStatusError()) == b'\x87\x01' True ###(109)=[passed] ModbusPDU08DiagnosticsRequest >>> raw(ModbusPDU08DiagnosticsRequest()) b'\x08\x00\x00\x00\x00' ###(110)=[passed] ModbusPDU08DiagnosticsRequest minimal parameters >>> raw(ModbusPDU08DiagnosticsRequest(data=[0x1234])) == b'\x08\x00\x00\x12\x34' True ###(111)=[passed] ModbusPDU08DiagnosticsResponse >>> raw(ModbusPDU08DiagnosticsResponse()) == b'\x08\x00\x00\x00\x00' True ###(112)=[passed] ModbusPDU08DiagnosticsResponse minimal parameters >>> raw(ModbusPDU08DiagnosticsResponse(data=[0x1234])) == b'\x08\x00\x00\x12\x34' True ###(113)=[passed] ModbusPDU08DiagnosticsError >>> raw(ModbusPDU08DiagnosticsError()) == b'\x88\x01' True ###(114)=[passed] ModbusPDU0BGetCommEventCounterRequest >>> raw(ModbusPDU0BGetCommEventCounterRequest()) == b'\x0b' True ###(115)=[passed] ModbusPDU0BGetCommEventCounterResponse >>> raw(ModbusPDU0BGetCommEventCounterResponse()) == b'\x0b\x00\x00\xff\xff' True ###(116)=[passed] ModbusPDU0BGetCommEventCounterError >>> raw(ModbusPDU0BGetCommEventCounterError()) == b'\x8b\x01' True ###(117)=[passed] ModbusPDU0CGetCommEventLogRequest >>> raw(ModbusPDU0CGetCommEventLogRequest()) == b'\x0c' True ###(118)=[passed] ModbusPDU0CGetCommEventLogResponse >>> raw(ModbusPDU0CGetCommEventLogResponse()) == b'\x0c\x08\x00\x00\x01\x08\x01\x21\x20\x00' True ###(119)=[passed] ModbusPDU0CGetCommEventLogError >>> raw(ModbusPDU0CGetCommEventLogError()) == b'\x8c\x01' True ###(120)=[passed] ModbusPDU0FWriteMultipleCoilsRequest >>> raw(ModbusPDU0FWriteMultipleCoilsRequest()) b'\x0f\x00\x00\x00\x01\x01\x00' ###(121)=[passed] ModbusPDU0FWriteMultipleCoilsRequest minimal parameters >>> raw(ModbusPDU0FWriteMultipleCoilsRequest(outputsValue=[0x01, 0x01])) == b'\x0f\x00\x00\x00\x01\x02\x01\x01' True ###(122)=[passed] ModbusPDU0FWriteMultipleCoilsResponse >>> raw(ModbusPDU0FWriteMultipleCoilsResponse()) == b'\x0f\x00\x00\x00\x01' True ###(123)=[passed] ModbusPDU0FWriteMultipleCoilsError >>> raw(ModbusPDU0FWriteMultipleCoilsError()) == b'\x8f\x01' True ###(124)=[passed] ModbusPDU10WriteMultipleRegistersRequest >>> raw(ModbusPDU10WriteMultipleRegistersRequest()) == b'\x10\x00\x00\x00\x01\x02\x00\x00' True ###(125)=[passed] ModbusPDU10WriteMultipleRegistersRequest minimal parameters >>> raw(ModbusPDU10WriteMultipleRegistersRequest(outputsValue=[0x0001, 0x0002])) == b'\x10\x00\x00\x00\x02\x04\x00\x01\x00\x02' True ###(126)=[passed] ModbusPDU10WriteMultipleRegistersResponse >>> raw(ModbusPDU10WriteMultipleRegistersResponse()) == b'\x10\x00\x00\x00\x01' True ###(127)=[passed] ModbusPDU10WriteMultipleRegistersError >>> raw(ModbusPDU10WriteMultipleRegistersError()) == b'\x90\x01' True ###(128)=[passed] ModbusPDU11ReportSlaveIdRequest >>> raw(ModbusPDU11ReportSlaveIdRequest()) == b'\x11' True ###(129)=[passed] ModbusPDU11ReportSlaveIdResponse minimal parameters >>> raw(ModbusPDU11ReportSlaveIdResponse(byteCount=3, slaveId="ID")) == b'\x11\x03\x49\x44\x00' True ###(130)=[passed] ModbusPDU11ReportSlaveIdError >>> raw(ModbusPDU11ReportSlaveIdError()) == b'\x91\x01' True ###(131)=[passed] ModbusPDU14ReadFileRecordRequest len parameters >>> p = raw(ModbusPDU14ReadFileRecordRequest()/ModbusReadFileSubRequest()/ModbusReadFileSubRequest()) >>> assert p == b'\x14\x0e\x06\x00\x01\x00\x00\x00\x01\x06\x00\x01\x00\x00\x00\x01' ###(132)=[passed] ModbusPDU14ReadFileRecordRequest minimal parameters >>> p = raw(ModbusPDU14ReadFileRecordRequest()/ModbusReadFileSubRequest(fileNumber=4, recordNumber=1, recordLength=2)/ModbusReadFileSubRequest(fileNumber=3, recordNumber=9, recordLength=2)) >>> assert p == b'\x14\x0e\x06\x00\x04\x00\x01\x00\x02\x06\x00\x03\x00\t\x00\x02' ###(133)=[passed] ModbusPDU14ReadFileRecordRequest dissection >>> p = ModbusPDU14ReadFileRecordRequest(b'\x14\x0e\x06\x00\x04\x00\x01\x00\x02\x06\x00\x03\x00\t\x00\x02') >>> assert isinstance(p.payload, ModbusReadFileSubRequest) >>> assert isinstance(p.payload.payload, ModbusReadFileSubRequest) ###(134)=[passed] ModbusPDU14ReadFileRecordResponse minimal parameters >>> raw(ModbusPDU14ReadFileRecordResponse()/ModbusReadFileSubResponse(recData=[0x0dfe, 0x0020])/ModbusReadFileSubResponse(recData=[0x33cd, 0x0040])) == b'\x14\x0c\x05\x06\r\xfe\x00 \x05\x063\xcd\x00@' True ###(135)=[passed] ModbusPDU14ReadFileRecordResponse dissection >>> p = ModbusPDU14ReadFileRecordResponse(b'\x14\x0c\x05\x06\r\xfe\x00 \x05\x063\xcd\x00@') >>> assert isinstance(p.payload, ModbusReadFileSubResponse) >>> assert isinstance(p.payload.payload, ModbusReadFileSubResponse) ###(136)=[passed] ModbusPDU14ReadFileRecordError >>> raw(ModbusPDU14ReadFileRecordError()) == b'\x94\x01' True ###(137)=[passed] ModbusPDU15WriteFileRecordRequest minimal parameters >>> raw(ModbusPDU15WriteFileRecordRequest()/ModbusWriteFileSubRequest(fileNumber=4, recordNumber=7, recordData=[0x06af, 0x04be, 0x100d])) == b'\x15\r\x06\x00\x04\x00\x07\x00\x03\x06\xaf\x04\xbe\x10\r' True ###(138)=[passed] ModbusPDU15WriteFileRecordRequest dissection >>> p = ModbusPDU15WriteFileRecordRequest(b'\x15\x0d\x06\x00\x04\x00\x07\x00\x03\x06\xaf\x04\xbe\x10\r') >>> assert isinstance(p.payload, ModbusWriteFileSubRequest) >>> assert p.payload.recordLength == 3 ###(139)=[passed] ModbusPDU15WriteFileRecordResponse minimal parameters >>> raw(ModbusPDU15WriteFileRecordResponse()/ModbusWriteFileSubResponse(fileNumber=4, recordNumber=7, recordData=[0x06af, 0x04be, 0x100d])) == b'\x15\r\x06\x00\x04\x00\x07\x00\x03\x06\xaf\x04\xbe\x10\r' True ###(140)=[passed] ModbusPDU15WriteFileRecordResponse dissection >>> p = ModbusPDU15WriteFileRecordResponse(b'\x15\x0d\x06\x00\x04\x00\x07\x00\x03\x06\xaf\x04\xbe\x10\r') >>> assert isinstance(p.payload, ModbusWriteFileSubResponse) >>> assert p.payload.recordLength == 3 ###(141)=[passed] ModbusPDU15WriteFileRecordError >>> raw(ModbusPDU15WriteFileRecordError()) == b'\x95\x01' True ###(142)=[passed] ModbusPDU16MaskWriteRegisterRequest >>> raw(ModbusPDU16MaskWriteRegisterRequest()) == b'\x16\x00\x00\xff\xff\x00\x00' True ###(143)=[passed] ModbusPDU16MaskWriteRegisterResponse >>> raw(ModbusPDU16MaskWriteRegisterResponse()) == b'\x16\x00\x00\xff\xff\x00\x00' True ###(144)=[passed] ModbusPDU16MaskWriteRegisterError >>> raw(ModbusPDU16MaskWriteRegisterError()) == b'\x96\x01' True ###(145)=[passed] ModbusPDU17ReadWriteMultipleRegistersRequest >>> raw(ModbusPDU17ReadWriteMultipleRegistersRequest()) == b'\x17\x00\x00\x00\x01\x00\x00\x00\x01\x02\x00\x00' True ###(146)=[passed] ModbusPDU17ReadWriteMultipleRegistersRequest minimal parameters >>> raw(ModbusPDU17ReadWriteMultipleRegistersRequest(writeRegistersValue=[0x0001, 0x0002])) == b'\x17\x00\x00\x00\x01\x00\x00\x00\x02\x04\x00\x01\x00\x02' True ###(147)=[passed] ModbusPDU17ReadWriteMultipleRegistersRequest dissection >>> p = ModbusPDU17ReadWriteMultipleRegistersRequest(b'\x17\x00\x00\x00\x01\x00\x00\x00\x02\x04\x00\x01\x00\x02') >>> assert p.byteCount == 4 >>> assert p.writeQuantityRegisters == 2 ###(148)=[passed] ModbusPDU17ReadWriteMultipleRegistersResponse >>> raw(ModbusPDU17ReadWriteMultipleRegistersResponse()) == b'\x17\x02\x00\x00' True ###(149)=[passed] ModbusPDU17ReadWriteMultipleRegistersResponse minimal parameters >>> raw(ModbusPDU17ReadWriteMultipleRegistersResponse(registerVal=[1,2,3])) == b'\x17\x06\x00\x01\x00\x02\x00\x03' True ###(150)=[passed] ModbusPDU17ReadWriteMultipleRegistersResponse dissection >>> raw(ModbusPDU17ReadWriteMultipleRegistersResponse(b'\x17\x02\x00\x01')) == b'\x17\x02\x00\x01' True ###(151)=[passed] ModbusPDU17ReadWriteMultipleRegistersError >>> raw(ModbusPDU17ReadWriteMultipleRegistersError()) == b'\x97\x01' True ###(152)=[passed] ModbusPDU18ReadFIFOQueueRequest >>> raw(ModbusPDU18ReadFIFOQueueRequest()) == b'\x18\x00\x00' True ###(153)=[passed] ModbusPDU18ReadFIFOQueueResponse >>> ###(154)=[passed] ModbusPDU18ReadFIFOQueueResponse >>> raw(ModbusPDU18ReadFIFOQueueResponse()) == b'\x18\x00\x02\x00\x00' True ###(155)=[passed] ModbusPDU18ReadFIFOQueueResponse minimal parameters >>> raw(ModbusPDU18ReadFIFOQueueResponse(FIFOVal=[0x0001, 0x0002, 0x0003])) == b'\x18\x00\x08\x00\x03\x00\x01\x00\x02\x00\x03' True ###(156)=[passed] ModbusPDU18ReadFIFOQueueResponse dissection >>> p = ModbusPDU18ReadFIFOQueueResponse(b'\x18\x00\x08\x00\x03\x00\x01\x00\x02\x00\x03') >>> assert p.byteCount == 8 >>> assert p.FIFOCount == 3 ###(157)=[passed] ModbusPDU18ReadFIFOQueueError >>> raw(ModbusPDU18ReadFIFOQueueError()) == b'\x98\x01' True ###(158)=[passed] ModbusPDU2B0EReadDeviceIdentificationRequest >>> raw(ModbusPDU2B0EReadDeviceIdentificationRequest()) == b'+\x0e\x01\x00' True ###(159)=[passed] ModbusPDU2B0EReadDeviceIdentificationResponse >>> raw(ModbusPDU2B0EReadDeviceIdentificationResponse()) == b'+\x0e\x04\x01\x00\x00\x00' True ###(160)=[passed] ModbusPDU2B0EReadDeviceIdentificationResponse complete response >>> p = raw(ModbusPDU2B0EReadDeviceIdentificationResponse(objCount=2)/ModbusObjectId(id=0, value="Obj1")/ModbusObjectId(id=1, value="Obj2")) >>> assert p == b'+\x0e\x04\x01\x00\x00\x02\x00\x04Obj1\x01\x04Obj2' ###(161)=[passed] ModbusPDU2B0EReadDeviceIdentificationResponse dissection >>> p = ModbusPDU2B0EReadDeviceIdentificationResponse(b'+\x0e\x01\x83\x00\x00\x03\x00\x08Pymodbus\x01\x02PM\x02\x031.0') >>> assert p.payload.payload.payload.id == 2 >>> assert p.payload.payload.id == 1 >>> assert p.payload.id == 0 ###(162)=[passed] ModbusPDU2B0EReadDeviceIdentificationError >>> raw(ModbusPDU2B0EReadDeviceIdentificationError()) == b'\xab\x01' True ###(163)=[passed] Modbus test for payload subfield >>> pkt = ModbusPDUUserDefinedFunctionCodeRequest(b'M\x00\x05\x00\n') >>> pkt = next(iter(pkt)) >>> assert pkt.mb_payload == b'\x00\x05\x00\n' Test mount layer ━ Run at 01:42:59 from [test/contrib/mount.uts] by UTscapy in 0.03634142875671387 └ Passed=8 └ Failed=0 ###### ## Packet Creation Tests ###### ###(000)=[passed] Create subpackets >>> Path() >>> File_Object() ###(001)=[passed] Create Mount Calls >>> NULL_Call() >>> MOUNT_Call() |> >>> UNMOUNT_Call() |> ###(002)=[passed] Create Successful Mount Replies >>> MOUNT_Reply(status=0) |> ###(003)=[passed] Create Failed Mount Replies >>> MOUNT_Reply(status=1) ###### ## RPC Layer bindings tests ###### ###(004)=[passed] Layer Bindings for Mount Calls >>> from scapy.contrib.oncrpc import * >>> pkt = RPC()/RPC_Call()/NULL_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100005, 3, 0) >>> pkt = RPC()/RPC_Call()/MOUNT_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100005, 3, 1) >>> pkt = RPC()/RPC_Call()/UNMOUNT_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100005, 3, 3) ###(005)=[passed] Layer Bindings for Mount Replies >>> from scapy.contrib.oncrpc import * >>> pkt = RPC()/RPC_Reply()/NULL_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/MOUNT_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/UNMOUNT_Reply() >>> assert pkt.mtype == 1 ###### ## Test Built Packets vs Raw Strings ###### ###(006)=[passed] Mount calls vs Raw strings >>> pkt = MOUNT_Call( ... path=Path( ... length=4, ... path='path' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04path' >>> >>> pkt = UNMOUNT_Call( ... path=Path( ... length=4, ... path='path' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04path' ###(007)=[passed] Mount replies vs Raw Strings >>> pkt = MOUNT_Reply( ... status=0, ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... flavors=3, ... flavor=[ ... 0,0,0 ... ] ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' Test campaign ━ Run at 01:42:59 from [test/contrib/mpls.uts] by UTscapy in 0.013631343841552734 └ Passed=3 └ Failed=0 ###### ## MPLS ###### ###(000)=[passed] Build & dissect - IPv4 >>> s = raw(Ether(src="00:01:02:04:05")/MPLS()/IP()) MAC address to reach destination not found. Using broadcast. >>> assert s == b'\xff\xff\xff\xff\xff\xff\x00\x01\x02\x04\x05\x00\x88G\x00\x00\x01\x00E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01' >>> >>> p = Ether(s) >>> assert MPLS in p and IP in p ###(001)=[passed] Build & dissect - IPv6 >>> s = raw(Ether(src="00:01:02:04:05")/MPLS(s=0)/MPLS()/IPv6()) MAC address to reach destination not found. Using broadcast. >>> assert s == b'\xff\xff\xff\xff\xff\xff\x00\x01\x02\x04\x05\x00\x88G\x00\x000\x00\x00\x00!\x00`\x00\x00\x00\x00\x00;@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> >>> p = Ether(s) >>> assert IPv6 in p and isinstance(p[MPLS].payload, MPLS) ###(002)=[passed] Association on IP and IPv6 >>> p = IP()/MPLS() >>> p = IP(raw(p)) >>> assert p[IP].proto == 137 >>> >>> p2 = IPv6()/MPLS() >>> p2 = IPv6(raw(p2)) >>> assert p2[IPv6].nh == 137 Test campaign ━ Run at 01:42:59 from [test/contrib/mqtt.uts] by UTscapy in 0.05261993408203125 └ Passed=24 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the MQTT layer >>> from scapy.contrib.mqtt import * ###### ## MQTT protocol test ###### ###(001)=[passed] MQTTPublish, packet instantiation >>> p = MQTT()/MQTTPublish(topic='test1',value='test2') >>> assert p.type == 3 >>> assert p.topic == b'test1' >>> assert p.value == b'test2' >>> assert p.len == None >>> assert p.length == None ###(002)=[passed] Fixed header and MQTTPublish, packet dissection >>> s = b'0\n\x00\x04testtest' >>> publish = MQTT(s) >>> assert publish.type == 3 >>> assert publish.QOS == 0 >>> assert publish.DUP == 0 >>> assert publish.RETAIN == 0 >>> assert publish.len == 10 >>> assert publish[MQTTPublish].length == 4 >>> assert publish[MQTTPublish].topic == b'test' >>> assert publish[MQTTPublish].value == b'test' ###(003)=[passed] MQTTPublish >>> topicC = "testtopic/command" >>> >>> p1 = MQTT( ... QOS=1 ... ) / MQTTPublish( ... topic=topicC, ... msgid=1234, ... value="msg1" ... ) >>> p2 = MQTT( ... QOS=1 ... ) / MQTTPublish( ... topic=topicC, ... msgid=1235, ... value="msg2" ... ) >>> >>> p = MQTT(raw(p1 / p2)) >>> assert p[1].msgid == 1234 ###(004)=[passed] MQTTConnect, packet instantiation >>> c = MQTT()/MQTTConnect(clientIdlen=5, clientId='newid') >>> assert c.type == 1 >>> assert c.clientId == b'newid' >>> assert c.clientIdlen == 5 ###(005)=[passed] MQTTConnect, packet dissection >>> s = b'\x10\x1f\x00\x06MQIsdp\x03\x02\x00<\x00\x11mosqpub/1440-kali' >>> connect = MQTT(s) >>> assert connect.length == 6 >>> assert connect.protoname == b'MQIsdp' >>> assert connect.protolevel == 3 >>> assert connect.usernameflag == 0 >>> assert connect.passwordflag == 0 >>> assert connect.willretainflag == 0 >>> assert connect.willQOSflag == 0 >>> assert connect.willflag == 0 >>> assert connect.cleansess == 1 >>> assert connect.reserved == 0 >>> assert connect.klive == 60 >>> assert connect.clientIdlen == 17 >>> assert connect.clientId == b'mosqpub/1440-kali' ###(006)=[passed] MQTTDisconnect >>> mr = raw(MQTT()/MQTTDisconnect()) >>> dc= MQTT(mr) >>> assert dc.type == 14 ###(007)=[passed] MQTTConnack, packet instantiation >>> ck = MQTT()/MQTTConnack(sessPresentFlag=1,retcode=0) >>> assert ck.type == 2 >>> assert ck.sessPresentFlag == 1 >>> assert ck.retcode == 0 ###(008)=[passed] MQTTConnack, packet dissection >>> s = b' \x02\x00\x00' >>> connack = MQTT(s) >>> assert connack.sessPresentFlag == 0 >>> assert connack.retcode == 0 ###(009)=[passed] MQTTSubscribe, packet instantiation >>> sb = MQTT()/MQTTSubscribe(msgid=1, topics=[MQTTTopicQOS(topic='newtopic', QOS=1, length=0)]) >>> assert sb.type == 8 >>> assert sb.msgid == 1 >>> assert sb.topics[0].topic == b'newtopic' >>> assert sb.topics[0].length == 0 >>> assert sb[MQTTSubscribe][MQTTTopicQOS].QOS == 1 ###(010)=[passed] MQTTSubscribe, packet dissection >>> s = b'\x82\t\x00\x01\x00\x04test\x01' >>> subscribe = MQTT(s) >>> assert subscribe.msgid == 1 >>> assert subscribe.topics[0].length == 4 >>> assert subscribe.topics[0].topic == b'test' >>> assert subscribe.topics[0].QOS == 1 ###(011)=[passed] MQTTSuback, packet instantiation >>> sk = MQTT()/MQTTSuback(msgid=1, retcodes=[0]) >>> assert sk.type == 9 >>> assert sk.msgid == 1 >>> assert sk.retcodes == [0] ###(012)=[passed] MQTTSuback, packet dissection >>> s = b'\x90\x03\x00\x01\x00' >>> suback = MQTT(s) >>> assert suback.msgid == 1 >>> assert suback.retcodes == [0] >>> >>> s = b'\x90\x03\x00\x01\x00\x01' >>> suback = MQTT(s) >>> assert suback.msgid == 1 >>> assert suback.retcodes == [0, 1] ###(013)=[passed] MQTTUnsubscribe, packet instantiation >>> unsb = MQTT()/MQTTUnsubscribe(msgid=1, topics=[MQTTTopic(topic='newtopic',length=0)]) >>> assert unsb.type == 10 >>> assert unsb.msgid == 1 >>> assert unsb.topics[0].topic == b'newtopic' >>> assert unsb.topics[0].length == 0 ###(014)=[passed] MQTTUnsubscribe, packet dissection >>> u = b'\xA2\x09\x00\x01\x00\x03\x61\x2F\x62' >>> unsubscribe = MQTT(u) >>> assert unsubscribe.msgid == 1 >>> assert unsubscribe.topics[0].length == 3 >>> assert unsubscribe.topics[0].topic == b'a/b' ###(015)=[passed] MQTTUnsuback, packet instantiation >>> unsk = MQTT()/MQTTUnsuback(msgid=1) >>> assert unsk.type == 11 >>> assert unsk.msgid == 1 ###(016)=[passed] MQTTUnsuback, packet dissection >>> u = b'\xb0\x02\x00\x01' >>> unsuback = MQTT(u) >>> assert unsuback.type == 11 >>> assert unsuback.msgid == 1 ###(017)=[passed] MQTTPubrec, packet instantiation >>> pc = MQTT()/MQTTPubrec(msgid=1) >>> assert pc.type == 5 >>> assert pc.msgid == 1 ###(018)=[passed] MQTTPubrec packet dissection >>> s = b'P\x02\x00\x01' >>> pubrec = MQTT(s) >>> assert pubrec.msgid == 1 ###(019)=[passed] MQTTPublish, long value >>> p = MQTT()/MQTTPublish(topic='test1',value='a'*200) >>> assert bytes(p) >>> assert p.type == 3 >>> assert p.topic == b'test1' >>> assert p.value == b'a'*200 >>> assert p.len == None >>> assert p.length == None ###(020)=[passed] MQTT without payload >>> p = MQTT() >>> assert bytes(p) == b'\x10\x00' ###(021)=[passed] MQTT RandVariableFieldLen >>> assert type(MQTT().fieldtype['len'].randval()) == RandVariableFieldLen >>> assert type(MQTT().fieldtype['len'].randval() + 0) == int ###(022)=[passed] MQTTUnsubscribe >>> u = MQTT(b'\xA2\x0C\x00\x01\x00\x03\x61\x2F\x62\x00\x03\x63\x2F\x64') >>> assert MQTTUnsubscribe in u and len(u.topics) == 2 and u.topics[1].topic == b"c/d" ###(023)=[passed] MQTTSubscribe >>> u = MQTT(b'\x82\x10\x00\x01\x00\x03\x61\x2F\x62\x02\x00\x03\x63\x2F\x64\x00') >>> assert MQTTSubscribe in u and len(u.topics) == 2 and u.topics[1].topic == b"c/d" Test campaign ━ Run at 01:43:00 from [test/contrib/mqttsn.uts] by UTscapy in 0.24092578887939453 └ Passed=78 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the MQTT-SN layer >>> from scapy.contrib.mqttsn import * ###### ## MQTT-SN protocol test ###### ###(001)=[passed] MQTTSN + MQTTSNAdvertise, packet instantiation and len field adjust >>> p = MQTTSN() / MQTTSNAdvertise(gw_id=142, duration=54403) >>> assert p.len is None >>> assert p.type == ADVERTISE >>> assert p.gw_id == 142 >>> assert p.duration == 54403 >>> b = bytes(p) >>> p = MQTTSN(b) >>> assert p.len == 5 >>> assert p.type == ADVERTISE >>> assert p.gw_id == 142 >>> assert p.duration == 54403 ###(002)=[passed] MQTTSNAdvertise, packet dissection >>> b = b"\x05\x00\x98\x2b\x9a" >>> p = MQTTSN(b) >>> assert p.len == 5 >>> assert p.type == ADVERTISE >>> assert p.gw_id == 0x98 >>> assert p.duration == 0x2b9a ###(003)=[passed] MQTTSNSearchGW, packet instantiation >>> p = MQTTSN() / MQTTSNSearchGW(radius=175) >>> assert p.len is None >>> assert p.type == SEARCHGW >>> assert p.radius == 175 ###(004)=[passed] MQTTSNSearchGW, packet dissection >>> b = b"\x03\x01\xcc" >>> p = MQTTSN(b) >>> assert p.len == 3 >>> assert p.type == SEARCHGW >>> assert p.radius == 0xcc ###(005)=[passed] MQTTSNGwInfo, packet instantiation >>> p = MQTTSN() / MQTTSNGwInfo(gw_id=135, gw_addr="test\0test") >>> assert p.len is None >>> assert p.type == GWINFO >>> assert p.gw_id == 135 >>> assert p.gw_addr == b"test\x00test" ###(006)=[passed] MQTTSN + MQTTSNGwInfo, packet instantiation and len field adjust >>> p = MQTTSN(len=7) / MQTTSNGwInfo(gw_id=7, gw_addr="test") / "xyz" >>> assert p.len == 7 >>> assert p.type == GWINFO >>> assert p.gw_id == 7 >>> assert p.gw_addr == b"test" >>> assert p.load == b"xyz" >>> b = bytes(p) >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == GWINFO >>> assert p.gw_id == 7 >>> assert p.gw_addr == b"test" >>> assert p.load == b"xyz" ###(007)=[passed] MQTTSNGwInfo, packet dissection >>> b = b"\x07\x02\x14testing" >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == GWINFO >>> assert p.gw_id == 0x14 >>> assert p.gw_addr == b"test" >>> assert p.load == b"ing" ###(008)=[passed] MQTTSNGwInfo, packet dissection - invalid length >>> b = b"\x01\x00\x01\x02\x14test" >>> p = MQTTSN(b) >>> print(type(p), repr(p)) >> >>> assert p.len == 1 >>> assert p.type == GWINFO >>> assert p.gw_id == 0x14 >>> assert p.gw_addr == b"" ###(009)=[passed] MQTTSNConnect, packet instantiation >>> p = MQTTSN() / MQTTSNConnect(duration=40666, client_id="test") >>> assert p.len is None >>> assert p.type == CONNECT >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.prot_id == 1 >>> assert p.duration == 40666 >>> assert p.client_id == b"test" ###(010)=[passed] MQTTSNConnect, packet dissection >>> b = b"\x0a\x04\x04\x1a\x77\x5btesting" >>> p = MQTTSN(b) >>> assert p.len == 10 >>> assert p.type == CONNECT >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 1 >>> assert p.tid_type == TID_NORMAL >>> assert p.prot_id == 0x1a >>> assert p.duration == 0x775b >>> assert p.client_id == b"test" >>> assert p.load == b"ing" ###(011)=[passed] MQTTSNConnack, packet instantiation >>> p = MQTTSN() / MQTTSNConnack() >>> assert p.len is None >>> assert p.type == CONNACK >>> assert p.return_code == ACCEPTED ###(012)=[passed] MQTTSNConnack, packet dissection >>> b = b"\x03\x05\x02" >>> p = MQTTSN(b) >>> assert p.len == 3 >>> assert p.type == CONNACK >>> assert p.return_code == REJ_TID ###(013)=[passed] MQTTSNWillTopicReq, packet instantiation >>> p = MQTTSN() / MQTTSNWillTopicReq() >>> assert p.len is None >>> assert p.type == WILLTOPICREQ ###(014)=[passed] MQTTSNWillTopicReq, packet dissection >>> b = b"\x02\x06" >>> p = MQTTSN(b) >>> assert p.len == 2 >>> assert p.type == WILLTOPICREQ ###(015)=[passed] MQTTSNWillTopic, packet instantiation >>> p = MQTTSN() / MQTTSNWillTopic(will_topic="/test") >>> assert p.len is None >>> assert p.type == WILLTOPIC >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.will_topic == b"/test" ###(016)=[passed] MQTTSNWillTopic, packet dissection >>> b = b"\x08\x07\x00/testing" >>> p = MQTTSN(b) >>> assert p.len == 8 >>> assert p.type == WILLTOPIC >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.will_topic == b"/test" ###(017)=[passed] MQTTSNWillMsgReq, packet instantiation >>> p = MQTTSN() / MQTTSNWillMsgReq() >>> assert p.len is None >>> assert p.type == WILLMSGREQ ###(018)=[passed] MQTTSNWillMsgReq, packet dissection >>> b = b"\x02\x08" >>> p = MQTTSN(b) >>> assert p.len == 2 >>> assert p.type == WILLMSGREQ ###(019)=[passed] MQTTSNWillMsg, packet instantiation >>> p = MQTTSN() / MQTTSNWillMsg(will_msg="test") >>> assert p.len is None >>> assert p.type == WILLMSG >>> assert p.will_msg == b"test" ###(020)=[passed] MQTTSNWillMsg, packet dissection >>> b = b"\x06\x09testing" >>> p = MQTTSN(b) >>> assert p.len == 6 >>> assert p.type == WILLMSG >>> assert p.will_msg == b"test" >>> assert p.load == b"ing" ###(021)=[passed] MQTTSNRegister, packet instantiation >>> p = MQTTSN() / MQTTSNRegister(mid=30533, topic_name="/test") >>> assert p.len is None >>> assert p.type == REGISTER >>> assert p.tid == 0 >>> assert p.mid == 30533 >>> assert p.topic_name == b"/test" ###(022)=[passed] MQTTSNRegister, packet dissection >>> b = b"\x0b\x0a\0\0\x48\x8a/testing" >>> p = MQTTSN(b) >>> assert p.len == 11 >>> assert p.type == REGISTER >>> assert p.tid == 0 >>> assert p.mid == 0x488a >>> assert p.topic_name == b"/test" >>> assert p.load == b"ing" ###(023)=[passed] MQTTSNRegack, packet instantiation >>> p = MQTTSN() / MQTTSNRegack(tid=61547, mid=8593, return_code=REJ_NOTSUP) >>> assert p.len is None >>> assert p.type == REGACK >>> assert p.tid == 61547 >>> assert p.mid == 8593 >>> assert p.return_code == REJ_NOTSUP ###(024)=[passed] MQTTSNRegack, packet dissection >>> b = b"\x08\x0b\xc5\xe8\x31\x87\x01" >>> p = MQTTSN(b) >>> assert p.len == 8 >>> assert p.type == REGACK >>> assert p.tid == 0xc5e8 >>> assert p.mid == 0x3187 >>> assert p.return_code == REJ_CONJ ###(025)=[passed] MQTTSNPublish, packet instantiation >>> p = MQTTSN() / MQTTSNPublish(qos=QOS_1, tid=52032, mid=35252, ... data="Hello world!") >>> assert p.len is None >>> assert p.type == PUBLISH >>> assert p.dup == 0 >>> assert p.qos == QOS_1 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.tid == 52032 >>> assert p.mid == 35252 >>> assert p.data == b"Hello world!" ###(026)=[passed] MQTTSNPublish, packet instantiation - long data >>> p = MQTTSN() / MQTTSNPublish(qos=QOS_NEG1, tid=62839, mid=36181, ... data=726 * "X") >>> assert p.len is None >>> assert p.type == PUBLISH >>> assert p.dup == 0 >>> assert p.qos == QOS_NEG1 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.tid == 62839 >>> assert p.mid == 36181 >>> assert p.data == 726 * b"X" >>> b = bytes(p) >>> assert b[:3] == b'\x01\x02\xdf' >>> p = MQTTSN(b) >>> assert p.len == 735 >>> assert p.data == 726 * b"X" ###(027)=[passed] MQTTSNPublish, packet dissection >>> b = b"\x0b\x0c\x40\x19\x7f\x6a\x26testing" >>> p = MQTTSN(b) >>> assert p.len == 11 >>> assert p.type == PUBLISH >>> assert p.dup == 0 >>> assert p.qos == QOS_2 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.tid == 0x197f >>> assert p.mid == 0x6a26 >>> assert p.data == b"test" >>> assert p.load == b"ing" ###(028)=[passed] MQTTSNPublish, packet dissection - long data >>> b = b"\x01\x04\x64\x0c" + b"\x00\xb1\x39\xd7\x4a" + (1115 * b"X") >>> p = MQTTSN(b) >>> assert p.len == 0x0464 == (4 + 5 + 1115) >>> assert p.type == PUBLISH >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.tid == 0xb139 >>> assert p.mid == 0xd74a >>> assert p.data == 1115 * b"X" ###(029)=[passed] MQTTSNPuback, packet instantiation >>> p = MQTTSN() / MQTTSNPuback(tid=27610, mid=30284, return_code=ACCEPTED) >>> assert p.len is None >>> assert p.type == PUBACK >>> assert p.tid == 27610 >>> assert p.mid == 30284 >>> assert p.return_code == ACCEPTED ###(030)=[passed] MQTTSNPuback, packet dissection >>> b = b"\x08\x0d\x03\xda\x73\x9a\x02" >>> p = MQTTSN(b) >>> assert p.len == 8 >>> assert p.type == PUBACK >>> assert p.tid == 0x03da >>> assert p.mid == 0x739a >>> assert p.return_code == REJ_TID ###(031)=[passed] MQTTSNPubcomp, packet instantiation >>> p = MQTTSN() / MQTTSNPubcomp(mid=36193) >>> assert p.len is None >>> assert p.type == PUBCOMP >>> assert p.mid == 36193 ###(032)=[passed] MQTTSNPubcomp, packet dissection >>> b = b"\x04\x0e\x26\xa2" >>> p = MQTTSN(b) >>> assert p.len == 4 >>> assert p.type == PUBCOMP >>> assert p.mid == 0x26a2 ###(033)=[passed] MQTTSNPubrec, packet instantiation >>> p = MQTTSN() / MQTTSNPubrec(mid=44837) >>> assert p.len is None >>> assert p.type == PUBREC >>> assert p.mid == 44837 ###(034)=[passed] MQTTSNPubrec, packet dissection >>> b = b"\x04\x0f\x36\xc4" >>> p = MQTTSN(b) >>> assert p.len == 4 >>> assert p.type == PUBREC >>> assert p.mid == 0x36c4 ###(035)=[passed] MQTTSNPubrel, packet instantiation >>> p = MQTTSN() / MQTTSNPubrel(mid=42834) >>> assert p.len is None >>> assert p.type == PUBREL >>> assert p.mid == 42834 ###(036)=[passed] MQTTSNPubrel, packet dissection >>> b = b"\x04\x10\x94\x0f" >>> p = MQTTSN(b) >>> assert p.len == 4 >>> assert p.type == PUBREL >>> assert p.mid == 0x940f ###(037)=[passed] MQTTSNSubscribe, packet instantiation - topic name >>> p = MQTTSN() / MQTTSNSubscribe(mid=63780, topic_name="/test") >>> assert p.len is None >>> assert p.type == SUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.topic_name == b"/test" >>> assert p.short_topic is None >>> assert p.tid is None ###(038)=[passed] MQTTSNSubscribe, packet instantiation - predefined topic ID >>> p = MQTTSN() / MQTTSNSubscribe(mid=63780, tid_type=TID_PREDEF, ... tid=1187) >>> assert p.len is None >>> assert p.type == SUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_PREDEF >>> assert p.topic_name is None >>> assert p.short_topic is None >>> assert p.tid == 1187 ###(039)=[passed] MQTTSNSubscribe, packet instantiation - short topic >>> p = MQTTSN() / MQTTSNSubscribe(mid=63780, tid_type=TID_SHORT, short_topic="fx") >>> assert p.len is None >>> assert p.type == SUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_SHORT >>> assert p.topic_name is None >>> assert p.short_topic == b"fx" >>> assert p.tid is None ###(040)=[passed] MQTTSNSubscribe, packet dissection - topic name >>> b = b"\x07\x12\x00\x66\x8a/t" >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == SUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.mid == 0x668a >>> assert p.topic_name == b"/t" >>> assert p.short_topic is None >>> assert p.tid is None ###(041)=[passed] MQTTSNSubscribe, packet dissection - short topic >>> b = b"\x07\x12\x01\x66\x8a/t" >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == SUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_PREDEF >>> assert p.mid == 0x668a >>> assert p.topic_name is None >>> assert p.short_topic is None >>> assert p.tid == (ord("/") << 8 | ord("t")) == 12148 ###(042)=[passed] MQTTSNSubscribe, packet dissection - predefined topic ID >>> b = b"\x07\x12\x02\x66\x8a/t" >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == SUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_SHORT >>> assert p.mid == 0x668a >>> assert p.topic_name is None >>> assert p.short_topic == b"/t" >>> assert p.tid is None ###(043)=[passed] MQTTSNSuback, packet instantiation >>> p = MQTTSN() / MQTTSNSuback(qos=QOS_0, tid=5496, mid=63108, ... return_code=REJ_TID) >>> assert p.len is None >>> assert p.type == SUBACK >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.tid == 5496 >>> assert p.mid == 63108 >>> assert p.return_code == REJ_TID ###(044)=[passed] MQTTSNSuback, packet dissection >>> b = b"\x08\x13\xa4\x93\x0b\x02\xc6\x00" >>> p = MQTTSN(b) >>> assert p.len == 8 >>> assert p.type == SUBACK >>> assert p.dup == 1 >>> assert p.qos == QOS_1 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 1 >>> assert p.tid_type == TID_NORMAL >>> assert p.tid == 0x930b >>> assert p.mid == 0x02c6 >>> assert p.return_code == ACCEPTED ###(045)=[passed] MQTTSNUnsubscribe, packet instantiation - topic name >>> p = MQTTSN() / MQTTSNUnsubscribe(mid=63780, topic_name="/test") >>> assert p.len is None >>> assert p.type == UNSUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.topic_name == b"/test" >>> assert p.short_topic is None >>> assert p.tid is None ###(046)=[passed] MQTTSNUnsubscribe, packet instantiation - predefined topic ID >>> p = MQTTSN() / MQTTSNUnsubscribe(mid=63780, tid_type=TID_PREDEF, ... tid=1187) >>> assert p.len is None >>> assert p.type == UNSUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_PREDEF >>> assert p.topic_name is None >>> assert p.short_topic is None >>> assert p.tid == 1187 ###(047)=[passed] MQTTSNUnsubscribe, packet instantiation - short topic >>> p = MQTTSN() / MQTTSNUnsubscribe(mid=63780, tid_type=TID_SHORT, ... short_topic="fx") >>> assert p.len is None >>> assert p.type == UNSUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_SHORT >>> assert p.topic_name is None >>> assert p.short_topic == b"fx" >>> assert p.tid is None ###(048)=[passed] MQTTSNUnsubscribe, packet dissection - topic name >>> b = b"\x07\x14\x00\x66\x8a/t" >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == UNSUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.mid == 0x668a >>> assert p.topic_name == b"/t" >>> assert p.short_topic is None >>> assert p.tid is None ###(049)=[passed] MQTTSNUnsubscribe, packet dissection - short topic >>> b = b"\x07\x14\x01\x66\x8a/t" >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == UNSUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_PREDEF >>> assert p.mid == 0x668a >>> assert p.topic_name is None >>> assert p.short_topic is None >>> assert p.tid == (ord("/") << 8 | ord("t")) == 12148 ###(050)=[passed] MQTTSNUnsubscribe, packet dissection - predefined topic ID >>> b = b"\x07\x14\x02\x66\x8a/t" >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == UNSUBSCRIBE >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_SHORT >>> assert p.mid == 0x668a >>> assert p.topic_name is None >>> assert p.short_topic == b"/t" >>> assert p.tid is None ###(051)=[passed] MQTTSNUnsuback, packet instantiation >>> p = MQTTSN() / MQTTSNUnsuback(mid=44541) >>> assert p.len is None >>> assert p.type == UNSUBACK >>> assert p.mid == 44541 ###(052)=[passed] MQTTSNUnsuback, packet dissection >>> b = b"\x08\x15\xcb\x3d" >>> p = MQTTSN(b) >>> assert p.len == 8 >>> assert p.type == UNSUBACK >>> assert p.mid == 0xcb3d ###(053)=[passed] MQTTSNPingReq, packet instantiation - no client ID >>> p = MQTTSN() / MQTTSNPingReq() >>> assert p.len is None >>> assert p.type == PINGREQ >>> assert p.client_id == b"" ###(054)=[passed] MQTTSNPingReq, packet instantiation - with client ID >>> p = MQTTSN() / MQTTSNPingReq(client_id="test") >>> assert p.len is None >>> assert p.type == PINGREQ >>> assert p.client_id == b"test" ###(055)=[passed] MQTTSNPingReq, packet dissection >>> b = b"\x07\x16hello" >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == PINGREQ >>> assert p.client_id == b"hello" ###(056)=[passed] MQTTSNPingResp, packet instantiation >>> p = MQTTSN() / MQTTSNPingResp() >>> assert p.len is None >>> assert p.type == PINGRESP ###(057)=[passed] MQTTSNPingResp, packet dissection >>> b = b"\x02\x17" >>> p = MQTTSN(b) >>> assert p.len == 2 >>> assert p.type == PINGRESP ###(058)=[passed] MQTTSNDisconnect, packet instantiation and len field adjust - w/o duration >>> p = MQTTSN() / MQTTSNDisconnect() >>> assert p.len is None >>> assert p.type == DISCONNECT >>> assert p.duration is None >>> b = bytes(p) >>> p = MQTTSN(b) >>> assert p.len == 2 >>> assert p.type == DISCONNECT ###(059)=[passed] MQTTSNDisconnect, packet instantiation and len field adjust - w duration >>> p = MQTTSN() / MQTTSNDisconnect(duration=19567) >>> assert p.len is None >>> assert p.type == DISCONNECT >>> assert p.duration == 19567 >>> b = bytes(p) >>> p = MQTTSN(b) >>> assert p.len == 4 >>> assert p.type == DISCONNECT >>> assert p.duration == 19567 ###(060)=[passed] MQTTSNDisconnect, packet dissection - w/o duration >>> b = b"\x02\x18" >>> p = MQTTSN(b) >>> assert p.len == 2 >>> assert p.type == DISCONNECT ###(061)=[passed] MQTTSNDisconnect, packet dissection - w duration >>> b = b"\x04\x18\x03\x12" >>> p = MQTTSN(b) >>> assert p.len == 4 >>> assert p.type == DISCONNECT >>> assert p.duration == 0x0312 ###(062)=[passed] MQTTSNWillTopicUpd, packet instantiation >>> p = MQTTSN() / MQTTSNWillTopicUpd(will_topic="/test") >>> assert p.len is None >>> assert p.type == WILLTOPICUPD >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.will_topic == b"/test" ###(063)=[passed] MQTTSNWillTopicUpd, packet dissection >>> b = b"\x08\x1a\x00/testing" >>> p = MQTTSN(b) >>> assert p.len == 8 >>> assert p.type == WILLTOPICUPD >>> assert p.dup == 0 >>> assert p.qos == QOS_0 >>> assert p.retain == 0 >>> assert p.will == 0 >>> assert p.cleansess == 0 >>> assert p.tid_type == TID_NORMAL >>> assert p.will_topic == b"/test" ###(064)=[passed] MQTTSNWillTopicResp, packet instantiation >>> p = MQTTSN() / MQTTSNWillTopicResp() >>> assert p.len is None >>> assert p.type == WILLTOPICRESP >>> assert p.return_code == ACCEPTED ###(065)=[passed] MQTTSNWillTopicResp, packet dissection >>> b = b"\x03\x1b\x02" >>> p = MQTTSN(b) >>> assert p.len == 3 >>> assert p.type == WILLTOPICRESP >>> assert p.return_code == REJ_TID ###(066)=[passed] MQTTSNWillMsgUpd, packet instantiation >>> p = MQTTSN() / MQTTSNWillMsgUpd(will_msg="test") >>> assert p.len is None >>> assert p.type == WILLMSGUPD >>> assert p.will_msg == b"test" ###(067)=[passed] MQTTSNWillMsgUpd, packet dissection >>> b = b"\x06\x1ctesting" >>> p = MQTTSN(b) >>> assert p.len == 6 >>> assert p.type == WILLMSGUPD >>> assert p.will_msg == b"test" >>> assert p.load == b"ing" ###(068)=[passed] MQTTSNWillMsgResp, packet instantiation >>> p = MQTTSN() / MQTTSNWillMsgResp() >>> assert p.len is None >>> assert p.type == WILLMSGRESP >>> assert p.return_code == ACCEPTED ###(069)=[passed] MQTTSNWillMsgResp, packet dissection >>> b = b"\x03\x1d\x02" >>> p = MQTTSN(b) >>> assert p.len == 3 >>> assert p.type == WILLMSGRESP >>> assert p.return_code == REJ_TID ###(070)=[passed] MQTTSNEncaps, packet instantiation >>> p = MQTTSN() / MQTTSNEncaps(radius=1, w_node_id="test") / MQTTSN() / \ ... MQTTSNConnack() >>> assert p.len is None >>> assert p.type == ENCAPS_MSG >>> assert p.radius == 1 >>> assert p.w_node_id == b"test" >>> assert p.payload.payload.len is None >>> assert p.payload.payload.type == CONNACK >>> assert p.payload.payload.return_code == ACCEPTED >>> b = bytes(p) >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == ENCAPS_MSG >>> assert p.radius == 1 >>> assert p.w_node_id == b"test" >>> assert p.return_code == ACCEPTED >>> assert p.payload.payload.len == 3 >>> assert p.payload.payload.type == CONNACK >>> assert p.payload.payload.return_code == ACCEPTED ###(071)=[passed] MQTTSNEncaps, packet dissection >>> b = b"\x07\xfe\x02test\x03\x05\x00" >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == ENCAPS_MSG >>> assert p.radius == 2 >>> assert p.w_node_id == b"test" >>> assert p.payload.payload.len == 3 >>> assert p.payload.payload.type == CONNACK >>> assert p.payload.payload.return_code == ACCEPTED ###(072)=[passed] MQTTSNEncaps, packet dissection -- long payload >>> b = b"\x07\xfe\x02test" + b"\x01\x04\x64\x0c" + b"\x00\xb1\x39\xd7\x4a" + \ ... (1115 * b"X") >>> p = MQTTSN(b) >>> assert p.len == 7 >>> assert p.type == ENCAPS_MSG >>> assert p.radius == 2 >>> assert p.w_node_id == b"test" >>> assert p.payload.payload.len == 4 + 5 + 1115 == 0x0464 >>> assert p.payload.payload.type == PUBLISH >>> assert p.payload.payload.dup == 0 >>> assert p.payload.payload.qos == QOS_0 >>> assert p.payload.payload.retain == 0 >>> assert p.payload.payload.will == 0 >>> assert p.payload.payload.cleansess == 0 >>> assert p.payload.payload.tid_type == TID_NORMAL >>> assert p.payload.payload.tid == 0xb139 >>> assert p.payload.payload.mid == 0xd74a >>> assert p.payload.payload.data == 1115 * b"X" ###(073)=[passed] MQTTSN without payload >>> p = MQTTSN() >>> assert bytes(p) == b"\x02\x00" ###(074)=[passed] MQTTSN without payload -- invalid lengths >>> p = MQTTSN(len=1) >>> try: ... bytes(p) # expect Scapy_Exception ... assert false ... except Scapy_Exception: ... pass ... >>> p = MQTTSN(len=0x10000) >>> try: ... bytes(p) # expect Scapy_Exception ... assert false ... except Scapy_Exception: ... pass ... >>> b = '\x01' >>> try: ... p = MQTTSN(b) # expect Scapy_Exception ... assert false ... except Scapy_Exception: ... pass ... >>> b = '\x01\x02' >>> try: ... p = MQTTSN(b) # expect Scapy_Exception ... assert false ... except Scapy_Exception: ... pass ... ###(075)=[passed] MQTT-SN RandVariableFieldLen >>> assert type(MQTTSN().fieldtype["len"].randval()) == RandVariableFieldLen >>> assert type(MQTTSN().fieldtype["len"].randval() + 0) == int ###(076)=[passed] Disect full IPv6 packages >>> b = b"\x60\x00\x00\x00\x00\x2c\x11\x40\x20\x01\x0d\xb8\x00\x00\x00\x00" \ ... b"\x17\x11\x6b\x10\x65\xf7\x5f\x0a\x20\x01\x0d\xb8\x00\x00\x00\x00" \ ... b"\x17\x11\x6b\x10\x65\xfd\xbe\x06\xc0\x00\x07\x5b\x00\x2c\x40\x7e" \ ... b"\x0b\x0a\0\0\x48\x8a/testing" >>> p = IPv6(b) >>> assert MQTTSNRegister in p >>> >>> b = b"\x60\x00\x00\x00\x00\x0f\x11\x40\x20\x01\x0d\xb8\x00\x00\x00\x00" \ ... b"\x17\x11\x6b\x10\x65\xfd\xbe\x06\x20\x01\x0d\xb8\x00\x00\x00\x00" \ ... b"\x17\x11\x6b\x10\x65\xf7\x5f\x0a\x07\x5b\xc0\x00\x00\x0f\x62\x7c" \ ... b"\x07\x0d\x00\x01\x86\x2f\x00" >>> p = IPv6(b) >>> assert MQTTSNPuback in p ###(077)=[passed] UDP packet instantiation >>> b = bytes(UDP() / MQTTSN() / MQTTSNConnack()) No IP underlayer to compute checksum. Leaving null. >>> p = UDP(b) >>> assert MQTTSNConnack in p >>> assert p.sport == 1883 >>> assert p.dport == 1883 Tests for nfs module ━ Run at 01:43:00 from [test/contrib/nfs.uts] by UTscapy in 0.5406699180603027 └ Passed=8 └ Failed=0 ###### ## Packet Creation Tests ###### ###(000)=[passed] Create subpackets >>> Fattr3() >>> File_Object() >>> Object_Name() >>> WCC_Attr() >>> File_From_Dir_Plus() |> >>> File_From_Dir() |> >>> Sattr3() ###(001)=[passed] Create NFS Calls >>> NULL_Call() >>> GETATTR_Call() |> >>> SETATTR_Call() attributes= |> >>> LOOKUP_Call() filename= |> >>> ACCESS_Call() |> >>> READLINK_Call() |> >>> READ_Call() |> >>> WRITE_Call() |> >>> CREATE_Call() filename= attributes= |> >>> MKDIR_Call() dir_name= attributes= |> >>> SYMLINK_Call() dir_name= attributes= link_name= |> >>> REMOVE_Call() filename= |> >>> RMDIR_Call() filename= |> >>> RENAME_Call() name_from= dir_to= name_to= |> >>> LINK_Call() link_dir= link_name= |> >>> READDIR_Call() |> >>> READDIRPLUS_Call() |> >>> FSSTAT_Call() |> >>> FSINFO_Call() |> >>> PATHCONF_Call() |> >>> COMMIT_Call() |> ###(002)=[passed] Create NFS Successful replies >>> GETATTR_Reply(status=0) |> >>> SETATTR_Reply(status=0) >>> LOOKUP_Reply(status=0) |> >>> ACCESS_Reply(status=0) >>> READLINK_Reply(status=0) |> >>> READ_Reply(status=0) >>> WRITE_Reply(status=0) >>> CREATE_Reply(status=0) >>> MKDIR_Reply(status=0) >>> SYMLINK_Reply(status=0) >>> REMOVE_Reply(status=0) >>> RMDIR_Reply(status=0) >>> RENAME_Reply(status=0) >>> LINK_Reply(status=0) >>> READDIR_Reply(status=0) >>> READDIRPLUS_Reply(status=0) >>> FSSTAT_Reply(status=0) >>> FSINFO_Reply(status=0) >>> PATHCONF_Reply(status=0) >>> COMMIT_Reply(status=0) ###(003)=[passed] Create NFS Failed replies >>> GETATTR_Reply(status=1) >>> SETATTR_Reply(status=1) >>> LOOKUP_Reply(status=1) >>> ACCESS_Reply(status=1) >>> READLINK_Reply(status=1) >>> READ_Reply(status=1) >>> WRITE_Reply(status=1) >>> CREATE_Reply(status=1) >>> MKDIR_Reply(status=1) >>> SYMLINK_Reply(status=1) >>> REMOVE_Reply(status=1) >>> RMDIR_Reply(status=1) >>> RENAME_Reply(status=1) >>> LINK_Reply(status=1) >>> READDIR_Reply(status=1) >>> READDIRPLUS_Reply(status=1) >>> FSSTAT_Reply(status=1) >>> FSINFO_Reply(status=1) >>> PATHCONF_Reply(status=1) >>> COMMIT_Reply(status=1) ###### ## Test RPC Call layer bindings ###### ###(004)=[passed] Layer Bindings for NFS Calls >>> from scapy.contrib.oncrpc import * >>> pkt = RPC()/RPC_Call()/NULL_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 0) >>> pkt = RPC()/RPC_Call()/GETATTR_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 1) >>> pkt = RPC()/RPC_Call()/SETATTR_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 2) >>> pkt = RPC()/RPC_Call()/LOOKUP_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 3) >>> pkt = RPC()/RPC_Call()/ACCESS_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 4) >>> pkt = RPC()/RPC_Call()/READLINK_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 5) >>> pkt = RPC()/RPC_Call()/READ_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 6) >>> pkt = RPC()/RPC_Call()/WRITE_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 7) >>> pkt = RPC()/RPC_Call()/CREATE_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 8) >>> pkt = RPC()/RPC_Call()/MKDIR_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 9) >>> pkt = RPC()/RPC_Call()/SYMLINK_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 10) >>> pkt = RPC()/RPC_Call()/REMOVE_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 12) >>> pkt = RPC()/RPC_Call()/RMDIR_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 13) >>> pkt = RPC()/RPC_Call()/RENAME_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 14) >>> pkt = RPC()/RPC_Call()/LINK_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 15) >>> pkt = RPC()/RPC_Call()/READDIR_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 16) >>> pkt = RPC()/RPC_Call()/READDIRPLUS_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 17) >>> pkt = RPC()/RPC_Call()/FSSTAT_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 18) >>> pkt = RPC()/RPC_Call()/FSINFO_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 19) >>> pkt = RPC()/RPC_Call()/PATHCONF_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 20) >>> pkt = RPC()/RPC_Call()/COMMIT_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100003, 3, 21) ###(005)=[passed] Layer Bindings for NFS Replies >>> from scapy.contrib.oncrpc import * >>> pkt = RPC()/RPC_Reply()/NULL_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/GETATTR_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/SETATTR_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/LOOKUP_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/ACCESS_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/READLINK_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/READ_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/WRITE_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/CREATE_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/MKDIR_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/SYMLINK_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/REMOVE_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/RMDIR_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/RENAME_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/LINK_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/READDIR_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/READDIRPLUS_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/FSSTAT_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/FSINFO_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/PATHCONF_Reply() >>> assert pkt.mtype==1 >>> pkt = RPC()/RPC_Reply()/COMMIT_Reply() >>> assert pkt.mtype==1 ###### ## Test Built Packets Against Raw Strings ###### ###(006)=[passed] Built NFS Calls vs Raw Strings >>> pkt = GETATTR_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file' >>> >>> pkt = LOOKUP_Call( ... dir=File_Object( ... length=3, ... fh='DIR', ... fill='\x00' ... ), ... filename=Object_Name( ... length=4, ... _name='File' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x03DIR\x00\x00\x00\x00\x04File' >>> >>> pkt = FSINFO_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file' >>> >>> pkt = PATHCONF_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file' >>> >>> pkt = ACCESS_Call( ... filehandle=File_Object( ... length=4, ... fh='file', ... ), ... check_access='READ' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file\x00\x00\x00\x01' >>> >>> pkt = READDIRPLUS_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... cookie=0xffffffffffffffff, ... verifier=0xaaaaaaaaaaaaaaaa, ... dircount=512, ... maxcount=4096 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x02\x00\x00\x00\x10\x00' >>> >>> pkt = WRITE_Call( ... filehandle=File_Object( ... length=4, ... fh='file', ... ), ... offset=0xffffffffffffffff, ... count=0xaaaaaaaa, ... stable='UNSTABLE', ... length=8, ... contents='\x00\x01\x02\x03\x04\x05\x06\x07' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x08\x00\x01\x02\x03\x04\x05\x06\x07' >>> >>> pkt = COMMIT_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... offset=0xffffffffffffffff, ... count=0xaaaaaaaa ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa' >>> >>> pkt = SETATTR_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... attributes=Sattr3( ... set_mode='SET', mode=0o755, ... set_uid='SET', uid=1, ... set_gid='SET', gid=1, ... set_size='SET', size=0xffffffffffffffff, ... set_atime='CLIENT TIME', atime_s=0xffffffff, atime_ns=0xffffffff, ... set_mtime='CLIENT TIME', mtime_s=0xaaaaaaaa, mtime_ns=0xaaaaaaaa ... ), ... check=0xffffffff ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x02\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x02\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xff\xff\xff\xff' >>> >>> pkt = FSSTAT_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file' >>> >>> pkt = CREATE_Call( ... dir=File_Object( ... length=3, ... fh='DIR', ... fill='\x00' ... ), ... filename=Object_Name( ... length=4, ... _name='File' ... ), ... create_mode='EXCLUSIVE', ... verifier=0xffffffffffffffff ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x03DIR\x00\x00\x00\x00\x04File\x00\x00\x00\x02\xff\xff\xff\xff\xff\xff\xff\xff' >>> >>> pkt = REMOVE_Call( ... dir=File_Object( ... length=3, ... fh='DIR', ... fill='\x00' ... ), ... filename=Object_Name( ... length=4, ... _name='File' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x03DIR\x00\x00\x00\x00\x04File' >>> >>> pkt = READDIR_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... cookie=0xffffffffffffffff, ... verifier=0xaaaaaaaaaaaaaaaa, ... count=0xabcdef12 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xab\xcd\xef\x12' >>> >>> pkt = RENAME_Call( ... dir_from=File_Object( ... length=8, ... fh='DIR_FROM' ... ), ... name_from=Object_Name( ... length=9, ... _name='NAME_FROM', ... fill='\x00\x00\x00' ... ), ... dir_to=File_Object( ... length=6, ... fh='DIR_TO', ... fill='\x00\x00' ... ), ... name_to=Object_Name( ... length=7, ... _name='NAME_TO', ... fill='\x00' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x08DIR_FROM\x00\x00\x00\tNAME_FROM\x00\x00\x00\x00\x00\x00\x06DIR_TO\x00\x00\x00\x00\x00\x07NAME_TO\x00' >>> >>> pkt = LINK_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... link_dir=File_Object( ... length=8, ... fh='LINK_DIR' ... ), ... link_name=Object_Name( ... length=9, ... _name='LINK_NAME', ... fill='\x00\x00\x00' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file\x00\x00\x00\x08LINK_DIR\x00\x00\x00\tLINK_NAME\x00\x00\x00' >>> >>> pkt = RMDIR_Call( ... dir=File_Object( ... length=3, ... fh='DIR', ... fill='\x00' ... ), ... filename=Object_Name( ... length=4, ... _name='File' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x03DIR\x00\x00\x00\x00\x04File' >>> >>> pkt = READLINK_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file' >>> >>> pkt = READ_Call( ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... offset=0xffffffffffffffff, ... count=0xaaaaaaaa ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x04file\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa' >>> >>> pkt = MKDIR_Call( ... dir=File_Object( ... length=3, ... fh='DIR', ... fill='\x00' ... ), ... dir_name=Object_Name( ... length=4, ... _name='DIR_NAME' ... ), ... attributes=Sattr3( ... set_mode='SET', mode=0o755, ... set_uid='SET', uid=1, ... set_gid='SET', gid=1, ... set_size='SET', size=0xffffffffffffffff, ... set_atime='CLIENT TIME', atime_s=0xffffffff, atime_ns=0xffffffff, ... set_mtime='CLIENT TIME', mtime_s=0xaaaaaaaa, mtime_ns=0xaaaaaaaa ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x03DIR\x00\x00\x00\x00\x04DIR_NAME\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x02\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x02\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa' >>> >>> pkt = SYMLINK_Call( ... dir=File_Object( ... length=3, ... fh='DIR', ... fill='\x00' ... ), ... dir_name=Object_Name( ... length=4, ... _name='DIR_NAME' ... ), ... attributes=Sattr3( ... set_mode='SET', mode=0o755, ... set_uid='SET', uid=1, ... set_gid='SET', gid=1, ... set_size='SET', size=0xffffffffffffffff, ... set_atime='CLIENT TIME', atime_s=0xffffffff, atime_ns=0xffffffff, ... set_mtime='CLIENT TIME', mtime_s=0xaaaaaaaa, mtime_ns=0xaaaaaaaa ... ), ... link_name=Object_Name( ... length=9, ... _name='LINK_NAME', ... fill='\x00\x00\x00' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x03DIR\x00\x00\x00\x00\x04DIR_NAME\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x02\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x02\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\tLINK_NAME\x00\x00\x00' ###(007)=[passed] Built NFS Replies vs Raw Strings >>> pkt = GETATTR_Reply( ... status=0, ... attributes=Fattr3( ... type='NF3DIR', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333' >>> >>> pkt = LOOKUP_Reply( ... status='NFS3_OK', ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... af_file=1, ... file_attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... af_dir=1, ... dir_attributes=Fattr3( ... type='NF3DIR', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333' >>> >>> pkt = FSINFO_Reply( ... status=0, ... attributes_follow=1, ... attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... rtmax=1, ... rtpref=2, ... rtmult=3, ... wtmax=4, ... wtpref=5, ... wtmult=6, ... dtpref=7, ... maxfilesize=0xa, ... timedelta_s=0xb, ... timedelta_ns=0xc, ... properties=0xd ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x0b\x00\x00\x00\x0c\x00\x00\x00\r' >>> >>> pkt = PATHCONF_Reply( ... status=0, ... attributes_follow=1, ... attributes=Fattr3( ... type='NF3DIR', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... linkmax=1, ... name_max=2, ... no_trunc='YES', ... chown_restricted='YES', ... case_insensitive='YES', ... case_preserving='YES' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01' >>> >>> pkt = ACCESS_Reply( ... status=0, ... attributes_follow=1, ... attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... access_rights=10 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\n' >>> >>> pkt = READDIRPLUS_Reply(status=0, attributes_follow=1, ... attributes=Fattr3(type='NF3DIR', mode=0o755, nlink=1, uid=2, ... gid=3, size=0xffffffffffffffff, used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], fsid=0xbbbbbbbbbbbbbbbb, fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, atime_ns=0xeeeeeeee, mtime_s=0xffffffff, ... mtime_ns=0x11111111, ctime_s=0x22222222, ctime_ns=0x33333333), ... verifier=0xa, value_follows=1, ... files=[File_From_Dir_Plus(fileid=0xa, ... filename=Object_Name(length=5, _name='file1', fill='\x00\x00\x00'), ... cookie=0xb, attributes_follow=1, ... attributes=Fattr3(type='NF3REG', mode=0o755, nlink=1, uid=2, gid=3, ... size=0xffffffffffffffff, used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, mtime_s=0xffffffff, ... mtime_ns=0x11111111, ctime_s=0x22222222, ... ctime_ns=0x33333333), ... handle_follows=1, filehandle=File_Object(length=3, fh='fh1', fill='\x00'), ... value_follows=1), ... File_From_Dir_Plus(fileid=0xb, filename=Object_Name(length=5, _name='file2', fill='\x00\x00\x00'), ... cookie=0xc, attributes_follow=1, attributes=Fattr3(type='NF3REG', mode=0o755, nlink=1, uid=2, ... gid=3, size=0xffffffffffffffff, used=0xaaaaaaaaaaaaaaaa, rdev=[4, 5], fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, atime_s=0xdddddddd, atime_ns=0xeeeeeeee, mtime_s=0xffffffff, ... mtime_ns=0x11111111, ctime_s=0x22222222, ctime_ns=0x33333333), handle_follows=1, ... filehandle=File_Object(length=3, fh='fh2', fill='\x00'), value_follows=0) ... ], eof=1) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x05file1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x01\x00\x00\x00\x03fh1\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x00\x00\x05file2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x01\x00\x00\x00\x03fh2\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> >>> pkt = WRITE_Reply( ... status=0, ... af_before=1, ... attributes_before=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_after=1, ... attributes_after=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... count=0xffffffff, ... committed='STABLE', ... verifier=0xffffffffffffffff ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\xff\xff\xff\xff\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff\xff\xff' >>> >>> pkt = COMMIT_Reply( ... status=0, ... af_before=1, ... attributes_before=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_after=1, ... attributes_after=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... verifier=0xffffffffffffffff ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\xff\xff\xff\xff\xff\xff\xff\xff' >>> >>> pkt = SETATTR_Reply( ... status=0, ... af_before=1, ... attributes_before=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_after=1, ... attributes_after=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333' >>> >>> pkt = FSSTAT_Reply( ... status=0, ... attributes_follow=1, ... attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... tbytes=1, ... fbytes=2, ... abytes=3, ... tfiles=4, ... afiles=5, ... invarsec=6 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x06' >>> >>> pkt = CREATE_Reply( ... status=0, ... handle_follows=1, ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... attributes_follow=1, ... attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... af_before=1, ... dir_attributes_before=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_after=1, ... dir_attributes_after=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04file\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333' >>> >>> pkt = REMOVE_Reply( ... status=0, ... af_before=1, ... attributes_before=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_after=1, ... attributes_after=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333' >>> >>> pkt = READDIR_Reply( ... status=0, ... attributes_follow=1, ... attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... verifier=0xffffffffffffffff, ... value_follows=1, ... files=[ ... File_From_Dir( ... fileid=1, ... filename=Object_Name( ... length=5, ... _name='file1', ... fill='\x00\x00\x00' ... ), ... cookie=0xaaaaaaaaaaaaaaaa, ... value_follows=0 ... ) ... ], ... eof=1 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x05file1\x00\x00\x00\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x01' >>> >>> pkt = RENAME_Reply( ... status=0, ... af_before_f=1, ... attributes_before_f=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_after_f=1, ... attributes_after_f=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... af_before_t=1, ... attributes_before_t=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_after_t=1, ... attributes_after_t=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333' >>> >>> pkt = LINK_Reply( ... status=0, ... af_file=1, ... file_attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... af_link_before=1, ... link_attributes_before=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_link_after=1, ... link_attributes_after=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333' >>> >>> pkt = RMDIR_Reply( ... status=0, ... af_before=1, ... attributes_before=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_after=1, ... attributes_after=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333' >>> >>> pkt = READLINK_Reply( ... status=0, ... attributes_follow=1, ... attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... filename=Object_Name( ... length=4, ... _name='file' ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x04file' >>> >>> pkt = READ_Reply( ... status=0, ... attributes_follow=1, ... attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... count=8, ... eof=1, ... data_length=8, ... data='\x00\x01\x02\x03\x04\x05\x06\x07' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x08\x00\x00\x00\x01\x00\x00\x00\x08\x00\x01\x02\x03\x04\x05\x06\x07' >>> >>> pkt = MKDIR_Reply( ... status=0, ... handle_follows=1, ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... attributes_follow=1, ... attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... af_before=1, ... dir_attributes_before=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_after=1, ... dir_attributes_after=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04file\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333' >>> >>> pkt = SYMLINK_Reply( ... status=0, ... handle_follows=1, ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... attributes_follow=1, ... attributes=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ), ... af_before=1, ... dir_attributes_before=WCC_Attr( ... size=0xa, ... mtime_s=0xffffffff, ... mtime_ns=0xeeeeeeee, ... ctime_s=0xdddddddd, ... ctime_ns=0xcccccccc ... ), ... af_after=1, ... dir_attributes_after=Fattr3( ... type='NF3REG', ... mode=0o755, ... nlink=1, ... uid=2, ... gid=3, ... size=0xffffffffffffffff, ... used=0xaaaaaaaaaaaaaaaa, ... rdev=[4, 5], ... fsid=0xbbbbbbbbbbbbbbbb, ... fileid=0xcccccccccccccccc, ... atime_s=0xdddddddd, ... atime_ns=0xeeeeeeee, ... mtime_s=0xffffffff, ... mtime_ns=0x11111111, ... ctime_s=0x22222222, ... ctime_ns=0x33333333 ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x04file\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\n\xff\xff\xff\xff\xee\xee\xee\xee\xdd\xdd\xdd\xdd\xcc\xcc\xcc\xcc\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x01\xed\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff\xff\xff\xff\xff\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x00\x00\x00\x04\x00\x00\x00\x05\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xdd\xdd\xdd\xdd\xee\xee\xee\xee\xff\xff\xff\xff\x11\x11\x11\x11""""3333' Tests for nlm module ━ Run at 01:43:00 from [test/contrib/nlm.uts] by UTscapy in 0.15849971771240234 └ Passed=7 └ Failed=0 ###### ## Packet creation tests ###### ###(000)=[passed] Create subpackets >>> File_Object() >>> NLM4_Cookie() >>> Object_Name() ###(001)=[passed] Create nlm Calls >>> SHARE_Call() caller= filehandle= owner= |> >>> UNSHARE_Call() caller= filehandle= owner= |> >>> LOCK_Call() caller= filehandle= owner= |> >>> UNLOCK_Call() caller= filehandle= owner= |> >>> GRANTED_MSG_Call() caller= filehandle= owner= |> >>> GRANTED_RES_Call() |> >>> CANCEL_Call() caller= filehandle= owner= |> >>> TEST_Call() caller= filehandle= owner= |> ###(002)=[passed] Create nlm Replies >>> SHARE_Reply() |> >>> UNSHARE_Reply() |> >>> LOCK_Reply() |> >>> UNLOCK_Reply() |> >>> GRANTED_MSG_Reply() >>> GRANTED_RES_Reply() >>> CANCEL_Reply() |> >>> TEST_Reply() |> ###### ## Layer bindings tests ###### ###(003)=[passed] RPC Layer Bindings for NLM Calls >>> from scapy.contrib.oncrpc import * >>> pkt = RPC()/RPC_Call()/SHARE_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 20) >>> pkt = RPC()/RPC_Call()/UNSHARE_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 21) >>> pkt = RPC()/RPC_Call()/LOCK_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 2) >>> pkt = RPC()/RPC_Call()/UNLOCK_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 4) >>> pkt = RPC()/RPC_Call()/GRANTED_MSG_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 10) >>> pkt = RPC()/RPC_Call()/GRANTED_RES_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 15) >>> pkt = RPC()/RPC_Call()/CANCEL_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 3) >>> pkt = RPC()/RPC_Call()/TEST_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100021, 4, 1) ###(004)=[passed] RPC Layer Bindings for NLM Replies >>> from scapy.contrib.oncrpc import * >>> pkt = RPC()/RPC_Reply()/SHARE_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/UNSHARE_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/LOCK_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/UNLOCK_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/GRANTED_MSG_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/GRANTED_RES_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/CANCEL_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/TEST_Reply() >>> assert pkt.mtype == 1 ###### ## Test Built Packets Against Raw Strings ###### ###(005)=[passed] Built NLM Calls vs Raw Strings >>> pkt = SHARE_Call( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... caller=Object_Name( ... length=6, ... _name='CALLER', ... fill='\x00\x00' ... ), ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... owner=Object_Name( ... length=5, ... _name='OWNER', ... fill='\x00' ... ), ... mode=1, ... access=2, ... reclaim='YES' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01' >>> >>> pkt = UNSHARE_Call( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... caller=Object_Name( ... length=6, ... _name='CALLER', ... fill='\x00\x00' ... ), ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... owner=Object_Name( ... length=5, ... _name='OWNER', ... fill='\x00' ... ), ... mode=1, ... access=2, ... reclaim='YES' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01' >>> >>> pkt = LOCK_Call( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... block='YES', ... exclusive='YES', ... caller=Object_Name( ... length=6, ... _name='CALLER', ... fill='\x00\x00' ... ), ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... owner=Object_Name( ... length=5, ... _name='OWNER', ... fill='\x00' ... ), ... svid=1, ... l_offset=2, ... l_len=3, ... reclaim=1, ... state=4 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x04' >>> >>> pkt = UNLOCK_Call( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... caller=Object_Name( ... length=6, ... _name='CALLER', ... fill='\x00\x00' ... ), ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... owner=Object_Name( ... length=5, ... _name='OWNER', ... fill='\x00' ... ), ... svid=1, ... l_offset=2, ... l_len=3 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03' >>> >>> pkt = GRANTED_MSG_Call( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... exclusive='YES', ... caller=Object_Name( ... length=6, ... _name='CALLER', ... fill='\x00\x00' ... ), ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... owner=Object_Name( ... length=5, ... _name='OWNER', ... fill='\x00' ... ), ... svid=1, ... l_offset=2, ... l_len=3 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03' >>> >>> pkt = GRANTED_RES_Call( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... status='NLM4_BLOCKED' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x03' >>> >>> pkt = CANCEL_Call( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... block='YES', ... exclusive='YES', ... caller=Object_Name( ... length=6, ... _name='CALLER', ... fill='\x00\x00' ... ), ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... owner=Object_Name( ... length=5, ... _name='OWNER', ... fill='\x00' ... ), ... svid=1, ... l_offset=2, ... l_len=3 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03' >>> >>> pkt = TEST_Call( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... exclusive='YES', ... caller=Object_Name( ... length=6, ... _name='CALLER', ... fill='\x00\x00' ... ), ... filehandle=File_Object( ... length=4, ... fh='file' ... ), ... owner=Object_Name( ... length=5, ... _name='OWNER', ... fill='\x00' ... ), ... svid=1, ... l_offset=2, ... l_len=3 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x06CALLER\x00\x00\x00\x00\x00\x04file\x00\x00\x00\x05OWNER\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03' ###(006)=[passed] NLM Replies vs Raw Strings >>> pkt = SHARE_Reply( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... status='NLM4_DENIED', ... sequence=1 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01' >>> >>> pkt = UNSHARE_Reply( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... status='NLM4_DENIED', ... sequence=1 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01' >>> >>> pkt = LOCK_Reply( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... status='NLM4_DENIED' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01' >>> >>> pkt = UNLOCK_Reply( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... status='NLM4_DENIED' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01' >>> >>> pkt = CANCEL_Reply( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... status='NLM4_DENIED' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01' >>> >>> pkt = TEST_Reply( ... cookie=NLM4_Cookie( ... length=6, ... contents='COOKIE', ... fill='\x00\x00' ... ), ... status='NLM4_DENIED' ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x06COOKIE\x00\x00\x00\x00\x00\x01' Test campaign ━ Run at 01:43:00 from [test/contrib/nsh.uts] by UTscapy in 0.031781673431396484 └ Passed=6 └ Failed=0 ###### ## Basic Layer Tests ###### ###(000)=[passed] Build a NSH over NSH packet with SPI=42, and SI=1 >>> raw(NSH(spi=42, si=1)/NSH()) == b'\x0f\xc6\x01\x04\x00\x00*\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xc6\x01\x03\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(001)=[passed] Build a NSH with Fixed context headers >>> raw(NSH(ttl=25, spi=55, si=34, context_header=b"\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff")) == b'\x06F\x01\x03\x00\x007"\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff\xff\xff' True ###(002)=[passed] Build a Ethernet over NSH over Ethernet packet (NSH over Ethernet encapsulating the original packet) and verify Ethernet Bindings >>> raw(Ether(src="00:00:00:00:00:01", dst="00:00:00:00:00:02")/NSH()/Ether(src="00:00:00:00:00:03", dst="00:00:00:00:00:04")/ARP(psrc="10.0.0.1", hwsrc="00:00:00:00:00:01")) == b'\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x01\x89O\x0f\xc6\x01\x03\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x03\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\x00\x00\x00\x00\x00\x01\n\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(003)=[passed] Build a NSH over GRE packet, and verify GRE Bindings >>> raw(Ether(src="00:00:00:00:00:01", dst="00:00:00:00:00:02")/IP(src="1.1.1.1", dst="2.2.2.2")/GRE()/NSH()/Ether(src="00:00:00:00:00:03", dst="00:00:00:00:00:04")/ARP(psrc="10.0.0.1", hwsrc="00:00:00:00:00:01")) == b'\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x01\x08\x00E\x00\x00Z\x00\x01\x00\x00@/to\x01\x01\x01\x01\x02\x02\x02\x02\x00\x00\x89O\x0f\xc6\x01\x03\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x03\x08\x06\x00\x01\x08\x00\x06\x04\x00\x01\x00\x00\x00\x00\x00\x01\n\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(004)=[passed] 0 length variable length context header NSH >>> raw(NSH(mdtype=2, spi=0xF0F0F0, si=0xFF)) == b'\x0f\xc2\x02\x03\xf0\xf0\xf0\xff' True ###(005)=[passed] Build a NSH over VXLAN packet and verify bindings >>> raw(Ether(dst='0c:42:a1:5f:fb:e0', src='b8:59:9f:cd:de:3e')/IPv6(src='::1', dst='::2')/UDP(sport=10, dport=8472)/VXLAN(NextProtocol=4, vni=4660)/NSH()/NSH()/Ether(dst='0c:42:a1:5f:fb:e4', src='b8:59:9f:cd:de:33')/IP(src='10.200.100.10', dst='2.2.2.3')/TCP(sport=123, dport=333)) == b'\x0cB\xa1_\xfb\xe0\xb8Y\x9f\xcd\xde>\x86\xdd`\x00\x00\x00\x00v\x11@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\n!\x18\x00v\x05F\x0c\x00\x00\x04\x00\x124\x00\x0f\xc6\x01\x04\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xc6\x01\x03\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0cB\xa1_\xfb\xe4\xb8Y\x9f\xcd\xde3\x08\x00E\x00\x00(\x00\x01\x00\x00@\x06\x07\xf9\n\xc8d\n\x02\x02\x02\x03\x00{\x01M\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x1bD\x00\x00' True Test campaign ━ Run at 01:43:06 from [test/contrib/oam.uts] by UTscapy in 5.1349406242370605 └ Passed=37 └ Failed=0 ###### ## TLV ###### ###(000)=[passed] Generic TLV >>> pkt = OAM_TLV(raw(OAM_TLV()/Raw(b'123'))) >>> assert pkt.type == 1 >>> assert pkt.length == 3 ###(001)=[passed] Data TLV >>> pkt = OAM_DATA_TLV(raw(OAM_DATA_TLV()/Raw(b'123'))) >>> assert pkt.type == 3 >>> assert pkt.length == 3 ###(002)=[passed] Test TLV >>> from binascii import crc32 >>> >>> pkt = OAM_TEST_TLV(raw(OAM_TEST_TLV(pat_type="Null signal without CRC-32")/Raw(b'123'))) >>> assert pkt.type == 32 >>> assert pkt.length == 4 >>> assert raw(pkt.payload) == b'123' >>> pkt = OAM_TEST_TLV(raw(OAM_TEST_TLV(pat_type="Null signal with CRC-32")/Raw(b'123'))) >>> assert pkt.type == 32 >>> assert pkt.length == 8 >>> assert pkt.crc == crc32(raw(pkt)[:-4]) % (1 << 32) >>> assert pkt.crc == 0xad147086 >>> assert raw(pkt.payload) == b'123' >>> pkt = OAM_TEST_TLV(raw(OAM_TEST_TLV(pat_type="PRBS 2^-31 - 1 without CRC-32")/Raw(b'123'))) >>> assert pkt.type == 32 >>> assert pkt.length == 4 >>> assert raw(pkt.payload) == b'123' >>> pkt = OAM_TEST_TLV(raw(OAM_TEST_TLV(pat_type="PRBS 2^-31 - 1 with CRC-32")/Raw(b'123'))) >>> assert pkt.type == 32 >>> assert pkt.length == 8 >>> assert pkt.crc == crc32(raw(pkt)[:-4]) % (1 << 32) >>> assert pkt.crc == 0x71db80d >>> assert raw(pkt.payload) == b'123' ###(003)=[passed] LTM TLV >>> pkt = OAM_LTM_TLV(raw(OAM_LTM_TLV(egress_id=3)/Raw(b'123'))) >>> assert pkt.type == 7 >>> assert pkt.length == 8 >>> assert pkt.egress_id == 3 ###(004)=[passed] LTR TLV >>> pkt = OAM_LTR_TLV(raw(OAM_LTR_TLV(last_egress_id=2, next_egress_id=4)/Raw(b'123'))) >>> assert pkt.type == 8 >>> assert pkt.length == 16 >>> assert pkt.last_egress_id == 2 >>> assert pkt.next_egress_id == 4 ###(005)=[passed] LTR IG TLV >>> pkt = OAM_LTR_IG_TLV(raw(OAM_LTR_IG_TLV(ingress_act=2, ingress_mac="00:11:22:33:44:55")/Raw(b'123'))) >>> assert pkt.type == 5 >>> assert pkt.length == 7 >>> assert pkt.ingress_act == 2 >>> assert pkt.ingress_mac == "00:11:22:33:44:55" ###(006)=[passed] LTR EG TLV >>> pkt = OAM_LTR_EG_TLV(raw(OAM_LTR_EG_TLV(egress_act=2, egress_mac="00:11:22:33:44:55")/Raw(b'123'))) >>> assert pkt.type == 6 >>> assert pkt.length == 7 >>> assert pkt.egress_act == 2 >>> assert pkt.egress_mac == "00:11:22:33:44:55" ###(007)=[passed] TEST ID TLV >>> pkt = OAM_TEST_ID_TLV(raw(OAM_TEST_ID_TLV(test_id=1)/Raw(b'123'))) >>> assert pkt.type == 36 >>> assert pkt.length == 32 >>> assert pkt.test_id == 1 ###(008)=[passed] PTP TIMESTAMP >>> pkt = PTP_TIMESTAMP(raw(PTP_TIMESTAMP(seconds=5, nanoseconds=10)/Raw(b'123'))) >>> assert pkt.seconds == 5 >>> assert pkt.nanoseconds == 10 ###(009)=[passed] APS >>> pkt = APS(raw(APS(req_st="Wait-to-restore (WTR)", ... prot_type="D+A", ... req_sig="Normal traffic", ... br_sig="Normal traffic", ... br_type="T")/Raw(b'123'))) >>> assert pkt.req_st == 0b0101 >>> assert pkt.prot_type == 0b1010 >>> assert pkt.req_sig == 1 >>> assert pkt.br_sig == 1 >>> assert pkt.br_type == 0b10000000 ###(010)=[passed] RAPS >>> pkt = RAPS(raw(RAPS(req_st="Signal fail(SF)", ... status="RB+BPR", ... node_id="00:11:22:33:44:55")/Raw(b'123'))) >>> assert pkt.req_st == 0b1011 >>> assert pkt.sub_code == 0b0000 >>> assert pkt.status == 0b10100000 >>> assert pkt.node_id == "00:11:22:33:44:55" ###### ## MEG ID ###### ###(011)=[passed] MEG ID >>> pkt = MegId(raw(MegId(format=1, ... values=int(0xdeadbeef)))) >>> assert pkt.format == 1 >>> assert pkt.length == 45 >>> assert len(raw(pkt)) == 48 ###(012)=[passed] MEG ICC ID >>> pkt = MegId(raw(MegId(format=32, ... values=list(range(13))))) >>> >>> assert pkt.format == 32 >>> assert pkt.values == list(range(13)) >>> assert pkt.length == 13 >>> assert len(raw(pkt)) == 48 ###(013)=[passed] MEG ICC and CC ID >>> pkt = MegId(raw(MegId(format=33, ... values=list(range(15))))) >>> >>> assert pkt.format == 33 >>> assert pkt.values == list(range(15)) >>> assert pkt.length == 15 >>> assert len(raw(pkt)) == 48 ###### ## OAM ###### ###(014)=[passed] Define check_tshark function >>> def check_tshark(pkt, string): ... import tempfile, os ... fd, pcapfilename = tempfile.mkstemp() ... wrpcap(pcapfilename, pkt) ... rv = tcpdump(pcapfilename, prog=conf.prog.tshark, getfd=True, args=['-Y', 'cfm'], dump=True, wait=True) ... assert string in rv.decode("utf8") ... os.close(fd) ... os.unlink(pcapfilename) ... ###(015)=[passed] CCM >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Continuity Check Message (CCM)", ... flags="RDI", ... period="Trans Int 10s", ... mep_id=0xffff, ... meg_id=MegId(format=32, ... values=list(range(13))), ... txfcf=1, ... rxfcb=2, ... txfcb=3))) >>> >>> assert pkt[OAM].opcode == 1 >>> assert pkt[OAM].period == 5 >>> assert pkt[OAM].tlv_offset == 70 >>> assert pkt[OAM].flags.RDI == True >>> assert pkt[OAM].flags == 1<<4 >>> assert pkt[OAM].mep_id == 0xffff >>> assert pkt[OAM].meg_id.format == 32 >>> assert pkt[OAM].meg_id.length == 13 >>> assert pkt[OAM].meg_id.values == list(range(13)) >>> assert pkt[OAM].txfcf == 1 >>> assert pkt[OAM].rxfcb == 2 >>> assert pkt[OAM].txfcb == 3 >>> >>> check_tshark(pkt, "(CCM)") :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(016)=[passed] LBM >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Loopback Message (LBM)", ... seq_num=33, ... tlvs=[OAM_DATA_TLV()/Raw(b'123'), ... OAM_DATA_TLV()/Raw(b'456'), ... OAM_DATA_TLV()/Raw(b'789')]))) >>> >>> assert pkt[OAM].opcode == 3 >>> assert pkt[OAM].tlv_offset == 4 >>> assert pkt[OAM].seq_num == 33 >>> for i in range(3): ... assert pkt[OAM].tlvs[i].type == 3 ... assert pkt[OAM].tlvs[i].length == 3 ... >>> assert raw(pkt[OAM].tlvs[0].payload) == b'123' >>> assert raw(pkt[OAM].tlvs[1].payload) == b'456' >>> assert raw(pkt[OAM].tlvs[2].payload) == b'789' >>> >>> check_tshark(pkt, "(LBM)") /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10511 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(017)=[passed] LTM >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Linktrace Message (LTM)", ... trans_id=12, ... ttl=21, ... flags="HWonly", ... orig_mac="12:34:56:78:90:11", ... targ_mac="12:34:56:78:90:22", ... tlvs=[OAM_LTM_TLV(egress_id=12)]))) >>> >>> assert pkt[OAM].opcode == 5 >>> assert pkt[OAM].tlv_offset == 17 >>> assert pkt[OAM].ttl == 21 >>> assert pkt[OAM].flags.HWonly == True >>> assert pkt[OAM].flags == 1<<7 >>> assert pkt[OAM].orig_mac == "12:34:56:78:90:11" >>> assert pkt[OAM].targ_mac == "12:34:56:78:90:22" >>> assert pkt[OAM].tlvs[0].type == 7 >>> assert pkt[OAM].tlvs[0].length == 8 >>> assert pkt[OAM].tlvs[0].egress_id == 12 >>> >>> check_tshark(pkt, "(LTM)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10515 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(018)=[passed] LTR >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Linktrace Reply (LTR)", ... trans_id=21, ... ttl=12, ... flags="HWonly+TerminalMEP", ... relay_act=8, ... tlvs=[OAM_LTR_TLV(last_egress_id=1, next_egress_id=2), ... OAM_LTR_TLV(last_egress_id=3, next_egress_id=4), ... OAM_LTR_IG_TLV(ingress_act=1, ingress_mac="12:34:56:78:90:11"), ... OAM_LTR_IG_TLV(ingress_act=6, ingress_mac="12:34:56:78:90:22"), ... OAM_LTR_EG_TLV(egress_act=2, egress_mac="12:34:56:78:90:33"), ... OAM_LTR_EG_TLV(egress_act=3, egress_mac="12:34:56:78:90:44")]))) >>> >>> assert pkt[OAM].opcode == 4 >>> assert pkt[OAM].tlv_offset == 6 >>> assert pkt[OAM].ttl == 12 >>> assert pkt[OAM].flags.HWonly == True >>> assert pkt[OAM].flags.FwdYes == False >>> assert pkt[OAM].flags.TerminalMEP == True >>> assert pkt[OAM].flags == (1<<7) | (1<<5) >>> assert pkt[OAM].relay_act == 8 >>> assert pkt[OAM].tlvs[0].type == 8 >>> assert pkt[OAM].tlvs[0].length == 16 >>> assert pkt[OAM].tlvs[0].last_egress_id == 1 >>> assert pkt[OAM].tlvs[0].next_egress_id == 2 >>> assert pkt[OAM].tlvs[1].type == 8 >>> assert pkt[OAM].tlvs[1].length == 16 >>> assert pkt[OAM].tlvs[1].last_egress_id == 3 >>> assert pkt[OAM].tlvs[1].next_egress_id == 4 >>> assert pkt[OAM].tlvs[2].type == 5 >>> assert pkt[OAM].tlvs[2].length == 7 >>> assert pkt[OAM].tlvs[2].ingress_act == 1 >>> assert pkt[OAM].tlvs[2].ingress_mac == "12:34:56:78:90:11" >>> assert pkt[OAM].tlvs[3].type == 5 >>> assert pkt[OAM].tlvs[3].length == 7 >>> assert pkt[OAM].tlvs[3].ingress_act == 6 >>> assert pkt[OAM].tlvs[3].ingress_mac == "12:34:56:78:90:22" >>> assert pkt[OAM].tlvs[4].type == 6 >>> assert pkt[OAM].tlvs[4].length == 7 >>> assert pkt[OAM].tlvs[4].egress_act == 2 >>> assert pkt[OAM].tlvs[4].egress_mac == "12:34:56:78:90:33" >>> assert pkt[OAM].tlvs[5].type == 6 >>> assert pkt[OAM].tlvs[5].length == 7 >>> assert pkt[OAM].tlvs[5].egress_act == 3 >>> assert pkt[OAM].tlvs[5].egress_mac == "12:34:56:78:90:44" >>> >>> check_tshark(pkt, "(LTR)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10519 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(019)=[passed] AIS >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Alarm Indication Signal (AIS)", ... period="1 frame per second"))) >>> >>> assert pkt[OAM].opcode == 33 >>> assert pkt[OAM].tlv_offset == 0 >>> assert pkt[OAM].period == 0b100 >>> >>> check_tshark(pkt, "(AIS)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10523 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(020)=[passed] LCK >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Lock Signal (LCK)", ... period="1 frame per second"))) >>> >>> assert pkt[OAM].opcode == 35 >>> assert pkt[OAM].tlv_offset == 0 >>> assert pkt[OAM].period == 0b100 >>> >>> check_tshark(pkt, "(LCK)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(021)=[passed] TST >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Test Signal (TST)", ... seq_num=15, ... tlvs=[OAM_TEST_TLV(pat_type="Null signal without CRC-32")/Raw(b'123'), ... OAM_TEST_TLV(pat_type="Null signal without CRC-32")/Raw(b'23456'), ... OAM_TEST_TLV(pat_type="Null signal with CRC-32")/Raw(b'123'), ... OAM_TEST_TLV(pat_type="Null signal with CRC-32")/Raw(b'23456'), ... OAM_TEST_TLV(pat_type="PRBS 2^-31 - 1 without CRC-32")/Raw(b'123'), ... OAM_TEST_TLV(pat_type="PRBS 2^-31 - 1 without CRC-32")/Raw(b'23456'), ... OAM_TEST_TLV(pat_type="PRBS 2^-31 - 1 with CRC-32")/Raw(b'123'), ... OAM_TEST_TLV(pat_type="PRBS 2^-31 - 1 with CRC-32")/Raw(b'23456')]))) >>> >>> assert pkt[OAM].opcode == 37 >>> assert pkt[OAM].tlv_offset == 4 >>> assert pkt[OAM].seq_num == 15 >>> >>> assert pkt[OAM].tlvs[0].type == 32 >>> assert pkt[OAM].tlvs[0].length == 4 >>> assert pkt[OAM].tlvs[0].pat_type == 0 >>> assert raw(pkt[OAM].tlvs[0].payload) == b'123' >>> assert pkt[OAM].tlvs[1].type == 32 >>> assert pkt[OAM].tlvs[1].length == 6 >>> assert pkt[OAM].tlvs[1].pat_type == 0 >>> assert raw(pkt[OAM].tlvs[1].payload) == b'23456' >>> assert pkt[OAM].tlvs[2].type == 32 >>> assert pkt[OAM].tlvs[2].length == 8 >>> assert pkt[OAM].tlvs[2].pat_type == 1 >>> assert raw(pkt[OAM].tlvs[2].payload) == b'123' >>> assert pkt[OAM].tlvs[2].crc == crc32(raw(pkt[OAM].tlvs[2])[:-4]) % (1 << 32) >>> assert pkt[OAM].tlvs[3].type == 32 >>> assert pkt[OAM].tlvs[3].length == 10 >>> assert pkt[OAM].tlvs[3].pat_type == 1 >>> assert raw(pkt[OAM].tlvs[3].payload) == b'23456' >>> assert pkt[OAM].tlvs[3].crc == crc32(raw(pkt[OAM].tlvs[3])[:-4]) % (1 << 32) >>> assert pkt[OAM].tlvs[4].type == 32 >>> assert pkt[OAM].tlvs[4].length == 4 >>> assert pkt[OAM].tlvs[4].pat_type == 2 >>> assert raw(pkt[OAM].tlvs[4].payload) == b'123' >>> assert pkt[OAM].tlvs[5].type == 32 >>> assert pkt[OAM].tlvs[5].length == 6 >>> assert pkt[OAM].tlvs[5].pat_type == 2 >>> assert raw(pkt[OAM].tlvs[5].payload) == b'23456' >>> assert pkt[OAM].tlvs[6].type == 32 >>> assert pkt[OAM].tlvs[6].length == 8 >>> assert pkt[OAM].tlvs[6].pat_type == 3 >>> assert raw(pkt[OAM].tlvs[6].payload) == b'123' >>> assert pkt[OAM].tlvs[6].crc == crc32(raw(pkt[OAM].tlvs[6])[:-4]) % (1 << 32) >>> assert pkt[OAM].tlvs[7].type == 32 >>> assert pkt[OAM].tlvs[7].length == 10 >>> assert pkt[OAM].tlvs[7].pat_type == 3 >>> assert raw(pkt[OAM].tlvs[7].payload) == b'23456' >>> assert pkt[OAM].tlvs[7].crc == crc32(raw(pkt[OAM].tlvs[7])[:-4]) % (1 << 32) >>> >>> check_tshark(pkt, "(TST)") /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10531 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(022)=[passed] APS >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Automatic Protection Switching (APS)", ... aps=APS(req_st="Forced switch (FS)", ... prot_type="A+B+R", ... req_sig="Normal traffic", ... br_sig="Null signal", ... br_type="T")))) >>> >>> assert pkt[OAM].opcode == 39 >>> assert pkt[APS].req_st == 0b1101 >>> assert pkt[APS].prot_type.A == True >>> assert pkt[APS].prot_type.B == True >>> assert pkt[APS].prot_type.R == True >>> assert pkt[APS].prot_type == 0b1101 >>> assert pkt[APS].req_sig == 1 >>> assert pkt[APS].br_sig == 0 >>> assert pkt[APS].br_type.T == True >>> assert pkt[APS].br_type == (1 << 7) >>> >>> check_tshark(pkt, "(APS)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10535 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(023)=[passed] RAPS >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Ring-Automatic Protection Switching (R-APS)", ... raps=RAPS(req_st="Event", ... sub_code="Flush", ... status="RB+BPR", ... node_id="12:12:12:23:23:23")))) >>> >>> assert pkt[OAM].opcode == 40 >>> assert pkt[RAPS].req_st == 0b1110 >>> assert pkt[RAPS].sub_code == 0b0000 >>> assert pkt[RAPS].status.RB == True >>> assert pkt[RAPS].status.DNF == False >>> assert pkt[RAPS].status.BPR == True >>> assert pkt[RAPS].status == (1 << 7) | (1 << 5) >>> assert pkt[RAPS].node_id == "12:12:12:23:23:23" >>> >>> check_tshark(pkt, "(R-APS)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10539 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(024)=[passed] MCC >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Maintenance Communication Channel (MCC)", ... oui=12, ... subopcode=2))) >>> >>> assert pkt[OAM].opcode == 41 >>> assert pkt[OAM].oui == 12 >>> assert pkt[OAM].subopcode == 2 >>> >>> check_tshark(pkt, "(MCC)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10543 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(025)=[passed] LMM >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Loss Measurement Message (LMM)", ... flags="Proactive", ... txfcf=1, ... rxfcf=2, ... txfcb=3))) >>> >>> assert pkt[OAM].opcode == 43 >>> assert pkt[OAM].version == 1 >>> assert pkt[OAM].tlv_offset == 12 >>> assert pkt[OAM].flags == 1 >>> assert pkt[OAM].flags.Proactive == True >>> assert pkt[OAM].txfcf == 1 >>> assert pkt[OAM].rxfcf == 2 >>> assert pkt[OAM].txfcb == 3 >>> >>> check_tshark(pkt, "(LMM)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(026)=[passed] LMR >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Loss Measurement Reply (LMR)", ... txfcf=1, ... rxfcf=2, ... txfcb=3))) >>> >>> assert pkt[OAM].opcode == 42 >>> assert pkt[OAM].txfcf == 1 >>> assert pkt[OAM].rxfcf == 2 >>> assert pkt[OAM].txfcb == 3 >>> >>> check_tshark(pkt, "(LMR)") /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10551 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(027)=[passed] 1DM >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="One Way Delay Measurement (1DM)", ... txtsf=PTP_TIMESTAMP(seconds=1, nanoseconds=2), ... rxtsf=PTP_TIMESTAMP(seconds=3, nanoseconds=4), ... tlvs=[OAM_DATA_TLV()/Raw(b'123'), ... OAM_DATA_TLV()/Raw(b'456789'), ... OAM_TEST_ID_TLV(test_id=5)]))) >>> >>> assert pkt[OAM].opcode == 45 >>> assert pkt[OAM].version == 1 >>> assert pkt[OAM].tlv_offset == 16 >>> assert pkt[OAM].txtsf.seconds == 1 >>> assert pkt[OAM].txtsf.nanoseconds == 2 >>> assert pkt[OAM].rxtsf.seconds == 3 >>> assert pkt[OAM].rxtsf.nanoseconds == 4 >>> assert pkt[OAM].tlvs[0].type == 3 >>> assert pkt[OAM].tlvs[0].length == 3 >>> assert raw(pkt[OAM].tlvs[0].payload) == b'123' >>> assert pkt[OAM].tlvs[1].type == 3 >>> assert pkt[OAM].tlvs[1].length == 6 >>> assert raw(pkt[OAM].tlvs[1].payload) == b'456789' >>> assert pkt[OAM].tlvs[2].type == 36 >>> assert pkt[OAM].tlvs[2].length == 32 >>> assert pkt[OAM].tlvs[2].test_id == 5 >>> >>> check_tshark(pkt, "(1DM)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10555 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(028)=[passed] DMM >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Delay Measurement Message (DMM)", ... txtsf=PTP_TIMESTAMP(seconds=1, nanoseconds=2), ... txtsb=PTP_TIMESTAMP(seconds=2, nanoseconds=1), ... rxtsf=PTP_TIMESTAMP(seconds=3, nanoseconds=4), ... rxtsb=PTP_TIMESTAMP(seconds=6, nanoseconds=5), ... tlvs=[OAM_DATA_TLV()/Raw(b'123'), ... OAM_DATA_TLV()/Raw(b'456789'), ... OAM_TEST_ID_TLV(test_id=5)]))) >>> >>> assert pkt[OAM].opcode == 47 >>> assert pkt[OAM].version == 1 >>> assert pkt[OAM].tlv_offset == 32 >>> assert pkt[OAM].txtsf.seconds == 1 >>> assert pkt[OAM].txtsf.nanoseconds == 2 >>> assert pkt[OAM].rxtsf.seconds == 3 >>> assert pkt[OAM].rxtsf.nanoseconds == 4 >>> assert pkt[OAM].txtsb.seconds == 2 >>> assert pkt[OAM].txtsb.nanoseconds == 1 >>> assert pkt[OAM].rxtsb.seconds == 6 >>> assert pkt[OAM].rxtsb.nanoseconds == 5 >>> assert pkt[OAM].tlvs[0].type == 3 >>> assert pkt[OAM].tlvs[0].length == 3 >>> assert raw(pkt[OAM].tlvs[0].payload) == b'123' >>> assert pkt[OAM].tlvs[1].type == 3 >>> assert pkt[OAM].tlvs[1].length == 6 >>> assert raw(pkt[OAM].tlvs[1].payload) == b'456789' >>> assert pkt[OAM].tlvs[2].type == 36 >>> assert pkt[OAM].tlvs[2].length == 32 >>> assert pkt[OAM].tlvs[2].test_id == 5 >>> >>> check_tshark(pkt, "(DMM)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10559 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(029)=[passed] EXM >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Experimental OAM Message (EXM)", ... oui=123, ... subopcode=33))) >>> >>> assert pkt[OAM].opcode == 49 >>> assert pkt[OAM].oui == 123 >>> assert pkt[OAM].subopcode == 33 >>> >>> check_tshark(pkt, "(EXM)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10563 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(030)=[passed] EXR >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Experimental OAM Reply (EXR)", ... oui=123, ... subopcode=33))) >>> >>> assert pkt[OAM].opcode == 48 >>> assert pkt[OAM].oui == 123 >>> assert pkt[OAM].subopcode == 33 >>> >>> check_tshark(pkt, "(EXR)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10567 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(031)=[passed] VSM >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Vendor Specific Message (VSM)", ... oui=123, ... subopcode=33))) >>> >>> assert pkt[OAM].opcode == 51 >>> assert pkt[OAM].oui == 123 >>> assert pkt[OAM].subopcode == 33 >>> >>> check_tshark(pkt, "(VSM)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10571 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(032)=[passed] CSF >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Client Signal Fail (CSF)", ... flags="RDI", ... period="1 frame per minute"))) >>> >>> assert pkt[OAM].opcode == 52 >>> assert pkt[OAM].tlv_offset == 0 >>> assert pkt[OAM].flags == 0b010 >>> assert pkt[OAM].period == 0b110 >>> >>> check_tshark(pkt, "(CSF)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10575 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(033)=[passed] SLM >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Synthetic Loss Message (SLM)", ... test_id=11, ... src_mep_id=12, ... rcv_mep_id=34, ... txfcf=3, ... txfcb=9, ... tlvs=[OAM_DATA_TLV()/Raw(b'123'), ... OAM_DATA_TLV()/Raw(b'456789')]))) >>> >>> assert pkt[OAM].opcode == 55 >>> assert pkt[OAM].tlv_offset == 16 >>> assert pkt[OAM].test_id == 11 >>> assert pkt[OAM].src_mep_id == 12 >>> assert pkt[OAM].rcv_mep_id == 34 >>> assert pkt[OAM].txfcf == 3 >>> assert pkt[OAM].txfcb == 9 >>> assert pkt[OAM].tlvs[0].type == 3 >>> assert pkt[OAM].tlvs[0].length == 3 >>> assert raw(pkt[OAM].tlvs[0].payload) == b'123' >>> assert pkt[OAM].tlvs[1].type == 3 >>> assert pkt[OAM].tlvs[1].length == 6 >>> assert raw(pkt[OAM].tlvs[1].payload) == b'456789' >>> >>> check_tshark(pkt, "(SLM)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10579 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(034)=[passed] SLR >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Synthetic Loss Reply (SLR)", ... test_id=11, ... src_mep_id=12, ... rcv_mep_id=34, ... txfcf=3, ... txfcb=9, ... tlvs=[OAM_DATA_TLV()/Raw(b'123'), ... OAM_DATA_TLV()/Raw(b'456789')]))) >>> >>> assert pkt[OAM].opcode == 54 >>> assert pkt[OAM].tlv_offset == 16 >>> assert pkt[OAM].test_id == 11 >>> assert pkt[OAM].src_mep_id == 12 >>> assert pkt[OAM].rcv_mep_id == 34 >>> assert pkt[OAM].txfcf == 3 >>> assert pkt[OAM].txfcb == 9 >>> assert pkt[OAM].tlvs[0].type == 3 >>> assert pkt[OAM].tlvs[0].length == 3 >>> assert raw(pkt[OAM].tlvs[0].payload) == b'123' >>> assert pkt[OAM].tlvs[1].type == 3 >>> assert pkt[OAM].tlvs[1].length == 6 >>> assert raw(pkt[OAM].tlvs[1].payload) == b'456789' >>> >>> check_tshark(pkt, "(SLR)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(035)=[passed] 1SL >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="One Way Synthetic Loss Measurement (1SL)", ... test_id=11, ... src_mep_id=12, ... txfcf=3, ... tlvs=[OAM_DATA_TLV()/Raw(b'123'), ... OAM_DATA_TLV()/Raw(b'456789')]))) >>> >>> assert pkt[OAM].opcode == 53 >>> assert pkt[OAM].tlv_offset == 16 >>> assert pkt[OAM].test_id == 11 >>> assert pkt[OAM].src_mep_id == 12 >>> assert pkt[OAM].txfcf == 3 >>> assert pkt[OAM].tlvs[0].type == 3 >>> assert pkt[OAM].tlvs[0].length == 3 >>> assert raw(pkt[OAM].tlvs[0].payload) == b'123' >>> assert pkt[OAM].tlvs[1].type == 3 >>> assert pkt[OAM].tlvs[1].length == 6 >>> assert raw(pkt[OAM].tlvs[1].payload) == b'456789' >>> >>> check_tshark(pkt, "(1SL)") /usr/lib64/python3.13/subprocess.py:1137: ResourceWarning: subprocess 10587 is still running _warn("subprocess %s is still running" % self.pid, ResourceWarning: Enable tracemalloc to get the object allocation traceback ###(036)=[passed] GNM >>> pkt = Ether(raw(Ether(dst="00:11:22:33:44:55")/Dot1Q()/ ... OAM(opcode="Generic Notification Message (GNM)", ... period="1 frame per minute", ... nom_bdw=1, ... curr_bdw=2, ... port_id=3))) >>> >>> assert pkt[OAM].opcode == 32 >>> assert pkt[OAM].tlv_offset == 13 >>> assert pkt[OAM].period == 0b110 >>> assert pkt[OAM].subopcode == 1 >>> assert pkt[OAM].nom_bdw == 1 >>> assert pkt[OAM].curr_bdw == 2 >>> assert pkt[OAM].port_id == 3 >>> >>> check_tshark(pkt, "(GNM)") /usr/lib64/python3.13/subprocess.py:829: ResourceWarning: unclosed file <_io.BufferedReader name=24> _cleanup() ResourceWarning: Enable tracemalloc to get the object allocation traceback :6: ResourceWarning: unclosed file <_io.BufferedReader name=24> ResourceWarning: Enable tracemalloc to get the object allocation traceback Tests for oncrpc module ━ Run at 01:43:06 from [test/contrib/oncrpc.uts] by UTscapy in 0.034342050552368164 └ Passed=4 └ Failed=0 ###### ## Packet Creation Tests ###### ###(000)=[passed] Create subpackets >>> Object_Name() >>> Auth_Unix() |> >>> Auth_RPCSEC_GSS() |> >>> Verifier_RPCSEC_GSS() ###(001)=[passed] Create ONC RPC Packets >>> RM_Header() >>> RPC() >>> RPC_Call() |> |> >>> RPC_Reply() ###### ## Test Layer bindings ###### ###(002)=[passed] RPC Message type >>> pkt = RPC()/RPC_Call() >>> assert pkt.mtype==0 >>> pkt = RPC()/RPC_Reply() >>> assert pkt.mtype==1 ###### ## Test Built Packets vs Raw Strings ###### ###(003)=[passed] Test Built Packets vs Raw Strings >>> pkt = RM_Header( ... rm=0x80000000 ... ) >>> assert bytes(pkt) == b'\x80\x00\x00\x00' >>> >>> pkt = RPC( ... xid=0xabcdef12, ... mtype='CALL' ... ) >>> assert bytes(pkt) == b'\xab\xcd\xef\x12\x00\x00\x00\x00' >>> >>> pkt = RPC_Call( ... version=2, ... program=100005, ... pversion=3, ... procedure=1, ... aflavor='AUTH_UNIX', ... a_unix=Auth_Unix( ... stamp=0xffffffff, ... mname=Object_Name( ... length=5, ... _name='MNAME', ... fill='\x00\x00\x00' ... ), ... uid=1, ... gid=1, ... num_auxgids=1, ... auxgids=[0] ... ), ... vflavor=1, ... v_unix=Auth_Unix( ... stamp=0xffffffff, ... mname=Object_Name( ... length=5, ... _name='MNAME', ... fill='\x00\x00\x00' ... ), ... uid=1, ... gid=1, ... num_auxgids=1, ... auxgids=[0] ... ) ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x02\x00\x01\x86\xa5\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00 \xff\xff\xff\xff\x00\x00\x00\x05MNAME\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x05MNAME\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00' >>> >>> pkt = RPC_Call( ... version=2, ... program=100021, ... pversion=4, ... procedure=20, ... aflavor='RPCSEC_GSS', ... a_rpcsec_gss=Auth_RPCSEC_GSS( ... gss_version=1, ... gss_procedure=0, ... gss_seq_num=10, ... gss_service=1, ... gss_context=Object_Name( ... length=4, ... _name='AAAA', ... fill='' ... ), ... ), ... vflavor=6, ... v_rpcsec_gss=Verifier_RPCSEC_GSS(b"\x00\x00\x00\x04\x41\x41\x41\x41") ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x02\x00\x01\x86\xb5\x00\x00\x00\x04\x00\x00\x00\x14\x00\x00\x00\x06\x00\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x01\x00\x00\x00\x04\x41\x41\x41\x41\x00\x00\x00\x06\x00\x00\x00\x04\x41\x41\x41\x41' >>> >>> pkt = RPC_Reply( ... reply_stat=1, ... flavor=1, ... a_unix=Auth_Unix( ... stamp=0xffffffff, ... mname=Object_Name( ... length=5, ... _name='MNAME', ... fill='\x00\x00\x00' ... ), ... uid=1, ... gid=1, ... num_auxgids=1, ... auxgids=[0] ... ), ... length=32, ... accept_stat=1 ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x01\x00\x00\x00\x01\xff\xff\xff\xff\x00\x00\x00\x05MNAME\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x01' Scapy OPC DA layer tests ━ Run at 01:43:06 from [test/contrib/opc_da.uts] by UTscapy in 0.06334686279296875 └ Passed=9 └ Failed=0 ###### ## Test Request Packet ###### ###(000)=[passed] OpcDaRequest >>> opcdaRequestPacket_Dissect = hex_bytes(b'050000830000000000640000000000150000003c000600050000c41d0a9c0000d7028c761299f7bf00000000') >>> elem1 = raw(OpcDaMessage(opcdaRequestPacket_Dissect)) >>> >>> opcdaRequestPacket_Build = OpcDaMessage(OpcDaMessage= \ ... OpcDaHeaderMessage (versionMajor=5,versionMinor=0,pduType=0, \ ... pfc_flags = 131,integerRepresentation='bigEndian',\ ... characterRepresentation='ascii',floatingPointRepresentation='ieee',\ ... res=0)/ OpcDaHeaderN(fragLength=100,authLength=0,callID=21)\ ... / OpcDaRequest(allocHint=60,contextId=6,opNum=5,\ ... uuid=b'0000c41d-0a9c-0000-d702-8c761299f7bf',stubData=RequestStubData(\ ... versionMajor=0,versionMinor=0,stubdata=''))) >>> elem2 = raw(opcdaRequestPacket_Build) >>> >>> assert elem1 == elem2 ###(001)=[passed] OpcDaRequestLE >>> opcdaRequestLEPacket_Dissect = hex_bytes(b'050000831000000064000000150000003c000000060005001dc400009c0a0000d7028c761299f7bf000000000000000000000000512d4e34ab431449a2cf7784b21b3ea1') >>> elem1 = raw(OpcDaMessage(opcdaRequestLEPacket_Dissect)) >>> >>> opcdaRequestLEPacket_Build = OpcDaMessage(OpcDaMessage= \ ... OpcDaHeaderMessage (versionMajor=5,versionMinor=0,pduType=0, \ ... pfc_flags = 131,integerRepresentation='littleEndian',\ ... characterRepresentation='ascii',floatingPointRepresentation='ieee',\ ... res=0)/ OpcDaHeaderNLE(fragLength=100,authLength=0,callID=21)\ ... / OpcDaRequestLE (allocHint=60,contextId=6,opNum=5,\ ... uuid=b'0000c41d-0a9c-0000-d702-8c761299f7bf',\ ... stubData=RequestStubDataLE(versionMajor=0,versionMinor=0,\ ... stubdata=b'\x00\x00\x00\x00\x00\x00\x00\x00Q-N4\xabC\x14I\xa2\xcfw\x84\xb2\x1b>\xa1'))) >>> elem2 = raw(opcdaRequestLEPacket_Build) >>> >>> assert elem1 == elem2 ###### ## Test Ping Packet ###### ###(002)=[passed] OpcDaPing >>> opcdaPingPacket_Dissect = hex_bytes(b'0500010310000000640000001500000000') >>> elem1 = raw(OpcDaMessage(opcdaPingPacket_Dissect)) >>> >>> opcdaPingPacket_Build = OpcDaMessage(OpcDaMessage= \ ... OpcDaHeaderMessage (versionMajor=5,versionMinor=0,pduType=1, \ ... pfc_flags = 3,integerRepresentation='littleEndian',\ ... characterRepresentation='ascii',floatingPointRepresentation='ieee',\ ... res=0)/ OpcDaHeaderNLE(fragLength=100,authLength=0,callID=21)\ ... / OpcDaPing()) / '\x00' >>> elem2 = raw(opcdaPingPacket_Build) >>> >>> assert elem1 == elem2 ###### ## Test Response Packets ###### ###(003)=[passed] OpcDaResponse >>> opcDaResponsePacket_Dissect = hex_bytes(b'050002030000000000d4000000000015000000bc00060000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030') >>> elem1 = raw(OpcDaMessage(opcDaResponsePacket_Dissect)) >>> >>> opcDaResponsePacket_Build = OpcDaMessage(OpcDaMessage= \ ... OpcDaHeaderMessage (versionMajor=5,versionMinor=0,pduType=2, \ ... pfc_flags = 3,integerRepresentation='bigEndian',\ ... characterRepresentation='ascii',floatingPointRepresentation='ieee',\ ... res=0)/ OpcDaHeaderN(fragLength=212,authLength=0,callID=21)\ ... / OpcDaResponse(allocHint=188,contextId=6,cancelCount=0,reserved=0,\ ... stubData=b'0'*(212-32))) >>> elem2 = raw(opcDaResponsePacket_Build) >>> >>> assert elem1 == elem2 ###(004)=[passed] OpcDaResponseLE >>> opcDaResponseLEPacket_Dissect = hex_bytes(b'0500020310000000d400000015000000bc00000006000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030') >>> elem1 = raw(OpcDaMessage(opcDaResponseLEPacket_Dissect)) >>> >>> opcDaResponseLEPacket_Build = OpcDaMessage(OpcDaMessage= \ ... OpcDaHeaderMessage (versionMajor=5,versionMinor=0,pduType=2, \ ... pfc_flags = 3,integerRepresentation='littleEndian',\ ... characterRepresentation='ascii',floatingPointRepresentation='ieee',\ ... res=0)/ OpcDaHeaderNLE(fragLength=212,authLength=0,callID=21)\ ... / OpcDaResponseLE(allocHint=188,contextId=6,cancelCount=0,reserved=0,\ ... stubData=b'0'*(212-32))) >>> elem2 = raw(opcDaResponseLEPacket_Build) >>> >>> assert elem1 == elem2 ###### ## Test Alter_context ###### ###(005)=[passed] OpcDaAlter_context >>> opcDaAlter_contextPacket_Dissect = hex_bytes(b'05000e0300000000004800000000001716d016d00008294500000001070001000101000000000000c00000000000004600000000045d888aeb1cc9119fe808002b10486002000000') >>> elem1 = raw(OpcDaMessage(opcDaAlter_contextPacket_Dissect)) >>> >>> ocDaAlter_contextPacket_Build = OpcDaMessage(OpcDaMessage= \ ... OpcDaHeaderMessage (versionMajor=5,versionMinor=0,pduType=14, \ ... pfc_flags = 3,integerRepresentation='bigEndian',\ ... characterRepresentation='ascii',floatingPointRepresentation='ieee',\ ... res=0)/ OpcDaHeaderN(fragLength=72,authLength=0,callID=23)\ ... / OpcDaAlter_context(maxXmitFrag=5840,maxRecvtFrag=5840,\ ... assocGroupId=534853)) \ ... / '\x00\x00\x00\x01\x07\x00\x01\x00\x01\x01\x00\x00\x00\x00\x00\x00\xc0'\ ... '\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9'\ ... '\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00' >>> elem2 = raw(ocDaAlter_contextPacket_Build) ###(006)=[passed] OpcDaAlter_contextLE >>> opcDaAlter_contextLEPacket_Dissect = hex_bytes(b'05000e03100000004800000017000000d016d0164529080001000000070001000101000000000000c00000000000004600000000045d888aeb1cc9119fe808002b10486002000000') >>> elem1 = raw(OpcDaMessage(opcDaAlter_contextLEPacket_Dissect)) >>> >>> ocDaAlter_contextLEPacket_Build = OpcDaMessage(OpcDaMessage= \ ... OpcDaHeaderMessage (versionMajor=5,versionMinor=0,pduType=14, \ ... pfc_flags = 3,integerRepresentation='littleEndian',\ ... characterRepresentation='ascii',floatingPointRepresentation='ieee',\ ... res=0)/ OpcDaHeaderNLE(fragLength=72,authLength=0,callID=23)\ ... / OpcDaAlter_contextLE(maxXmitFrag=5840,maxRecvtFrag=5840,\ ... assocGroupId=534853)) \ ... / '\x01\x00\x00\x00\x07\x00\x01\x00\x01\x01\x00\x00\x00\x00\x00\x00\xc0'\ ... '\x00\x00\x00\x00\x00\x00\x46\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9'\ ... '\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00' >>> elem2 = raw(ocDaAlter_contextLEPacket_Build) ###### ## Test Alter_context_Resp ###### ###(007)=[passed] OpcDaAlter_Context_Resp >>> ###(008)=[passed] OpcDaAlter_Context_RespLE >>> Tests for OpenFlow v1.0 with Scapy ━ Run at 01:43:06 from [test/contrib/openflow.uts] by UTscapy in 0.06448554992675781 └ Passed=16 └ Failed=0 ###### ## Preparation ###### ###(000)=[passed] Be sure we have loaded OpenFlow v1 >>> load_contrib("openflow") ###### ## Usual OFv1.0 messages ###### ###(001)=[passed] OFPTHello(), simple hello message >>> ofm = OFPTHello() >>> raw(ofm) == b'\x01\x00\x00\x08\x00\x00\x00\x00' True ###(002)=[passed] OFPTEchoRequest(), echo request >>> ofm = OFPTEchoRequest() >>> raw(ofm) == b'\x01\x02\x00\x08\x00\x00\x00\x00' True ###(003)=[passed] OFPMatch(), check wildcard completion >>> ofm = OFPMatch(in_port=1, nw_tos=8) >>> ofm = OFPMatch(raw(ofm)) >>> assert ofm.wildcards1 == 0x1 >>> ofm.wildcards2 == 0xee True ###(004)=[passed] OpenFlow(), generic method test with OFPTEchoRequest() >>> ofm = OFPTEchoRequest() >>> s = raw(ofm) >>> isinstance(OpenFlow(s), OFPTEchoRequest) True ###(005)=[passed] OFPTFlowMod(), check codes and defaults values >>> ofm = OFPTFlowMod(cmd='OFPFC_DELETE', out_port='CONTROLLER', flags='CHECK_OVERLAP+EMERG') >>> assert ofm.cmd == 3 >>> assert ofm.buffer_id == 0xffffffff >>> assert ofm.out_port == 0xfffd >>> ofm.flags == 6 True ###### ## Complex OFv1.0 messages ###### ###(006)=[passed] OFPTFlowMod(), complex flow_mod >>> mtc = OFPMatch(dl_vlan=10, nw_src='192.168.42.0', nw_src_mask=8) >>> act1 = OFPATSetNwSrc(nw_addr='192.168.42.1') >>> act2 = OFPATOutput(port='CONTROLLER') >>> act3 = OFPATSetDlSrc(dl_addr='1a:d5:cb:4e:3c:64') >>> ofm = OFPTFlowMod(priority=1000, match=mtc, flags='CHECK_OVERLAP', actions=[act1,act2,act3]) >>> raw(ofm) b'\x01\x0e\x00h\x00\x00\x00\x00\x00?\xc8\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x08\x00\x00\x00\x00\x00\xc0\xa8*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xe8\xff\xff\xff\xff\xff\xff\x00\x02\x00\x06\x00\x08\xc0\xa8*\x01\x00\x00\x00\x08\xff\xfd\xff\xff\x00\x04\x00\x10\x1a\xd5\xcbN>> s = b'\x01\x0e\x00h\x00\x00\x00\x00\x00?\xc8\xed\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x08\x00\x00\x00\x00\x00\xc0\xa8*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xe8\xff\xff\xff\xff\xff\xff\x00\x02\x00\x06\x00\x08\xc0\xa8*\x01\x00\x00\x00\x08\xff\xfd\xff\xff\x00\x04\x00\x10\x1a\xd5\xcbN>> raw(ofm) == s True ###(007)=[passed] OFPETBadRequest() containing a flow_mod with wrong table_id >>> flowmod = OFPTFlowMod(actions=OFPATOutput(port='LOCAL')) >>> ofm = OFPETBadRequest(errcode='OFPBRC_EPERM', data=raw(flowmod)) >>> hexdump(ofm) 0000 01 01 00 5C 00 00 00 00 00 01 00 05 01 0E 00 50 ...\...........P 0010 00 00 00 00 00 3F FF FF 00 00 00 00 00 00 00 00 .....?.......... 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0040 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF ................ 0050 FF FF 00 00 00 00 00 08 FF FE FF FF ............ >>> s = b'\x01\x01\x00\\\x00\x00\x00\x00\x00\x01\x00\x05\x01\x0e\x00P\x00\x00\x00\x00\x00?\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x08\xff\xfe\xff\xff' >>> raw(ofm) == s True ###(008)=[passed] OFPTPacketIn() containing an Ethernet frame >>> ofm = OFPTPacketIn(data=Ether()/IP()/ICMP()) >>> p = OFPTPacketIn(raw(ofm)) >>> dat = p.data >>> assert isinstance(dat, Ether) >>> assert isinstance(dat.payload, IP) >>> isinstance(dat.payload.payload, ICMP) True ###(009)=[passed] OFPTStatsReplyFlow() >>> pkt = TCP()/OFPTStatsReplyFlow(flow_stats=[OFPFlowStats(actions=[OFPATSetTpSrc()])]) >>> pkt = TCP(raw(pkt)) No IP underlayer to compute checksum. Leaving null. >>> assert isinstance(pkt.flow_stats[0].actions[0], OFPATSetTpSrc) ###(010)=[passed] OFPTQueueGetConfigReply() >>> pkt = TCP()/OFPTQueueGetConfigReply(queues=[OFPPacketQueue(properties=[OFPQTMinRate(rate=123)])]) >>> pkt = TCP(raw(pkt)) No IP underlayer to compute checksum. Leaving null. >>> assert pkt.queues[0].properties[0].rate == 123 ###(011)=[passed] OFPETHelloFailed() >>> pkt = OFPETHelloFailed(data=OFPTEchoRequest()) >>> pkt = OFPETHelloFailed(raw(pkt)) >>> assert isinstance(pkt.data, OFPTEchoRequest) ###### ## Layer bindings ###### ###(012)=[passed] TCP()/OFPTStatsRequestDesc(), check default sport >>> p = TCP()/OFPTStatsRequestDesc() >>> p[TCP].sport == 6653 True ###(013)=[passed] TCP()/OFPETHelloFailed(), check default dport >>> p = TCP()/OFPETHelloFailed() >>> p[TCP].dport == 6653 True ###(014)=[passed] TCP()/OFPTHello() dissection, check new TCP.guess_payload_class >>> o = TCP(dport=6653)/OFPTHello() >>> p = TCP(raw(o)) No IP underlayer to compute checksum. Leaving null. >>> p[TCP].sport == 6653 True >>> isinstance(p[TCP].payload, OFPTHello) True ###(015)=[passed] complete Ether()/IP()/TCP()/OFPTFeaturesRequest() >>> ofm = Ether(src='00:11:22:33:44:55',dst='01:23:45:67:89:ab')/IP(src='10.0.0.7',dst='192.168.0.42')/TCP(sport=6633, dport=6633)/OFPTFeaturesRequest(xid=23) >>> s = b'\x01#Eg\x89\xab\x00\x11"3DU\x08\x00E\x00\x000\x00\x01\x00\x00@\x06\xaf\xee\n\x00\x00\x07\xc0\xa8\x00*\x19\xe9\x19\xe9\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90\x0b\x00\x00\x01\x05\x00\x08\x00\x00\x00\x17' >>> assert raw(ofm) == s >>> e = Ether(s) >>> e.show2() ###[ Ethernet ]### dst = 01:23:45:67:89:ab src = 00:11:22:33:44:55 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 48 id = 1 flags = frag = 0 ttl = 64 proto = tcp chksum = 0xafee src = 10.0.0.7 dst = 192.168.0.42 \options \ ###[ TCP ]### sport = 6633 dport = 6633 seq = 0 ack = 0 dataofs = 5 reserved = 0 flags = S window = 8192 chksum = 0x900b urgptr = 0 options = [] ###[ OFPT_FEATURES_REQUEST ]### version = OpenFlow 1.0 type = OFPT_FEATURES_REQUEST len = 8 xid = 23 >>> e[OFPTFeaturesRequest].xid == 23 True Tests for OpenFlow v1.3 with Scapy ━ Run at 01:43:06 from [test/contrib/openflow3.uts] by UTscapy in 0.10730671882629395 └ Passed=24 └ Failed=0 ###### ## Preparation ###### ###(000)=[passed] Be sure we have loaded OpenFlow v3 >>> load_contrib("openflow3") ###### ## Usual OFv1.3 messages ###### ###(001)=[passed] OFPTHello(), hello without version bitmap >>> ofm = OFPTHello() >>> raw(ofm) == b'\x04\x00\x00\x08\x00\x00\x00\x00' True ###(002)=[passed] OFPTEchoRequest(), echo request >>> ofm = OFPTEchoRequest() >>> raw(ofm) == b'\x04\x02\x00\x08\x00\x00\x00\x00' True ###(003)=[passed] OFPMatch(), check padding >>> ofm = OFPMatch(oxm_fields=OFBEthType(eth_type=0x86dd)) >>> assert len(raw(ofm))%8 == 0 >>> raw(ofm) == b'\x00\x01\x00\x0a\x80\x00\x0a\x02\x86\xdd\x00\x00\x00\x00\x00\x00' True ###(004)=[passed] OpenFlow3(), generic method test with OFPTEchoRequest() >>> ofm = OFPTEchoRequest() >>> s = raw(ofm) >>> isinstance(OpenFlow3(s), OFPTEchoRequest) True ###(005)=[passed] OFPTFlowMod(), check codes and defaults values >>> ofm = OFPTFlowMod(cmd='OFPFC_DELETE', out_group='ALL', flags='CHECK_OVERLAP+NO_PKT_COUNTS') >>> assert ofm.cmd == 3 >>> assert ofm.out_port == 0xffffffff >>> assert ofm.out_group == 0xfffffffc >>> ofm.flags == 10 True ###(006)=[passed] OFBIPv6ExtHdrHMID(), check creation of last OXM classes >>> assert hasattr(OFBIPv6ExtHdr(), 'ipv6_ext_hdr_flags') >>> OFBIPv6ExtHdrHMID().field == 39 True ###### ## Complex OFv1.3 messages ###### ###(007)=[passed] OFPTFlowMod(), complex flow_mod >>> mtc = OFPMatch(oxm_fields=OFBVLANVID(vlan_vid=10)) >>> ist1 = OFPITApplyActions(actions=[OFPATSetField(field=OFBIPv4Src(ipv4_src='192.168.10.41')),OFPATSetField(field=OFBEthSrc(eth_src='1a:d5:cb:4e:3c:64')),OFPATOutput(port='NORMAL')]) >>> ist2 = OFPITWriteActions(actions=OFPATOutput(port='CONTROLLER')) >>> ofm = OFPTFlowMod(table_id=2, match=mtc, instructions=[ist1,ist2]) >>> hexdump(ofm) 0000 04 0E 00 98 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0010 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 ................ 0020 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 00 00 ................ 0030 00 01 00 0A 80 00 0C 02 00 0A 00 00 00 00 00 00 ................ 0040 00 04 00 40 00 00 00 00 00 19 00 18 80 00 0A 02 ...@............ 0050 08 00 80 00 16 04 C0 A8 0A 29 00 00 00 00 00 00 .........)...... 0060 00 19 00 10 80 00 08 06 1A D5 CB 4E 3C 64 00 00 ...........N>> s = b'\x04\x0e\x00\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x01\x00\n\x80\x00\x0c\x02\x00\n\x00\x00\x00\x00\x00\x00\x00\x04\x00@\x00\x00\x00\x00\x00\x19\x00\x18\x80\x00\n\x02\x08\x00\x80\x00\x16\x04\xc0\xa8\n)\x00\x00\x00\x00\x00\x00\x00\x19\x00\x10\x80\x00\x08\x06\x1a\xd5\xcbN>> raw(ofm) == s True ###(008)=[passed] OFPTFlowMod(), complex flow_mod - Dissection >>> ofm = OFPTFlowMod(raw(ofm)) >>> assert len(ofm.instructions[0].actions) == 3 >>> assert len(ofm.instructions[1].actions) == 1 >>> assert isinstance(ofm.instructions[0].actions[0].field[0], OFBEthType) >>> assert ofm.instructions[0].actions[0].field[1].ipv4_src == '192.168.10.41' ###(009)=[passed] OFPFlowStats() >>> fls = OFPFlowStats(instructions=OFPITGotoTable(table_id=0)) >>> fls = OFPFlowStats(raw(fls)) >>> assert fls.match.type == 1 >>> assert fls.instructions[0].type == 1 >>> assert fls.instructions[0].table_id == 0 ###(010)=[passed] OFPETBadRequest() containing a flow_mod with wrong table_id >>> flowmod = OFPTFlowMod(instructions=OFPITGotoTable(table_id=0)) >>> ofm = OFPETBadRequest(errcode='OFPBRC_BAD_TABLE_ID', data=raw(flowmod)) >>> hexdump(ofm) 0000 04 01 00 4C 00 00 00 00 00 01 00 09 04 0E 00 40 ...L...........@ 0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0020 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF ................ 0030 FF FF FF FF FF FF FF FF 00 00 00 00 00 01 00 04 ................ 0040 00 00 00 00 00 01 00 08 00 00 00 00 ............ >>> s = b'\x04\x01\x00L\x00\x00\x00\x00\x00\x01\x00\t\x04\x0e\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x01\x00\x04\x00\x00\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00' >>> raw(ofm) == s True ###(011)=[passed] OFPTFPTInstructions() >>> fpti = OFPTFPTInstructions(instruction_ids=[OFPITGotoTableID(), OFPITClearActionsID()]) >>> fpti = OFPTFPTInstructions(raw(fpti)) >>> assert len(fpti) == 16 >>> assert fpti.instruction_ids[0].type == 1 >>> assert fpti.instruction_ids[1].type == 5 >>> >>> fpti.instruction_ids[0] = OFPITGotoTableID() >>> assert bytes(fpti) == b'\x00\x00\x00\x0c\x00\x01\x00\x04\x00\x05\x00\x04\x00\x00\x00\x00' ###(012)=[passed] OFPTPacketIn() containing an Ethernet frame >>> ofm = OFPTPacketIn(data=Ether()/IP()/ICMP()) >>> p = OFPTPacketIn(raw(ofm)) >>> dat = p.data >>> assert isinstance(dat, Ether) >>> assert isinstance(dat.payload, IP) >>> isinstance(dat.payload.payload, ICMP) True ###(013)=[passed] OFPTGroupMod() >>> fptgm = OFPTGroupMod(buckets=[OFPBucket(actions=[OFPATOutput(port='CONTROLLER')])]) >>> fptgm = OFPTGroupMod(raw(fptgm)) >>> assert fptgm.buckets[0].actions[0].port == 4294967293 >>> assert fptgm.buckets[0].actions[0].len == len(fptgm.buckets[0].actions[0]) == 16 >>> assert fptgm.buckets[0].actions[0].type == 0 >>> assert fptgm.buckets[0].actions[0].max_len == 0xffff ###(014)=[passed] OFPTQueueGetConfigReply() >>> qgcr = OFPTQueueGetConfigReply(queues=[OFPPacketQueue(queue_id=0, properties=[OFPQTNone()]), OFPPacketQueue(queue_id=1, properties=[OFPQTNone(), OFPQTMinRate(rate=123)])]) >>> qgcr = OFPTQueueGetConfigReply(raw(qgcr)) >>> assert qgcr.queues[0].queue_id == 0 >>> assert len(qgcr.queues[0].properties) == 1 >>> assert qgcr.queues[0].properties[0].type == 0 >>> >>> assert qgcr.queues[1].queue_id == 1 >>> assert len(qgcr.queues[1].properties) == 2 >>> assert qgcr.queues[1].properties[0].type == 0 >>> assert qgcr.queues[1].properties[1].type == 1 >>> assert qgcr.queues[1].properties[1].rate == 123 ###(015)=[passed] OFPMPReplyMeter() >>> rm = OFPMPReplyMeter(flags="REPLY_MORE", meter_stats=[OFPMeterStats(meter_id=2, duration_sec=3, byte_in_count=15, band_stats=[OFPMeterBandStats(packet_band_count=0x123, byte_band_count=0x456)])]) >>> rm = OFPMPReplyMeter(raw(rm)) >>> assert rm.flags == 1 >>> assert rm.meter_stats[0].meter_id == 2 >>> assert rm.meter_stats[0].duration_sec == 3 >>> assert rm.meter_stats[0].byte_in_count == 15 >>> assert rm.meter_stats[0].band_stats[0].packet_band_count == 0x123 >>> assert rm.meter_stats[0].band_stats[0].byte_band_count == 0x456 ###(016)=[passed] OFPMPReplyMeterConfig() >>> rmc = OFPMPReplyMeterConfig(meter_configs=[OFPMeterConfig(flags="KBPS+STATS", bands=[OFPMBTDrop()]), OFPMeterConfig(bands=[OFPMBTDSCPRemark(burst_size=12)])]) >>> rmc = OFPMPReplyMeterConfig(raw(rmc)) >>> assert rmc.meter_configs[0].flags == 9 >>> assert rmc.meter_configs[0].bands[0].type == 0 >>> assert rmc.meter_configs[1].bands[0].type == 1 >>> assert rmc.meter_configs[1].bands[0].burst_size == 12 ###### ## Layer bindings ###### ###(017)=[passed] TCP()/OFPMPRequestDesc(), check default sport >>> p = TCP()/OFPMPRequestDesc() >>> p[TCP].sport == 6653 True ###(018)=[passed] TCP()/OFPETHelloFailed(), check default dport >>> p = TCP()/OFPETHelloFailed() >>> p[TCP].dport == 6653 True ###(019)=[passed] TCP()/OFPTHello() dissection, check new TCP.guess_payload_class >>> o = TCP()/OFPTHello() >>> p = TCP(raw(o)) No IP underlayer to compute checksum. Leaving null. >>> p[TCP].sport == 6653 True >>> isinstance(p[TCP].payload, OFPTHello) True ###(020)=[passed] Advanced TCP()/OFPTHello() built, with OFPHETVersionBitmap >>> pkt = TCP()/OFPTHello(elements=[OFPHETVersionBitmap(bitmap="OFv1.4", len=None)]) >>> pkt = TCP(raw(pkt)) No IP underlayer to compute checksum. Leaving null. >>> assert isinstance(pkt[OFPTHello].elements[0], OFPHETVersionBitmap) >>> assert pkt[OFPTHello].elements[0].bitmap == 32 >>> assert pkt[OFPTHello].elements[0].len == 8 >>> >>> pkt = TCP()/OFPTHello(elements=[OFPHETVersionBitmap(bitmap="OFv1.5", len=None)]) >>> pkt = TCP(raw(pkt)) No IP underlayer to compute checksum. Leaving null. >>> assert isinstance(pkt[OFPTHello].elements[0], OFPHETVersionBitmap) >>> assert pkt[OFPTHello].elements[0].bitmap == 64 >>> assert pkt[OFPTHello].elements[0].len == 8 ###(021)=[passed] complete Ether()/IP()/TCP()/OFPTFeaturesRequest() >>> ofm = Ether(src='00:11:22:33:44:55',dst='01:23:45:67:89:ab')/IP(src='10.0.0.7',dst='192.168.0.42')/TCP(sport=6633)/OFPTFeaturesRequest(xid=23) >>> s = b'\x01#Eg\x89\xab\x00\x11"3DU\x08\x00E\x00\x000\x00\x01\x00\x00@\x06\xaf\xee\n\x00\x00\x07\xc0\xa8\x00*\x19\xe9\x19\xfd\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8c\xf7\x00\x00\x04\x05\x00\x08\x00\x00\x00\x17' >>> assert raw(ofm) == s >>> e = Ether(s) >>> e.show2() ###[ Ethernet ]### dst = 01:23:45:67:89:ab src = 00:11:22:33:44:55 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 48 id = 1 flags = frag = 0 ttl = 64 proto = tcp chksum = 0xafee src = 10.0.0.7 dst = 192.168.0.42 \options \ ###[ TCP ]### sport = 6633 dport = openflow seq = 0 ack = 0 dataofs = 5 reserved = 0 flags = S window = 8192 chksum = 0x8cf7 urgptr = 0 options = [] ###[ OFPT_FEATURES_REQUEST ]### version = OpenFlow 1.3 type = OFPT_FEATURES_REQUEST len = 8 xid = 23 >>> e[OFPTFeaturesRequest].xid == 23 True ###(022)=[passed] OFPMPRequestTableFeatures() with OFPTFPTMatch() OXMIDPacketListField tests >>> pkt = TCP()/OFPMPRequestTableFeatures(table_features=[OFPTableFeatures(properties=[OFPTFPTMatch(oxm_ids=[OFBUDPSrcID()])])]) >>> assert raw(pkt) == b'\x19\xfd\x19\xfd\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x00\x00\x00\x00\x04\x12\x00X\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x08\x80\x00\x1e\x02' No IP underlayer to compute checksum. Leaving null. >>> pkt = TCP(raw(pkt)) No IP underlayer to compute checksum. Leaving null. >>> assert pkt.table_features[0].properties[0].oxm_ids[0].fields == {'class_': 32768, 'field': 15, 'hasmask': 0, 'len': 2} ###(023)=[passed] Test OFBTCPSrc Autocompletion >>> conf.contribs['OPENFLOW']['prereq_autocomplete'] = True >>> >>> pkt = TCP()/OFPTPacketIn(match=OFPMatch(oxm_fields=OFBTCPSrc())) >>> pkt = TCP(raw(pkt)) No IP underlayer to compute checksum. Leaving null. >>> >>> assert len(pkt[OFPTPacketIn].match.oxm_fields) == 3 >>> assert isinstance(pkt[OFPTPacketIn].match.oxm_fields[0], OFBEthType) >>> assert isinstance(pkt[OFPTPacketIn].match.oxm_fields[1], OFBIPProto) >>> assert isinstance(pkt[OFPTPacketIn].match.oxm_fields[2], OFBTCPSrc) Test campaign ━ Run at 01:43:06 from [test/contrib/ospf.uts] by UTscapy in 0.036589622497558594 └ Passed=5 └ Failed=0 ###### ## OSPF ###### ###(000)=[passed] OSPF, basic instantiation >>> data = b'\x01\x00^\x00\x00\x05\x00\xe0\x18\xb1\x0c\xad\x08\x00E\xc0\x00T\x08\x19\x00\x00\x01Ye\xc2\xc0\xa8\xaa\x08\xe0\x00\x00\x05\x02\x04\x00@\xc0\xa8\xaa\x08\x00\x00\x00\x01\x96\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\xe2\x02\x01\xc0\xa8\xaa\x08\xc0\xa8\xaa\x08\x80\x00\r\xc3%\x06\x00$\x02\x00\x00\x01\xc0\xa8\xaa\x00\xff\xff\xff\x00\x03\x00\x00\n' >>> >>> p = Ether(data) >>> >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].age == 994) >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].type == 1) >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].id == '192.168.170.8') >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].adrouter == '192.168.170.8') >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].seq == 0x80000dc3) >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].chksum == 0x2506) >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].len == 36) >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].reserved == 0) >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].linkcount == 1) >>> >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].linklist[0][OSPF_Link].id == '192.168.170.0') >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].linklist[0][OSPF_Link].data == '255.255.255.0') >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].linklist[0][OSPF_Link].type == 3) >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].linklist[0][OSPF_Link].toscount == 0) >>> assert (p[OSPF_LSUpd][OSPF_Router_LSA].linklist[0][OSPF_Link].metric == 10) ###(001)=[passed] OSPF - build >>> pkt = Ether(dst="01:00:5e:00:00:05", src="ca:11:09:b3:00:1c")/IP(tos=0xc0, ttl=1, ihl=5, id=36333, dst="224.0.0.5", src="10.75.0.254")/OSPF_Hdr(src="75.1.3.1")/\ ... OSPF_Hello(options=0x12, router="10.75.0.254", backup="10.75.0.1", neighbors=["75.1.0.1"])/OSPF_LLS_Hdr(llstlv=[LLS_Extended_Options(options='\x00\x00\x00\x01')]) >>> assert raw(pkt) == b'\x01\x00^\x00\x00\x05\xca\x11\t\xb3\x00\x1c\x08\x00E\xc0\x00P\x8d\xed\x00\x00\x01Y?Z\nK\x00\xfe\xe0\x00\x00\x05\x02\x01\x000K\x01\x03\x01\x00\x00\x00\x00>\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\x00\x00\n\x12\x01\x00\x00\x00(\nK\x00\xfe\nK\x00\x01K\x01\x00\x01\xff\xf6\x00\x03\x00\x01\x00\x04\x00\x00\x00\x01' ###(002)=[passed] OSPF - answers >>> a = OSPF_Hdr(area="1.1.1.1")/OSPF_LSAck(lsaheaders=[OSPF_LSA_Hdr(type=1, seq=0x80000003)]) >>> b = OSPF_Hdr(area="1.1.1.1")/OSPF_LSUpd(lsalist=[OSPF_Router_LSA(type=1, seq=0x80000003)]) >>> assert a.answers(b) >>> a = OSPF_Hdr(raw(a)) >>> b = OSPF_Hdr(raw(b)) >>> assert a.answers(b) ###(003)=[passed] OSPFv3 - build >>> pkt = Ether(dst="01:00:5e:00:00:05", src="ca:11:09:b3:00:1c")/IPv6(dst="::1", src="fe80::160c:12aa:fe7e:cd28")/OSPFv3_Hdr(src="75.1.3.1")/\ ... OSPFv3_Hello(options=0x12, router="10.75.0.254", backup="10.75.0.1", neighbors=["75.1.0.1"]) >>> assert raw(pkt) == b'\x01\x00^\x00\x00\x05\xca\x11\t\xb3\x00\x1c\x86\xdd`\x00\x00\x00\x00(Y@\xfe\x80\x00\x00\x00\x00\x00\x00\x16\x0c\x12\xaa\xfe~\xcd(\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x01\x00(K\x01\x03\x01\x00\x00\x00\x00Y\x98\x00\x00\x00\x00\x00\x00\x01\x00\x00\x12\x00\n\x00(\nK\x00\xfe\nK\x00\x01K\x01\x00\x01' ###(004)=[passed] OSPFv2 Opaque lsa >>> data = b'\x01\x00^\x00\x00\x05\x00\x90\x92\x9d\x94\x01\x08\x00E\xc0\x00\xb4?\x99\x00\x00\x01Y\xc6\x91\xd2\x00\x00\x01\xe0\x00\x00\x05\x02\x04\x00\xa0\x11\x03\x03\x03\x00\x00\x00d9\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01 \n\x01\x00\x00\x00\x11\x03\x03\x03\x80\x00\x00\x1f\xab\xd9\x00\x84\x00\x01\x00\x04\x11\x03\x03\x03\x00\x02\x00d\x00\x01\x00\x01\x02\x00\x00\x00\x00\x02\x00\x04\xd2\x00\x00\x02\x00\x03\x00\x04\xd2\x00\x00\x01\x00\x04\x00\x04\xd2\x00\x00\x02\x00\x05\x00\x04\x00\x00\x03\xe8\x00\x06\x00\x04I\x98\x96\x80\x00\x07\x00\x04I\x98\x96\x80\x00\x08\x00 I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80\x00\t\x00\x04\x00\x00\x00\x00\x92\xe6\xb6:' >>> >>> p = Ether(data) >>> >>> assert (p[OSPF_LSUpd][OSPF_Area_Scope_Opaque_LSA].age == 1) >>> assert (p[OSPF_LSUpd][OSPF_Area_Scope_Opaque_LSA].type == 10) >>> assert (p[OSPF_LSUpd][OSPF_Area_Scope_Opaque_LSA].id == '1.0.0.0') >>> assert (p[OSPF_LSUpd][OSPF_Area_Scope_Opaque_LSA].adrouter == '17.3.3.3') >>> assert (p[OSPF_LSUpd][OSPF_Area_Scope_Opaque_LSA].seq == 0x8000001f) >>> assert (p[OSPF_LSUpd][OSPF_Area_Scope_Opaque_LSA].chksum == 0xabd9) >>> assert (p[OSPF_LSUpd][OSPF_Area_Scope_Opaque_LSA].len == 132) >>> assert (p[OSPF_LSUpd][OSPF_Area_Scope_Opaque_LSA].opaqueid() == 0) >>> assert (p[OSPF_LSUpd][OSPF_Area_Scope_Opaque_LSA].opaquetype() == 1) >>> >>> opaque_data=b'\x00\x01\x00\x04\x11\x03\x03\x03\x00\x02\x00d\x00\x01\x00\x01\x02\x00\x00\x00\x00\x02\x00\x04\xd2\x00\x00\x02\x00\x03\x00\x04\xd2\x00\x00\x01\x00\x04\x00\x04\xd2\x00\x00\x02\x00\x05\x00\x04\x00\x00\x03\xe8\x00\x06\x00\x04I\x98\x96\x80\x00\x07\x00\x04I\x98\x96\x80\x00\x08\x00 I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80I\x18\x96\x80\x00\t\x00\x04\x00\x00\x00\x00' >>> >>> p = OSPF_Link_Scope_Opaque_LSA(seq=0x80000003,data=opaque_data) >>> assert (p.type == 9) >>> assert (p.seq == 0x80000003) >>> assert (len(p) == 132) >>> >>> p = OSPF_Area_Scope_Opaque_LSA(seq=0x80000004,data=opaque_data) >>> assert (p.type == 10) >>> assert (p.seq == 0x80000004) >>> assert (len(p) == 132) >>> >>> p = OSPF_AS_Scope_Opaque_LSA(seq=0x80000005,data=opaque_data) >>> assert (p.type == 11) >>> assert (p.seq == 0x80000005) >>> assert (len(p) == 132) PCOM tests ━ Run at 01:43:06 from [test/contrib/pcom.uts] by UTscapy in 0.04093003273010254 └ Passed=10 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the pcom layer >>> from scapy.contrib.scada.pcom import * ###### ## Test PCOM/TCP ###### ###(001)=[passed] PCOM/TCP Default values >>> raw(PCOMRequest())[2:] == b'\x65\x00\x00\x00' True >>> raw(PCOMResponse())[2:] == b'\x65\x00\x00\x00' True ###(002)=[passed] PCOM/TCP Len >>> r = b'\x65\x00\x04\x00\x00\x00\x00\x00' >>> raw(PCOMRequest() / b'\x00\x00\x00\x00')[2:] == r True >>> r = b'\x65\x00\x04\x00\x00\x00\x00\x00' >>> raw(PCOMResponse() / b'\x00\x00\x00\x00')[2:] == r True ###(003)=[passed] PCOM/TCP Guess Payload Class >>> assert isinstance(PCOMRequest(b'\x00\x00\x65\x00\x01\x00\x00\x00\x00\x00\x00\x00').payload, PCOMAsciiRequest) >>> assert isinstance(PCOMResponse(b'\x00\x00\x65\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00').payload, PCOMAsciiResponse) >>> assert isinstance(PCOMRequest(b'\x00\x00\x66\x00\x01\x00\x00\x00' + b'\x00' * 25).payload, PCOMBinaryRequest) >>> assert isinstance(PCOMResponse(b'\x00\x00\x66\x00\x01\x00\x00\x00' + b'\x00' * 25).payload, PCOMBinaryResponse) ###### ## Test PCOM/Ascii ###### ###(004)=[passed] PCOM/ASCII Default values >>> r = b'\x65\x00\x06\x00\x2f\x30\x30\x36\x30\x0d' >>> raw(PCOMRequest() / PCOMAsciiRequest())[2:] == r True >>> r = b'\x65\x00\x07\x00\x2f\x41\x30\x30\x36\x30\x0d' >>> raw(PCOMResponse() / PCOMAsciiResponse())[2:] == r True ###(005)=[passed] PCOM/ASCII Checksum >>> r = b'\x65\x00\x08\x00\x2f\x30\x30\x49\x44\x45\x44\x0d' >>> raw(PCOMRequest() / PCOMAsciiRequest(unitId='00',command='ID'))[2:] == r True >>> r = b'\x65\x00\x09\x00\x2f\x41\x30\x30\x49\x44\x45\x44\x0d' >>> raw(PCOMResponse() / PCOMAsciiResponse(unitId='00',command='ID'))[2:] == r True ###(006)=[passed] PCOM/ASCII Known Codes >>> f = PCOMAsciiCommandField('command', '', length_from= None) >>> assert f.i2repr(None, 'CCS') == 'Send Stop Command \'CCS\'' >>> assert f.i2repr(None, 'CC') == 'Reply of Admin Commands (CC*) \'CC\'' ###### ## Test PCOM/Binary ###### ###(007)=[passed] PCOM/Binary Default values >>> r = b'\x66\x00\x1b\x00\x2f\x5f\x4f\x50\x4c\x43\x00\xfe\x01\x00\x00\x00\x00\x00\ ... \x00\x00\x00\x00\x00\x00\x00\x00\x45\xfd\x00\x00\x5c' >>> raw(PCOMRequest(mode=0x66) / PCOMBinaryRequest())[2:] == r True >>> r = b'\x66\x00\x1b\x00\x2f\x5f\x4f\x50\x4c\x43\xfe\x00\x01\x00\x00\x00\x00\x00\ ... \x00\x00\x00\x00\x00\x00\x00\x00\x45\xfd\x00\x00\x5c' >>> raw(PCOMResponse(mode=0x66) / PCOMBinaryResponse())[2:] == r True ###(008)=[passed] PCOM/Binary Checksum >>> data = b'\x01\x00\x01\x01' >>> r = b'\x66\x00\x1f\x00\x2f\x5f\x4f\x50\x4c\x43\x00\xfe\x01\x01\x00\x00\x4d\x00\ ... \x00\x00\x00\x00\x00\x01\x04\x00\xf2\xfc\x01\x00\x01\x01\xfd\xff\x5c' >>> raw(PCOMRequest(mode=0x66) / PCOMBinaryRequest(command=0x4d,reserved3=0x01, ... commandSpecific='\x00\x00\x00\x00\x00\x01', len=4, data= data))[2:] == r True >>> r = b'\x66\x00\x1f\x00\x2f\x5f\x4f\x50\x4c\x43\xfe\x00\x01\x01\x00\x00\x4d\x00\ ... \x00\x00\x00\x00\x00\x01\x04\x00\xf2\xfc\x01\x00\x01\x01\xfd\xff\x5c' >>> raw(PCOMResponse(mode=0x66) / PCOMBinaryResponse(command=0x4d,reserved3=0x01, ... commandSpecific='\x00\x00\x00\x00\x00\x01', len=4, data= data))[2:] == r True ###(009)=[passed] PCOM/Binary Known Codes >>> f = PCOMBinaryCommandField('command', None) >>> assert f.i2repr(None, 0x4d) == 'Read Operands Request - 0x4d' PFCP tests ━ Run at 01:43:08 from [test/contrib/pfcp.uts] by UTscapy in 1.8113832473754883 └ Passed=10 └ Failed=0 ###### ## Build packets & dissect ###### ###(000)=[passed] Verify IEs >>> import scapy.contrib.pfcp as pfcp_mod >>> >>> skip_IEs = [ ... IE_Base, ... IE_Compound ... ] >>> >>> for name, cls in pfcp_mod.__dict__.items(): ... if name.startswith("IE_") and type(cls) == Packet_metaclass and cls not in skip_IEs: ... print("testing %s" % name) ... pkt = cls() ... bs = bytes(pkt) ... restored = cls(bs) ... assert bytes(restored) == bs ... # TODO: also test packet field equality ... testing IE_CreatePDR testing IE_PDI testing IE_CreateFAR testing IE_ForwardingParameters testing IE_DuplicatingParameters testing IE_CreateURR testing IE_CreateQER testing IE_CreatedPDR testing IE_UpdatePDR testing IE_UpdateFAR testing IE_UpdateForwardingParameters testing IE_UpdateBAR_SRR testing IE_UpdateURR testing IE_UpdateQER testing IE_RemovePDR testing IE_RemoveFAR testing IE_RemoveURR testing IE_RemoveQER testing IE_LoadControlInformation testing IE_OverloadControlInformation testing IE_ApplicationID_PFDs testing IE_PFDContext testing IE_ApplicationDetectionInformation testing IE_QueryURR testing IE_UsageReport_SMR testing IE_UsageReport_SDR testing IE_UsageReport_SRR testing IE_DownlinkDataReport testing IE_Create_BAR testing IE_Update_BAR_SMR testing IE_Remove_BAR testing IE_ErrorIndicationReport testing IE_UserPlanePathFailureReport testing IE_UpdateDuplicatingParameters testing IE_AggregatedURRs testing IE_CreateTrafficEndpoint testing IE_CreatedTrafficEndpoint testing IE_UpdateTrafficEndpoint testing IE_RemoveTrafficEndpoint testing IE_EthernetPacketFilter testing IE_EthernetTrafficInformation testing IE_AdditionalMonitoringTime testing IE_Cause testing IE_SourceInterface testing IE_FTEID testing IE_NetworkInstance testing IE_SDF_Filter testing IE_ApplicationId testing IE_GateStatus testing IE_MBR testing IE_GBR testing IE_QERCorrelationId testing IE_Precedence testing IE_TransportLevelMarking testing IE_VolumeThreshold testing IE_TimeThreshold testing IE_MonitoringTime testing IE_SubsequentVolumeThreshold testing IE_SubsequentTimeThreshold testing IE_InactivityDetectionTime testing IE_ReportingTriggers testing IE_RedirectInformation testing IE_ReportType testing IE_OffendingIE testing IE_ForwardingPolicy testing IE_DestinationInterface testing IE_UPFunctionFeatures testing IE_ApplyAction testing IE_DownlinkDataServiceInformation testing IE_DownlinkDataNotificationDelay testing IE_DLBufferingDuration testing IE_DLBufferingSuggestedPacketCount testing IE_PFCPSMReqFlags testing IE_PFCPSRRspFlags testing IE_SequenceNumber testing IE_Metric testing IE_Timer testing IE_PDR_Id testing IE_FSEID testing IE_NodeId testing IE_PFDContents testing IE_MeasurementMethod testing IE_UsageReportTrigger testing IE_MeasurementPeriod testing IE_FqCSID testing IE_VolumeMeasurement testing IE_DurationMeasurement testing IE_TimeOfFirstPacket testing IE_TimeOfLastPacket testing IE_QuotaHoldingTime testing IE_DroppedDLTrafficThreshold testing IE_VolumeQuota testing IE_TimeQuota testing IE_StartTime testing IE_EndTime testing IE_URR_Id testing IE_LinkedURR_Id testing IE_OuterHeaderCreation testing IE_BAR_Id testing IE_CPFunctionFeatures testing IE_UsageInformation testing IE_ApplicationInstanceId testing IE_FlowInformation testing IE_UE_IP_Address testing IE_PacketRate testing IE_OuterHeaderRemoval testing IE_RecoveryTimeStamp testing IE_DLFlowLevelMarking testing IE_HeaderEnrichment testing IE_MeasurementInformation testing IE_NodeReportType testing IE_RemoteGTP_U_Peer testing IE_UR_SEQN testing IE_ActivatePredefinedRules testing IE_DeactivatePredefinedRules testing IE_FAR_Id testing IE_QER_Id testing IE_OCIFlags testing IE_PFCPAssociationReleaseRequest testing IE_GracefulReleasePeriod testing IE_PDNType testing IE_FailedRuleId testing IE_TimeQuotaMechanism testing IE_UserPlaneIPResourceInformation testing IE_UserPlaneInactivityTimer testing IE_Multiplier testing IE_AggregatedURR_Id testing IE_SubsequentVolumeQuota testing IE_SubsequentTimeQuota testing IE_RQI testing IE_QFI testing IE_QueryURRReference testing IE_AdditionalUsageReportsInformation testing IE_TrafficEndpointId testing IE_MACAddress testing IE_C_TAG testing IE_S_TAG testing IE_Ethertype testing IE_Proxying testing IE_EthernetFilterId testing IE_EthernetFilterProperties testing IE_SuggestedBufferingPacketsCount testing IE_UserId testing IE_EthernetPDUSessionInformation testing IE_MACAddressesDetected testing IE_MACAddressesRemoved testing IE_EthernetInactivityTimer testing IE_EventQuota testing IE_EventThreshold testing IE_SubsequentEventQuota testing IE_SubsequentEventThreshold testing IE_TraceInformation testing IE_FramedRoute testing IE_FramedRouting testing IE_FramedIPv6Route testing IE_EventTimeStamp testing IE_AveragingWindow testing IE_PagingPolicyIndicator testing IE_APN_DNN testing IE_3GPP_InterfaceType testing IE_EnterpriseSpecific testing IE_NotImplemented ###(001)=[passed] Verify PCAPs >>> def command(pkt): ... f = [] ... for fn, fv in sorted(pkt.fields.items(), key=lambda item: item[0]): ... if fn in ("length", "message_type"): ... continue ... if fn == "ietype" and not isinstance(pkt, IE_EnterpriseSpecific) and \ ... not isinstance(pkt, IE_NotImplemented): ... continue ... if fn.startswith("num_") or fn.endswith("_length"): ... continue ... if fv is None: ... continue ... fld = pkt.get_field(fn) ... if isinstance(fld, ConditionalField) and not fld._evalcond(pkt): ... continue ... # if fv == fld.default: ... # continue ... if isinstance(fv, (list, dict, set)) and len(fv) == 0: ... continue ... if isinstance(fv, Packet): ... fv = command(fv) ... elif fld.islist and fld.holds_packets and isinstance(fv, list): ... fv = "[%s]" % ",".join(map(command, fv)) ... elif isinstance(fld, FlagsField): ... fv = int(fv) ... else: ... fv = repr(fv) ... f.append("%s=%s" % (fn, fv)) ... c = "%s(%s)" % (pkt.__class__.__name__, ", ".join(f)) ... if not isinstance(pkt.payload, NoPayload): ... pc = command(pkt.payload) ... if pc: ... c += "/" + pc ... return c ... >>> broken_ies = set([]) >>> >>> broken_ie_types = set([ ... cls.ie_type for cls in broken_ies ... ]) >>> >>> ignore = set([]) >>> >>> def find_raw_or_not_implemented(pkt, prefix=""): ... if prefix in ignore: ... return False, False ... if hasattr(pkt, "IE_list"): ... prev = None ... found_any = False ... for n, ie in enumerate(pkt.IE_list, 1): ... if type(ie) in broken_ies: ... return False, False ... name = "%s-%d-%s" % (prefix, n, type(ie).__name__) ... found, leaf = find_raw_or_not_implemented(ie, prefix=name) ... if found: ... found_any = True ... if found and leaf: ... print("gotcha: %s %r" % (prefix, ie)) ... bs = b"" ... if prev is not None: ... bs = bytes(prev) ... bs += bytes(ie) ... if prev is not None: ... prev.show2() ... ie.show2() ... print("%s -- bad val: %s" % (prefix, bytes_hex(bs).decode())) ... if len(bs) > 4: ... l = bs[2] * 256 + bs[3] ... if len(bs) >= l + 4: ... print("bad val (length-limited): %s" % bytes_hex(bs[:l + 4]).decode()) ... print("bad val (short): %s" % bytes_hex(bytes(ie)).decode()) ... prev = ie ... return found_any, False ... if isinstance(pkt, Raw): ... bs = bytes(pkt) ... if len(bs) > 4: ... ie_type = bs[0] * 256 + bs[1] ... if ie_type in broken_ie_types: ... return False, True ... return True, True ... if isinstance(pkt, Padding) or isinstance(pkt, IE_NotImplemented): ... return True, True ... return False, True ... >>> def find_mismatching_command(pkt, prefix=""): ... c = command(pkt) ... if hasattr(pkt, "IE_list"): ... for n, ie in enumerate(pkt.IE_list, 1): ... name = "%s-%d-%s" % (prefix, n, type(ie).__name__) ... find_mismatching_command(ie, prefix=name) ... if bytes(eval(c)) != bytes(pkt): ... print(prefix) ... print("ORIG: %s" % bytes_hex(bytes(pkt))) ... print("EVAL: %s" % bytes_hex(bytes(eval(c)))) ... raise AssertionError("bad command: %s" % c) ... >>> for n, pkt in enumerate(rdpcap("test/pcaps/pfcp.pcap"), 1): ... if PFCP in pkt: ... # if IE_DLBufferingSuggestedPacketCount in pkt: ... # continue ... pkt0 = pkt[PFCP] ... if IE_NotImplemented in pkt0 or Raw in pkt0 or IE_NotImplemented in pkt0 or Padding in pkt0: ... found, leaf = find_raw_or_not_implemented(pkt, prefix=str(n)) ... if not found: ... # ignored ... continue ... pkt0.show2() ... raise AssertionError("IE_NotImplemented / Raw / Padding detected") ... bs = bytes(pkt0) ... pkt1 = PFCP(bs) ... # TODO: diff show2() result ... c0 = command(pkt0) ... c1 = command(pkt1) ... pkt2 = eval(c1) ... c2 = command(pkt2) ... if bytes(pkt2) != bs: ... find_mismatching_command(pkt0, prefix=str(n)) ... print(bytes_hex(bytes(pkt2))) ... print(bytes_hex(bs)) ... raise AssertionError("bytes(pkt2) != bs") ... if bs != pkt0.original: ... print(bytes_hex(bs)) ... print(bytes_hex(pkt0.original)) ... raise AssertionError("bs != pkt0.original") ... if bytes(pkt1) != bs: ... print(bytes_hex(bytes(pkt1))) ... print(bytes_hex(bs)) ... raise AssertionError("bytes(pkt1) != bs") ... if c0 != c1: ... print("COMMAND MISMATCH:\n----\n%s\n----\n%s\n\n" % (c0, c1)) ... pkt0.show2() ... pkt1.show2() ... print(bytes_hex(bytes(pkt0))) ... print("packet index: %d\n" % n) ... raise AssertionError("c0 != c1") ... if c0 != c2: ... print("EVAL COMMAND MISMATCH:\n----\n%s\n----\n%s\n\n" % (c0, c2)) ... pkt0.show2() ... pkt2.show2() ... print(bytes_hex(bytes(pkt0))) ... print("packet index: %d\n" % n) ... raise AssertionError("c0 != c2") ... ###(002)=[passed] Build and dissect PFCP Association Setup Request >>> pfcpASReqBytes = hex_bytes("200500160000010000600004e1a47d08003c0006020465726777") >>> >>> pfcpASReq = PFCP(version=1, S=0, seq=1) / \ ... PFCPAssociationSetupRequest(IE_list=[ ... IE_RecoveryTimeStamp(timestamp=3785653512), ... IE_NodeId(id_type="FQDN", id="ergw") ... ]) >>> >>> assert bytes(pfcpASReq) == pfcpASReqBytes >>> >>> pfcpASReq = PFCP(pfcpASReqBytes) >>> assert pfcpASReq.version == 1 >>> assert pfcpASReq.MP == 0 >>> assert pfcpASReq.S == 0 >>> assert pfcpASReq.message_type == 5 >>> assert pfcpASReq.length == 22 >>> ies = pfcpASReq[PFCPAssociationSetupRequest].IE_list >>> assert isinstance(ies[0], IE_RecoveryTimeStamp) >>> assert ies[0].ietype == 96 >>> assert ies[0].length == 4 >>> assert ies[0].timestamp == 3785653512 >>> assert isinstance(ies[1], IE_NodeId) >>> assert ies[1].ietype == 60 >>> assert ies[1].length == 6 >>> assert ies[1].id_type == 2 >>> assert ies[1].id == b"ergw" ###(003)=[passed] Build and dissect PFCP Association Setup Response >>> pfcpASRespBytes = hex_bytes("2006008c00000100001300010100600004e1a47af9002b00020001007400092980ac1201020263708002006448f9767070207631392e30382e312d3339377e673465333431343066612d6469727479206275696c7420627920726f6f74206f6e206275696c646b697473616e64626f7820617420576564204465632031312031353a30323a3535205554432032303139") >>> >>> pfcpASResp = PFCP(version=1, S=0, seq=1) / \ ... PFCPAssociationSetupResponse(IE_list=[ ... IE_Cause(cause="Request accepted"), ... IE_RecoveryTimeStamp(timestamp=3785652985), ... IE_UPFunctionFeatures( ... TREU=0, HEEU=0, PFDM=0, FTUP=0, TRST=0, DLBD=0, DDND=0, BUCP=0, ... spare=0, PFDE=0, FRRT=0, TRACE=0, QUOAC=0, UDBC=0, PDIU=0, EMPU=1), ... IE_UserPlaneIPResourceInformation( ... ASSOSI=0, ASSONI=1, TEIDRI=2, V6=0, V4=1, teid_range=0x80, ... ipv4="172.18.1.2", network_instance="cp"), ... IE_EnterpriseSpecific( ... ietype=32770, ... enterprise_id=18681, ... data="vpp v19.08.1-397~g4e34140fa-dirty built by root on buildkitsandbox at Wed Dec 11 15:02:55 UTC 2019") ... ]) >>> >>> >>> pfcpASResp.show2() ###[ PFCP (v1) Header ]### version = 1 spare_b2 = 0x0 spare_b3 = 0x0 spare_b4 = 0x0 MP = 0 S = 0 message_type= association_setup_response length = 140 seq = 1 spare_oct = 0 ###[ PFCP Association Setup Response ]### \IE_list \ |###[ IE Cause ]### | ietype = Cause | length = 1 | cause = Request accepted |###[ IE Recovery Time Stamp ]### | ietype = Recovery Time Stamp | length = 4 | timestamp = 3785652985 | extra_data= b'' |###[ IE UP Function Features ]### | ietype = UP Function Features | length = 2 | TREU = 0 | HEEU = 0 | PFDM = 0 | FTUP = 0 | TRST = 0 | DLBD = 0 | DDND = 0 | BUCP = 0 | spare = 0 | PFDE = 0 | FRRT = 0 | TRACE = 0 | QUOAC = 0 | UDBC = 0 | PDIU = 0 | EMPU = 1 | extra_data= b'' |###[ IE User Plane IP Resource Information ]### | ietype = User Plane IP Resource Information | length = 9 | spare1 = 0x0 | ASSOSI = 0 | ASSONI = 1 | TEIDRI = 2 | V6 = 0 | V4 = 1 | teid_range= 0x80 | ipv4 = 172.18.1.2 | network_instance= b'cp' | extra_data= b'' |###[ Enterpise Specific ]### | ietype = 32770 | length = 100 | enterprise_id= 18681 | data = b'vpp v19.08.1-397~g4e34140fa-dirty built by root on buildkitsandbox at Wed Dec 11 15:02:55 UTC 2019' >>> assert bytes(pfcpASResp) == pfcpASRespBytes >>> >>> pfcpASResp = PFCP(pfcpASRespBytes) >>> assert pfcpASResp.version == 1 >>> assert pfcpASResp.MP == 0 >>> assert pfcpASResp.S == 0 >>> assert pfcpASResp.message_type == 6 >>> assert pfcpASResp.length == 140 >>> >>> ies = pfcpASResp[PFCPAssociationSetupResponse].IE_list >>> assert isinstance(ies[0], IE_Cause) >>> assert ies[0].ietype == 19 >>> assert ies[0].length == 1 >>> assert ies[0].cause == 1 >>> assert isinstance(ies[1], IE_RecoveryTimeStamp) >>> assert ies[1].ietype == 96 >>> assert ies[1].length == 4 >>> assert ies[1].timestamp == 3785652985 >>> assert isinstance(ies[2], IE_UPFunctionFeatures) >>> assert ies[2].ietype == 43 >>> assert ies[2].length == 2 >>> assert ies[2].TREU == 0 >>> assert ies[2].HEEU == 0 >>> assert ies[2].PFDM == 0 >>> assert ies[2].FTUP == 0 >>> assert ies[2].TRST == 0 >>> assert ies[2].DLBD == 0 >>> assert ies[2].DDND == 0 >>> assert ies[2].BUCP == 0 >>> assert ies[2].spare == 0 >>> assert ies[2].PFDE == 0 >>> assert ies[2].FRRT == 0 >>> assert ies[2].TRACE == 0 >>> assert ies[2].QUOAC == 0 >>> assert ies[2].UDBC == 0 >>> assert ies[2].PDIU == 0 >>> assert ies[2].EMPU == 1 >>> assert isinstance(ies[3], IE_UserPlaneIPResourceInformation) >>> assert ies[3].ASSOSI == 0 >>> assert ies[3].ASSONI == 1 >>> assert ies[3].TEIDRI == 2 >>> assert ies[3].V6 == 0 >>> assert ies[3].V4 == 1 >>> assert ies[3].teid_range == 0x80 >>> assert ies[3].ipv4 == "172.18.1.2" >>> assert ies[3].network_instance == b"cp" >>> assert isinstance(ies[4], IE_EnterpriseSpecific) >>> assert ies[4].ietype == 32770 >>> assert ies[4].enterprise_id == 18681 >>> assert ies[4].data == b"vpp v19.08.1-397~g4e34140fa-dirty built by root on buildkitsandbox at Wed Dec 11 15:02:55 UTC 2019" >>> >>> assert pfcpASResp.answers(pfcpASReq) >>> >>> >>> pfcpSEReq1Bytes = hex_bytes("2132011300000000000000000000020000030021002c000102006c00040000000200040010002a00010000160007066163636573730003000d002c000101006c00040000000100010038006c000400000002005f000100000200190015000901104c9033ac120102001600030263700014000103003800020002001d00040000006400010057006c000400000001000200350016000706616363657373001700210100001d7065726d6974206f75742069702066726f6d20616e7920746f20616e790014000100003800020001001d00040000fde800510004000000010006001b003e000104002500021000004a00040000003c00510004000000010039000d02ffde7210bf97810aac120101003c0006020465726777") >>> >>> pfcpSEReq1 = PFCP(version=1, S=1, seq=2, seid=0, spare_oct=0) / \ ... PFCPSessionEstablishmentRequest(IE_list=[ ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=2), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="Access"), ... IE_NetworkInstance(instance="access"), ... ]) ... ]), ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(DROP=1), ... IE_FAR_Id(id=1) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=2), ... IE_OuterHeaderRemoval(header="GTP-U/UDP/IPv4"), ... IE_PDI(IE_list=[ ... IE_FTEID(V4=1, TEID=0x104c9033, ipv4="172.18.1.2"), ... IE_NetworkInstance(instance="cp"), ... IE_SourceInterface(interface="CP-function"), ... ]), ... IE_PDR_Id(id=2), ... IE_Precedence(precedence=100) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=1), ... IE_PDI(IE_list=[ ... IE_NetworkInstance(instance="access"), ... IE_SDF_Filter(FD=1, flow_description="permit out ip from any to any"), ... IE_SourceInterface(interface="Access"), ... ]), ... IE_PDR_Id(id=1), ... IE_Precedence(precedence=65000), ... IE_URR_Id(id=1) ... ]), ... IE_CreateURR(IE_list=[ ... IE_MeasurementMethod(EVENT=1), ... IE_ReportingTriggers(start_of_traffic=1), ... IE_TimeQuota(quota=60), ... IE_URR_Id(id=1) ... ]), ... IE_FSEID(v4=1, seid=0xffde7210bf97810a, ipv4="172.18.1.1"), ... IE_NodeId(id_type="FQDN", id="ergw") ... ]) >>> >>> assert bytes(pfcpSEReq1) == pfcpSEReq1Bytes >>> assert bytes(PFCP(pfcpSEReq1Bytes)) == pfcpSEReq1Bytes >>> >>> pfcpSEReq2Bytes = hex_bytes("213202ba00000000000000000000080000030037002c000102006c00040000000400040026002a000102001600040373676900260015020012687474703a2f2f6578616d706c652e636f6d0003001e002c000102006c0004000000020004000d002a000102001600040373676900030021002c000102006c00040000000300040010002a000100001600070661636365737300030021002c000102006c00040000000100040010002a00010000160007066163636573730001006d006c0004000000040002004b00160007066163636573730017002e0100002a7065726d6974206f75742069702066726f6d203139382e31392e36352e3420746f2061737369676e65640014000100005d0005020ac00000003800020004001d00040000006400510004000000020001006d006c0004000000020002004b00160007066163636573730017002e0100002a7065726d6974206f75742069702066726f6d203139382e31392e36352e3220746f2061737369676e65640014000100005d0005020ac00000003800020002001d0004000000c800510004000000010001006a006c0004000000030002004800160004037367690017002e0100002a7065726d6974206f75742069702066726f6d203139382e31392e36352e3420746f2061737369676e65640014000102005d0005060ac00000003800020003001d00040000006400510004000000020001006a006c0004000000010002004800160004037367690017002e0100002a7065726d6974206f75742069702066726f6d203139382e31392e36352e3220746f2061737369676e65640014000102005d0005060ac00000003800020001001d0004000000c8005100040000000100060013003e000102002500020000005100040000000200060013003e00010200250002000000510004000000010039000d02ffde7210d971c146ac120101003c0006020465726777") >>> >>> pfcpSEReq2 = PFCP(seq=8) / PFCPSessionEstablishmentRequest(IE_list=[ ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=4), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="SGi-LAN/N6-LAN"), ... IE_NetworkInstance(instance="sgi"), ... IE_RedirectInformation(type="URL", address="http://example.com"), ... ]) ... ]), ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=2), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="SGi-LAN/N6-LAN"), ... IE_NetworkInstance(instance="sgi"), ... ]) ... ]), ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=3), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="Access"), ... IE_NetworkInstance(instance="access") ... ]) ... ]), ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=1), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="Access"), ... IE_NetworkInstance(instance="access") ... ]) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=4), ... IE_PDI(IE_list=[ ... IE_NetworkInstance(instance="access"), ... IE_SDF_Filter( ... FD=1, flow_description="permit out ip from 198.19.65.4 to assigned"), ... IE_SourceInterface(interface="Access"), ... IE_UE_IP_Address(ipv4="10.192.0.0", V4=1) ... ]), ... IE_PDR_Id(id=4), ... IE_Precedence(precedence=100), ... IE_URR_Id(id=2) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=2), ... IE_PDI(IE_list=[ ... IE_NetworkInstance(instance="access"), ... IE_SDF_Filter(FD=1, flow_description="permit out ip from 198.19.65.2 to assigned"), ... IE_SourceInterface(interface="Access"), ... IE_UE_IP_Address(ipv4="10.192.0.0", V4=1) ... ]), ... IE_PDR_Id(id=2), ... IE_Precedence(precedence=200), ... IE_URR_Id(id=1) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=3), ... IE_PDI(IE_list=[ ... IE_NetworkInstance(instance="sgi"), ... IE_SDF_Filter(FD=1, flow_description="permit out ip from 198.19.65.4 to assigned"), ... IE_SourceInterface(interface="SGi-LAN/N6-LAN"), ... IE_UE_IP_Address(ipv4="10.192.0.0", SD=1, V4=1) ... ]), ... IE_PDR_Id(id=3), ... IE_Precedence(precedence=100), ... IE_URR_Id(id=2) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=1), ... IE_PDI(IE_list=[ ... IE_NetworkInstance(instance="sgi"), ... IE_SDF_Filter(FD=1, flow_description="permit out ip from 198.19.65.2 to assigned"), ... IE_SourceInterface(interface="SGi-LAN/N6-LAN"), ... IE_UE_IP_Address(ipv4="10.192.0.0", SD=1, V4=1) ... ]), ... IE_PDR_Id(id=1), ... IE_Precedence(precedence=200), ... IE_URR_Id(id=1) ... ]), ... IE_CreateURR(IE_list=[ ... IE_MeasurementMethod(VOLUM=1), ... IE_ReportingTriggers(), ... IE_URR_Id(id=2) ... ]), ... IE_CreateURR(IE_list=[ ... IE_MeasurementMethod(VOLUM=1), ... IE_ReportingTriggers(), ... IE_URR_Id(id=1) ... ]), ... IE_FSEID(ipv4="172.18.1.1", v4=1, seid=0xffde7210d971c146), ... IE_NodeId(id_type="FQDN", id="ergw")]) >>> >>> assert bytes(pfcpSEReq2) == pfcpSEReq2Bytes >>> assert bytes(PFCP(pfcpSEReq2Bytes)) == pfcpSEReq2Bytes >>> >>> pfcpSEReq3Bytes = hex_bytes("213203a10000000000000000000003000003001e002c000102006c0004000000060004000d002a000102001600040373676900030037002c000102006c00040000000400040026002a000102001600040373676900260015020012687474703a2f2f6578616d706c652e636f6d0003001e002c000102006c0004000000020004000d002a000102001600040373676900030021002c000102006c00040000000500040010002a000100001600070661636365737300030021002c000102006c00040000000300040010002a000100001600070661636365737300030021002c000102006c00040000000100040010002a000100001600070661636365737300010042006c000400000006000200200018000354535400160007066163636573730014000100005d0005020ac00000003800020006001d00040000009600510004000000030001006d006c0004000000040002004b00160007066163636573730017002e0100002a7065726d6974206f75742069702066726f6d203139382e31392e36352e3420746f2061737369676e65640014000100005d0005020ac00000003800020004001d00040000006400510004000000020001006d006c0004000000020002004b00160007066163636573730017002e0100002a7065726d6974206f75742069702066726f6d203139382e31392e36352e3220746f2061737369676e65640014000100005d0005020ac00000003800020002001d0004000000c800510004000000010001003f006c0004000000050002001d0018000354535400160004037367690014000102005d0005060ac00000003800020005001d00040000009600510004000000030001006a006c0004000000030002004800160004037367690017002e0100002a7065726d6974206f75742069702066726f6d203139382e31392e36352e3420746f2061737369676e65640014000102005d0005060ac00000003800020003001d00040000006400510004000000020001006a006c0004000000010002004800160004037367690017002e0100002a7065726d6974206f75742069702066726f6d203139382e31392e36352e3220746f2061737369676e65640014000102005d0005060ac00000003800020001001d0004000000c8005100040000000100060013003e000102002500020000005100040000000200060013003e000103002500020000005100040000000300060013003e00010200250002000000510004000000010039000d02ffde7211a5ab800aac120101003c0006020465726777") >>> >>> pfcpSEReq3 = PFCP(seq=3) / \ ... PFCPSessionEstablishmentRequest(IE_list=[ ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=6), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="SGi-LAN/N6-LAN"), ... IE_NetworkInstance(instance="sgi") ... ]) ... ]), ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=4), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="SGi-LAN/N6-LAN"), ... IE_NetworkInstance(instance="sgi"), ... IE_RedirectInformation(type="URL", address="http://example.com") ... ]) ... ]), ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=2), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="SGi-LAN/N6-LAN"), ... IE_NetworkInstance(instance="sgi") ... ]) ... ]), ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=5), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="Access"), ... IE_NetworkInstance(instance="access") ... ]) ... ]), ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=3), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="Access"), ... IE_NetworkInstance(instance="access") ... ]) ... ]), ... IE_CreateFAR(IE_list=[ ... IE_ApplyAction(FORW=1), ... IE_FAR_Id(id=1), ... IE_ForwardingParameters(IE_list=[ ... IE_DestinationInterface(interface="Access"), ... IE_NetworkInstance(instance="access") ... ]) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=6), ... IE_PDI(IE_list=[ ... IE_ApplicationId(id="TST"), ... IE_NetworkInstance(instance="access"), ... IE_SourceInterface(interface="Access"), ... IE_UE_IP_Address(ipv4='10.192.0.0', V4=1) ... ]), ... IE_PDR_Id(id=6), ... IE_Precedence(precedence=150), ... IE_URR_Id(id=3) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=4), ... IE_PDI(IE_list=[ ... IE_NetworkInstance(instance="access"), ... IE_SDF_Filter(FD=1, flow_description="permit out ip from 198.19.65.4 to assigned"), ... IE_SourceInterface(interface="Access"), ... IE_UE_IP_Address(ipv4='10.192.0.0', V4=1) ... ]), ... IE_PDR_Id(id=4), ... IE_Precedence(precedence=100), ... IE_URR_Id(id=2) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=2), ... IE_PDI(IE_list=[ ... IE_NetworkInstance(instance="access"), ... IE_SDF_Filter(FD=1, flow_description="permit out ip from 198.19.65.2 to assigned"), ... IE_SourceInterface(interface="Access"), ... IE_UE_IP_Address(ipv4='10.192.0.0', V4=1) ... ]), ... IE_PDR_Id(id=2), ... IE_Precedence(precedence=200), ... IE_URR_Id(id=1) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=5), ... IE_PDI(IE_list=[ ... IE_ApplicationId(id="TST"), ... IE_NetworkInstance(instance="sgi"), ... IE_SourceInterface(interface="SGi-LAN/N6-LAN"), ... IE_UE_IP_Address(ipv4='10.192.0.0', SD=1, V4=1) ... ]), ... IE_PDR_Id(id=5), ... IE_Precedence(precedence=150), ... IE_URR_Id(id=3) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=3), ... IE_PDI(IE_list=[ ... IE_NetworkInstance(instance="sgi"), ... IE_SDF_Filter(FD=1, flow_description="permit out ip from 198.19.65.4 to assigned"), ... IE_SourceInterface(interface="SGi-LAN/N6-LAN"), ... IE_UE_IP_Address(ipv4='10.192.0.0', SD=1, V4=1) ... ]), ... IE_PDR_Id(id=3), ... IE_Precedence(precedence=100), ... IE_URR_Id(id=2) ... ]), ... IE_CreatePDR(IE_list=[ ... IE_FAR_Id(id=1), ... IE_PDI(IE_list=[ ... IE_NetworkInstance(instance="sgi"), ... IE_SDF_Filter(FD=1, flow_description="permit out ip from 198.19.65.2 to assigned"), ... IE_SourceInterface(interface="SGi-LAN/N6-LAN"), ... IE_UE_IP_Address(ipv4='10.192.0.0', SD=1, V4=1) ... ]), ... IE_PDR_Id(id=1), ... IE_Precedence(precedence=200), ... IE_URR_Id(id=1) ... ]), ... IE_CreateURR(IE_list=[ ... IE_MeasurementMethod(VOLUM=1), ... IE_ReportingTriggers(), ... IE_URR_Id(id=2) ... ]), ... IE_CreateURR(IE_list=[ ... IE_MeasurementMethod(VOLUM=1, DURAT=1), ... IE_ReportingTriggers(), ... IE_URR_Id(id=3) ... ]), ... IE_CreateURR(IE_list=[ ... IE_MeasurementMethod(VOLUM=1), ... IE_ReportingTriggers(), ... IE_URR_Id(id=1) ... ]), ... IE_FSEID(ipv4='172.18.1.1', v4=1, seid=0xffde7211a5ab800a), ... IE_NodeId(id_type="FQDN", id="ergw") ... ]) >>> >>> assert bytes(pfcpSEReq3) == pfcpSEReq3Bytes >>> assert bytes(PFCP(pfcpSEReq3Bytes)) == pfcpSEReq3Bytes ###(004)=[passed] Build and dissect PFCP Session Establishment Response >>> pfcpSERespBytes = hex_bytes("21330022ffde7210bf97810a0000020000130001010039000d02ffde7210bf97810aac120102") >>> >>> pfcpSEResp = PFCP(version=1, S=1, seq=2, seid=0xffde7210bf97810a) / \ ... PFCPSessionEstablishmentResponse(IE_list=[ ... IE_Cause(cause="Request accepted"), ... IE_FSEID(ipv4="172.18.1.2", v4=1, seid=0xffde7210bf97810a), ... ]) >>> >>> assert bytes(pfcpSEResp) == pfcpSERespBytes >>> assert bytes(PFCP(pfcpSERespBytes)) == pfcpSERespBytes >>> assert pfcpSEResp.answers(pfcpSEReq1) ###(005)=[passed] Build and dissect PFCP Heartbeat Request >>> pfcpHReqBytes = hex_bytes("2001000c0000030000600004e1a47d08") >>> >>> pfcpHReq = PFCP(version=1, S=0, seq=3) / \ ... PFCPHeartbeatRequest(IE_list=[ ... IE_RecoveryTimeStamp(timestamp=3785653512) ... ]) >>> >>> assert bytes(pfcpHReq) == pfcpHReqBytes >>> assert bytes(PFCP(pfcpHReqBytes)) == pfcpHReqBytes >>> >>> >>> pfcpHRespBytes = hex_bytes("2002000c0000030000600004e1a47af9") >>> >>> pfcpHResp = PFCP(version=1, S=0, seq=3) / \ ... PFCPHeartbeatResponse(IE_list=[ ... IE_RecoveryTimeStamp(timestamp=3785652985) ... ]) >>> >>> assert bytes(pfcpHResp) == pfcpHRespBytes >>> assert bytes(PFCP(pfcpHRespBytes)) == pfcpHRespBytes >>> assert pfcpHResp.answers(pfcpHReq) >>> >>> >>> pfcpSRReq1Bytes = hex_bytes("21380034ffde7210bf99c00300006b0000270001020050001f00510004000000010068000400000001003f00021000005d0005020ac00001") >>> >>> pfcpSRReq1 = PFCP(seq=107, version=1, S=1, seid=18437299340760956931) / \ ... PFCPSessionReportRequest(IE_list=[ ... IE_ReportType(USAR=1), ... IE_UsageReport_SRR(IE_list=[ ... IE_URR_Id(id=1), ... IE_UR_SEQN(number=1), ... IE_UsageReportTrigger(START=1), ... IE_UE_IP_Address(ipv4="10.192.0.1", V4=1) ... ]) ... ]) >>> >>> assert bytes(pfcpSRReq1) == pfcpSRReq1Bytes >>> assert bytes(PFCP(pfcpSRReq1Bytes)) == pfcpSRReq1Bytes >>> >>> pfcpSRReq2Bytes = hex_bytes("2138008a0ffde7210bf940000000310000270001020050007500510004000000030068000400000018003f00020100004b0004e1b44787004c0004e1b447910042001907000000000000000000000000000000000000000000000000004300040000000a8003000a48f9e1b4479137cbd8008004000a48f9e1b4478737cbd8008005000a48f9e1b4479137cbd800") >>> >>> pfcpSRReq2 = PFCP(seq=49, seid=1152331208797536256) / \ ... PFCPSessionReportRequest(IE_list=[ ... IE_ReportType(USAR=1), ... IE_UsageReport_SRR(IE_list=[ ... IE_URR_Id(id=3), ... IE_UR_SEQN(number=24), ... IE_UsageReportTrigger(PERIO=1), ... IE_StartTime(timestamp=3786688391), ... IE_EndTime(timestamp=3786688401), ... IE_VolumeMeasurement( ... DLVOL=1, ULVOL=1, TOVOL=1, total=0, uplink=0, downlink=0), ... IE_DurationMeasurement(duration=10), ... IE_EnterpriseSpecific( ... ietype=32771, ... enterprise_id=18681, ... data=b'\xe1\xb4G\x917\xcb\xd8\x00'), ... IE_EnterpriseSpecific( ... ietype=32772, ... enterprise_id=18681, ... data=b'\xe1\xb4G\x877\xcb\xd8\x00'), ... IE_EnterpriseSpecific( ... ietype=32773, ... enterprise_id=18681, ... data=b'\xe1\xb4G\x917\xcb\xd8\x00') ... ]) ... ]) >>> >>> assert bytes(pfcpSRReq2) == pfcpSRReq2Bytes >>> assert bytes(PFCP(pfcpSRReq2Bytes)) == pfcpSRReq2Bytes >>> >>> pfcpSRReq3Bytes = hex_bytes("21380035a2a2aa9ad7f316fd0000010000270001020050002000510004000000010068000400000000003f0003100000005d000502ac100202") >>> >>> pfcpSRReq3 = PFCP(seq=1, seid=11719116762396169981) / \ ... PFCPSessionReportRequest(IE_list=[ ... IE_ReportType(USAR=1), ... IE_UsageReport_SRR(IE_list=[ ... IE_URR_Id(id=1), ... IE_UR_SEQN(number=0), ... IE_UsageReportTrigger(START=1, extra_data=b'\x00'), ... IE_UE_IP_Address(ipv4='172.16.2.2', V4=1) ... ]) ... ]) >>> >>> assert bytes(pfcpSRReq3) == pfcpSRReq3Bytes >>> assert bytes(PFCP(pfcpSRReq3Bytes)) == pfcpSRReq3Bytes ###(006)=[passed] Build and dissect PFCP Session Report Response >>> pfcpSRRespBytes = hex_bytes("21390011ffde7210bf99c00300006b000013000101") >>> >>> pfcpSRResp = PFCP(version=1, S=1, seq=107, seid=0xffde7210bf99c003) / \ ... PFCPSessionReportResponse(IE_list=[ ... IE_Cause(cause="Request accepted") ... ]) >>> >>> assert bytes(pfcpSRResp) == pfcpSRRespBytes >>> assert bytes(PFCP(pfcpSRRespBytes)) == pfcpSRRespBytes >>> assert pfcpSRResp.answers(pfcpSRReq1) ###(007)=[passed] Build and dissect PFCP Session Modification Request >>> pfcpSMReqBytes = hex_bytes("21340018ffde72125aeb00a300000600004d00080051000400000001") >>> pfcpSMReq = PFCP(pfcpSMReqBytes) >>> >>> pfcpSMReq = PFCP(version=1, seq=6, seid=0xffde72125aeb00a3) / \ ... PFCPSessionModificationRequest(IE_list=[ ... IE_QueryURR(IE_list=[IE_URR_Id(id=1)]) ... ]) >>> assert bytes(pfcpSMReq) == pfcpSMReqBytes >>> assert bytes(PFCP(pfcpSMReqBytes)) == pfcpSMReqBytes ###(008)=[passed] Build and dissect PFCP Session Modification Response >>> pfcpSMRespBytes = hex_bytes("2135008affde72125aeb00a3000006000013000101004e007500510004000000010068000400000000003f00028000004b0004e16e7efa004c0004e16e7efa004200190700000000000000000000000000000000000000000000000000430004000000008003000a48f9e16e7efa05566c008004000a48f9e16e7efa027f08008005000a48f9e16e7efa027f0800") >>> >>> pfcpSMResp = PFCP(version=1, seq=6, seid=0xffde72125aeb00a3) / \ ... PFCPSessionModificationResponse(IE_list=[ ... IE_Cause(cause=1), ... IE_UsageReport_SMR(IE_list=[ ... IE_URR_Id(id=1), ... IE_UR_SEQN(number=0), ... IE_UsageReportTrigger(IMMER=1), ... IE_StartTime(timestamp=3782115066), ... IE_EndTime(timestamp=3782115066), ... IE_VolumeMeasurement(DLVOL=1, ULVOL=1, TOVOL=1), ... IE_DurationMeasurement(), ... IE_EnterpriseSpecific(ietype=32771, enterprise_id=18681, data=b'\xe1n~\xfa\x05Vl\x00'), ... IE_EnterpriseSpecific(ietype=32772, enterprise_id=18681, data=b'\xe1n~\xfa\x02\x7f\x08\x00'), ... IE_EnterpriseSpecific(ietype=32773, enterprise_id=18681, data=b'\xe1n~\xfa\x02\x7f\x08\x00') ... ]) ... ]) >>> >>> assert bytes(pfcpSMResp) == pfcpSMRespBytes >>> assert bytes(PFCP(pfcpSMRespBytes)) == pfcpSMRespBytes >>> assert pfcpSMResp.answers(pfcpSMReq) ###(009)=[passed] Verify IEs >>> from difflib import unified_diff >>> cases = [ ... dict( ... hex="0054000a0100010000000a177645", ... expect=IE_OuterHeaderCreation(GTPUUDPIPV4=1, TEID=0x01000000, ipv4="10.23.118.69")), ... dict( ... hex="002900050461626364", ... expect=IE_ForwardingPolicy(policy_identifier="abcd")), ... dict( ... hex="002e0001ae", ... expect=IE_DownlinkDataNotificationDelay(delay=174)), ... dict( ... hex="003d00020000", ... expect=IE_PFDContents()), ... dict( ... hex="005e00070300205903e95d", ... expect=IE_PacketRate(ULPR=1, DLPR=1, ... ul_time_unit="minute", ul_max_packet_rate=8281, ... dl_time_unit="day", dl_max_packet_rate=59741)), ... dict( ... hex="00850007010906638dccd5", ... expect=IE_MACAddress(SOUR=1, source_mac="09:06:63:8d:cc:d5")), ... dict( ... hex="00540014080017d0bd69dceb747a1e036c0f9c8d4af115d0", ... expect=IE_OuterHeaderCreation(UDPIPV6=1, ... ipv6="17d0:bd69:dceb:747a:1e03:6c0f:9c8d:4af1", ... port=5584)), ... dict( ... hex="006700050280df69b2", ... expect=IE_RemoteGTP_U_Peer(V4=1, ipv4="128.223.105.178")), ... ] >>> >>> for case in cases: ... bs = hex_bytes(case["hex"]) ... exp = case["expect"] ... dissected = type(exp)(bs) ... exp_text = exp.show2(dump=True) ... dissected_text = dissected.show2(dump=True) ... if exp_text != dissected_text: ... print("---\n%s\n---\n%s\n" % (exp_text, dissected_text)) ... for line in unified_diff(exp_text.split("\n"), dissected_text.split("\n"), ... fromfile="expected", tofile="dissected"): ... print(line) ... raise AssertionError("text mismatch") ... assert bytes(dissected) == bs ... assert bytes(exp) == bs ... Test campaign ━ Run at 01:43:08 from [test/contrib/pim.uts] by UTscapy in 0.09697604179382324 └ Passed=8 └ Failed=0 ###### ## pim ###### ###(000)=[passed] PIMv2 Hello - instantiation >>> hello_data = b'\x01\x00^\x00\x00\r\x00\xd0\xcb\x00\xba\xe4\x08\x00E\xc0\x00BY\xf9\x00\x00\x01gTe\x15\x15\x15\x15\xe0\x00\x00\r \x00\xa55\x00\x01\x00\x02\x00i\x00\x13\x00\x04\x00\x00\x00\x00\x00\x02\x00\x04\x01\xf4\t\xc4\x00\x14\x00\x04\x00\x00\x00\x00' >>> >>> hello_pkt = Ether(hello_data) >>> >>> assert (hello_pkt[PIMv2Hdr].version == 2) >>> assert (hello_pkt[PIMv2Hdr].type == 0) >>> assert (len(hello_pkt[PIMv2Hello].option) == 4) >>> assert (hello_pkt[PIMv2Hello].option[0][PIMv2HelloHoldtime].type == 1) >>> assert (hello_pkt[PIMv2Hello].option[0][PIMv2HelloHoldtime].holdtime == 105) >>> assert (hello_pkt[PIMv2Hello].option[1][PIMv2HelloDRPriority].type == 19) >>> assert (hello_pkt[PIMv2Hello].option[1][PIMv2HelloDRPriority].dr_priority == 0) >>> assert (hello_pkt[PIMv2Hello].option[2][PIMv2HelloLANPruneDelay].type == 2) >>> assert (hello_pkt[PIMv2Hello].option[2][PIMv2HelloLANPruneDelay].value[0][PIMv2HelloLANPruneDelayValue].t == 0) >>> assert (hello_pkt[PIMv2Hello].option[2][PIMv2HelloLANPruneDelay].value[0][PIMv2HelloLANPruneDelayValue].propagation_delay == 500) >>> assert (hello_pkt[PIMv2Hello].option[2][PIMv2HelloLANPruneDelay].value[0][PIMv2HelloLANPruneDelayValue].override_interval == 2500) >>> assert (hello_pkt[PIMv2Hello].option[3][PIMv2HelloGenerationID].type == 20) >>> >>> repr(PIMv2HelloLANPruneDelayValue(t=1)) '\x1b[0m<\x1b[0m\x1b[31m\x1b[1mPIMv2HelloLANPruneDelayValue\x1b[0m \x1b[34mt\x1b[0m\x1b[0m=\x1b[0m\x1b[35m1\x1b[0m \x1b[0m|\x1b[0m\x1b[0m>\x1b[0m' ###(001)=[passed] PIMv2 Join/Prune - instantiation >>> jp_data = b'\x01\x00^\x00\x00\r\x00\xd0\xcb\x00\xba\xe4\x08\x00E\xc0\x00rY\xfb\x00\x00\x01gT3\x15\x15\x15\x15\xe0\x00\x00\r#\x00\x1b\x18\x01\x00\x15\x15\x15\x16\x00\x04\x00\xd2\x01\x00\x00 \xef\x01\x01\x0b\x00\x01\x00\x00\x01\x00\x07 \x16\x16\x16\x15\x01\x00\x00 \xef\x01\x01\x0c\x00\x01\x00\x00\x01\x00\x07 \x16\x16\x16\x15\x01\x00\x00 \xef\x01\x01\x0b\x00\x00\x00\x01\x01\x00\x07 \x16\x16\x16\x15\x01\x00\x00 \xef\x01\x01\x0c\x00\x00\x00\x01\x01\x00\x07 \x16\x16\x16\x15' >>> >>> jp_pkt = Ether(jp_data) >>> >>> assert (jp_pkt[PIMv2Hdr].version == 2) >>> assert (jp_pkt[PIMv2Hdr].type == 3) >>> assert (jp_pkt[PIMv2JoinPrune].up_addr_family == 1) >>> assert (jp_pkt[PIMv2JoinPrune].up_encoding_type == 0) >>> assert (jp_pkt[PIMv2JoinPrune].up_neighbor_ip == "21.21.21.22") >>> assert (jp_pkt[PIMv2JoinPrune].reserved == 0) >>> assert (jp_pkt[PIMv2JoinPrune].num_group == 4) >>> assert (jp_pkt[PIMv2JoinPrune].holdtime == 210) >>> assert (jp_pkt[PIMv2JoinPrune].num_group == len(jp_pkt[PIMv2JoinPrune].jp_ips)) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].addr_family == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].encoding_type == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].bidirection == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].reserved == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].admin_scope_zone == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].mask_len == 32) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].gaddr == "239.1.1.11") >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].num_joins == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].num_joins == len(jp_pkt[PIMv2JoinPrune].jp_ips[0].join_ips)) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].addr_family == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].encoding_type == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].rsrvd == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].sparse == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].wildcard == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].rpt == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].mask_len == 32) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].src_ip == "22.22.22.21") >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].num_prunes == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[0].num_prunes == len(jp_pkt[PIMv2JoinPrune].jp_ips[0].prune_ips)) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].addr_family == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].encoding_type == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].bidirection == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].reserved == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].admin_scope_zone == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].mask_len == 32) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].gaddr == "239.1.1.11") >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].num_joins == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].num_joins == len(jp_pkt[PIMv2JoinPrune].jp_ips[2].join_ips)) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].num_prunes == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].num_prunes == len(jp_pkt[PIMv2JoinPrune].jp_ips[2].prune_ips)) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].prune_ips[0][PIMv2PruneAddrs].addr_family == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].prune_ips[0][PIMv2PruneAddrs].encoding_type == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].prune_ips[0][PIMv2PruneAddrs].rsrvd == 0) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].prune_ips[0][PIMv2PruneAddrs].sparse == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].prune_ips[0][PIMv2PruneAddrs].wildcard == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].prune_ips[0][PIMv2PruneAddrs].rpt == 1) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].prune_ips[0][PIMv2PruneAddrs].mask_len == 32) >>> assert (jp_pkt[PIMv2JoinPrune].jp_ips[2].prune_ips[0][PIMv2PruneAddrs].src_ip == "22.22.22.21") ###(002)=[passed] PIMv2 Hello - build >>> hello_delay_pkt = Ether(dst="01:00:5e:00:00:0d", src="00:d0:cb:00:ba:e4")/IP(version=4, ihl=5, tos=0xc0, id=23037, ttl=1, proto=103, src="21.21.21.21", dst="224.0.0.13")/\ ... PIMv2Hdr(version=2, type=0, reserved=0)/\ ... PIMv2Hello(option=[PIMv2HelloHoldtime(type=1, holdtime=105), PIMv2HelloDRPriority(type=19, dr_priority=0), ... PIMv2HelloLANPruneDelay(type=2, value=[PIMv2HelloLANPruneDelayValue(t=0, propagation_delay=500, override_interval=2500)]), ... PIMv2HelloGenerationID(type=20, generation_id=459007194)]) >>> >>> assert raw(hello_delay_pkt) == b'\x01\x00^\x00\x00\r\x00\xd0\xcb\x00\xba\xe4\x08\x00E\xc0\x006Y\xfd\x00\x00\x01gTm\x15\x15\x15\x15\xe0\x00\x00\r \x00\xd3p\x00\x01\x00\x02\x00i\x00\x13\x00\x04\x00\x00\x00\x00\x00\x02\x00\x04\x01\xf4\t\xc4\x00\x14\x00\x04\x1b[\xe4\xda' >>> >>> hello_refresh_pkt = Ether(dst="01:00:5e:00:00:0d", src="c2:01:52:72:00:00")/IP(version=4, ihl=5, tos=0xc0, id=121, ttl=1, proto=103, src="10.0.0.1", dst="224.0.0.13")/\ ... PIMv2Hdr(version=2, type=0, reserved=0)/\ ... PIMv2Hello(option=[PIMv2HelloHoldtime(type=1, holdtime=105), PIMv2HelloGenerationID(type=20, generation_id=3613938422), ... PIMv2HelloDRPriority(type=19, dr_priority=1), ... PIMv2HelloStateRefresh(type=21, value=[PIMv2HelloStateRefreshValue(version=1, interval=0, reserved=0)])]) >>> >>> assert raw(hello_refresh_pkt) == b'\x01\x00^\x00\x00\r\xc2\x01Rr\x00\x00\x08\x00E\xc0\x006\x00y\x00\x00\x01g\xce\x1a\n\x00\x00\x01\xe0\x00\x00\r \x00\xb3\xeb\x00\x01\x00\x02\x00i\x00\x14\x00\x04\xd7hR\xf6\x00\x13\x00\x04\x00\x00\x00\x01\x00\x15\x00\x04\x01\x00\x00\x00' ###(003)=[passed] PIMv2 Join/Prune - build >>> join_pkt = Ether(dst="01:00:5e:00:00:0d", src="c2:02:3d:80:00:01")/IP(version=4, ihl=5, tos=0xc0, id=139, ttl=1, proto=103, src="10.0.0.14", dst="224.0.0.13")/\ ... PIMv2Hdr(version=2, type=3, reserved=0)/\ ... PIMv2JoinPrune(up_addr_family=1, up_encoding_type=0, up_neighbor_ip="10.0.0.13", reserved=0, num_group=1, holdtime=210, ... jp_ips=[PIMv2GroupAddrs(addr_family=1, encoding_type=0, bidirection=0, reserved=0, admin_scope_zone=0, ... mask_len=32, gaddr="239.123.123.123", ... join_ips=[PIMv2JoinAddrs(addr_family=1, encoding_type=0, rsrvd=0, sparse=1, wildcard=1, ... rpt=1, mask_len=32, src_ip="1.1.1.1")], ... prune_ips=[]) ... ] ) >>> >>> >>> assert raw(join_pkt) == b'\x01\x00^\x00\x00\r\xc2\x02=\x80\x00\x01\x08\x00E\xc0\x006\x00\x8b\x00\x00\x01g\xcd\xfb\n\x00\x00\x0e\xe0\x00\x00\r#\x00Z\xe5\x01\x00\n\x00\x00\r\x00\x01\x00\xd2\x01\x00\x00 \xef{{{\x00\x01\x00\x00\x01\x00\x07 \x01\x01\x01\x01' >>> >>> >>> >>> prune_pkt = Ether(dst="01:00:5e:00:00:0d", src="c2:02:3d:80:00:01")/IP(version=4, ihl=5, tos=0xc0, id=139, ttl=1, proto=103, src="10.0.0.2", dst="224.0.0.13")/\ ... PIMv2Hdr(version=2, type=3, reserved=0)/\ ... PIMv2JoinPrune(up_addr_family=1, up_encoding_type=0, up_neighbor_ip="10.0.0.1", reserved=0, num_group=1, holdtime=210, ... jp_ips=[PIMv2GroupAddrs(addr_family=1, encoding_type=0, bidirection=0, reserved=0, admin_scope_zone=0, ... mask_len=32, gaddr="239.123.123.123", ... prune_ips=[PIMv2PruneAddrs(addr_family=1, encoding_type=0, rsrvd=0, sparse=0, wildcard=0, rpt=0, ... mask_len=32, src_ip="172.16.40.10")]) ... ] ... ) >>> >>> assert raw(prune_pkt) == b'\x01\x00^\x00\x00\r\xc2\x02=\x80\x00\x01\x08\x00E\xc0\x006\x00\x8b\x00\x00\x01g\xce\x07\n\x00\x00\x02\xe0\x00\x00\r#\x00\x8f\xd8\x01\x00\n\x00\x00\x01\x00\x01\x00\xd2\x01\x00\x00 \xef{{{\x00\x00\x00\x01\x01\x00\x00 \xac\x10(\n' ###(004)=[passed] IPv6 PIMv2 Hello - instantiation >>> hello_data6 = b'33\x00\x00\x00\r\x02\x00\x00\x00\x00\x01\x86\xddk\x80\x00\x00\x008g\x01\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r \x00\xe4G\x00\x01\x00\x02\x00i\x00\x02\x00\x04\x01\xf4\t\xc4\x00\x13\x00\x04\x00\x00\x00\x01\x00\x14\x00\x04:I\x8b\xa3\x00\x18\x00\x12\x02\x00 \x01\xa7\xff@\n"\t\x00\x00\x00\x00\x00\x00\x00\x02' >>> >>> hello_pkt6 = Ether(hello_data6) >>> >>> assert (hello_pkt6[PIMv2Hdr].version == 2) >>> assert (hello_pkt6[PIMv2Hdr].type == 0) >>> assert (len(hello_pkt6[PIMv2Hello].option) == 5) >>> assert (hello_pkt6[PIMv2Hello].option[0][PIMv2HelloHoldtime].type == 1) >>> assert (hello_pkt6[PIMv2Hello].option[0][PIMv2HelloHoldtime].holdtime == 105) >>> assert (hello_pkt6[PIMv2Hello].option[1][PIMv2HelloLANPruneDelay].type == 2) >>> assert (hello_pkt6[PIMv2Hello].option[1][PIMv2HelloLANPruneDelay].value[0][PIMv2HelloLANPruneDelayValue].t == 0) >>> assert (hello_pkt6[PIMv2Hello].option[1][PIMv2HelloLANPruneDelay].value[0][PIMv2HelloLANPruneDelayValue].propagation_delay == 500) >>> assert (hello_pkt6[PIMv2Hello].option[1][PIMv2HelloLANPruneDelay].value[0][PIMv2HelloLANPruneDelayValue].override_interval == 2500) >>> assert (hello_pkt6[PIMv2Hello].option[2][PIMv2HelloDRPriority].type == 19) >>> assert (hello_pkt6[PIMv2Hello].option[2][PIMv2HelloDRPriority].dr_priority == 1) >>> assert (hello_pkt6[PIMv2Hello].option[3][PIMv2HelloGenerationID].type == 20) >>> >>> repr(PIMv2HelloLANPruneDelayValue(t=1)) '\x1b[0m<\x1b[0m\x1b[31m\x1b[1mPIMv2HelloLANPruneDelayValue\x1b[0m \x1b[34mt\x1b[0m\x1b[0m=\x1b[0m\x1b[35m1\x1b[0m \x1b[0m|\x1b[0m\x1b[0m>\x1b[0m' ###(005)=[passed] IPv6 PIMv2 Join/Prune - instantiation >>> jp_data6join = b'33\x00\x00\x00\r\x02\x00\x00\x00\x00\x01\x86\xddk\x80\x00\x00\x00Fg\x01\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r#\x00\xc6X\x02\x00\xfe\x80\x00\x00\x00\x00\x00\x00\xfc\x87\xff\xff\xfe\x00\x01A\x00\x01\x00\xd2\x02\x00\x00\x80\xff>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x01\x00\x01\x00\x00\x02\x00\x04\x80$\x04\x80\x00\x00\x01\xf0\x01\x00\x00\x00\x00\x00\x00\x00\x01' >>> >>> jp_pkt6 = Ether(jp_data6join) >>> >>> assert (jp_pkt6[PIMv2Hdr].version == 2) >>> assert (jp_pkt6[PIMv2Hdr].type == 3) >>> assert (jp_pkt6[PIMv2JoinPrune].up_addr_family == 2) >>> assert (jp_pkt6[PIMv2JoinPrune].up_encoding_type == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].up_neighbor_ip == 'fe80::fc87:ffff:fe00:141') >>> assert (jp_pkt6[PIMv2JoinPrune].reserved == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].num_group == 1) >>> assert (jp_pkt6[PIMv2JoinPrune].holdtime == 210) >>> assert (jp_pkt6[PIMv2JoinPrune].num_group == len(jp_pkt6[PIMv2JoinPrune].jp_ips)) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].addr_family == 2) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].encoding_type == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].bidirection == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].reserved == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].admin_scope_zone == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].mask_len == 128) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].gaddr == 'ff3e::8000:1') >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].num_joins == 1) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].num_joins == len(jp_pkt6[PIMv2JoinPrune].jp_ips[0].join_ips)) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].addr_family == 2) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].encoding_type == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].rsrvd == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].sparse == 1) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].wildcard == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].rpt == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].mask_len == 128) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].join_ips[0][PIMv2JoinAddrs].src_ip == '2404:8000:1:f001::1') >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].num_prunes == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].num_prunes == len(jp_pkt6[PIMv2JoinPrune].jp_ips[0].prune_ips)) >>> >>> >>> >>> jp_data6prune = b'33\x00\x00\x00\r\x02\x00\x00\x00\x00\x01\x86\xddk\x80\x00\x00\x00Fg\x01\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r#\x00\xc6X\x02\x00\xfe\x80\x00\x00\x00\x00\x00\x00\xfc\x87\xff\xff\xfe\x00\x01A\x00\x01\x00\xd2\x02\x00\x00\x80\xff>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x01\x00\x00\x00\x01\x02\x00\x04\x80$\x04\x80\x00\x00\x01\xf0\x01\x00\x00\x00\x00\x00\x00\x00\x01' >>> >>> jp_pkt6 = Ether(jp_data6prune) >>> >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].addr_family == 2) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].encoding_type == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].bidirection == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].reserved == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].admin_scope_zone == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].mask_len == 128) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].gaddr == 'ff3e::8000:1') >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].num_joins == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].num_joins == len(jp_pkt6[PIMv2JoinPrune].jp_ips[0].join_ips)) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].num_prunes == 1) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].num_prunes == len(jp_pkt6[PIMv2JoinPrune].jp_ips[0].prune_ips)) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].prune_ips[0][PIMv2PruneAddrs].addr_family == 2) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].prune_ips[0][PIMv2PruneAddrs].encoding_type == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].prune_ips[0][PIMv2PruneAddrs].rsrvd == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].prune_ips[0][PIMv2PruneAddrs].sparse == 1) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].prune_ips[0][PIMv2PruneAddrs].wildcard == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].prune_ips[0][PIMv2PruneAddrs].rpt == 0) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].prune_ips[0][PIMv2PruneAddrs].mask_len == 128) >>> assert (jp_pkt6[PIMv2JoinPrune].jp_ips[0].prune_ips[0][PIMv2PruneAddrs].src_ip == '2404:8000:1:f001::1') ###(006)=[passed] IPv6 PIMv2 Hello - build >>> hello_delay_pkt6 = Ether(dst='33:33:00:00:00:0d', src='02:00:00:00:00:01')/ \ ... IPv6(tc=0xb8, nh=103, hlim=1, src='fe80::ff:fe00:1', dst='ff02::d')/ \ ... PIMv2Hdr()/ \ ... PIMv2Hello(option=[ \ ... PIMv2HelloHoldtime(holdtime=105), ... PIMv2HelloLANPruneDelay(value=[PIMv2HelloLANPruneDelayValue(propagation_delay=500, override_interval=2500)]), ... PIMv2HelloDRPriority(dr_priority=1), ... PIMv2HelloGenerationID(generation_id=977898403), ... PIMv2HelloAddrList(value=[PIMv2HelloAddrListValue(addr_family=2,prefix='2001:a7ff:400a:2209::2')]), ... ]) >>> >>> >>> assert raw(hello_delay_pkt6) == hello_data6 ###(007)=[passed] IPv6 PIMv2 Join/Prune - build >>> join_pkt6 = Ether(dst='33:33:00:00:00:0d', src='02:00:00:00:00:01')/\ ... IPv6(tc=184, nh=103, hlim=1, src='fe80::ff:fe00:1', dst='ff02::d')/ \ ... PIMv2Hdr(version=2, type=3, reserved=0)/ \ ... PIMv2JoinPrune(jp_ips=[ \ ... PIMv2GroupAddrs(join_ips=[ ... PIMv2JoinAddrs(addr_family=2, sparse=1, wildcard=0, rpt=0, mask_len=128, src_ip='2404:8000:1:f001::1')], ... addr_family=2, admin_scope_zone=0, mask_len=128, gaddr='ff3e::8000:1', ... num_joins=1, num_prunes=0)], ... up_addr_family=2, up_neighbor_ip='fe80::fc87:ffff:fe00:141', num_group=1, holdtime=210) >>> >>> >>> assert raw(join_pkt6) == jp_data6join >>> >>> >>> >>> prune_pkt6 = Ether(dst='33:33:00:00:00:0d', src='02:00:00:00:00:01')/ \ ... IPv6(tc=184, nh=103, hlim=1, src='fe80::ff:fe00:1', dst='ff02::d')/ \ ... PIMv2Hdr()/ \ ... PIMv2JoinPrune(jp_ips=[ \ ... PIMv2GroupAddrs(prune_ips=[ \ ... PIMv2PruneAddrs(addr_family=2, sparse=1, wildcard=0, rpt=0, mask_len=128, src_ip='2404:8000:1:f001::1')], ... addr_family=2, mask_len=128, gaddr='ff3e::8000:1', ... num_joins=0, num_prunes=1)], ... up_addr_family=2, up_neighbor_ip='fe80::fc87:ffff:fe00:141', num_group=1, holdtime=210) >>> >>> >>> assert raw(prune_pkt6) == jp_data6prune ProfinetIO layer test campaign ━ Run at 01:43:08 from [test/contrib/pnio.uts] by UTscapy in 0.06669950485229492 └ Passed=20 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the ProfinetIO layer >>> from scapy.contrib.pnio import * >>> from scapy.config import conf >>> import re >>> old_conf_dissector = conf.debug_dissector >>> conf.debug_dissector=True ###### ## Check DCE/RPC layer ###### ###(001)=[passed] ProfinetIO default values >>> raw(ProfinetIO()) == b'\x00\x00' True ###(002)=[passed] ProfinetIO overloads Ethertype >>> p = Ether() / ProfinetIO() >>> p.type == 0x8892 True ###(003)=[passed] ProfinetIO overloads UDP dport >>> p = UDP() / ProfinetIO() >>> p.dport == 0x8892 True ###(004)=[passed] Ether guesses ProfinetIO as payload class >>> p = Ether(hex_bytes('ffffffffffff00000000000088920102')) >>> isinstance(p.payload, ProfinetIO) and p.frameID == 0x0102 True ###(005)=[passed] UDP guesses ProfinetIO as payload class >>> p = UDP(hex_bytes('12348892000a00000102')) >>> isinstance(p.payload, ProfinetIO) and p.frameID == 0x0102 True ###### ## PNIO RTC PDU tests ###### ###(006)=[passed] ProfinetIO PNIORealTime_IOxS parsing of a single status >>> p = PNIORealTime_IOxS(b'\x80') >>> assert p.dataState == 1 >>> assert p.instance == 0 >>> assert p.reserved == 0 >>> assert p.extension == 0 >>> >>> p = PNIORealTime_IOxS(b'\xe1') >>> assert p.dataState == 1 >>> assert p.instance == 3 >>> assert p.reserved == 0 >>> assert p.extension == 1 >>> True True ###(007)=[passed] ProfinetIO PNIORealTime_IOxS building of a single status >>> p = PNIORealTime_IOxS(dataState = 'good', instance='subslot', extension=0) >>> assert raw(p) == b'\x80' >>> >>> p = PNIORealTime_IOxS(dataState = 'bad', instance='device', extension=1) >>> assert raw(p) == b'\x41' >>> True True ###(008)=[passed] ProfinetIO PNIORealTime_IOxS parsing with multiple statuses >>> TestPacket = type( ... 'TestPacket', ... (Packet,), ... { ... 'name': 'TestPacket', ... 'fields_desc': [ ... PacketListField('data', [], next_cls_cb= PNIORealTime_IOxS.is_extension_set) ... ], ... } ... ) >>> >>> p = TestPacket(b'\x81\xe1\x01\x80') >>> assert len(p.data) == 4 >>> assert p.data[0].dataState == 1 >>> assert p.data[0].instance == 0 >>> assert p.data[0].reserved == 0 >>> assert p.data[0].extension == 1 >>> assert p.data[1].dataState == 1 >>> assert p.data[1].instance == 3 >>> assert p.data[1].reserved == 0 >>> assert p.data[1].extension == 1 >>> assert p.data[2].dataState == 0 >>> assert p.data[2].instance == 0 >>> assert p.data[2].reserved == 0 >>> assert p.data[2].extension == 1 >>> assert p.data[3].dataState == 1 >>> assert p.data[3].instance == 0 >>> assert p.data[3].reserved == 0 >>> assert p.data[3].extension == 0 ###(009)=[passed] ProfinetIO RTC PDU parsing without configuration >>> p = Ether(b'\x00\x02\x04\x06\x08\x0a\x01\x03\x05\x07\x09\x0B\x88\x92\x80\x00\x01\x02\x03\x04\xf0\x00\x35\x00') >>> assert p[Ether].dst == '00:02:04:06:08:0a' >>> assert p[Ether].src == '01:03:05:07:09:0b' >>> assert p[Ether].type == 0x8892 >>> assert p[ProfinetIO].frameID == 0x8000 >>> assert isinstance(p[ProfinetIO].payload, PNIORealTimeCyclicPDU) >>> assert len(p[PNIORealTimeCyclicPDU].data) == 1 >>> assert isinstance(p[PNIORealTimeCyclicPDU].data[0], PNIORealTimeCyclicDefaultRawData) >>> assert p[PNIORealTimeCyclicDefaultRawData].data == b'\x01\x02\x03\x04' >>> assert p[PNIORealTimeCyclicPDU].padding == b'' >>> assert p[PNIORealTimeCyclicPDU].cycleCounter == 0xf000 >>> assert p[PNIORealTimeCyclicPDU].dataStatus == 0x35 >>> assert p[PNIORealTimeCyclicPDU].transferStatus == 0 >>> True True ###(010)=[passed] ProfinetIO RTC PDU building >>> p = Ether(src='01:03:05:07:09:0b', dst='00:02:04:06:08:0a')/ProfinetIO(frameID = 'PTCP-RTSyncPDU')/PNIORealTimeCyclicPDU( ... data=[ ... PNIORealTimeCyclicPDU.build_fixed_len_raw_type(10)(data = b'\x80'*10) ... ], ... padding = b'\x00'*8, ... cycleCounter = 900, ... dataStatus = 0x35, ... transferStatus = 0 ... ) >>> >>> assert( ... raw(p) == \ ... b'\x00\x02\x04\x06\x08\x0a' \ ... b'\x01\x03\x05\x07\x09\x0b' \ ... b'\x88\x92' \ ... b'\x00\x80' \ ... b'\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80' \ ... b'\x00\x00\x00\x00\x00\x00\x00\x00' \ ... b'\x03\x84' \ ... b'\x35' \ ... b'\x00' ... ) ###(011)=[passed] ProfinetIO RTC PDU parsing with config >>> scapy.config.conf.contribs['PNIO_RTC'][('01:03:05:07:09:0b', '00:02:04:06:08:0a', 0x8010)] = [ ... PNIORealTimeCyclicPDU.build_fixed_len_raw_type(5), ... PNIORealTimeCyclicPDU.build_fixed_len_raw_type(3), ... PNIORealTimeCyclicPDU.build_fixed_len_raw_type(2) ... ] >>> p = Ether( ... b'\x00\x02\x04\x06\x08\x0a' \ ... b'\x01\x03\x05\x07\x09\x0B' \ ... b'\x88\x92' \ ... b'\x80\x10' \ ... b'\x01\x02\x03\x04\x05' \ ... b'\x01\x02\x03' \ ... b'\x01\x02' \ ... b'\x00\x00' \ ... b'\xf0\x00' \ ... b'\x35' \ ... b'\x00' ... ) >>> >>> assert p[Ether].dst == '00:02:04:06:08:0a' >>> assert p[Ether].src == '01:03:05:07:09:0b' >>> assert p[Ether].type == 0x8892 >>> assert p[ProfinetIO].frameID == 0x8010 >>> assert isinstance(p[ProfinetIO].payload, PNIORealTimeCyclicPDU) >>> assert len(p[PNIORealTimeCyclicPDU].data) == 3 >>> assert isinstance(p[PNIORealTimeCyclicPDU].data[0], scapy.config.conf.raw_layer) >>> assert p[PNIORealTimeCyclicPDU].data[0].data == b'\x01\x02\x03\x04\x05' >>> assert isinstance(p[PNIORealTimeCyclicPDU].data[1], scapy.config.conf.raw_layer) >>> assert p[PNIORealTimeCyclicPDU].data[1].data == b'\x01\x02\x03' >>> assert isinstance(p[PNIORealTimeCyclicPDU].data[2], scapy.config.conf.raw_layer) >>> assert p[PNIORealTimeCyclicPDU].data[2].data == b'\x01\x02' >>> assert p[PNIORealTimeCyclicPDU].padding == b'\x00' * 2 >>> assert p[PNIORealTimeCyclicPDU].cycleCounter == 0xf000 >>> assert p[PNIORealTimeCyclicPDU].dataStatus == 0x35 >>> assert p[PNIORealTimeCyclicPDU].transferStatus == 0 >>> >>> p = Ether(b'\x00\x02\x04\x06\x08\x0a\x01\x03\x05\x07\x09\x0B\x88\x92\x80\x00\x01\x02\x03\x04\xf0\x00\x35\x00') >>> assert p[Ether].dst == '00:02:04:06:08:0a' >>> assert p[Ether].src == '01:03:05:07:09:0b' >>> assert p[Ether].type == 0x8892 >>> assert p[ProfinetIO].frameID == 0x8000 >>> assert isinstance(p[ProfinetIO].payload, PNIORealTimeCyclicPDU) >>> assert len(p[PNIORealTimeCyclicPDU].data) == 1 >>> assert isinstance(p[PNIORealTimeCyclicPDU].data[0], PNIORealTimeCyclicDefaultRawData) >>> assert p[PNIORealTimeCyclicDefaultRawData].data == b'\x01\x02\x03\x04' >>> assert p[PNIORealTimeCyclicPDU].padding == b'' >>> assert p[PNIORealTimeCyclicPDU].cycleCounter == 0xf000 >>> assert p[PNIORealTimeCyclicPDU].dataStatus == 0x35 >>> assert p[PNIORealTimeCyclicPDU].transferStatus == 0 >>> True True ###(012)=[passed] PROFIsafe parsing (query with F_CRC_SEED=0) >>> p = PROFIsafe.build_PROFIsafe_class(PROFIsafeControl, 2)(b'\x80\x80\x40\x01\x02\x03') >>> assert p.data == b'\x80\x80' >>> assert p.control == 0x40 >>> assert p.crc == 0x010203 >>> True True ###(013)=[passed] PROFIsafe parsing (query with F_CRC_SEED=1) >>> p = PROFIsafe.build_PROFIsafe_class(PROFIsafeControlCRCSeed, 2)(b'\x80\x80\x40\x01\x02\x03\x04') >>> assert p.data == b'\x80\x80' >>> assert p.control == 0x40 >>> assert p.crc == 0x01020304 >>> True True ###(014)=[passed] PROFIsafe parsing (response with F_CRC_SEED=0) >>> p = PROFIsafe.build_PROFIsafe_class(PROFIsafeStatus, 1)(b'\x80\x40\x01\x02\x03') >>> assert p.data == b'\x80' >>> assert p.status == 0x40 >>> assert p.crc == 0x010203 >>> True True ###(015)=[passed] PROFIsafe parsing (response with F_CRC_SEED=1) >>> p = PROFIsafe.build_PROFIsafe_class(PROFIsafeStatusCRCSeed, 1)(b'\x80\x40\x01\x02\x03\x04') >>> assert p.data == b'\x80' >>> assert p.status == 0x40 >>> assert p.crc == 0x01020304 >>> True True ###(016)=[passed] PROFIsafe building (query with F_CRC_SEED=0) >>> p = PROFIsafe.build_PROFIsafe_class(PROFIsafeControl, 2)(data = b'\x81\x80', control=0x40, crc=0x040506) >>> assert raw(p) == b'\x81\x80\x40\x04\x05\x06' ###(017)=[passed] PROFIsafe building (query with F_CRC_SEED=1) >>> p = PROFIsafe.build_PROFIsafe_class(PROFIsafeControlCRCSeed, 2)(data = b'\x81\x80', control=0x02, crc=0x04050607) >>> assert raw(p) == b'\x81\x80\x02\x04\x05\x06\x07' ###(018)=[passed] PROFIsafe building (response with F_CRC_SEED=0) >>> p = PROFIsafe.build_PROFIsafe_class(PROFIsafeStatus, 3)(data = b'\x01\x81\x00', status=0x01, crc=0x040506) >>> assert raw(p) == b'\x01\x81\x00\x01\x04\x05\x06' ###(019)=[passed] PROFIsafe building (response with F_CRC_SEED=1) >>> p = PROFIsafe.build_PROFIsafe_class(PROFIsafeStatusCRCSeed, 3)(data = b'\x01\x81\x80', status=0x01, crc=0x04050607) >>> assert raw(p) == b'\x01\x81\x80\x01\x04\x05\x06\x07' >>> >>> conf.debug_dissector = old_conf_dissector ProfinetIO DCP layer test campaign ━ Run at 01:43:08 from [test/contrib/pnio_dcp.uts] by UTscapy in 0.0622096061706543 └ Passed=11 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the ProfinetIO layer >>> from scapy.contrib.pnio import * >>> from scapy.contrib.pnio_dcp import * >>> from scapy.config import conf >>> import re >>> old_conf_dissector = conf.debug_dissector >>> conf.debug_dissector=True ###### ## PNIO DCP PDU tests ###### ###(001)=[passed] DCP Identify All Request parsing >>> p = Ether(b'\x01\x0e\xcf\x00\x00\x00\x01\x23\x45\x67\x89\xab\x88\x92\xfe\xfe' \ ... b'\x05\x00\x01\x00\x00\x01\x00\x01\x00\x04\xff\xff\x00\x00\x00\x00' \ ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \ ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> >>> assert p[Ether].dst == '01:0e:cf:00:00:00' >>> assert p[Ether].src == '01:23:45:67:89:ab' >>> assert p[Ether].type == 0x8892 >>> assert p[ProfinetIO].frameID == 0xfefe >>> assert p[ProfinetDCP].service_id == 0x05 >>> assert p[ProfinetDCP].service_type == 0x00 >>> assert p[ProfinetDCP].xid == 0x1000001 >>> assert p[ProfinetDCP].reserved == 0x01 >>> assert p[ProfinetDCP].dcp_data_length == 0x04 >>> assert p[ProfinetDCP].option == 0xff >>> assert p[ProfinetDCP].sub_option == 0xff >>> assert p[ProfinetDCP].dcp_block_length == 0x00 ###(002)=[passed] DCP Set Request parsing >>> p = Ether(b'\x01\x23\x45\x67\x89\xac\x01\x23\x45\x67\x89\xab\x88\x92\xfe\xfd' \ ... b'\x04\x00\x00\x00\x00\x01\x00\x00\x00\x0c\x02\x02\x00\x08\x00\x01' \ ... b'\x64\x65\x76\x69\x63\x65\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \ ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> >>> assert p[Ether].dst == '01:23:45:67:89:ac' >>> assert p[Ether].src == '01:23:45:67:89:ab' >>> assert p[Ether].type == 0x8892 >>> assert p[ProfinetIO].frameID == 0xfefd >>> assert p[ProfinetDCP].service_id == 0x04 >>> assert p[ProfinetDCP].service_type == 0x00 >>> assert p[ProfinetDCP].xid == 0x0000001 >>> assert p[ProfinetDCP].reserved == 0x00 >>> assert p[ProfinetDCP].dcp_data_length == 0x0c >>> assert p[ProfinetDCP].option == 0x02 >>> assert p[ProfinetDCP].sub_option == 0x02 >>> assert p[ProfinetDCP].dcp_block_length == 0x08 >>> assert p[ProfinetDCP].block_qualifier == 0x01 ###(003)=[passed] DCP Identify Response parsing >>> p = Ether(b'\x94\x65\x9c\x51\x90\x7d\xac\x64\x17\x21\x35\xcf\x81\x00\x00\x00' \ ... b'\x88\x92\xfe\xff\x05\x01\x01\x00\x00\x01\x00\x00\x00\x4e\x02\x05' \ ... b'\x00\x04\x00\x00\x02\x07\x02\x01\x00\x09\x00\x00\x45\x54\x32\x30' \ ... b'\x30\x53\x50\x00\x02\x02\x00\x08\x00\x00\x64\x65\x76\x69\x63\x65' \ ... b'\x02\x03\x00\x06\x00\x00\x00\x2a\x03\x13\x02\x04\x00\x04\x00\x00' \ ... b'\x01\x00\x02\x07\x00\x04\x00\x00\x00\x01\x01\x02\x00\x0e\x00\x01' \ ... b'\xc0\xa8\x01\x0e\xff\xff\xff\x00\xc0\xa8\x01\x0e') >>> >>> assert p[ProfinetIO].frameID == 0xfeff >>> assert p[ProfinetDCP].service_id == 0x05 >>> assert p[ProfinetDCP].service_type == 0x01 >>> assert p[ProfinetDCP].xid == 0x1000001 >>> assert p[ProfinetDCP].reserved == 0x00 >>> assert p[ProfinetDCP].dcp_data_length == 0x4e >>> >>> assert p[DCPDeviceOptionsBlock].option == 0x02 >>> assert p[DCPDeviceOptionsBlock].sub_option == 0x05 >>> assert p[DCPDeviceOptionsBlock].dcp_block_length == 0x04 >>> assert p[DCPDeviceOptionsBlock].block_info == 0x00 >>> >>> assert p[DeviceOption].option == 0x02 >>> assert p[DeviceOption].sub_option == 0x07 >>> >>> assert p[DCPManufacturerSpecificBlock].option == 0x02 >>> assert p[DCPManufacturerSpecificBlock].sub_option == 0x01 >>> assert p[DCPManufacturerSpecificBlock].dcp_block_length == 0x09 >>> assert p[DCPManufacturerSpecificBlock].block_info == 0x00 >>> assert p[DCPManufacturerSpecificBlock].device_vendor_value == b'ET200SP' >>> >>> assert p[DCPNameOfStationBlock].option == 0x02 >>> assert p[DCPNameOfStationBlock].sub_option == 0x02 >>> assert p[DCPNameOfStationBlock].dcp_block_length == 0x08 >>> assert p[DCPNameOfStationBlock].block_info == 0x00 >>> assert p[DCPNameOfStationBlock].name_of_station == b'device' >>> >>> assert p[DCPDeviceIDBlock].option == 0x02 >>> assert p[DCPDeviceIDBlock].sub_option == 0x03 >>> assert p[DCPDeviceIDBlock].dcp_block_length == 0x06 >>> assert p[DCPDeviceIDBlock].block_info == 0x00 >>> assert p[DCPDeviceIDBlock].vendor_id == 0x002a >>> assert p[DCPDeviceIDBlock].device_id == 0x0313 >>> >>> assert p[DCPDeviceRoleBlock].option == 0x02 >>> assert p[DCPDeviceRoleBlock].sub_option == 0x04 >>> assert p[DCPDeviceRoleBlock].dcp_block_length == 0x04 >>> assert p[DCPDeviceRoleBlock].block_info == 0x00 >>> assert p[DCPDeviceRoleBlock].device_role_details == 0x01 >>> >>> assert p[DCPDeviceInstanceBlock].option == 0x02 >>> assert p[DCPDeviceInstanceBlock].sub_option == 0x07 >>> assert p[DCPDeviceInstanceBlock].dcp_block_length == 0x04 >>> assert p[DCPDeviceInstanceBlock].block_info == 0x00 >>> assert p[DCPDeviceInstanceBlock].device_instance_high == 0x00 >>> assert p[DCPDeviceInstanceBlock].device_instance_low == 0x01 >>> >>> assert p[DCPIPBlock].option == 0x01 >>> assert p[DCPIPBlock].sub_option == 0x02 >>> assert p[DCPIPBlock].dcp_block_length == 0x0e >>> assert p[DCPIPBlock].block_info == 0x01 >>> assert p[DCPIPBlock].ip == "192.168.1.14" >>> assert p[DCPIPBlock].netmask == "255.255.255.0" >>> assert p[DCPIPBlock].gateway == "192.168.1.14" ###(004)=[passed] DCP Identify Response parsing with new DCP packages (DCPOEMIDBlock, DCPDeviceInitiativeBlock) >>> p = Ether(b'\x01\x0e\xcf\x00\x00\x00\x01\x23\x45\x67\x89\xab\x88\x92' \ ... b'\xfe\xff\x05\x01\x01\x00\x00\x01\x00\x00\x00\x7a\x02\x02\x00\x02\x00' \ ... b'\x00\x01\x02\x00\x0e\x00\x01\xc0\xa8\x01\x0b\xff\xff\xff\x00\x00\x00' \ ... b'\x00\x00\x02\x03\x00\x06\x00\x00\x01\x6a\x04\x00\x02\x05\x00\x16\x00' \ ... b'\x00\x01\x01\x01\x02\x02\x01\x02\x02\x02\x03\x02\x04\x02\x05\x02\x07' \ ... b'\x02\x08\x06\x01\x02\x04\x00\x04\x00\x00\x01\x00\x06\x01\x00\x04\x00' \ ... b'\x00\x00\x00\x02\x01\x00\x18\x00\x00\x31\x32\x33\x34\x20\x44\x44\x44' ... b'\x20\x33\x58\x58\x32\x2d\x31\x32\x31\x2d\x30\x46\x44\x44\x02\x07\x00' \ ... b'\x04\x00\x00\x00\x01\x02\x08\x00\x06\x00\x00\x01\x1e\xff\xff') >>> >>> assert p[Ether].dst == '01:0e:cf:00:00:00' >>> assert p[Ether].src == '01:23:45:67:89:ab' >>> assert p[Ether].type == 0x8892 >>> assert p[ProfinetIO].frameID == 0xFEFF >>> assert p[ProfinetDCP].service_id == 0x05 >>> assert p[ProfinetDCP].service_type == 0x01 >>> assert p[ProfinetDCP].xid == 0x1000001 >>> assert p[ProfinetDCP].reserved == 0x00 >>> assert p[ProfinetDCP].dcp_data_length == 122 >>> assert list(map(lambda x: type(x), p[ProfinetDCP].dcp_blocks)) == [DCPNameOfStationBlock, DCPIPBlock, DCPDeviceIDBlock, DCPDeviceOptionsBlock, DCPDeviceRoleBlock, DCPDeviceInitiativeBlock, DCPManufacturerSpecificBlock, DCPDeviceInstanceBlock, DCPOEMIDBlock] >>> >>> assert p[DCPNameOfStationBlock].option == 0x02 >>> assert p[DCPNameOfStationBlock].sub_option == 0x02 >>> >>> assert p[DCPIPBlock].option == 0x01 >>> assert p[DCPIPBlock].sub_option == 0x02 >>> assert p[DCPIPBlock].dcp_block_length == 0x0E >>> assert p[DCPIPBlock].ip == '192.168.1.11' >>> assert p[DCPIPBlock].netmask == '255.255.255.0' >>> assert p[DCPIPBlock].gateway == '0.0.0.0' >>> >>> assert p[DCPDeviceInitiativeBlock].option == 0x06 >>> assert p[DCPDeviceInitiativeBlock].sub_option == 0x01 >>> assert p[DCPDeviceInitiativeBlock].dcp_block_length == 0x04 >>> assert p[DCPDeviceInitiativeBlock].device_initiative == 0x0000 >>> >>> assert p[DCPManufacturerSpecificBlock].option == 0x02 >>> assert p[DCPManufacturerSpecificBlock].sub_option == 0x01 >>> assert p[DCPManufacturerSpecificBlock].device_vendor_value == b'1234 DDD 3XX2-121-0FDD' >>> >>> assert p[DCPOEMIDBlock].option == 0x02 >>> assert p[DCPOEMIDBlock].sub_option == 0x08 >>> assert p[DCPOEMIDBlock].dcp_block_length == 0x06 >>> assert p[DCPOEMIDBlock].vendor_id == 0x011e >>> assert p[DCPOEMIDBlock].device_id == 0xffff ###(005)=[passed] DCP Set Request parsing >>> p = Ether(b'\x94\x65\x9c\x51\x90\x7d\xac\x64\x17\x21\x35\xcf\x81\x00\x00\x00' \ ... b'\x88\x92\xfe\xfd\x04\x01\x00\x00\x00\x01\x00\x00\x00\x08\x05\x04' \ ... b'\x00\x03\x02\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \ ... b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> >>> assert p[ProfinetIO].frameID == 0xfefd >>> assert p[ProfinetDCP].service_id == 0x04 >>> assert p[ProfinetDCP].service_type == 0x01 >>> assert p[ProfinetDCP].xid == 0x0000001 >>> assert p[ProfinetDCP].reserved == 0x00 >>> assert p[ProfinetDCP].dcp_data_length == 0x08 >>> >>> assert p[DCPControlBlock].option == 0x05 >>> assert p[DCPControlBlock].sub_option == 0x04 >>> assert p[DCPControlBlock].dcp_block_length == 0x03 >>> assert p[DCPControlBlock].response == 0x02 >>> assert p[DCPControlBlock].response_sub_option == 0x02 >>> assert p[DCPControlBlock].block_error == 0x00 ###(006)=[passed] DCP Set Full IP Suite Request parsing >>> p = Ether(b'\x12\x34\x00\x78\x90\xab\xc8\x5b\x76\xe6\x89\xdf' \ ... b'\x88\x92\xfe\xfd\x04\x00\x00\x00\x00\x04\x00\x00' \ ... b'\x00\x28\x01\x03\x00\x1e\x00\x00\xc0\xa8\x01\xab' \ ... b'\xff\xff\xff\x00\xc0\xa8\x01\x01\x01\x02\x03\x04' \ ... b'\x05\x06\x07\x08\x00\x00\x00\x00\x00\x00\x00\x00') >>> >>> assert p[ProfinetIO].frameID == 0xfefd >>> assert p[ProfinetDCP].service_id == 0x04 >>> assert p[ProfinetDCP].service_type == 0x00 >>> assert p[ProfinetDCP].xid == 0x0000004 >>> assert p[ProfinetDCP].reserved == 0x00 >>> assert p[ProfinetDCP].dcp_data_length == 40 >>> assert p[ProfinetDCP].option == 0x01 >>> assert p[ProfinetDCP].sub_option == 0x03 >>> assert p[ProfinetDCP].ip == "192.168.1.171" >>> assert p[ProfinetDCP].netmask == "255.255.255.0" >>> assert p[ProfinetDCP].gateway == "192.168.1.1" >>> assert p[ProfinetDCP].dnsaddr[0] == "1.2.3.4" >>> assert p[ProfinetDCP].dnsaddr[1] == "5.6.7.8" >>> assert p[ProfinetDCP].dnsaddr[2] == "0.0.0.0" >>> assert p[ProfinetDCP].dnsaddr[3] == "0.0.0.0" ###(007)=[passed] DCP Identify All Request crafting >>> p = ProfinetIO(frameID=DCP_IDENTIFY_REQUEST_FRAME_ID) / ProfinetDCP(service_id=DCP_SERVICE_ID_IDENTIFY, service_type=DCP_REQUEST, option=255, sub_option=255, dcp_data_length=4) >>> >>> assert p[ProfinetIO].frameID == 0xfefe >>> assert p[ProfinetDCP].service_id == 0x05 >>> assert p[ProfinetDCP].service_type == 0x00 >>> assert p[ProfinetDCP].xid == 0x1000001 >>> assert p[ProfinetDCP].reserved == 0x00 >>> assert p[ProfinetDCP].dcp_data_length == 0x04 >>> assert p[ProfinetDCP].option == 0xff >>> assert p[ProfinetDCP].sub_option == 0xff >>> assert p[ProfinetDCP].dcp_block_length == 0x00 ###(008)=[passed] DCP Set Name Request with specified name crafting >>> p = ProfinetIO(frameID=DCP_GET_SET_FRAME_ID) / ProfinetDCP ( service_id=DCP_SERVICE_ID_SET, service_type=DCP_REQUEST, option=2, sub_option=2, name_of_station="device", dcp_block_length=8, dcp_data_length=12) >>> >>> assert p[ProfinetIO].frameID == 0xfefd >>> assert p[ProfinetDCP].service_id == 0x04 >>> assert p[ProfinetDCP].service_type == 0x00 >>> assert p[ProfinetDCP].xid == 0x1000001 >>> assert p[ProfinetDCP].reserved == 0x00 >>> assert p[ProfinetDCP].dcp_data_length == 0x0c >>> assert p[ProfinetDCP].option == 0x02 >>> assert p[ProfinetDCP].sub_option == 0x02 >>> assert p[ProfinetDCP].dcp_block_length == 0x08 >>> assert p[ProfinetDCP].block_qualifier == 0x0001 ###(009)=[passed] DCP Identify Response crafting >>> p = ProfinetIO(frameID=DCP_IDENTIFY_RESPONSE_FRAME_ID) / ProfinetDCP(service_id=DCP_SERVICE_ID_IDENTIFY, service_type=DCP_RESPONSE, dcp_data_length=12) / DCPNameOfStationBlock(name_of_station="device", dcp_block_length=8) >>> >>> assert p[ProfinetIO].frameID == 0xfeff >>> assert p[ProfinetDCP].service_id == 0x05 >>> assert p[ProfinetDCP].service_type == 0x01 >>> assert p[ProfinetDCP].xid == 0x1000001 >>> assert p[ProfinetDCP].reserved == 0x00 >>> assert p[ProfinetDCP].dcp_data_length == 0x0c >>> assert p[DCPNameOfStationBlock].option == 0x02 >>> assert p[DCPNameOfStationBlock].sub_option == 0x02 >>> assert p[DCPNameOfStationBlock].dcp_block_length == 0x08 >>> assert p[DCPNameOfStationBlock].block_info == 0x00 >>> assert p[DCPNameOfStationBlock].name_of_station == b'device' ###(010)=[passed] DCP Set Full IP Suite Request crafting >>> p = ProfinetIO(frameID=DCP_GET_SET_FRAME_ID) / ProfinetDCP(service_id=DCP_SERVICE_ID_SET, service_type=DCP_REQUEST, option=1, sub_option=3, ip='192.168.1.171', netmask='255.255.255.0', gateway='192.168.1.1', dnsaddr=['1.2.3.4', '5.6.7.8'], dcp_data_length=40, dcp_block_length=30) >>> >>> assert p[ProfinetIO].frameID == 0xfefd >>> assert p[ProfinetDCP].service_id == 0x04 >>> assert p[ProfinetDCP].service_type == 0x00 >>> assert p[ProfinetDCP].xid == 0x1000001 >>> assert p[ProfinetDCP].reserved == 0x00 >>> assert p[ProfinetDCP].dcp_data_length == 40 >>> assert p[ProfinetDCP].option == 0x01 >>> assert p[ProfinetDCP].sub_option == 0x03 >>> assert p[ProfinetDCP].ip == "192.168.1.171" >>> assert p[ProfinetDCP].netmask == "255.255.255.0" >>> assert p[ProfinetDCP].gateway == "192.168.1.1" >>> assert p[ProfinetDCP].dnsaddr[0] == "1.2.3.4" >>> assert p[ProfinetDCP].dnsaddr[1] == "5.6.7.8" >>> >>> >>> conf.debug_dissector = old_conf_dissector PNIO RPC layer test campaign ━ Run at 01:43:09 from [test/contrib/pnio_rpc.uts] by UTscapy in 0.38505029678344727 └ Passed=83 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the PNIO RPC layer >>> from scapy.layers.dcerpc import * >>> from scapy.contrib.pnio import * >>> from scapy.contrib.pnio_rpc import * ###(001)=[passed] Check that we have UUIDs >>> for v in RPC_INTERFACE_UUID.values(): ... assert isinstance(v, UUID) ... ###### ## Check Block ###### ###(002)=[passed] Block default values >>> bytes(Block()) == bytearray.fromhex('000000020100') True ###(003)=[passed] Block basic example >>> bytes(Block(load=b'\x01\x02\x03')) == bytearray.fromhex('000000050100010203') True ###(004)=[passed] Block has no payload (only padding) >>> p = Block(bytearray.fromhex('000000050100010203040506')) >>> p == Block(block_length=5, load=b'\x01\x02\x03') / conf.padding_layer(b'\x04\x05\x06') True ###### ## Check IODControlReq ###### ###(005)=[passed] IODControlReq default values >>> bytes(IODControlReq()) == bytearray.fromhex('0000001c01000000000000000000000000000000000000000000000000000000') True ###(006)=[passed] IODControlReq basic example (IODControlReq PrmEnd control) >>> bytes(IODControlReq(ARUUID='01234567-89ab-cdef-0123-456789abcdef', SessionKey=2, ControlCommand_PrmEnd=1)) == bytearray.fromhex('0110001c010000000123456789abcdef0123456789abcdef0002000000010000') True ###(007)=[passed] IODControlReq dissection >>> p = IODControlReq(bytearray.fromhex('0118001c010000000123456789abcdef0123456789abcdef0005000000400000ef')) >>> p == IODControlReq(ARUUID='01234567-89ab-cdef-0123-456789abcdef', SessionKey=5, ControlCommand_PrmBegin=1, block_type='IODBlockReq_connect_begin', block_length=28, padding=b'\0\0') / conf.padding_layer(b'\xef') True ###(008)=[passed] IODControlReq response >>> p = p.get_response() >>> p == IODControlRes(ARUUID='01234567-89ab-cdef-0123-456789abcdef', SessionKey=5, block_type='IODBlockRes_connect_begin') True ###### ## Check IODControlRes ###### ###(009)=[passed] IODControlRes default values >>> bytes(IODControlRes()) == bytearray.fromhex('8110001c01000000000000000000000000000000000000000000000000080000') True ###(010)=[passed] IODControlRes basic example (IODControlRes PrmEnd control) >>> bytes(IODControlRes(ARUUID='01234567-89ab-cdef-0123-456789abcdef', SessionKey=2, block_type='IODBlockRes_connect_end')) == bytearray.fromhex('8110001c010000000123456789abcdef0123456789abcdef0002000000080000') True ###(011)=[passed] IODControlRes dissection >>> p = IODControlRes(bytearray.fromhex('8118001c010000000123456789abcdef0123456789abcdef0005000000080000ef')) >>> p == IODControlRes(ARUUID='01234567-89ab-cdef-0123-456789abcdef', SessionKey=5, block_type='IODBlockRes_connect_begin', block_length=28, padding=b'\0\0') / conf.padding_layer(b'\xef') True ###### ## Check IODWriteReq ###### ###(012)=[passed] IODWriteReq default values >>> bytes(IODWriteReq()) == bytearray.fromhex('0008003c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000') True ###(013)=[passed] IODWriteReq basic example >>> bytes(IODWriteReq( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321 ... ) / b'\xab\xcd' ... ) == bytearray.fromhex('0008003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000002000000000000000000000000000000000000000000000000abcd') True ###(014)=[passed] IODWriteReq dissection >>> p = IODWriteReq(bytearray.fromhex('0008003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000002000000000000000000000000000000000000000000000000abcdef')) >>> p == IODWriteReq(ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321, block_length=60, recordDataLength=2, padding='\0\0', RWPadding=b'\0'*24 ... ) / b'\xab\xcd' / conf.padding_layer(b'\xef') True ###(015)=[passed] IODWriteReq response >>> p = p.get_response() >>> p == IODWriteRes(ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321) True ###### ## Check IODWriteRes ###### ###(016)=[passed] IODWriteRes default values >>> bytes(IODWriteRes()) == bytearray.fromhex('8008003c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000') True ###(017)=[passed] IODWriteRes basic example >>> bytes(IODWriteRes( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321 ... )) == bytearray.fromhex('8008003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000000000000000000000000000000000000000000000000000000') True ###(018)=[passed] IODWriteRes dissection >>> p = IODWriteRes(bytearray.fromhex('8008003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000000000000000000000000000000000000000000000000000000ef')) >>> p == IODWriteRes(ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321, recordDataLength=0, block_length=60, padding=b'\0\0', RWPadding=b'\0'*16 ... ) / conf.padding_layer(b'\xef') True ###### ## Check IODWriteMultipleReq ###### ###(019)=[passed] IODWriteMultipleReq default values >>> bytes(IODWriteMultipleReq()) == bytearray.fromhex('0008003c0100000000000000000000000000000000000000ffffffffffffffff0000e04000000000000000000000000000000000000000000000000000000000') True ###(020)=[passed] IODWriteMultipleReq basic example >>> bytes(IODWriteMultipleReq(ARUUID='01234567-89ab-cdef-0123-456789abcdef', blocks=[ ... IODWriteReq( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321 ... ) / b'\xab\xcd', ... IODWriteReq( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=2, API=2, slotNumber=3, subslotNumber=4, ... index=0x1234 ... ) / b'\x01\x02', ... ]) ... ) == bytearray.fromhex('0008003c010000000123456789abcdef0123456789abcdefffffffffffffffff0000e04000000086000000000000000000000000000000000000000000000000') + \ ... bytearray.fromhex('0008003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000002000000000000000000000000000000000000000000000000abcd') + b'\0\0' + \ ... bytearray.fromhex('0008003c010000020123456789abcdef0123456789abcdef000000020003000400001234000000020000000000000000000000000000000000000000000000000102') True ###(021)=[passed] IODWriteMultipleReq dissection >>> p = IODWriteMultipleReq( ... bytearray.fromhex('0008003c010000000123456789abcdef0123456789abcdefffffffffffffffff0000e04000000086000000000000000000000000000000000000000000000000') + \ ... bytearray.fromhex('0008003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000002000000000000000000000000000000000000000000000000abcd') + b'\0\0' + \ ... bytearray.fromhex('0008003c010000020123456789abcdef0123456789abcdef000000020003000400001234000000020000000000000000000000000000000000000000000000000102') + b'\xef' ... ) >>> p == IODWriteMultipleReq(ARUUID='01234567-89ab-cdef-0123-456789abcdef', recordDataLength=0x86, ... padding=b'\0'*2, RWPadding=b'\0'*24, block_length=60, blocks=[ ... IODWriteReq( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321, recordDataLength=2, padding=b'\0'*2, RWPadding=b'\0'*24, block_length=60 ... ) / b'\xab\xcd', ... IODWriteReq( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=2, API=2, slotNumber=3, subslotNumber=4, ... index=0x1234, recordDataLength=2, padding=b'\0'*2, RWPadding=b'\0'*24, block_length=60 ... ) / b'\x01\x02', ... ]) / conf.padding_layer(b'\xef') True ###(022)=[passed] IODWriteMultipleReq response >>> p = p.get_response() >>> p == IODWriteMultipleRes(ARUUID='01234567-89ab-cdef-0123-456789abcdef', blocks=[ ... IODWriteRes( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321 ... ), ... IODWriteRes( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=2, API=2, slotNumber=3, subslotNumber=4, ... index=0x1234 ... ), ... ]) True ###### ## Check IODWriteMultipleRes ###### ###(023)=[passed] IODWriteMultipleRes default values >>> bytes(IODWriteMultipleRes()) == bytearray.fromhex('8008003c0100000000000000000000000000000000000000ffffffffffffffff0000e04000000000000000000000000000000000000000000000000000000000') True ###(024)=[passed] IODWriteMultipleRes basic example >>> bytes(IODWriteMultipleRes(ARUUID='01234567-89ab-cdef-0123-456789abcdef', blocks=[ ... IODWriteRes( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321 ... ), ... IODWriteRes( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=2, API=2, slotNumber=3, subslotNumber=4, ... index=0x1234 ... ), ... ]) ... ) == bytearray.fromhex('8008003c010000000123456789abcdef0123456789abcdefffffffffffffffff0000e04000000080000000000000000000000000000000000000000000000000') + \ ... bytearray.fromhex('8008003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000000000000000000000000000000000000000000000000000000') + \ ... bytearray.fromhex('8008003c010000020123456789abcdef0123456789abcdef00000002000300040000123400000000000000000000000000000000000000000000000000000000') True ###(025)=[passed] IODWriteMultipleRes dissection >>> p = IODWriteMultipleRes( ... bytearray.fromhex('8008003c010000000123456789abcdef0123456789abcdefffffffffffffffff0000e04000000080000000000000000000000000000000000000000000000000') + \ ... bytearray.fromhex('8008003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000000000000000000000000000000000000000000000000000000') + \ ... bytearray.fromhex('8008003c010000020123456789abcdef0123456789abcdef00000002000300040000123400000000000000000000000000000000000000000000000000000000') + b'\xef' ... ) >>> p == IODWriteMultipleRes(ARUUID='01234567-89ab-cdef-0123-456789abcdef', recordDataLength=0x80, ... padding=b'\0'*2, RWPadding=b'\0'*16, block_length=60, blocks=[ ... IODWriteRes( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321, recordDataLength=0, padding=b'\0'*2, RWPadding=b'\0'*16, block_length=60 ... ), ... IODWriteRes( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=2, API=2, slotNumber=3, subslotNumber=4, ... index=0x1234, recordDataLength=0, padding=b'\0'*2, RWPadding=b'\0'*16, block_length=60 ... ), ... ]) / conf.padding_layer(b'\xef') True ###### ## Check IODReadReq ###### ###(026)=[passed] IODReadReq default values >>> bytes(IODReadReq()) == bytearray.fromhex('0009003c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000') True ###(027)=[passed] IODReadReq basic example >>> bytes(IODReadReq( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321) ... ) == bytearray.fromhex('0009003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000000000000000000000000000000000000000000000000000000') True ###(028)=[passed] IODReadReq dissection >>> p = IODReadReq(bytearray.fromhex('0009003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000002000000000000000000000000000000000000000000000000abcdef')) >>> p == IODReadReq(ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321, block_length=60, recordDataLength=2, padding='\0\0', RWPadding=b'\0'*24 ... ) / b'\xab\xcd' / conf.padding_layer(b'\xef') True ###(029)=[passed] IODReadReq response >>> p = p.get_response() >>> p == IODReadRes(ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321) True ###### ## Check IODReadRes ###### ###(030)=[passed] IODReadRes default values >>> bytes(IODReadRes()) == bytearray.fromhex('8009003c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000') True ###(031)=[passed] IODReadRes basic example >>> bytes(IODReadRes( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321)) == bytearray.fromhex('8009003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000000000000000000000000000000000000000000000000000000') True ###(032)=[passed] IODReadRes dissection >>> p = IODReadRes(bytearray.fromhex('8009003c010000010123456789abcdef0123456789abcdef00000001000200030000432100000000000000000000000000000000000000000000000000000000ef')) >>> p == IODReadRes( ... ARUUID='01234567-89ab-cdef-0123-456789abcdef', seqNum=1, API=1, slotNumber=2, subslotNumber=3, ... index=0x4321, recordDataLength=0, block_length=60, padding=b'\0\0', RWPadding=b'\0'*20 ... ) / conf.padding_layer(b'\xef') True ###### ## Check I&M ###### ###(033)=[passed] IM0Block default values >>> raw(IM0Block()) == bytearray.fromhex('002000380100000000000000000000000000000000000000000000000000000000000000000000000000000000005600000000000000000001010000') True ###(034)=[passed] IM0Block basic example >>> raw(IM0Block(OrderID='foobar', IMSerialNumber='ABCDEF1234567890')) == bytearray.fromhex('0020003801000000666f6f62617200000000000000000000000000004142434445463132333435363738393000005600000000000000000001010000') True ###(035)=[passed] IM1Block default values >>> raw(IM1Block()) == bytearray.fromhex('002100380100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000') True ###(036)=[passed] IM2Block default values >>> raw(IM2Block()) == bytearray.fromhex('00220012010000000000000000000000000000000000') True ###(037)=[passed] IM3Block default values >>> raw(IM3Block()) == bytearray.fromhex('002300380100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000') True ###(038)=[passed] IM4Block default values >>> raw(IM4Block()) == bytearray.fromhex('002400380100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000') True ###### ## Check ARBlockReq ###### ###(039)=[passed] ARBlockReq default values >>> bytes(ARBlockReq()) == bytearray.fromhex('0101003601000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103e888920000') True ###(040)=[passed] ARBlockReq basic example >>> bytes(ARBlockReq( ... ARType='IOCARSingle', ARUUID='01234567-89ab-cdef-0123-456789abcdef', SessionKey=1, ... CMInitiatorObjectUUID='dea00000-6c97-11d1-8271-010203040506', ARProperties_ParametrizationServer='CM_Initator', ... CMInitiatorStationName='plc1') ... ) == bytearray.fromhex('0101003a010000010123456789abcdef0123456789abcdef0001000000000000dea000006c9711d182710102030405060000001103e888920004') + b'plc1' True ###(041)=[passed] ARBlockReq dissection >>> p = ARBlockReq(bytearray.fromhex('0101003a010000010123456789abcdef0123456789abcdef0001010203040506dea000006c9711d182710102030405060000001103e888920004') + b'plc1' + b'\xef') >>> p == ARBlockReq( ... ARType='IOCARSingle', ARUUID='01234567-89ab-cdef-0123-456789abcdef', SessionKey=1, ... CMInitiatorObjectUUID='dea00000-6c97-11d1-8271-010203040506', ARProperties_ParametrizationServer='CM_Initator', ... CMInitiatorMacAdd='01:02:03:04:05:06', StationNameLength=4, CMInitiatorStationName='plc1', block_length=58 ... ) / conf.padding_layer(b'\xef') True ###(042)=[passed] ARBlockReq response >>> p = p.get_response() >>> p == ARBlockRes(ARType='IOCARSingle', ARUUID='01234567-89ab-cdef-0123-456789abcdef', SessionKey=1) True ###### ## Check ARBlockRes ###### ###(043)=[passed] ARBlockRes default values >>> bytes(ARBlockRes()) == bytearray.fromhex('8101001e010000010000000000000000000000000000000000000000000000008892') True ###(044)=[passed] ARBlockRes basic example >>> bytes( ... ARBlockRes(ARType='IOCARSingle', ARUUID='01234567-89ab-cdef-0123-456789abcdef', SessionKey=1) ... ) == bytearray.fromhex('8101001e010000010123456789abcdef0123456789abcdef00010000000000008892') True ###(045)=[passed] ARBlockRes dissection >>> p = ARBlockRes(bytearray.fromhex('8101001e010000010123456789abcdef0123456789abcdef00010102030405068892ef')) >>> p == ARBlockRes( ... ARType='IOCARSingle', ARUUID='01234567-89ab-cdef-0123-456789abcdef', SessionKey=1, ... CMResponderMacAdd='01:02:03:04:05:06', block_length=30) / conf.padding_layer(b'\xef') True ###### ## Check IOCRBlockReq ###### ###(046)=[passed] IOCRBlockReq default values >>> bytes(IOCRBlockReq()) == bytearray.fromhex('0102002a010000010001889200000000002880000020002000010000ffffffff000a000ac0000000000000000000') True ###(047)=[passed] IOCRAPI default values >>> bytes(IOCRAPI()) == bytearray.fromhex('0000000000000000') True ###(048)=[passed] IOCRAPIObject default values >>> bytes(IOCRAPIObject()) == bytearray.fromhex('000000000000') True ###(049)=[passed] IOCRBlockReq basic example >>> p = IOCRBlockReq( ... IOCRType='OutputCR', IOCRReference=1, SendClockFactor=2, ... ReductionRatio=32, DataLength=47, FrameID=0x8014, ... APIs=[ ... IOCRAPI( ... API=4, ... IODataObjects=[ ... IOCRAPIObject(SlotNumber=2, SubslotNumber=1, FrameOffset=0), ... IOCRAPIObject(SlotNumber=1, SubslotNumber=1, FrameOffset=9), ... ] ... ), ... IOCRAPI( ... API=0, ... IODataObjects=[ ... IOCRAPIObject(SlotNumber=3, SubslotNumber=1, FrameOffset=15), ... ], ... IOCSs=[ ... IOCRAPIObject(SlotNumber=3, SubslotNumber=1, FrameOffset=4), ... ], ... ), ... ] ... ) >>> bytes(p) == \ ... bytearray.fromhex('01020052010000020001889200000000002f80140002002000010000ffffffff000a000ac0000000000000000002' + \ ... '0000000400020002000100000001000100090000' + \ ... '00000000000100030001000f0001000300010004') True ###(050)=[passed] IOCRBlockReq dissection >>> p = IOCRBlockReq( ... bytearray.fromhex('01020052010000020001889200000000002f80140002002000010000ffffffff000a000ac0000102030405060002' + \ ... '0000000400020002000100000001000100090000' + \ ... '00000000000100030001000f0001000300010004') + b'\xef') >>> p == IOCRBlockReq( ... IOCRType='OutputCR', IOCRReference=1, SendClockFactor=2, IOCRMulticastMACAdd='01:02:03:04:05:06', ... ReductionRatio=32, DataLength=47, FrameID=0x8014, block_length=82, ... NumberOfAPIs=2, APIs=[ ... IOCRAPI( ... API=4, ... NumberOfIODataObjects=2, IODataObjects=[ ... IOCRAPIObject(SlotNumber=2, SubslotNumber=1, FrameOffset=0), ... IOCRAPIObject(SlotNumber=1, SubslotNumber=1, FrameOffset=9), ... ], ... NumberOfIOCS=0 ... ), ... IOCRAPI( ... API=0, ... NumberOfIODataObjects=1, IODataObjects=[ ... IOCRAPIObject(SlotNumber=3, SubslotNumber=1, FrameOffset=15), ... ], ... NumberOfIOCS=1, IOCSs=[ ... IOCRAPIObject(SlotNumber=3, SubslotNumber=1, FrameOffset=4), ... ], ... ), ... ] ... ) / conf.padding_layer(b'\xef') True ###(051)=[passed] IOCRBlockReq response >>> p = p.get_response() >>> p == IOCRBlockRes(IOCRType='OutputCR', IOCRReference=1, FrameID=0x8014) True ###### ## Check IOCRBlockRes ###### ###(052)=[passed] IOCRBlockRes default values >>> bytes(IOCRBlockRes()) == bytearray.fromhex('810200080100000100018000') True ###(053)=[passed] IOCRBlockRes basic example >>> bytes( ... IOCRBlockRes(IOCRType='InputCR', IOCRReference=2, FrameID=0x8014) ... ) == bytearray.fromhex('810200080100000100028014') True ###(054)=[passed] IOCRBlockRes dissection >>> p = IOCRBlockRes(bytearray.fromhex('810200080100000100028014ef')) >>> p == IOCRBlockRes(IOCRType='InputCR', IOCRReference=2, FrameID=0x8014, ... block_length=8) / conf.padding_layer(b'\xef') True ###### ## Check ExpectedSubmoduleBlockReq ###### ###(055)=[passed] ExpectedSubmoduleBlockReq default values >>> bytes(ExpectedSubmoduleBlockReq()) == bytearray.fromhex('0104000401000000') True ###(056)=[passed] ExpectedSubmoduleAPI default values >>> bytes(ExpectedSubmoduleAPI()) == bytearray.fromhex('0000000000000000000000000000') True ###(057)=[passed] ExpectedSubmodule default values >>> bytes(ExpectedSubmodule()) == bytearray.fromhex('0000000000000000') True ###(058)=[passed] ExpectedSubmoduleDataDescription default values >>> bytes(ExpectedSubmoduleDataDescription()) == bytearray.fromhex('000000000000') True ###(059)=[passed] ExpectedSubmoduleBlockReq basic example >>> p = ExpectedSubmoduleBlockReq( ... APIs=[ ... ExpectedSubmoduleAPI( ... API=4, SlotNumber=2, ModuleIdentNumber=0x08c4, ... Submodules=[ ... ExpectedSubmodule( ... SubslotNumber=1, SubmoduleIdentNumber=0x0123, ... SubmoduleProperties_Type='INPUT_OUTPUT', ... DataDescription=[ ... ExpectedSubmoduleDataDescription( ... DataDescription='Output', ... SubmoduleDataLength=5, ... LengthIOPS=2, LengthIOCS=0 ... ), ... ExpectedSubmoduleDataDescription( ... DataDescription='Input', ... SubmoduleDataLength=3, ... LengthIOPS=1, LengthIOCS=2 ... ) ... ] ... ), ... ] ... ), ... ] ... ) >>> bytes(p) == \ ... bytearray.fromhex('0104002601000001') + \ ... bytearray.fromhex('000000040002000008c400000001') + \ ... bytearray.fromhex('0001000001230003') + \ ... bytearray.fromhex('000200050002') + \ ... bytearray.fromhex('000100030201') True ###(060)=[passed] ExpectedSubmoduleBlockReq dissection >>> p = ExpectedSubmoduleBlockReq( ... bytearray.fromhex('0104002601000001') + \ ... bytearray.fromhex('000000040002000008c400000001') + \ ... bytearray.fromhex('0001000001230003') + \ ... bytearray.fromhex('000200050002') + \ ... bytearray.fromhex('000100030201') + b'\xef' ... ) >>> p == ExpectedSubmoduleBlockReq(block_length=38, ... NumberOfAPIs=1, APIs=[ ... ExpectedSubmoduleAPI( ... API=4, SlotNumber=2, ModuleIdentNumber=0x08c4, ... NumberOfSubmodules=1 ,Submodules=[ ... ExpectedSubmodule( ... SubslotNumber=1, SubmoduleIdentNumber=0x0123, ... SubmoduleProperties_Type='INPUT_OUTPUT', ... DataDescription=[ ... ExpectedSubmoduleDataDescription( ... DataDescription='Output', ... SubmoduleDataLength=5, ... LengthIOPS=2, LengthIOCS=0 ... ), ... ExpectedSubmoduleDataDescription( ... DataDescription='Input', ... SubmoduleDataLength=3, ... LengthIOPS=1, LengthIOCS=2 ... ) ... ] ... ), ... ] ... ), ... ] ... ) / conf.padding_layer(b'\xef') True ###### ## Check AlarmCRBlockReq ###### ###(061)=[passed] AlarmCRBlockReq default values >>> bytes(AlarmCRBlockReq()) == bytearray.fromhex('010300160100000188920000000000010003000300c8c000a000') True ###(062)=[passed] AlarmCRBlockReq with transport >>> bytes(AlarmCRBlockReq(AlarmCRProperties_Transport=1)) == bytearray.fromhex('010300160100000108004000000000010003000300c8c000a000') True ###(063)=[passed] AlarmCRBlockReq dissection >>> p = AlarmCRBlockReq(bytearray.fromhex('010300160100000188920000000000010003000300c8c000a000')) >>> p[AlarmCRBlockReq].AlarmCRType == 0x0001 True >>> p[AlarmCRBlockReq].LocalAlarmReference == 0x0003 True ###(064)=[passed] AlarmCRBlockReq response >>> p = p.get_response() >>> p == AlarmCRBlockRes(AlarmCRType=0x0001, LocalAlarmReference=0x0003) True ###### ## Check AlarmCRBlockRes ###### ###(065)=[passed] AlarmCRBlockRes default values >>> bytes(AlarmCRBlockRes()) == bytearray.fromhex('810300080100000100000000') True ###(066)=[passed] AlarmCRBlockRes dissection >>> p = AlarmCRBlockRes(bytearray.fromhex('810300080100000100030000')) >>> p[AlarmCRBlockRes].AlarmCRType == 0x0001 True >>> p[AlarmCRBlockRes].LocalAlarmReference == 0x0003 True ###### ## Check PNIOServiceReqPDU ###### ###(067)=[passed] PNIOServiceReqPDU basic example PNIOServiceReqPDU must always be placed above a DCE/RPC layer as it requires the endianness field >>> p = DceRpc4() / PNIOServiceReqPDU(blocks=[ ... Block(load=b'\x01\x02') ... ]) >>> s = bytes(p) >>> assert s[:18] + s[24:] == b'\x04\x00\x00\x00\x10\x00\x00\x00\x00\x00\xa0\xde\x97l\xd1\x11\x82q\x01\x00\xa0\xde\x97l\xd1\x11\x82q\x00\xa0$B\xdf}\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x1c\x00\x00\x00\x00\x00\x08\x00\x00\x00\x08\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x04\x01\x00\x01\x02' ###(068)=[passed] PNIOServiceReqPDU dissection >>> p = DceRpc4( ... bytes(bytearray.fromhex('0400000000000000dea000006c9711d18271010203040506dea000016c9711d1827100a02442df7d000000000000000000000000000000000000000000000001000000000000ffffffff001c00000000' + \ ... '0000000f000000080000000f0000000000000008' + \ ... '0000000401000102ef') ... )) >>> bytes(p.payload) == bytes(PNIOServiceReqPDU(args_length=8, args_max=15, max_count=15, actual_count=8, ... blocks=[ ... Block(block_length=4, load=b'\x01\x02') ... ] ... ) / b'\xef') True ###### ## Check PNIOServiceResPDU ###### ###(069)=[passed] PNIOServiceResPDU basic example PNIOServiceResPDU must always be placed above a DCE/RPC layer as it requires the endianness field >>> p = DceRpc4() / PNIOServiceResPDU(blocks=[ ... Block(load=b'\x01\x02') ... ]) >>> s = bytes(p) >>> assert s[:18] + s[24:] == b'\x04\x02\x00\x00\x10\x00\x00\x00\x00\x00\xa0\xde\x97l\xd1\x11\x82q\x02\x00\xa0\xde\x97l\xd1\x11\x82q\x00\xa0$B\xdf}\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x04\x01\x00\x01\x02' ###(070)=[passed] PNIOServiceResPDU dissection >>> p = DceRpc4( ... bytes(bytearray.fromhex('0402000000000000dea000006c9711d18271010203040506dea000026c9711d1827100a02442df7d000000000000000000000000000000000000000000000001000000000000ffffffff001c00000000' + \ ... '00001234000000080000000f0000000000000008' + \ ... '0000000401000102ef') ... )) >>> bytes(p.payload) == bytes(PNIOServiceResPDU(status=0x1234, args_length=8, max_count=15, actual_count=8, ... blocks=[ ... Block(block_length=4, load=b'\x01\x02') ... ] ... ) / b'\xef') True ###### ## Check some basic examples ###### ###(071)=[passed] A PNIO RPC Connect Request >>> p = DceRpc4( ... endian='little', opnum=0, seqnum=0, ... object='dea00000-6c97-11d1-8271-010203040506', ... act_id='01234567-89ab-cdef-0123-456789abcdef' ... ) / PNIOServiceReqPDU( ... blocks=[ ... # AR block ... ARBlockReq( ... ARType='IOCARSingle', ARUUID='fedcba98-7654-3210-fedc-ba9876543210', SessionKey=0, ... CMInitiatorMacAdd='01:02:03:04:05:06', CMInitiatorStationName='plc-1', ... CMInitiatorObjectUUID='dea00000-6c97-11d1-8271-010203040506', ARProperties_ParametrizationServer='CM_Initator' ... ), ... # IO CR input block ... IOCRBlockReq( ... IOCRType='InputCR', IOCRReference=1, SendClockFactor=2, ... ReductionRatio=32, DataLength=40, ... APIs=[ ... IOCRAPI( ... API=0, ... IODataObjects=[ ... IOCRAPIObject(SlotNumber=3, SubslotNumber=1,FrameOffset=15), ... ], ... IOCSs=[ ... IOCRAPIObject(SlotNumber=3, SubslotNumber=1,FrameOffset=4), ... ], ... ), ... ] ... ), ... # IO CR output block ... IOCRBlockReq( ... IOCRType='OutputCR', IOCRReference=2, SendClockFactor=8, ReductionRatio=32, ... DataLength=52, FrameID=0xffff, ... APIs=[ ... IOCRAPI( ... API=0, ... IODataObjects=[ ... IOCRAPIObject(SlotNumber=3, SubslotNumber=1,FrameOffset=0), ... IOCRAPIObject(SlotNumber=1, SubslotNumber=2,FrameOffset=9), ... ], ... ), ... ] ... ), ... # List of expected submodules ... ExpectedSubmoduleBlockReq( ... APIs=[ ... ExpectedSubmoduleAPI( ... API=0, SlotNumber=3, ModuleIdentNumber=0x08c4, ... Submodules=[ ... ExpectedSubmodule( ... SubslotNumber=1, SubmoduleIdentNumber=0x0124, ... SubmoduleProperties_Type='INPUT_OUTPUT', ... DataDescription=[ ... ExpectedSubmoduleDataDescription( ... DataDescription='Output', ... SubmoduleDataLength=3, ... LengthIOPS=1, LengthIOCS=1 ... ), ... ExpectedSubmoduleDataDescription( ... DataDescription='Input', ... SubmoduleDataLength=5, ... LengthIOPS=2, LengthIOCS=0 ... ) ... ] ... ), ... ] ... ), ... ] ... ), ... ExpectedSubmoduleBlockReq( ... APIs=[ ... ExpectedSubmoduleAPI( ... API=0, SlotNumber=1, ModuleIdentNumber=0x08c3, ... Submodules=[ ... ExpectedSubmodule( ... SubslotNumber=2, SubmoduleIdentNumber=0x0424, ... SubmoduleProperties_Type='OUTPUT', ... DataDescription=[ ... ExpectedSubmoduleDataDescription( ... DataDescription='Output', ... SubmoduleDataLength=5, ... LengthIOPS=1, LengthIOCS=0 ... ) ... ] ... ), ... ] ... ), ... ] ... ), ... ] ... ) >>> bytes(p) == bytearray.fromhex( ... '04000000100000000000a0de976cd11182710102030405060100a0de976cd111827100a02442df7d67452301ab89efcd0123456789abcdef0000000001000000000000000000ffffffff250100000000' + \ ... '1101000011010000110100000000000011010000' + \ ... '0101003b01000001fedcba9876543210fedcba98765432100000010203040506dea000006c9711d182710102030405060000001103e888920005') + b'plc-1' + \ ... bytearray.fromhex('0102003e010000010001889200000000002880000002002000010000ffffffff000a000ac0000000000000000001' + \ ... '00000000000100030001000f0001000300010004' + \ ... '0102003e0100000200028892000000000034ffff0008002000010000ffffffff000a000ac0000000000000000001' + \ ... '0000000000020003000100000001000200090000' + \ ... '0104002601000001000000000003000008c400000001' + \ ... '0001000001240003' + \ ... '000200030101' + \ ... '000100050002' + \ ... '0104002001000001000000000001000008c300000001' + \ ... '0002000004240002' + \ ... '000200050001') True ###(072)=[passed] A PNIO RPC Write Request >>> p = DceRpc4( ... endian='little', opnum=2, seqnum=1, ... object='dea00000-6c97-11d1-8271-010203040506', ... act_id='01234567-89ab-cdef-0123-456789abcdef' ... ) / PNIOServiceReqPDU( ... blocks=[ ... IODWriteMultipleReq( ... seqNum=0, ARUUID='fedcba98-7654-3210-fedc-ba9876543210', blocks=[ ... IODWriteReq( ... seqNum=1, API=0, slotNumber=1, subslotNumber=1, index=0x123, ... ARUUID='fedcba98-7654-3210-fedc-ba9876543210' ... ) / b'\x01\x02', ... IODWriteReq( ... seqNum=2, API=0, slotNumber=3, subslotNumber=1, ... ARUUID='fedcba98-7654-3210-fedc-ba9876543210' ... ) / FParametersBlock( ... F_CRC_Seed=1, F_CRC_Length='CRC-24', F_Source_Add=0xc1, F_Dest_Add=0xc2, ... F_WD_Time=500, F_Par_CRC=0x1234 ... ), ... ] ... ) ... ] ... ) >>> bytes(p) == bytearray.fromhex( ... '04000000100000000000a0de976cd11182710102030405060100a0de976cd111827100a02442df7d67452301ab89efcd0123456789abcdef0000000001000000010000000200ffffffffe20000000000' + \ ... 'ce000000ce000000ce00000000000000ce000000' + \ ... '0008003c01000000fedcba9876543210fedcba9876543210ffffffffffffffff0000e0400000008e' + '00' * 24 + \ ... '0008003c01000001fedcba9876543210fedcba987654321000000000000100010000012300000002' + '00' * 24 + \ ... '01020000' + \ ... '0008003c01000002fedcba9876543210fedcba98765432100000000000030001000001000000000a' + '00' * 24 + \ ... '484000c100c201f41234') True ###(073)=[passed] A PNIO RPC PrmEnd Control Request >>> p = DceRpc4( ... endian='little', opnum=0, seqnum=2, ... object='dea00000-6c97-11d1-8271-010203040506', ... act_id='01234567-89ab-cdef-0123-456789abcdef' ... ) / PNIOServiceReqPDU( ... blocks=[ ... IODControlReq(ARUUID='fedcba98-7654-3210-fedc-ba9876543210', SessionKey=0, ControlCommand_PrmEnd=1) ... ] ... ) >>> bytes(p) == bytearray.fromhex( ... '04000000100000000000a0de976cd11182710102030405060100a0de976cd111827100a02442df7d67452301ab89efcd0123456789abcdef0000000001000000020000000000ffffffff340000000000' + \ ... '2000000020000000200000000000000020000000' + \ ... '0110001c01000000fedcba9876543210fedcba98765432100000000000010000') True ###(074)=[passed] A PNIO RPC PrmEnd Control Request >>> p = DceRpc4( ... endian='little', opnum=0, seqnum=0, ... object='dea00000-6c97-11d1-8271-060504030201', ... act_id='01020304-0506-0708-090a-0b0c0d0e0f00', ... if_id=RPC_INTERFACE_UUID['UUID_IO_ControllerInterface'], ... ) / PNIOServiceReqPDU( ... blocks=[ ... IODControlReq(ARUUID='fedcba98-7654-3210-fedc-ba9876543210', SessionKey=0, ControlCommand_ApplicationReady=1) ... ] ... ) >>> bytes(p) == bytearray.fromhex( ... '04000000100000000000a0de976cd11182710605040302010200a0de976cd111827100a02442df7d0403020106050807090a0b0c0d0e0f000000000001000000000000000000ffffffff340000000000' + \ ... '2000000020000000200000000000000020000000' + \ ... '0112001c01000000fedcba9876543210fedcba98765432100000000000020000') True ###(075)=[passed] PNIO Alarm decoding (Alarm_Low) >>> p = Ether(b'\x00\x11\x22\x33\x44\x55' \ ... b'\x00\x66\x77\x88\x99\xaa' \ ... b'\x81\x00\xa0\x00' \ ... b'\x88\x92' \ ... b'\xfe\x01' \ ... b'\x00\x03\x00\x03\x11\x11\xff\xff\xff\xfe\x00\x36' \ ... b'\x00\x02\x00\x32\x01\x00\x00\x01\x00\x00\x00\x00\x00' \ ... b'\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x08\x00' \ ... b'\x81\x00\x0f\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\x02' \ ... b'\x80\x02\x00\x0f\x2c\x00\x00\x05\x80\x00\x00\x00\x00\x22') >>> assert p[ProfinetIO].frameID == 0xfe01 >>> assert isinstance(p[ProfinetIO].payload, Alarm_Low) >>> assert p[AlarmNotification_Low].block_type == 0x0002 >>> assert isinstance(p[AlarmNotification_Low].AlarmPayload[0], MaintenanceItem) >>> assert p[MaintenanceItem].UserStructureIdentifier == 0x8100 >>> assert isinstance(p[AlarmNotification_Low].AlarmPayload[1], DiagnosisItem) >>> assert p[DiagnosisItem].UserStructureIdentifier == 0x8002 ###(076)=[passed] PNIO Alarm decoding (Alarm_High) >>> p = Ether(b'\x00\x11\x22\x33\x44\x55' \ ... b'\x00\x66\x77\x88\x99\xaa' \ ... b'\x81\x00\xa0\x00' \ ... b'\x88\x92' \ ... b'\xfc\x01' \ ... b'\x00\x03\x00\x03\x11\x11\xff\xff\xff\xfe\x00\x36' \ ... b'\x00\x02\x00\x32\x01\x00\x00\x01\x00\x00\x00\x00\x00' \ ... b'\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x08\x00' \ ... b'\x81\x00\x0f\x00\x00\x08\x01\x00\x00\x00\x00\x00\x00\x02' \ ... b'\x80\x02\x00\x0f\x2c\x00\x00\x05\x80\x00\x00\x00\x00\x22') >>> assert p[ProfinetIO].frameID == 0xfc01 >>> assert isinstance(p[ProfinetIO].payload, Alarm_High) >>> assert p[AlarmNotification_High].block_type == 0x0002 >>> assert isinstance(p[AlarmNotification_High].AlarmPayload[0], MaintenanceItem) >>> assert p[MaintenanceItem].UserStructureIdentifier == 0x8100 >>> assert isinstance(p[AlarmNotification_High].AlarmPayload[1], DiagnosisItem) >>> assert p[DiagnosisItem].UserStructureIdentifier == 0x8002 ###(077)=[passed] PNIO Alarm DiagnosisItem >>> p = AlarmNotification_Low(AlarmPayload=[MaintenanceItem(), DiagnosisItem()]) >>> assert raw(p) == bytearray.fromhex('0002002c0100000000000000000000000000000000000000000000000000000001000000000000000000000000000000') ###(078)=[passed] PNIO Alarm UploadRetrievalItem >>> p = AlarmNotification_Low(AlarmPayload=[MaintenanceItem(), UploadRetrievalItem()]) >>> assert raw(p) == bytearray.fromhex('00020036010000000000000000000000000000000000000000000000000000000100000000000000000000000000010000000000000000000000') ###(079)=[passed] PNIO Alarm iParameterItem >>> p = AlarmNotification_Low(AlarmPayload=[MaintenanceItem(), iParameterItem()]) >>> assert raw(p) == bytearray.fromhex('0002003e0100000000000000000000000000000000000000000000000000000001000000000000000000000000000100000000000000000000000000000000000000') ###(080)=[passed] PNIO Alarm RS_AlarmItem >>> p = AlarmNotification_Low(AlarmPayload=[MaintenanceItem(), RS_AlarmItem()]) >>> assert raw(p) == bytearray.fromhex('0002002801000000000000000000000000000000000000000000000000000000010000000000000000000000') ###(081)=[passed] PNIO Alarm PRAL_AlarmItem >>> p = AlarmNotification_Low(AlarmPayload=[MaintenanceItem(), PRAL_AlarmItem()]) >>> assert raw(p) == bytearray.fromhex('0002002e01000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000') ###(082)=[passed] PNIO PDPortDataAdjust Decoding >>> raw = bytearray.fromhex('0402280000000000dea000006c9711d182710001000305f9dea000016' \ ... 'c9711d1827100a02442df7d0777bc51ddaa4d07addb7075183fc28b00' \ ... '00000000000001000000000002ffffffff007c0000000000000000000' \ ... '000680000004000000000000000688009003c0100000002ba501cd47e' \ ... '40d3a0b545fd4ac70eb900000000000080020000802f0000002800000' \ ... '000000000000000000000000000000000000000000002020024010000' \ ... '00000080020224000c010000000000000100000000021b00080100000' \ ... '000010000') >>> p = DceRpc4(raw) >>> assert p[PDPortDataAdjust].subslotNumber == 0x8002 >>> assert p[AdjustPeerToPeerBoundary].peerToPeerBoundary == 0x1 >>> assert LINKSTATE_LINK[p[AdjustLinkState].LinkState] == 'Up' Tests for portmap module ━ Run at 01:43:09 from [test/contrib/portmap.uts] by UTscapy in 0.05017971992492676 └ Passed=6 └ Failed=0 ###### ## Packet Creation Tests ###### ###(000)=[passed] Create subpackets >>> Map_Entry() ###(001)=[passed] Create Portmap Packets >>> NULL_Call() >>> NULL_Reply() >>> DUMP_Call() >>> DUMP_Reply() >>> GETPORT_Call() >>> GETPORT_Reply() ###### ## Test Layer bindings ###### ###(002)=[passed] RPC Layer Bindings for Portmap calls >>> from scapy.contrib.oncrpc import * >>> pkt = RPC()/RPC_Call()/NULL_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100000, 2, 0) >>> pkt = RPC()/RPC_Call()/GETPORT_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100000, 2, 3) >>> pkt = RPC()/RPC_Call()/DUMP_Call() >>> assert (pkt.mtype, pkt.program, pkt.pversion, pkt.procedure) == (0, 100000, 2, 4) ###(003)=[passed] RPC Layer Bindings for Portmap replies >>> from scapy.contrib.oncrpc import * >>> pkt = RPC()/RPC_Reply()/NULL_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/GETPORT_Reply() >>> assert pkt.mtype == 1 >>> pkt = RPC()/RPC_Reply()/DUMP_Reply() >>> assert pkt.mtype == 1 ###### ## Test Built Packets vs Raw Strings ###### ###(004)=[passed] Portmap calls vs Raw Strings >>> pkt = GETPORT_Call( ... prog=100003, ... vers=3, ... prot=6, ... port=0 ... ) >>> assert bytes(pkt) == b'\x00\x01\x86\xa3\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x00' ###(005)=[passed] Portmap replies vs Raw Strings >>> pkt = GETPORT_Reply( ... port=2049 ... ) >>> assert bytes(pkt) == b'\x00\x00\x08\x01' >>> >>> pkt = DUMP_Reply(value_follows=1, ... mappings=[Map_Entry(prog=1, vers=2, prot=3, port=4, value_follows=1), ... Map_Entry(prog=5, vers=6, prot=7, port=8, value_follows=0), ... ] ... ) >>> assert bytes(pkt) == b'\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\x00' Test campaign ━ Run at 01:43:09 from [test/contrib/postgres.uts] by UTscapy in 0.06502199172973633 └ Passed=12 └ Failed=0 ###### ## postgres ###### ###(000)=[passed] postgres initialization >>> from scapy.contrib.postgres import * >>> >>> ssl_request = "\x00\x00\x00\x08\x04\xd2\x16\x2f" >>> >>> startup = Startup( ... b"\x00\x00\x00\x57\x00\x03\x00\x00\x75\x73\x65\x72\x00\x70\x6f\x73" ... b"\x74\x67\x72\x65\x73\x00\x64\x61\x74\x61\x62\x61\x73\x65\x00\x70" ... b"\x6f\x73\x74\x67\x72\x65\x73\x00\x61\x70\x70\x6c\x69\x63\x61\x74" ... b"\x69\x6f\x6e\x5f\x6e\x61\x6d\x65\x00\x70\x73\x71\x6c\x00\x63\x6c" ... b"\x69\x65\x6e\x74\x5f\x65\x6e\x63\x6f\x64\x69\x6e\x67\x00\x57\x49" ... b"\x4e\x31\x32\x35\x32\x00\x00" ... ) >>> >>> assert startup.len == 87 >>> assert startup.protocol_version_major == 3 >>> assert startup.protocol_version_minor == 0 >>> assert ( ... startup.options ... == b"user\x00postgres\x00database\x00postgres\x00application_name\x00psql\x00client_encoding\x00WIN1252\x00\x00" ... ) >>> >>> init_packet = ( ... b"\x52\x00\x00\x00\x08\x00\x00\x00\x00\x53\x00\x00\x00\x1a\x61\x70" ... b"\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x5f\x6e\x61\x6d\x65\x00\x70" ... b"\x73\x71\x6c\x00\x53\x00\x00\x00\x1c\x63\x6c\x69\x65\x6e\x74\x5f" ... b"\x65\x6e\x63\x6f\x64\x69\x6e\x67\x00\x57\x49\x4e\x31\x32\x35\x32" ... b"\x00\x53\x00\x00\x00\x17\x44\x61\x74\x65\x53\x74\x79\x6c\x65\x00" ... b"\x49\x53\x4f\x2c\x20\x4d\x44\x59\x00\x53\x00\x00\x00\x26\x64\x65" ... b"\x66\x61\x75\x6c\x74\x5f\x74\x72\x61\x6e\x73\x61\x63\x74\x69\x6f" ... b"\x6e\x5f\x72\x65\x61\x64\x5f\x6f\x6e\x6c\x79\x00\x6f\x66\x66\x00" ... b"\x53\x00\x00\x00\x17\x69\x6e\x5f\x68\x6f\x74\x5f\x73\x74\x61\x6e" ... b"\x64\x62\x79\x00\x6f\x66\x66\x00\x53\x00\x00\x00\x19\x69\x6e\x74" ... b"\x65\x67\x65\x72\x5f\x64\x61\x74\x65\x74\x69\x6d\x65\x73\x00\x6f" ... b"\x6e\x00\x53\x00\x00\x00\x1b\x49\x6e\x74\x65\x72\x76\x61\x6c\x53" ... b"\x74\x79\x6c\x65\x00\x70\x6f\x73\x74\x67\x72\x65\x73\x00\x53\x00" ... b"\x00\x00\x14\x69\x73\x5f\x73\x75\x70\x65\x72\x75\x73\x65\x72\x00" ... b"\x6f\x6e\x00\x53\x00\x00\x00\x19\x73\x65\x72\x76\x65\x72\x5f\x65" ... b"\x6e\x63\x6f\x64\x69\x6e\x67\x00\x55\x54\x46\x38\x00\x53\x00\x00" ... b"\x00\x32\x73\x65\x72\x76\x65\x72\x5f\x76\x65\x72\x73\x69\x6f\x6e" ... b"\x00\x31\x34\x2e\x32\x20\x28\x44\x65\x62\x69\x61\x6e\x20\x31\x34" ... b"\x2e\x32\x2d\x31\x2e\x70\x67\x64\x67\x31\x31\x30\x2b\x31\x29\x00" ... b"\x53\x00\x00\x00\x23\x73\x65\x73\x73\x69\x6f\x6e\x5f\x61\x75\x74" ... b"\x68\x6f\x72\x69\x7a\x61\x74\x69\x6f\x6e\x00\x70\x6f\x73\x74\x67" ... b"\x72\x65\x73\x00\x53\x00\x00\x00\x23\x73\x74\x61\x6e\x64\x61\x72" ... b"\x64\x5f\x63\x6f\x6e\x66\x6f\x72\x6d\x69\x6e\x67\x5f\x73\x74\x72" ... b"\x69\x6e\x67\x73\x00\x6f\x6e\x00\x53\x00\x00\x00\x15\x54\x69\x6d" ... b"\x65\x5a\x6f\x6e\x65\x00\x45\x74\x63\x2f\x55\x54\x43\x00\x4b\x00" ... b"\x00\x00\x0c\x00\x00\x01\x7f\x43\x4c\x36\xa5\x5a\x00\x00\x00\x05\x49" ... ) ###(001)=[passed] postgres backend sequence >>> init = PostgresBackend(init_packet) >>> >>> assert isinstance(init.contents[0], Authentication) >>> assert init.contents[0].len == 8 >>> assert init.contents[0].method == 0 >>> assert len(init.contents) == 16 >>> assert isinstance(init.contents[1], ParameterStatus) >>> assert init.contents[1].len == 26 >>> assert init.contents[1].parameter == b"application_name" >>> assert init.contents[1].value == b"psql" ###(002)=[passed] simple queries >>> simple_query_packet = ( ... b"\x51\x00\x00\x00\x15\x53\x45\x4c\x45\x43\x54\x20\x56\x45\x52\x53" ... b"\x49\x4f\x4e\x28\x29\x00" ... ) >>> simple_query = PostgresFrontend(simple_query_packet) >>> >>> assert isinstance(simple_query.contents[0], Query) >>> assert simple_query.contents[0].len == 21 >>> assert simple_query.contents[0].query == b"SELECT VERSION()" >>> >>> pair = SignedIntStrPair(b"\x00\x00\x00\x04\x01\x02\x03\x04") >>> >>> assert pair.len == 4 >>> assert pair.data == b"\x01\x02\x03\x04" >>> >>> command_response_packet = ( ... b"\x54\x00\x00\x00\x20\x00\x01\x76\x65\x72\x73\x69\x6f\x6e\x00\x00" ... b"\x00\x00\x00\x00\x00\x00\x00\x00\x19\xff\xff\xff\xff\xff\xff\x00" ... b"\x00\x44\x00\x00\x00\x85\x00\x01\x00\x00\x00\x7b\x50\x6f\x73\x74" ... b"\x67\x72\x65\x53\x51\x4c\x20\x31\x34\x2e\x32\x20\x28\x44\x65\x62" ... b"\x69\x61\x6e\x20\x31\x34\x2e\x32\x2d\x31\x2e\x70\x67\x64\x67\x31" ... b"\x31\x30\x2b\x31\x29\x20\x6f\x6e\x20\x78\x38\x36\x5f\x36\x34\x2d" ... b"\x70\x63\x2d\x6c\x69\x6e\x75\x78\x2d\x67\x6e\x75\x2c\x20\x63\x6f" ... b"\x6d\x70\x69\x6c\x65\x64\x20\x62\x79\x20\x67\x63\x63\x20\x28\x44" ... b"\x65\x62\x69\x61\x6e\x20\x31\x30\x2e\x32\x2e\x31\x2d\x36\x29\x20" ... b"\x31\x30\x2e\x32\x2e\x31\x20\x32\x30\x32\x31\x30\x31\x31\x30\x2c" ... b"\x20\x36\x34\x2d\x62\x69\x74\x43\x00\x00\x00\x0d\x53\x45\x4c\x45" ... b"\x43\x54\x20\x31\x00\x5a\x00\x00\x00\x05\x49" ... ) ###(003)=[passed] row data response >>> command_response = PostgresBackend(command_response_packet) >>> >>> assert len(command_response.contents) == 4 >>> assert isinstance(command_response.contents[0], RowDescription) >>> rd = command_response.contents[0] >>> assert rd.len == 32 >>> assert rd.numfields == 1 >>> assert rd.cols[0].col == b"version" >>> assert rd.cols[0].tableoid == 0 >>> assert rd.cols[0].colno == 0 >>> assert rd.cols[0].typeoid == 25 >>> assert rd.cols[0].typelen == -1 >>> assert rd.cols[0].format == 0 >>> assert rd.cols[0].typemod == -1 >>> >>> assert isinstance(command_response.contents[1], DataRow) >>> assert command_response.contents[1].len == 133 >>> assert command_response.contents[1].numfields == 1 >>> assert len(command_response.contents[1].data) == 1 >>> assert isinstance(command_response.contents[1].data[0], SignedIntStrPair) >>> assert command_response.contents[1].data[0].len == 123 >>> assert ( ... command_response.contents[1].data[0].data ... == b"PostgreSQL 14.2 (Debian 14.2-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit" ... ) >>> >>> assert isinstance(command_response.contents[2], CommandComplete) >>> assert isinstance(command_response.contents[3], ReadyForQuery) >>> >>> three_col_rd = RowDescription( ... b"\x54\x00\x00\x00\x55\x00\x03\x6e\x61\x6d\x65\x00\x00\x00\x00\x00" ... b"\x00\x00\x00\x00\x00\x19\xff\xff\xff\xff\xff\xff\x00\x00\x73\x65" ... b"\x74\x74\x69\x6e\x67\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19" ... b"\xff\xff\xff\xff\xff\xff\x00\x00\x64\x65\x73\x63\x72\x69\x70\x74" ... b"\x69\x6f\x6e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x19\xff\xff" ... b"\xff\xff\xff\xff\x00\x00" ... ) >>> assert three_col_rd.len == 85 >>> assert three_col_rd.numfields == 3 >>> assert len(three_col_rd.cols) == 3 >>> >>> three_col_dr = DataRow( ... b"\x44\x00\x00\x00\x63\x00\x03\x00\x00\x00\x17\x61\x6c\x6c\x6f\x77" ... b"\x5f\x73\x79\x73\x74\x65\x6d\x5f\x74\x61\x62\x6c\x65\x5f\x6d\x6f" ... b"\x64\x73\x00\x00\x00\x03\x6f\x66\x66\x00\x00\x00\x37\x41\x6c\x6c" ... b"\x6f\x77\x73\x20\x6d\x6f\x64\x69\x66\x69\x63\x61\x74\x69\x6f\x6e" ... b"\x73\x20\x6f\x66\x20\x74\x68\x65\x20\x73\x74\x72\x75\x63\x74\x75" ... b"\x72\x65\x20\x6f\x66\x20\x73\x79\x73\x74\x65\x6d\x20\x74\x61\x62" ... b"\x6c\x65\x73\x2e" ... ) >>> >>> assert three_col_dr.numfields == 3 >>> assert len(three_col_dr.data) == 3 >>> assert three_col_dr.data[0].len == 23 >>> assert three_col_dr.data[0].data == b"allow_system_table_mods" >>> assert three_col_dr.data[1].len == 3 >>> assert three_col_dr.data[1].data == b"off" >>> assert three_col_dr.data[2].len == 55 >>> assert ( ... three_col_dr.data[2].data ... == b"Allows modifications of the structure of system tables." ... ) ###(004)=[passed] errors >>> error_response = ErrorResponse( ... b"\x45\x00\x00\x00\x69\x53\x45\x52\x52\x4f\x52\x00\x56\x45\x52\x52" ... b"\x4f\x52\x00\x43\x34\x32\x50\x30\x31\x00\x4d\x72\x65\x6c\x61\x74" ... b"\x69\x6f\x6e\x20\x22\x66\x6f\x6f\x62\x61\x72\x22\x20\x64\x6f\x65" ... b"\x73\x20\x6e\x6f\x74\x20\x65\x78\x69\x73\x74\x00\x50\x31\x35\x00" ... b"\x46\x70\x61\x72\x73\x65\x5f\x72\x65\x6c\x61\x74\x69\x6f\x6e\x2e" ... b"\x63\x00\x4c\x31\x33\x38\x31\x00\x52\x70\x61\x72\x73\x65\x72\x4f" ... b"\x70\x65\x6e\x54\x61\x62\x6c\x65\x00\x00" ... ) >>> >>> assert len(error_response.error_fields) == 8 >>> assert error_response.error_fields[0] == ("Severity", b"ERROR") >>> assert error_response.error_fields[7] == ("Routine", b"parserOpenTable") ###(005)=[passed] copy data response and request >>> copyin_response = CopyInResponse(b"\x47\x00\x00\x00\x0f\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00") >>> >>> assert copyin_response.len == 15 >>> assert copyin_response.format == 0 # Text >>> assert len(copyin_response.cols) == 4 >>> assert copyin_response.ncols == 4 >>> assert copyin_response.cols[0] == 0 # Text >>> assert copyin_response.cols[1] == 0 # Text >>> assert copyin_response.cols[2] == 0 # Text >>> assert copyin_response.cols[3] == 0 # Text >>> >>> copydata_in = PostgresFrontend(b"\x64\x00\x00\x00\x10\x31\x2c\x42\x6f\x62\x2c\x32\x33\x2c\x31\x0d" \ ... b"\x0a\x64\x00\x00\x00\x12\x32\x2c\x53\x61\x6c\x6c\x79\x2c\x34\x33" \ ... b"\x2c\x32\x0d\x0a\x64\x00\x00\x00\x14\x33\x2c\x50\x61\x72\x64\x65" \ ... b"\x65\x70\x2c\x35\x34\x2c\x33\x0d\x0a\x64\x00\x00\x00\x0f\x34\x2c" \ ... b"\x53\x75\x2c\x33\x32\x2c\x34\x0d\x0a\x64\x00\x00\x00\x0f\x35\x2c" \ ... b"\x58\x69\x2c\x34\x33\x2c\x35\x0d\x0a\x64\x00\x00\x00\x0e\x36\x2c" \ ... b"\x50\x69\x70\x2c\x36\x36\x2c\x36\x63\x00\x00\x00\x04" ... ) >>> >>> copyout_response = CopyOutResponse(b"\x48\x00\x00\x00\x0f\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00") >>> assert copyout_response.len == 15 >>> >>> copydata_out = PostgresBackend(b"\x48\x00\x00\x00\x0f\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\x64\x00\x00\x00\x0f\x31\x09\x42\x6f\x62\x09\x32\x33\x09\x31\x0a" \ ... b"\x64\x00\x00\x00\x11\x32\x09\x53\x61\x6c\x6c\x79\x09\x34\x33\x09" \ ... b"\x32\x0a\x64\x00\x00\x00\x13\x33\x09\x50\x61\x72\x64\x65\x65\x70" \ ... b"\x09\x35\x34\x09\x33\x0a\x64\x00\x00\x00\x0e\x34\x09\x53\x75\x09" \ ... b"\x33\x32\x09\x34\x0a\x64\x00\x00\x00\x0e\x35\x09\x58\x69\x09\x34" \ ... b"\x33\x09\x35\x0a\x64\x00\x00\x00\x0f\x36\x09\x50\x69\x70\x09\x36" \ ... b"\x36\x09\x36\x0a\x63\x00\x00\x00\x04\x43\x00\x00\x00\x0b\x43\x4f" \ ... b"\x50\x59\x20\x36\x00\x5a\x00\x00\x00\x05\x49") >>> >>> assert len(copydata_out.contents) == 10 >>> assert copydata_out.contents[0].len == 15 >>> assert isinstance(copydata_out.contents[0], CopyOutResponse) >>> assert isinstance(copydata_out.contents[1], CopyData) >>> assert copydata_out.contents[1].len == 15 >>> assert copydata_out.contents[1].data == b'1\tBob\t23\t1\n' >>> assert isinstance(copydata_out.contents[2], CopyData) >>> assert copydata_out.contents[2].data == b'2\tSally\t43\t2\n' >>> assert isinstance(copydata_out.contents[3], CopyData) >>> assert copydata_out.contents[3].data == b'3\tPardeep\t54\t3\n' >>> assert isinstance(copydata_out.contents[4], CopyData) >>> assert copydata_out.contents[4].data == b'4\tSu\t32\t4\n' >>> assert isinstance(copydata_out.contents[5], CopyData) >>> assert copydata_out.contents[5].data == b'5\tXi\t43\t5\n' >>> assert isinstance(copydata_out.contents[6], CopyData) >>> assert copydata_out.contents[6].data == b'6\tPip\t66\t6\n' >>> assert isinstance(copydata_out.contents[7], CopyDone) >>> assert isinstance(copydata_out.contents[8], CommandComplete) >>> assert isinstance(copydata_out.contents[9], ReadyForQuery) ###(006)=[passed] Check example request packet >>> request = PostgresFrontend( ... b"\x50\x00\x00\x00\x64\x00\x53\x45\x4c\x45\x43\x54\x20\x44\x5f\x4e" ... b"\x45\x58\x54\x5f\x4f\x5f\x49\x44\x2c\x20\x44\x5f\x54\x41\x58\x20" ... b"\x20\x20\x46\x52\x4f\x4d\x20\x64\x69\x73\x74\x72\x69\x63\x74\x20" ... b"\x57\x48\x45\x52\x45\x20\x44\x5f\x57\x5f\x49\x44\x20\x3d\x20\x24" ... b"\x31\x20\x41\x4e\x44\x20\x44\x5f\x49\x44\x20\x3d\x20\x24\x32\x20" ... b"\x46\x4f\x52\x20\x55\x50\x44\x41\x54\x45\x00\x00\x02\x00\x00\x00" ... b"\x17\x00\x00\x00\x17\x42\x00\x00\x00\x20\x00\x00\x00\x02\x00\x01" ... b"\x00\x01\x00\x02\x00\x00\x00\x04\x00\x00\x00\x14\x00\x00\x00\x04" ... b"\x00\x00\x00\x0a\x00\x00\x44\x00\x00\x00\x06\x50\x00\x45\x00\x00" ... b"\x00\x09\x00\x00\x00\x00\x00\x53\x00\x00\x00\x04" ... ) >>> >>> assert len(request.contents) == 5 >>> assert isinstance(request.contents[0], Parse) >>> assert isinstance(request.contents[1], Bind) >>> assert isinstance(request.contents[2], Describe) >>> assert isinstance(request.contents[3], Execute) >>> assert isinstance(request.contents[4], Sync) ###(007)=[passed] Check parse decoding >>> parse_msg = request.contents[0] >>> assert parse_msg.len == 100 >>> assert parse_msg.destination == b"" >>> assert parse_msg.query == b"SELECT D_NEXT_O_ID, D_TAX FROM district WHERE D_W_ID = $1 AND D_ID = $2 FOR UPDATE" >>> assert parse_msg.num_param_dtypes == 2 >>> assert parse_msg.params[0] == 23 >>> assert parse_msg.params[1] == 23 ###(008)=[passed] Check bind decoding >>> bind_msg = request.contents[1] >>> assert bind_msg.len == 32 >>> assert bind_msg.destination == b"" >>> assert bind_msg.statement == b"" >>> assert bind_msg.codes_count == 2 >>> assert bind_msg.codes[0] == 1 >>> assert bind_msg.codes[1] == 1 >>> assert bind_msg.values_count == 2 >>> assert bind_msg.values[0].len == 4 >>> assert bind_msg.values[0].data == b"\x00\x00\x00\x14" >>> assert bind_msg.values[1].len == 4 >>> assert bind_msg.values[1].data == b"\x00\x00\x00\x0a" >>> assert bind_msg.results_count == 0 ###(009)=[passed] Check describe decoding >>> describe_msg = request.contents[2] >>> assert describe_msg.len == 6 >>> assert describe_msg.close_type == b"P" >>> assert describe_msg.statement == b"" ###(010)=[passed] Check execute decoding >>> exec_msg = request.contents[3] >>> assert exec_msg.len == 9 >>> assert exec_msg.portal == b"" >>> assert exec_msg.rows == 0 ###(011)=[passed] Check sync decoding >>> sync_msg = request.contents[4] >>> assert sync_msg.len == 4 PPI/PPI_CACE/PPI_GEOTAG Global Campaign ━ Run at 01:43:09 from [test/contrib/ppi_cace.uts] by UTscapy in 0.3022274971008301 └ Passed=13 └ Failed=0 ###### ## PPI Tests ###### ###(000)=[passed] Define test suite >>> from scapy.contrib.ppi_cace import * >>> from scapy.contrib.ppi_geotag import * >>> >>> >>> >>> def Pkt_10_1(): ... """GPS Only""" ... pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(Latitude=40.787743,Longitude=-73.971210)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:01")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.1") ... return PPI(raw(pkt)) ... >>> def Pkt_10_2(): ... """GPS + VECTOR + ANTENNA + RADIOTAP""" #No radiotap support yet... ... pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(Latitude=40.787743, Longitude=-73.971210), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x02, VectorChars="Antenna", Pitch=90.0, Roll=0.0, Heading=0.0, DescString="Antenna-1 orientation"), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x02,Gain=8,HorizBw=360.0,ModelName="8dBi-MagMountOmni"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-80,Antnoise=-110,Ch_Freq=2437)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:02")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.2") ... return PPI(raw(pkt)) ... >>> def Pkt_10_3(): ... """Direction of travel + one directional antenna, with Pitch in ForwardFrame""" ... pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(GPSFlags=0x02, Latitude=40.787743, Longitude=-73.971210), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x03, VectorChars=0x06, Pitch=10.0, Heading=22.5, DescString="VehicleVec"), ... PPI_Hdr()/PPI_Geotag_Sensor(SensorType="Velocity", Val_T=20.0), ... PPI_Hdr()/PPI_Geotag_Vector( VectorChars=0x01, Heading=90.0, DescString="AntennaVec"), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x02,Gain=9,HorizBw=120,ModelName="SA24-120-9"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-75,Antnoise=-110,Ch_Freq=2437)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:03")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.3") ... return PPI(raw(pkt)) #Cause the fields to be built ... >>> def Pkt_10_4(): ... """Two static directional antennas with offsets""" ... pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(GPSFlags=0x02, Latitude=40.787743, Longitude=-73.971210, Altitude_g=2.00), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x03, VectorChars=0x06, Pitch=10.0, Heading=22.5), ... PPI_Hdr()/PPI_Geotag_Sensor(SensorType="Velocity", Val_T=8.5), ... PPI_Hdr()/PPI_Geotag_Sensor(SensorType="Acceleration", Val_T=0.5), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x00, VectorChars=0x01, Heading=90.0, Off_X=0.75, Off_Y=0.6, Off_Z=-0.2, DescString="Antenna1Vec"), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x02,Gain=9,HorizBw=120,ModelName="SA24-120-9",DescString="RightAntenna"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-75,Antnoise=-110,Ch_Freq=2437), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x00, VectorChars=0x01, Heading=270.0, Off_X=-0.75, Off_Y=0.6, Off_Z=-0.2, DescString="Antenna2Vec"), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x02,Gain=9,HorizBw=120,ModelName="SA24-120-9",DescString="LeftAntenna"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-95,Antnoise=-110,Ch_Freq=2437)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:04")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.4") ... return PPI(raw(pkt)) #Cause the fields to be built ... >>> def Pkt_10_5(): ... """Similar to 10_3, but with a electronically steerable antenna""" ... pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(GPSFlags=0x02, Latitude=40.787743, Longitude=-73.971210), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x03, VectorChars=0x06, Pitch=00.0, Heading=22.5, DescString="VehicleVec"), ... PPI_Hdr()/PPI_Geotag_Vector( VectorChars=0x01, Heading=120.0, DescString="AntennaVec"), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x010002,Gain=12,HorizBw=60,BeamID=0xF1A1, ModelName="ElectronicallySteerableExAntenna", AppId=0x04030201), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-75,Antnoise=-110,Ch_Freq=2437)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:05")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.5") ... return PPI(raw(pkt)) #Cause the fields to be built ... >>> def Pkt_10_6(): ... """Mechanically steerable antenna. Non-intuitive forward""" ... pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(GPSFlags=0x02, Latitude=40.787743, Longitude=-73.971210), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x02, VectorChars=0x06, Heading=22.5, DescString="VehicleVec"), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x03, VectorChars=0x00, Heading=202.5, DescString="ForwardVec"), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x00, VectorChars=0x01, Heading=75.0, DescString="AntennaVec"), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x020002,Gain=12,HorizBw=60,ModelName="MechanicallySteerableAnt"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-77,Antnoise=-110,Ch_Freq=2437)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:06")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.6") ... return PPI(raw(pkt)) #Cause the fields to be built ... >>> def Pkt_10_7(): ... """Drifting boat.""" ... pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(GPSFlags=0x02, Latitude= 41.876154, Longitude=-87.608602), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x03, VectorChars=0x04, Heading=50.0, DescString="VehicleVec"), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x00, VectorChars=0x02, Heading=230.0, DescString="DOT-Vec"), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x00, VectorChars=0x01, Heading=90.0, DescString="AntennaVec"), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x02,Gain=9,HorizBw=120,ModelName="SA24-120-9"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-77,Antnoise=-110,Ch_Freq=2437)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:07")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.7") ... return PPI(raw(pkt)) #Cause the fields to be built ... >>> def Pkt_10_8(): ... """Time of arrival analysis""" ... pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(GPSFlags="Manual Input", Latitude=41.861885, Longitude=-87.616926, GPSTime=1288720719, FractionalTime=0.20), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x02, VectorChars=0x01, Pitch=90.0, DescString="Antenna-1 orientation"), ... PPI_Hdr()/PPI_Geotag_Sensor(SensorType="TDOA_Clock", ScaleFactor=-9, Val_T=60.8754, AppId=0x04030201), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x01,Gain=5,HorizBw=360.0,ModelName="8dBi-Omni", DescString="Signal 1"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-60), ... PPI_Hdr()/PPI_Geotag_GPS(GPSFlags="Manual Input", Latitude=41.861904, Longitude=-87.616365, GPSTime=1288720719, FractionalTime=0.20), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x02, VectorChars=0x01, Pitch=90.0, DescString="Antenna-2 orientation"), ... PPI_Hdr()/PPI_Geotag_Sensor(SensorType="TDOA_Clock", ScaleFactor=-9, Val_T=178.124, AppId=0x04030201), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x01,Gain=5,HorizBw=360.0,ModelName="8dBi-Omni", DescString="Signal 2"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-80)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:08")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.8") ... return PPI(raw(pkt)) #Cause the fields to be built ... >>> def Pkt_10_9(): ... """Time of arrival analysis(AOA)""" ... pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(GPSFlags="Manual Input", Latitude=41.861904, Longitude=-87.616365, GPSTime=1288720719, FractionalTime=0.20), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x02, VectorChars=0x01, Pitch=90.0, DescString="Antenna-2 orientation"), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x02, VectorChars=0x08, Heading=323.4, Err_Rot=10.0, DescString="AOA at Antenna-2", AppId=0x04030201), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x01,Gain=5,HorizBw=360.0,ModelName="8dBi-Omni", DescString="Signal 2"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-80)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:098")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.9") ... return PPI(raw(pkt)) #Cause the fields to be built ... >>> def Pkt_10_10(): ... """Transmitter Position/AOA example""" ... pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(GPSFlags="Manual Input", Latitude=41.861904, Longitude=-87.616365, GPSTime=1288720719, FractionalTime=0.20), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x02, VectorChars=0x01, Pitch=90.0, DescString="Antenna-2 orientation"), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x03, VectorChars=0x08, Heading=323.4, Err_Rot=10.0, DescString="AOA at Antenna-2", AppId=0x04030201), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags=0x00, VectorChars=0x10, Off_Y=40, Err_Off=2.0, DescString="Transmitter Position", AppId=0x4030201), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x01,Gain=5,HorizBw=360.0,ModelName="8dBi-Omni", DescString="Signal 2"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-80)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:0A")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.10") ... return PPI(raw(pkt)) #Cause the fields to be built ... >>> def TestPackets(): ... """Returns a list of test packets""" ... return [ ... ("10.1", Pkt_10_1(), test_Pkt_10_1), ... ("10.2", Pkt_10_2(), test_Pkt_10_2), ... ("10.3", Pkt_10_3(), test_Pkt_10_3), ... ("10.4", Pkt_10_4(), test_Pkt_10_4), ... ("10.5", Pkt_10_5(), test_Pkt_10_5), ... ("10.6", Pkt_10_6(), test_Pkt_10_6), ... ("10.7", Pkt_10_7(), test_Pkt_10_7), ... ("10.8", Pkt_10_8(), test_Pkt_10_8), ... ("10.9", Pkt_10_9(), test_Pkt_10_9), ... ("10.10", Pkt_10_10(), test_Pkt_10_10) ] ... ###(001)=[passed] Pkt_10_1 >>> a = Pkt_10_1() >>> raw(a) b'\x00\x00\x1c\x00i\x00\x00\x002u\x10\x00\x02\x00\x10\x00\x06\x00\x00\x006\x89\x99\x83\x9c\xb52?\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.1' >>> assert raw(a) == b'\x00\x00\x1c\x00i\x00\x00\x002u\x10\x00\x02\x00\x10\x00\x06\x00\x00\x006\x89\x99\x83\x9c\xb52?\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.1' >>> assert a.headers[0].present == 6 >>> assert a.headers[0].Latitude == 40.7877430 >>> assert a[Dot11Beacon].beacon_interval == 100 >>> assert a[Dot11Elt].info == b'Test-10.1' ###(002)=[passed] Pkt_10_2 >>> a = Pkt_10_2() >>> a.show() ###[ Per-Packet Information header (PPI) ]### version = 0 flags = 0 len = 169 dlt = 105 \headers \ |###[ PPI Header ]### | pfh_type = gps | pfh_length= 16 |###[ PPI GPS ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 16 | present = Latitude+Longitude | Latitude = 40.7877430 | Longitude = -73.9712100 |###[ PPI Header ]### | pfh_type = vector | pfh_length= 60 |###[ PPI Vector ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 60 | present = VectorFlags+VectorChars+Pitch+Roll+Heading+DescString | VectorFlags= RelativeToEarth | VectorChars= Antenna | Pitch = 90.000000 | Roll = 0.000000 | Heading = 0.000000 | DescString= b'Antenna-1 orientation' |###[ PPI Header ]### | pfh_type = antenna | pfh_length= 49 |###[ PPI Antenna ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 49 | present = AntennaFlags+Gain+HorizBw+ModelName | AntennaFlags= Horizontal Polarization | Gain = 8 | HorizBw = 360.000000 | ModelName = b'8dBi-MagMountOmni' |###[ PPI Header ]### | pfh_type = dot11-common | pfh_length= 20 |###[ PPI 802.11-Common ]### | TSF_Timer = 0.0 | Pkt_Flags = | Rate = 0 | Ch_Freq = 2437 | Ch_Flags = | FHSS_Hop = 0 | FHSS_Pat = 0 | Antsignal = -80 dBm | Antnoise = -110 dBm ###[ 802.11 ]### subtype = Beacon type = Management proto = 0 FCfield = ID = 0 addr1 = ff:ff:ff:ff:ff:ff (RA=DA) addr2 = 00:01:02:03:04:05 (TA=SA) addr3 = 00:01:02:09:01:02 (BSSID/STA) SC = 0 ###[ 802.11 Beacon ]### timestamp = 0 beacon_interval= 100 cap = ###[ 802.11 Information Element ]### ID = SSID len = 9 info = b'Test-10.2' >>> assert raw(a) == b'\x00\x00\xa9\x00i\x00\x00\x002u\x10\x00\x02\x00\x10\x00\x06\x00\x00\x006\x89\x99\x83\x9c\xb52?3u<\x00\x02\x00<\x00\x1f\x00\x00\x10\x02\x00\x00\x00\x01\x00\x00\x00\x80J]\x05\x00\x00\x00\x00\x00\x00\x00\x00Antenna-1 orientation\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005u1\x00\x02\x001\x00\x07\x00\x00\x08\x02\x00\x00\x00\x08\x00*u\x158dBi-MagMountOmni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb0\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.2' >>> assert isinstance(a.headers[0].payload, PPI_Geotag_GPS) >>> assert a.headers[0].present == 6 >>> assert isinstance(a.headers[1].payload, PPI_Geotag_Vector) >>> assert a.headers[2].present == 134217735 >>> assert isinstance(a.headers[2].payload, PPI_Geotag_Antenna) >>> assert a.headers[2].HorizBw == 360.0 >>> assert isinstance(a.headers[3].payload, PPI_Dot11Common) ###(003)=[passed] Pkt_10_3 >>> a = Pkt_10_3() >>> assert raw(a) == b"\x00\x00\xef\x00i\x00\x00\x002u\x14\x00\x02\x00\x14\x00\x07\x00\x00\x00\x02\x00\x00\x006\x89\x99\x83\x9c\xb52?3u8\x00\x02\x008\x00\x17\x00\x00\x10\x03\x00\x00\x00\x06\x00\x00\x00\x80\x96\x98\x00\xa0RW\x01VehicleVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004u\x0e\x00\x02\x00\x0e\x00!\x00\x00\x00\x01\x00@\xdfLk3u0\x00\x02\x000\x00\x12\x00\x00\x10\x01\x00\x00\x00\x80J]\x05AntennaVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005u1\x00\x02\x001\x00\x07\x00\x00\x08\x02\x00\x00\x00\t\x00\x0e'\x07SA24-120-9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb5\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.3" ###(004)=[passed] Pkt_10_4 >>> a = Pkt_10_4() >>> assert raw(a) == b"\x00\x00\xc6\x01i\x00\x00\x002u\x18\x00\x02\x00\x18\x00\x17\x00\x00\x00\x02\x00\x00\x006\x89\x99\x83\x9c\xb52? Jk3u\x18\x00\x02\x00\x18\x00\x17\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x80\x96\x98\x00\xa0RW\x014u\x0e\x00\x02\x00\x0e\x00!\x00\x00\x00\x01\x00\x08\x1eKk4u\x0e\x00\x02\x00\x0e\x00!\x00\x00\x00\x02\x00\x88\xe5Ik3u@\x00\x02\x00@\x00\xf3\x00\x00\x10\x00\x00\x00\x00\x01\x00\x00\x00\x80J]\x05L\xefIkp\xe9Ik0\xcaIkAntenna1Vec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x02\x00\x00\x00\t\x00\x0e'\x07SA24-120-9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RightAntenna\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb5\x923u@\x00\x02\x00@\x00\xf3\x00\x00\x10\x00\x00\x00\x00\x01\x00\x00\x00\x80\xdf\x17\x10\xb4\xb4Ikp\xe9Ik0\xcaIkAntenna2Vec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x02\x00\x00\x00\t\x00\x0e'\x07SA24-120-9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LeftAntenna\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xa1\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.4" ###(005)=[passed] Pkt_10_5 >>> a = Pkt_10_5() >>> a.show() ###[ Per-Packet Information header (PPI) ]### version = 0 flags = 0 len = 227 dlt = 105 \headers \ |###[ PPI Header ]### | pfh_type = gps | pfh_length= 20 |###[ PPI GPS ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 20 | present = GPSFlags+Latitude+Longitude | GPSFlags = GPS | Latitude = 40.7877430 | Longitude = -73.9712100 |###[ PPI Header ]### | pfh_type = vector | pfh_length= 56 |###[ PPI Vector ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 56 | present = VectorFlags+VectorChars+Pitch+Heading+DescString | VectorFlags= DefinesForward+RelativeToEarth | VectorChars= Direction of Travel+Front of Vehicle | Pitch = 0.000000 | Heading = 22.500000 | DescString= b'VehicleVec' |###[ PPI Header ]### | pfh_type = vector | pfh_length= 48 |###[ PPI Vector ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 48 | present = VectorChars+Heading+DescString | VectorChars= Antenna | Heading = 120.000000 | DescString= b'AntennaVec' |###[ PPI Header ]### | pfh_type = antenna | pfh_length= 55 |###[ PPI Antenna ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 55 | present = AntennaFlags+Gain+HorizBw+BeamID+ModelName+AppId | AntennaFlags= Horizontal Polarization+Electronically Steerable | Gain = 12 | HorizBw = 60.000000 | BeamID = 0xf1a1 | ModelName = b'ElectronicallySteerableExAntenna' | AppId = 0x4030201 |###[ PPI Header ]### | pfh_type = dot11-common | pfh_length= 20 |###[ PPI 802.11-Common ]### | TSF_Timer = 0.0 | Pkt_Flags = | Rate = 0 | Ch_Freq = 2437 | Ch_Flags = | FHSS_Hop = 0 | FHSS_Pat = 0 | Antsignal = -75 dBm | Antnoise = -110 dBm ###[ 802.11 ]### subtype = Beacon type = Management proto = 0 FCfield = ID = 0 addr1 = ff:ff:ff:ff:ff:ff (RA=DA) addr2 = 00:01:02:03:04:05 (TA=SA) addr3 = 00:01:02:09:01:05 (BSSID/STA) SC = 0 ###[ 802.11 Beacon ]### timestamp = 0 beacon_interval= 100 cap = ###[ 802.11 Information Element ]### ID = SSID len = 9 info = b'Test-10.5' >>> assert isinstance(a, PPI) >>> assert raw(a) == b"\x00\x00\xe3\x00i\x00\x00\x002u\x14\x00\x02\x00\x14\x00\x07\x00\x00\x00\x02\x00\x00\x006\x89\x99\x83\x9c\xb52?3u8\x00\x02\x008\x00\x17\x00\x00\x10\x03\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\xa0RW\x01VehicleVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u0\x00\x02\x000\x00\x12\x00\x00\x10\x01\x00\x00\x00\x00\x0e'\x07AntennaVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005u7\x00\x02\x007\x00'\x00\x00(\x02\x00\x01\x00\x0c\x00\x87\x93\x03\xa1\xf1ElectronicallySteerableExAntenna\x01\x02\x03\x04\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb5\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.5" ###(006)=[passed] Pkt_10_6 >>> a = Pkt_10_6() >>> assert raw(a) == b'\x00\x00\x15\x01i\x00\x00\x002u\x14\x00\x02\x00\x14\x00\x07\x00\x00\x00\x02\x00\x00\x006\x89\x99\x83\x9c\xb52?3u4\x00\x02\x004\x00\x13\x00\x00\x10\x02\x00\x00\x00\x06\x00\x00\x00\xa0RW\x01VehicleVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u4\x00\x02\x004\x00\x13\x00\x00\x10\x03\x00\x00\x00\x00\x00\x00\x00\xa0\xe7\x11\x0cForwardVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u4\x00\x02\x004\x00\x13\x00\x00\x10\x00\x00\x00\x00\x01\x00\x00\x00\xc0hx\x04AntennaVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005u1\x00\x02\x001\x00\x07\x00\x00\x08\x02\x00\x02\x00\x0c\x00\x87\x93\x03MechanicallySteerableAnt\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb3\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.6' ###(007)=[passed] Pkt_10_7 >>> a = Pkt_10_7() >>> assert raw(a) == b"\x00\x00\x15\x01i\x00\x00\x002u\x14\x00\x02\x00\x14\x00\x07\x00\x00\x00\x02\x00\x00\x00D\x9d?\x84\xfc\xce\x1173u4\x00\x02\x004\x00\x13\x00\x00\x10\x03\x00\x00\x00\x04\x00\x00\x00\x80\xf0\xfa\x02VehicleVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u4\x00\x02\x004\x00\x13\x00\x00\x10\x00\x00\x00\x00\x02\x00\x00\x00\x80\x85\xb5\rDOT-Vec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u4\x00\x02\x004\x00\x13\x00\x00\x10\x00\x00\x00\x00\x01\x00\x00\x00\x80J]\x05AntennaVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005u1\x00\x02\x001\x00\x07\x00\x00\x08\x02\x00\x00\x00\t\x00\x0e'\x07SA24-120-9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb3\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.7" >>> assert a.headers[5].Antnoise == -110 >>> assert isinstance(a[Dot11].payload, Dot11Beacon) ###(008)=[passed] Pkt_10_8 >>> a = Pkt_10_8() >>> a.show() ###[ Per-Packet Information header (PPI) ]### version = 0 flags = 0 len = 448 dlt = 105 \headers \ |###[ PPI Header ]### | pfh_type = gps | pfh_length= 28 |###[ PPI GPS ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 28 | present = GPSFlags+Latitude+Longitude+GPSTime+FractionalTime | GPSFlags = Manual Input | Latitude = 41.8618850 | Longitude = -87.6169260 | GPSTime = Tue, 02 Nov 2010 17:58:39 UTC (1288720719) | FractionalTime= 0.200000000 |###[ PPI Header ]### | pfh_type = vector | pfh_length= 52 |###[ PPI Vector ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 52 | present = VectorFlags+VectorChars+Pitch+DescString | VectorFlags= RelativeToEarth | VectorChars= Antenna | Pitch = 90.000000 | DescString= b'Antenna-1 orientation' |###[ PPI Header ]### | pfh_type = sensor | pfh_length= 19 |###[ PPI Sensor ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 19 | present = SensorType+ScaleFactor+Val_T+AppId | SensorType= TDOA_Clock | ScaleFactor= -9 | Val_T = 60.8754 | AppId = 0x4030201 |###[ PPI Header ]### | pfh_type = antenna | pfh_length= 81 |###[ PPI Antenna ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 81 | present = AntennaFlags+Gain+HorizBw+ModelName+DescString | AntennaFlags= Reserved00 | Gain = 5 | HorizBw = 360.000000 | ModelName = b'8dBi-Omni' | DescString= b'Signal 1' |###[ PPI Header ]### | pfh_type = dot11-common | pfh_length= 20 |###[ PPI 802.11-Common ]### | TSF_Timer = 0.0 | Pkt_Flags = | Rate = 0 | Ch_Freq = 0 | Ch_Flags = | FHSS_Hop = 0 | FHSS_Pat = 0 | Antsignal = -60 dBm | Antnoise = -128 dBm |###[ PPI Header ]### | pfh_type = gps | pfh_length= 28 |###[ PPI GPS ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 28 | present = GPSFlags+Latitude+Longitude+GPSTime+FractionalTime | GPSFlags = Manual Input | Latitude = 41.8619040 | Longitude = -87.6163650 | GPSTime = Tue, 02 Nov 2010 17:58:39 UTC (1288720719) | FractionalTime= 0.200000000 |###[ PPI Header ]### | pfh_type = vector | pfh_length= 52 |###[ PPI Vector ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 52 | present = VectorFlags+VectorChars+Pitch+DescString | VectorFlags= RelativeToEarth | VectorChars= Antenna | Pitch = 90.000000 | DescString= b'Antenna-2 orientation' |###[ PPI Header ]### | pfh_type = sensor | pfh_length= 19 |###[ PPI Sensor ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 19 | present = SensorType+ScaleFactor+Val_T+AppId | SensorType= TDOA_Clock | ScaleFactor= -9 | Val_T = 178.1240 | AppId = 0x4030201 |###[ PPI Header ]### | pfh_type = antenna | pfh_length= 81 |###[ PPI Antenna ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 81 | present = AntennaFlags+Gain+HorizBw+ModelName+DescString | AntennaFlags= Reserved00 | Gain = 5 | HorizBw = 360.000000 | ModelName = b'8dBi-Omni' | DescString= b'Signal 2' |###[ PPI Header ]### | pfh_type = dot11-common | pfh_length= 20 |###[ PPI 802.11-Common ]### | TSF_Timer = 0.0 | Pkt_Flags = | Rate = 0 | Ch_Freq = 0 | Ch_Flags = | FHSS_Hop = 0 | FHSS_Pat = 0 | Antsignal = -80 dBm | Antnoise = -128 dBm ###[ 802.11 ]### subtype = Beacon type = Management proto = 0 FCfield = ID = 0 addr1 = ff:ff:ff:ff:ff:ff (RA=DA) addr2 = 00:01:02:03:04:05 (TA=SA) addr3 = 00:01:02:09:01:08 (BSSID/STA) SC = 0 ###[ 802.11 Beacon ]### timestamp = 0 beacon_interval= 100 cap = ###[ 802.11 Information Element ]### ID = SSID len = 9 info = b'Test-10.8' >>> assert raw(a) == b'\x00\x00\xc0\x01i\x00\x00\x002u\x1c\x00\x02\x00\x1c\x00g\x00\x00\x00\x80\x00\x00\x00\xe2o=\x84\xd4\x89\x107L\xd0QO\x00\xc2\xeb\x0b3u4\x00\x02\x004\x00\x07\x00\x00\x10\x02\x00\x00\x00\x01\x00\x00\x00\x80J]\x05Antenna-1 orientation\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004u\x13\x00\x02\x00\x13\x00#\x00\x00 \xd0\x07\xf7\xf2\x1bSk\x01\x02\x03\x045uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x01\x00\x00\x00\x05\x00*u\x158dBi-Omni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Signal 1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x802u\x1c\x00\x02\x00\x1c\x00g\x00\x00\x00\x80\x00\x00\x00\xa0p=\x84\xbe\x9f\x107L\xd0QO\x00\xc2\xeb\x0b3u4\x00\x02\x004\x00\x07\x00\x00\x10\x02\x00\x00\x00\x01\x00\x00\x00\x80J]\x05Antenna-2 orientation\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004u\x13\x00\x02\x00\x13\x00#\x00\x00 \xd0\x07\xf7\xf8\xffdk\x01\x02\x03\x045uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x01\x00\x00\x00\x05\x00*u\x158dBi-Omni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Signal 2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x80\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.8' >>> assert isinstance(a.headers[7].payload, PPI_Geotag_Sensor) >>> assert a.headers[7].ScaleFactor == -9 >>> assert a.headers[7].pfh_length == 19 ###(009)=[passed] Pkt_10_9 >>> a = Pkt_10_9() >>> assert raw(a) == b'\x00\x00\r\x01i\x00\x00\x002u\x1c\x00\x02\x00\x1c\x00g\x00\x00\x00\x80\x00\x00\x00\xa0p=\x84\xbe\x9f\x107L\xd0QO\x00\xc2\xeb\x0b3u4\x00\x02\x004\x00\x07\x00\x00\x10\x02\x00\x00\x00\x01\x00\x00\x00\x80J]\x05Antenna-2 orientation\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u<\x00\x02\x00<\x00\x13\x00\x010\x02\x00\x00\x00\x08\x00\x00\x00@\xb1F\x13\x80\x96\x98\x00AOA at Antenna-2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x045uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x01\x00\x00\x00\x05\x00*u\x158dBi-Omni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Signal 2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x80\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.9' >>> assert a.headers[2].DescString == b'AOA at Antenna-2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' ###(010)=[passed] Pkt_10_10 >>> a = Pkt_10_10() >>> assert raw(a) == b'\x00\x00M\x01i\x00\x00\x002u\x1c\x00\x02\x00\x1c\x00g\x00\x00\x00\x80\x00\x00\x00\xa0p=\x84\xbe\x9f\x107L\xd0QO\x00\xc2\xeb\x0b3u4\x00\x02\x004\x00\x07\x00\x00\x10\x02\x00\x00\x00\x01\x00\x00\x00\x80J]\x05Antenna-2 orientation\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u<\x00\x02\x00<\x00\x13\x00\x010\x03\x00\x00\x00\x08\x00\x00\x00@\xb1F\x13\x80\x96\x98\x00AOA at Antenna-2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x043u<\x00\x02\x00<\x00C\x00\x020\x00\x00\x00\x00\x10\x00\x00\x00\x80\xecOk JkTransmitter Position\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x045uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x01\x00\x00\x00\x05\x00*u\x158dBi-Omni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Signal 2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x80\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\nTest-10.10' >>> assert a.headers[0].GPSTime == 1288720719 >>> assert a.headers[4].ModelName == b'8dBi-Omni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> assert isinstance(a.headers[3].payload, PPI_Geotag_Vector) >>> assert a.headers[3].pfh_type == 30003 >>> assert a.headers[3].Off_Y == 40.0 >>> assert a.headers[3].Err_Off == 2.0 ###(011)=[passed] All-in-one packet >>> a = hex_bytes(b'00008a02690000003275900002029000ff03007002000000368999839cb5323fa0584b6b406e4a6b4f51d04cffffffff40420f0080841e00005ed0b2416c6c4669656c64734750535061636b6574000000000000000000000000000004030201414243442e2e2e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003375900002029000ff000370ff0000000800000080969800002d3101e09da30110f9496b20204a6b0055496b80c3c90128604d6b46756c6c7946696c6c65644f7574566563746f720000000000000000000000000403020141424344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034757f0002027f007f0000700100ff4014596b8056686bc098776b00db866b50954a6b4d616465557056656c6f63697479730000000000000000000000000000000000010203044142434400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003575bb000102bb003f00007c0200000009000e2707002d310160f59000b2a13030303030310000000000000000000000000000000000000000000000000000534132342d3132302d39000000000000000000000000000000000000000000004c656674416e74656e6e610000000000000000000000000000000000000000000102030441424344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002001400000000000000000000000000850900000000a19280000000ffffffffffff0001020304050001020901040000000000000000000064000000000b546573742d53656e736f72') >>> pkt = PPI(a) >>> assert isinstance(pkt.headers[0].payload, PPI_Geotag_GPS) >>> assert pkt.headers[0].present == 1879049215 >>> assert isinstance(pkt.headers[1].payload, PPI_Geotag_Vector) >>> assert pkt.headers[1].present == 1879245055 >>> assert isinstance(pkt.headers[3].payload, PPI_Geotag_Antenna) >>> assert repr(pkt.headers[3].present) == "" >>> assert isinstance(pkt.headers[4].payload, PPI_Dot11Common) >>> assert isinstance(pkt[Dot11][Dot11Beacon].payload, Dot11Elt) >>> assert pkt[Dot11Elt].info == b'Test-Sensor' >>> assert pkt[Dot11Elt].ID == 0 ###(012)=[passed] All-wrong-data packet >>> pkt = PPI(headers=[ ... PPI_Hdr()/PPI_Geotag_GPS(GPSFlags="Manual Input", Latitude=-181, Longitude=181, GPSTime=1288720719, FractionalTime=-1, ept=100, eph=-1, epv=1000, Altitude=-999999, Altitude_g=999999), ... PPI_Hdr()/PPI_Geotag_Vector(VectorFlags="DefinesForward+RelativeToEarth", VectorChars=0x08, Heading=323.4, Err_Rot=10.0, DescString="AOA at Antenna-2", AppId=0x04030201), ... PPI_Hdr()/PPI_Geotag_Antenna(AntennaFlags=0x01,Gain=5,HorizBw=360.0,ModelName="8dBi-Omni", DescString="Signal 2"), ... PPI_Hdr()/PPI_Dot11Common(Antsignal=-80)])/\ ... Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:0A")/\ ... Dot11Beacon()/Dot11Elt(ID=0,info="Test-allwrong") Fixed3_7Field: Input value too negative: -181.0000000000 Fixed3_7Field: Input value too positive: 181.0000000000 Fixed6_4Field: Input value too negative: -999999.0000000000 Fixed6_4Field: Input value too positive: 999999.0000000000 more NSCounter_Field: Input value too negative: -1.0000000000 more Fixed3_6Field: Input value too positive: 1000.0000000000 >>> pkt = PPI(raw(pkt)) >>> pkt.show() Fixed3_6Field: Internal value too positive: 1000000000 ###[ Per-Packet Information header (PPI) ]### version = 0 flags = 0 len = 233 dlt = 105 \headers \ |###[ PPI Header ]### | pfh_type = gps | pfh_length= 48 |###[ PPI GPS ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 48 | present = GPSFlags+Latitude+Longitude+Altitude+Altitude_g+GPSTime+FractionalTime+eph+epv+ept | GPSFlags = Manual Input | Latitude = -180.0000000 | Longitude = 180.0000000 | Altitude = -180000.0000 | Altitude_g= 180000.0000 | GPSTime = Tue, 02 Nov 2010 17:58:39 UTC (1288720719) | FractionalTime= 0.000000000 | eph = 0.000000 | epv = 999.999999 | ept = 4.000000000 |###[ PPI Header ]### | pfh_type = vector | pfh_length= 60 |###[ PPI Vector ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 60 | present = VectorFlags+VectorChars+Heading+Err_Rot+DescString+AppId | VectorFlags= DefinesForward+RelativeToEarth | VectorChars= Angle of Arrival | Heading = 323.400000 | Err_Rot = 10.000000 | DescString= b'AOA at Antenna-2' | AppId = 0x4030201 |###[ PPI Header ]### | pfh_type = antenna | pfh_length= 81 |###[ PPI Antenna ]### | geotag_ver= 2 | geotag_pad= 0 | geotag_len= 81 | present = AntennaFlags+Gain+HorizBw+ModelName+DescString | AntennaFlags= Reserved00 | Gain = 5 | HorizBw = 360.000000 | ModelName = b'8dBi-Omni' | DescString= b'Signal 2' |###[ PPI Header ]### | pfh_type = dot11-common | pfh_length= 20 |###[ PPI 802.11-Common ]### | TSF_Timer = 0.0 | Pkt_Flags = | Rate = 0 | Ch_Freq = 0 | Ch_Flags = | FHSS_Hop = 0 | FHSS_Pat = 0 | Antsignal = -80 dBm | Antnoise = -128 dBm ###[ 802.11 ]### subtype = Beacon type = Management proto = 0 FCfield = ID = 0 addr1 = ff:ff:ff:ff:ff:ff (RA=DA) addr2 = 00:01:02:03:04:05 (TA=SA) addr3 = 00:01:02:09:01:0a (BSSID/STA) SC = 0 ###[ 802.11 Beacon ]### timestamp = 0 beacon_interval= 100 cap = ###[ 802.11 Information Element ]### ID = SSID len = 13 info = b'Test-allwrong' >>> assert pkt.headers[0].Latitude == -180.0 >>> assert pkt.headers[0].Longitude == 180.0 >>> assert pkt.headers[0].Altitude == -180000.0 >>> assert pkt.headers[0].Altitude_g == 180000.0 >>> assert pkt.headers[0].epv < 1000 Fixed3_6Field: Internal value too positive: 1000000000 >>> assert pkt.headers[0].ept < 5 >>> assert pkt.headers[0].FractionalTime == 0.0 Test campaign ━ Run at 01:43:09 from [test/contrib/ppi_geotag.uts] by UTscapy in 0.013491630554199219 └ Passed=6 └ Failed=0 ###### ## PPI Geotags tests ###### ###(000)=[passed] Import PPI Geotag >>> from scapy.contrib.ppi_geotag import * ###(001)=[passed] Test GPS dissection >>> assert raw(PPI_Hdr()/PPI_Geotag_GPS()) == b'2u\x08\x00\x02\x00\x08\x00\x00\x00\x00\x00' ###(002)=[passed] Test Vector dissection >>> assert raw(PPI_Hdr()/PPI_Geotag_Vector()) == b'3u\x08\x00\x02\x00\x08\x00\x00\x00\x00\x00' ###(003)=[passed] Test Sensor dissection >>> assert raw(PPI_Hdr()/PPI_Geotag_Sensor()) == b'4u\x08\x00\x02\x00\x08\x00\x00\x00\x00\x00' ###(004)=[passed] Test Antenna dissection >>> assert raw(PPI_Hdr()/PPI_Geotag_Antenna()) == b'5u\x08\x00\x02\x00\x08\x00\x00\x00\x00\x00' ###(005)=[passed] Test GPSTime_Field time handling >>> assert GPSTime_Field("GPSTime", None).delta == 0.0 Test campaign ━ Run at 01:43:09 from [test/contrib/ripng.uts] by UTscapy in 0.007531881332397461 └ Passed=1 └ Failed=0 ###### ## RIPng Contrib tests ###### ###(000)=[passed] Basic RIPng build >>> pkt = Ether()/IP()/UDP()/RIPng()/RIPngEntry(prefix_or_nh='8c07:9bc5:fdf6:996:117e:08c0:dd84:549e', metric=255)/RIPngEntry(prefix_or_nh='afb6:5b1b:c518:a147:312a:0c32:f40c:3771') >>> pkt = Ether(raw(pkt)) >>> assert RIPngEntry in pkt >>> assert pkt[RIPngEntry].prefix_or_nh == '8c07:9bc5:fdf6:996:117e:8c0:dd84:549e' >>> assert pkt[RIPngEntry].payload.prefix_or_nh == 'afb6:5b1b:c518:a147:312a:c32:f40c:3771' Regression tests for the RoCE layer ━ Run at 01:43:09 from [test/contrib/roce.uts] by UTscapy in 0.04255223274230957 └ Passed=6 └ Failed=0 ###### ## RoCE tests ###### ###(000)=[passed] RoCE layer >>> pkt = Ether(dst='24:8a:07:a8:fa:22', src='24:8a:07:a8:fa:22')/ \ ... IP(version=4, ihl=5, tos=0x1, id=1144, flags='DF', frag=0, \ ... ttl=64, src='192.168.0.7', dst='192.168.0.7', len=64)/ \ ... UDP(sport=49152, dport=4791, len=44)/ \ ... BTH(opcode='UC_SEND_ONLY', migreq=1, padcount=2, pkey=0xffff, dqpn=211, psn=13571856)/ \ ... Raw(b'F0\x81\x8b\xe2\x895\xd9\x0e\x9a\x95PT\x01\xbe\x88^P\x00\x00') >>> >>> pkt = Ether(pkt.build() + b'\x00' * 4) >>> >>> assert IP in pkt.layers() >>> print(hex(pkt[IP].chksum)) 0xb4d5 >>> assert pkt[IP].chksum == 0xb4d5 >>> assert UDP in pkt.layers() >>> print(hex(pkt[UDP].chksum)) 0xaca2 >>> assert pkt[UDP].chksum == 0xaca2 >>> assert BTH in pkt.layers() >>> assert pkt[BTH].icrc == 0x78f353f3 ###(001)=[passed] RoCE CNP packet >>> pkt = Ether()/IP(src='22.22.22.8', dst='22.22.22.7', id=0x98c6, flags='DF', ... ttl=0x20, tos=0x89)/ \ ... UDP(sport=56238, dport=4791, chksum=0)/ \ ... cnp(dqpn=0xd2) >>> pkt = Ether(pkt.build()) getmacbyip failed on [Errno 1] Operation not permitted MAC address to reach destination not found. Using broadcast. >>> >>> assert pkt[IP].len == 60 >>> assert pkt[UDP].len == 40 >>> assert pkt[BTH].opcode == 0x81 >>> assert pkt[BTH].becn >>> assert not pkt[BTH].fecn >>> assert pkt[BTH].resv6 == 0 >>> assert pkt[BTH].resv7 == 0 >>> assert pkt[BTH].dqpn == 0xd2 >>> assert pkt[BTH].version == 0 >>> assert not pkt[BTH].solicited >>> assert not pkt[BTH].migreq >>> assert pkt[BTH].padcount == 0 >>> assert pkt[BTH].pkey == 0xffff >>> assert not pkt[BTH].ackreq >>> assert pkt[BTH].psn == 0 >>> assert pkt[CNPPadding].reserved1 == 0 >>> assert pkt[CNPPadding].reserved2 == 0 ###(002)=[passed] RoCE CNP captured on ConnectX-4 Lx >>> pkt = Ether(import_hexcap('''0x0000: e41d 2dab 2bc2 7cfe 9064 3b32 0800 45c2 ... 0x0010: 003c 718c 4000 4011 9161 0a00 1101 0a00 ... 0x0020: 1201 0000 12b7 0028 0000 8100 ffff 4000 ... 0x0030: 0118 0000 0000 0000 0000 0000 0000 0000 ... 0x0040: 0000 0000 0000 82fd 002a ... ''')) >>> >>> assert BTH in pkt.layers() >>> assert pkt.opcode == CNP_OPCODE >>> del pkt.icrc >>> pkt = Ether(pkt.build()) >>> assert pkt.icrc == 0x82fd002a ###(003)=[passed] RoCE v1 RC RDMA WRITE ONLY >>> pkt = Ether(import_hexcap('''\ ... 0x0000 7c fe 90 75 3c d8 7c fe 90 75 3c d8 89 15 60 20 ... 0x0010 00 00 00 28 1b 40 00 00 00 00 00 00 00 00 00 00 ... 0x0020 ff ff 0f 00 00 02 00 00 00 00 00 00 00 00 00 00 ... 0x0030 ff ff 0f 00 00 02 0a 70 ff ff 00 00 01 0a 80 a7 ... 0x0040 88 bc 00 00 55 d4 c0 72 60 00 00 00 47 b3 00 00 ... 0x0050 00 05 00 00 00 00 01 00 00 00 e3 d8 56 bb ... ''')) >>> >>> assert GRH in pkt.layers() >>> assert BTH in pkt.layers() >>> assert pkt[GRH].ipver == 6 >>> assert pkt[GRH].tclass == 2 >>> assert pkt[GRH].flowlabel == 0 >>> assert pkt[GRH].paylen == 40 >>> assert pkt[BTH].opcode == 0xa >>> assert pkt[BTH].padcount == 3 >>> assert pkt[BTH].dqpn == 0x10a >>> assert pkt[BTH].ackreq >>> assert pkt.icrc == 0xe3d856bb ###(004)=[passed] RoCE v1 RC ACKNOWLEDGE >>> pkt = Ether(import_hexcap('''\ ... 0000 7c fe 90 75 3c d8 7c fe 90 75 3c d8 89 15 60 20 ... 0010 00 00 00 14 1b 40 00 00 00 00 00 00 00 00 00 00 ... 0020 ff ff 0f 00 00 02 00 00 00 00 00 00 00 00 00 00 ... 0030 ff ff 0f 00 00 02 11 40 ff ff 00 00 01 09 00 a7 ... 0040 88 c0 00 00 00 05 25 f0 c0 38 ... ''')) >>> >>> assert GRH in pkt.layers() >>> assert BTH in pkt.layers() >>> assert AETH in pkt.layers() >>> assert pkt[GRH].ipver == 6 >>> assert pkt[GRH].tclass == 2 >>> assert pkt[GRH].flowlabel == 0 >>> assert pkt[GRH].paylen == 20 >>> assert pkt[BTH].opcode == 0x11 >>> assert pkt[BTH].padcount == 0 >>> assert pkt[BTH].dqpn == 0x109 >>> assert not pkt[BTH].ackreq >>> assert pkt[AETH].syndrome == 0 >>> assert pkt[AETH].msn == 5 >>> assert pkt.icrc == 0x25f0c038 ###(005)=[passed] RoCE over IPv6 >>> pkt = Ether(dst='24:8a:07:a8:fa:22', src='24:8a:07:a8:fa:22')/ \ ... IPv6(nh=17,src='2022::1023', dst='2023::1024', \ ... version=6,hlim=255,plen=44,fl=0x1face,tc=226)/ \ ... UDP(sport=49152, dport=4791, len=44)/ \ ... BTH(opcode='UC_SEND_ONLY', migreq=1, padcount=2, pkey=0xffff, dqpn=211, psn=13571856)/ \ ... Raw(b'F0\x81\x8b\xe2\x895\xd9\x0e\x9a\x95PT\x01\xbe\x88^P\x00\x00') >>> >>> pkt = Ether(pkt.build() + b'\x00' * 4) >>> >>> assert IPv6 in pkt.layers() >>> assert UDP in pkt.layers() >>> print(hex(pkt[UDP].chksum)) 0xe7c5 >>> assert pkt[UDP].chksum == 0xe7c5 >>> assert BTH in pkt.layers() >>> print(hex(pkt[BTH].icrc)) 0x3e5b743b >>> assert pkt[BTH].icrc == 0x3e5b743b RPL layer test campaign ━ Run at 01:43:09 from [test/contrib/rpl.uts] by UTscapy in 0.06926417350769043 └ Passed=4 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the RPL layer >>> load_contrib("rpl") >>> load_contrib("rpl_metrics") ###### ## Test RPL Control Messages ###### ###(001)=[passed] RPL Base Objects construction >>> assert raw(ICMPv6RPL()/RPLDIS()) == b'\x9b\x00\x00\x00\x00\x00' No IPv6 underlayer to compute checksum. Leaving null. >>> assert raw(ICMPv6RPL()/RPLDIO()) == b'\x9b\x01\x00\x00\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' No IPv6 underlayer to compute checksum. Leaving null. >>> assert raw(ICMPv6RPL()/RPLDAO()) == b'\x9b\x02\x00\x00\x32\x00\x00\x01' more No IPv6 underlayer to compute checksum. Leaving null. >>> assert raw(ICMPv6RPL()/RPLDAOACK()) == b'\x9b\x03\x00\x00\x32\x00\x01\x00' >>> assert raw(ICMPv6RPL()/RPLDCO()) == b'\x9b\x07\x00\x00\x32\x00\x00\x01' >>> assert raw(ICMPv6RPL()/RPLDCOACK()) == b'\x9b\x08\x00\x00\x32\x00\x01\x00' >>> p=raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDCOACK()/RPLOptPadN(optdata='0'*10)) >>> assert p == b'\x60\x00\x00\x00\x00\x14\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x08\x42\x0f\x32\x00\x01\x00\x01\x0a\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDCO()/RPLOptTgt(prefix="fd00::1", plen=128)) >>> assert p == b'\x60\x00\x00\x00\x00\x1c\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x07\x32\x6e\x32\x00\x00\x01\x05\x12\x00\x80\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDIO()/RPLOptRIO(plen=64, prefix="fd00::1")) >>> assert p == b'\x60\x00\x00\x00\x00\x34\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\x6b\xe6\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x16\x40\x00\xff\xff\xff\xff\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDIO(dodagid="aaaa::1")/RPLOptDODAGConfig()/RPLOptDAGMC()/RPLDAGMCLinkETX()) >>> assert p == b'\x60\x00\x00\x00\x00\x34\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\xef\x1e\x32\x00\x00\x01\x88\xf0\x00\x00\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x0e\x00\x14\x03\x0a\x00\x00\x01\x00\x00\x01\x00\xff\xff\xff\x02\x06\x07\x00\x00\x02\x00\x01' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDIO(dodagid="aaaa::1")/RPLOptPIO(plen=64, prefix="fd00::1")) >>> assert p == b'\x60\x00\x00\x00\x00\x3c\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\xbc\x2b\x32\x00\x00\x01\x88\xf0\x00\x00\xaa\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x08\x1e\x40\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' >>> >>> p = raw(IPv6(src="fe80::1", dst="fe80::2")/ICMPv6RPL()/RPLDAO()/RPLOptTgtDesc()) >>> assert p == b'\x60\x00\x00\x00\x00\x0e\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x9b\x02\x2c\xab\x32\x00\x00\x01\x09\x04\x00\x00\x00\x00' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDIO()/RPLOptDAGMC()/RPLDAGMCNSA()) >>> assert p == b'\x60\x00\x00\x00\x00\x24\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\xa9\x06\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x06\x01\x00\x00\x02\x00\x00' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDIO()/RPLOptDAGMC()/RPLDAGMCNodeEnergy()) >>> assert p == b'\x60\x00\x00\x00\x00\x24\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\xa8\x06\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x06\x02\x00\x00\x02\x00\x00' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDIO()/RPLOptDAGMC()/RPLDAGMCHopCount()) >>> assert p == b'\x60\x00\x00\x00\x00\x24\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\xa7\x05\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x06\x03\x00\x00\x02\x00\x01' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDIO()/RPLOptDAGMC()/RPLDAGMCLinkThroughput()) >>> assert p == b'\x60\x00\x00\x00\x00\x26\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\xa5\xff\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x08\x04\x00\x00\x04\x00\x00\x00\x01' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDIO()/RPLOptDAGMC()/RPLDAGMCLinkColor()) >>> assert p == b'\x60\x00\x00\x00\x00\x25\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\x61\x03\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x07\x08\x00\x00\x03\x00\x00\x41' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDIO()/RPLOptDAGMC()/RPLDAGMCLinkLatency()) >>> assert p == b'\x60\x00\x00\x00\x00\x26\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\xa4\xff\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x08\x05\x00\x00\x04\x00\x00\x00\x01' >>> >>> p = raw(IPv6(src="fe80::1")/ICMPv6RPL()/RPLDIO()/RPLOptDAGMC()/RPLDAGMCLinkQualityLevel()) >>> assert p == b'\x60\x00\x00\x00\x00\x24\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\xa4\x06\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x06\x06\x00\x00\x02\x00\x00' ###(002)=[passed] RPL Base Objects dissection >>> p = ICMPv6RPL(b'\x9b\x00\x00\x00\x00\x00') >>> assert p.code == 0 >>> >>> p = ICMPv6RPL(b'\x9b\x01\x00\x00\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> assert p.code == 1 >>> assert p.RPLInstanceID == 50 >>> assert p.ver == 0 >>> assert p.rank == 1 >>> assert p.G == 1 >>> assert p.mop == 1 >>> assert p.dtsn == 240 >>> assert p.dodagid == "::1" >>> >>> p = ICMPv6RPL(b'\x9b\x02\x00\x00\x32\x00\x00\x01') >>> assert p.code == 2 ###### ## Test RPL Control Message Options ###### ###(003)=[passed] RPL Control Options construction >>> assert raw(ICMPv6RPL()/RPLDIS()/RPLOptPad1()) == b'\x9b\x00\x00\x00\x00\x00\x00' >>> >>> assert raw(ICMPv6RPL()/RPLDIS()/RPLOptSolInfo()) == b'\x9b\x00\x00\x00\x00\x00\x07\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00' >>> >>> assert raw(ICMPv6RPL()/RPLDIO()/RPLOptDAGMC()/RPLDAGMCLinkETX()) == b'\x9b\x01\x00\x00\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x06\x07\x00\x00\x02\x00\x01' >>> >>> assert raw(IPv6(src="fe80::1", dst="fe80::2")/\ ... ICMPv6RPL()/RPLDAO()/\ ... RPLOptTgt(plen=128,prefix="fd00::1")/\ ... RPLOptTIO()) == \ ... b'\x60\x00\x00\x00\x00\x22\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x9b\x02\x2c\x04\x32\x00\x00\x01\x05\x12\x00\x80\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x06\x04\x00\x00\x00\xff' >>> >>> assert raw(ICMPv6RPL()/RPLDAO(D=1, dodagid="fd00::1")/RPLOptDAGMC()) == \ ... b'\x9b\x02\x00\x00\x32\x40\x00\x01\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x00' >>> >>> p=IPv6(b'\x60\x00\x00\x00\x00\x1c\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x0f\x86\xcc\x88\xaf\xfa\xbe\x25\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x07\xe8\x3f\x32\x00\x00\x01\x05\x12\x00\x80\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> assert p.payload.code == 7 # Its a DCO >>> >>> p=IPv6(b'\x60\x00\x00\x00\x00\x2c\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x9b\x02\x35\xbb\x32\x40\x00\x01\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x05\x12\x00\x80\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01') >>> p.show() ###[ IPv6 ]### version = 6 tc = 0 fl = 0 plen = 44 nh = ICMPv6 hlim = 64 src = fe80::1 dst = fe80::2 ###[ RPL ]### type = RPL Control Message code = DAO cksum = 0x35bb ###[ Destination Advertisement Object ]### RPLInstanceID= 50 K = 0 D = 1 flags = 0 reserved = 0 daoseq = 1 dodagid = fd00::1 ###[ RPL Target ]### otype = RPL Target len = 18 flags = 0 plen = 128 prefix = fd00::1 >>> assert p.payload.code == 2 # Its a DAO >>> >>> p=IPv6(b'\x60\x00\x00\x00\x00\x24\x3a\x40\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1a\x9b\x01\xa3\x05\x32\x00\x00\x01\x88\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x06\x07\x00\x00\x02\x00\x01') >>> rpl=p.payload >>> assert rpl.code == 1 >>> dio=rpl.payload >>> assert dio.RPLInstanceID == 50 >>> assert dio.dtsn == 240 >>> dagmc=dio.payload >>> assert dagmc.len == 6 >>> mc=dagmc.options[0] >>> assert mc.ETX == 1 Regression tests for the rsvp module ━ Run at 01:43:09 from [test/contrib/rsvp.uts] by UTscapy in 0.009997367858886719 └ Passed=2 └ Failed=0 ###### ## Basic RSVP test ###### ###(000)=[passed] Default build >>> pkt = Ether()/IP()/RSVP()/RSVP_Object()/RSVP_SessionAttrb(Name="test") >>> pkt = Ether(raw(pkt)) >>> assert RSVP_SessionAttrb in pkt >>> assert pkt.Name == b"test" ###(001)=[passed] Master dissection >>> pkt = Ether(b"\x00\x90\x92\x9d\x94\x01\x00\xd0c\xc3\xb8G\x08\x00E\x00\x00\x80\x8ad\x00\x00\xff.\x8c\xe7\xd2\x00\x00\x02\xd2\x00\x00\x01\x10\x02\xeb\xfa\xff\x00\x00l\x00\x10\x01\x07\x10\x02\x02\x02\x00\x00\x00\x01\x11\x03\x03\x03\x00\x0c\x03\x01\xd2\x00\x00\x02\x00\x00\x00\x00\x00\x08\x05\x01\x00\x00u0\x00\x08\x08\x01\x00\x00\x00\x12\x00$\t\x02\x00\x00\x00\x07\x05\x00\x00\x06\x7f\x00\x00\x05I\x18\x96\x80Dz\x00\x00\x7f\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\n\x07\x11\x03\x03\x03\x00\x00'\x11\x00\x08\x10\x01\x00\x00\x00\x10\x03\x06-\xad") >>> assert RSVP_Time in pkt >>> assert pkt[RSVP_Time].refresh == 30000 RTCP regression tests for Scapy ━ Run at 01:43:09 from [test/contrib/rtcp.uts] by UTscapy in 0.021576881408691406 └ Passed=5 └ Failed=0 ###### ## RTCP Sender Report tests ###### ###(000)=[passed] test sender report parse >>> raw = b'\x80\xc8\x00\x06\x9c\xe9\xc6\x48\xe5\x61\xe4\x4b\x63\x8a\x19\xc9\x98\x64\xea\x2e\x00\x00\x00\x49\x00\x00\x09\x69' >>> parsed = RTCP(raw) >>> assert parsed.version == 2 >>> assert parsed.padding == 0 >>> assert parsed.count == 0 >>> assert parsed.packet_type == 200 >>> assert parsed.length == 6 >>> assert parsed.sourcesync == 0x9ce9c648 >>> assert parsed.sender_info.ntp_timestamp == 0xe561e44b638a19c9 >>> assert parsed.sender_info.rtp_timestamp == 2556750382 >>> assert parsed.sender_info.sender_packet_count == 73 >>> assert parsed.sender_info.sender_octet_count == 2409 ###### ## RTCP Receiver Report tests ###### ###(001)=[passed] test receiver report parse >>> raw = b'\x81\xc9\x00\x07\xa2\xdf\x02\x72\x49\x6e\x93\xbd\x00\xff\xff\xff\x00\x00\x59\x47\x00\x00\x00\x00\xe4\x8f\xb9\x3a\x00\x03\x3f\x1b' >>> parsed = RTCP(raw) >>> assert parsed.version == 2 >>> assert parsed.padding == 0 >>> assert parsed.count == 1 >>> assert parsed.packet_type == 201 >>> assert parsed.length == 7 >>> assert parsed.sourcesync == 0xa2df0272 >>> assert parsed.report_blocks[0].sourcesync == 0x496e93bd >>> assert parsed.report_blocks[0].fraction_lost == 0 >>> assert parsed.report_blocks[0].cumulative_lost == 0xffffff >>> assert parsed.report_blocks[0].highest_seqnum_recv == 22855 >>> assert parsed.report_blocks[0].interarrival_jitter == 0 >>> assert parsed.report_blocks[0].last_SR_timestamp == 0xe48fb93a >>> assert parsed.report_blocks[0].delay_since_last_SR == 212763 ###### ## RTCP Source Description tests ###### ###(002)=[passed] test source description report parse >>> raw = b"\x81\xca\x00\x0c\xa2\xdf\x02\x72\x01\x1c\x75\x73\x65\x72\x31\x35" \ ... b"\x30\x33\x34\x38\x38\x39\x30\x31\x40\x68\x6f\x73\x74\x2d\x65\x37" \ ... b"\x32\x64\x62\x34\x33\x64\x06\x09\x47\x53\x74\x72\x65\x61\x6d\x65" \ ... b"\x72\x00\x00\x00" >>> parsed = RTCP(raw) >>> assert parsed.version == 2 >>> assert parsed.padding == 0 >>> assert parsed.count == 1 >>> assert parsed.packet_type == 202 >>> assert parsed.length == 12 >>> assert parsed.sdes_chunks[0].sourcesync == 0xa2df0272 >>> assert parsed.sdes_chunks[0].items[0].chunk_type == 1 >>> assert parsed.sdes_chunks[0].items[0].length == 28 >>> assert parsed.sdes_chunks[0].items[0].value == b'user1503488901@host-e72db43d' >>> assert parsed.sdes_chunks[0].items[1].chunk_type == 6 >>> assert parsed.sdes_chunks[0].items[1].length == 9 >>> assert parsed.sdes_chunks[0].items[1].value == b'GStreamer' ###### ## RTCP parsing tests ###### ###(003)=[passed] test parse SR and SDES stacked >>> raw = b"\x81\xc9\x00\x07\xa2\xdf\x02\x72\x49\x6e\x93\xbd\x00\xff\xff\xff" \ ... b"\x00\x00\x59\x47\x00\x00\x00\x00\xe4\x8f\xb9\x3a\x00\x03\x3f\x1b" \ ... b"\x81\xca\x00\x0c\xa2\xdf\x02\x72\x01\x1c\x75\x73\x65\x72\x31\x35" \ ... b"\x30\x33\x34\x38\x38\x39\x30\x31\x40\x68\x6f\x73\x74\x2d\x65\x37" \ ... b"\x32\x64\x62\x34\x33\x64\x06\x09\x47\x53\x74\x72\x65\x61\x6d\x65" \ ... b"\x72\x00\x00\x00" ###(004)=[passed] format SR + 2xRR and parse back >>> rtcp = RTCP() >>> rtcp.packet_type = 200 >>> rtcp.sourcesync = 0x01010101 >>> rtcp.sender_info.rtp_timestamp = 0x03030303 >>> rtcp.count = 2 >>> rtcp.report_blocks.append(ReceptionReport(sourcesync=0x04040404)) >>> rtcp.report_blocks.append(ReceptionReport(sourcesync=0x05050505)) >>> b = bytes(rtcp) >>> rtcp2 = RTCP(b) >>> assert rtcp2.count == 2 >>> assert rtcp2.length == 18 >>> assert rtcp2.sourcesync == 0x01010101 >>> assert rtcp2.sender_info.rtp_timestamp == 0x03030303 >>> assert len(rtcp2.sender_info.payload) == 0 >>> assert rtcp2.report_blocks[0].sourcesync == 0x04040404 >>> assert len(rtcp2.report_blocks[0].payload) == 0 >>> assert rtcp2.report_blocks[1].sourcesync == 0x05050505 RTPS layer test campaign ━ Run at 01:43:09 from [test/contrib/rtps.uts] by UTscapy in 0.24701571464538574 └ Passed=8 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the RTPS layer >>> from scapy.contrib.rtps import * >>> pkt = b"\x52\x54\x50\x53\x02\x01\x01\x10\x57\x63\x10\x01\xd6\xab\x40\x7f" \ ... b"\x5b\xd9\xbb\x1c\x0e\x01\x0c\x00\x88\x2a\x10\x01\x5d\x8c\x97\x40" \ ... b"\x78\xb6\x2d\xc2\x09\x01\x08\x00\xf4\x50\x81\x60\x51\xdd\x5c\x1c" \ ... b"\x15\x05\x10\x01\x00\x00\x10\x00\x00\x01\x00\xc7\x00\x01\x00\xc2" \ ... b"\x00\x00\x00\x00\x01\x00\x00\x00\x00\x03\x00\x00\x15\x00\x04\x00" \ ... b"\x02\x01\x00\x00\x16\x00\x04\x00\x01\x10\x00\x00\x02\x00\x08\x00" \ ... b"\x0a\x00\x00\x00\x00\x00\x00\x00\x50\x00\x10\x00\x57\x63\x10\x01" \ ... b"\xd6\xab\x40\x7f\x5b\xd9\xbb\x1c\x00\x00\x01\xc1\x58\x00\x04\x00" \ ... b"\x3f\x0c\x00\x00\x0f\x00\x04\x00\x00\x00\x00\x00\x31\x00\x18\x00" \ ... b"\x01\x00\x00\x00\xbd\xeb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\x00\x00\x00\x00\xac\x11\x00\x02\x48\x00\x18\x00\x01\x00\x00\x00" \ ... b"\xe9\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\xef\xff\x00\x01\x32\x00\x18\x00\x01\x00\x00\x00\xbd\xeb\x00\x00" \ ... b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xac\x11\x00\x02" \ ... b"\x33\x00\x18\x00\x01\x00\x00\x00\xe8\x1c\x00\x00\x00\x00\x00\x00" \ ... b"\x00\x00\x00\x00\x00\x00\x00\x00\xef\xff\x00\x01\x07\x80\x38\x00" \ ... b"\x00\x00\x00\x00\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\x00\x00\x00\x00\x1d\x00\x00\x00\x74\x65\x73\x74\x2e\x6c\x6f\x63" \ ... b"\x61\x6c\x2f\x30\x2e\x38\x2e\x30\x2f\x4c\x69\x6e\x75\x78\x2f\x4c" \ ... b"\x69\x6e\x75\x78\x00\x00\x00\x00\x19\x80\x04\x00\x00\x80\x06\x00" \ ... b"\x01\x00\x00\x00" ###### ## Test endianness ###### ###(001)=[passed] PID_BUILTIN_ENDPOINT_QOS endianness >>> assert raw(PID_BUILTIN_ENDPOINT_QOS(parameterId=119, parameterLength=0, parameterData=b"")) == b'w\x00\x00\x00' ###### ## Test RTPS ###### ###(002)=[passed] RTPS default header values >>> pkt2 = RTPS()/RTPSMessage(submessages=[ ... RTPSSubMessage_HEARTBEAT(), ... RTPSSubMessage_INFO_TS(), ... RTPSSubMessage_DATA(), ... ]) >>> assert bytes(RTPS()) == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' ###(003)=[passed] RTPS packet declaration >>> pkt3 = RTPS( ... protocolVersion=ProtocolVersionPacket(major=2, minor=1), ... vendorId=VendorIdPacket(vendor_id=0x0110), ... guidPrefix=GUIDPrefixPacket( ... hostId=1466109953, appId=3601547391, instanceId=1540995868 ... ), ... magic=b"RTPS", ... ) / RTPSMessage( ... submessages=[ ... RTPSSubMessage_INFO_DST( ... submessageId=14, ... submessageFlags=1, ... octetsToNextHeader=12, ... guidPrefix=GUIDPrefixPacket( ... hostId=2284457985, appId=1569494848, instanceId=2025205186 ... ), ... ), ... RTPSSubMessage_INFO_TS( ... submessageId=9, ... submessageFlags=1, ... octetsToNextHeader=8, ... ts_seconds=1619087604, ... ts_fraction=475848017, ... ), ... RTPSSubMessage_DATA( ... submessageId=21, ... submessageFlags=5, ... octetsToNextHeader=272, ... extraFlags=0, ... octetsToInlineQoS=16, ... readerEntityIdKey=256, ... readerEntityIdKind=199, ... writerEntityIdKey=256, ... writerEntityIdKind=194, ... writerSeqNumHi=0, ... writerSeqNumLow=1, ... data=DataPacket( ... encapsulationKind=3, ... encapsulationOptions=0, ... parameterList=ParameterListPacket( ... parameterValues=[ ... PID_PROTOCOL_VERSION( ... parameterId=21, ... parameterLength=4, ... protocolVersion=ProtocolVersionPacket(major=2, minor=1), ... padding=b"\x00\x00", ... ), ... PID_VENDOR_ID( ... parameterId=22, ... parameterLength=4, ... vendorId=VendorIdPacket(vendor_id=0x0110), ... padding=b"\x00\x00", ... ), ... PID_PARTICIPANT_LEASE_DURATION( ... parameterId=2, ... parameterLength=8, ... parameterData=b"\n\x00\x00\x00\x00\x00\x00\x00", ... ), ... PID_PARTICIPANT_GUID( ... parameterId=80, ... parameterLength=16, ... guid=GUIDPacket( ... hostId=1466109953, ... appId=3601547391, ... instanceId=1540995868, ... entityId=449, ... ), ... ), ... PID_BUILTIN_ENDPOINT_SET( ... parameterId=88, ... parameterLength=4, ... parameterData=b"?\x0c\x00\x00", ... ), ... PID_DOMAIN_ID( ... parameterId=15, ... parameterLength=4, ... parameterData=b"\x00\x00\x00\x00", ... ), ... PID_DEFAULT_UNICAST_LOCATOR( ... parameterId=49, ... parameterLength=24, ... locator=LocatorPacket( ... locatorKind=1, port=60349, address="172.17.0.2" ... ), ... ), ... PID_DEFAULT_MULTICAST_LOCATOR( ... parameterId=72, ... parameterLength=24, ... locator=LocatorPacket( ... locatorKind=1, port=7401, address="239.255.0.1" ... ), ... ), ... PID_METATRAFFIC_UNICAST_LOCATOR( ... parameterId=50, ... parameterLength=24, ... locator=LocatorPacket( ... locatorKind=1, port=60349, address="172.17.0.2" ... ), ... ), ... PID_METATRAFFIC_MULTICAST_LOCATOR( ... parameterId=51, ... parameterLength=24, ... locator=LocatorPacket( ... locatorKind=1, port=7400, address="239.255.0.1" ... ), ... ), ... PID_UNKNOWN( ... parameterId=32775, ... parameterLength=56, ... parameterData=b"\x00\x00\x00\x00,\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1d\x00\x00\x00test.local/0.8.0/Linux/Linux\x00\x00\x00\x00", ... ), ... PID_UNKNOWN( ... parameterId=32793, ... parameterLength=4, ... parameterData=b"\x00\x80\x06\x00", ... ), ... ], ... sentinel=PID_SENTINEL(parameterId=1, parameterLength=0), ... ), ... ), ... ), ... ] ... ) ###(004)=[passed] RTPS header dissect >>> assert pkt3.build() == pkt ###### ## Test RTI RTPS ###### ###(005)=[passed] Test dissection >>> d = b"\x52\x54\x50\x53\x02\x03\x01\x01\x01\x01\x30\xba\xa8\x7b\x1d\xce" \ ... b"\xb3\x29\x1e\x43\x09\x01\x08\x00\xd6\x64\xa8\x61\x16\x09\x34\x7c" \ ... b"\x15\x05\xdc\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x01\x00\xc2" \ ... b"\x00\x00\x00\x00\x01\x00\x00\x00\x00\x03\x00\x00\x50\x00\x10\x00" \ ... b"\x01\x01\x30\xba\xa8\x7b\x1d\xce\xb3\x29\x1e\x43\x00\x00\x01\xc1" \ ... b"\x58\x00\x04\x00\x3f\x0c\x00\x00\x77\x00\x04\x00\x01\x00\x00\x00" \ ... b"\x15\x00\x04\x00\x02\x03\x00\x00\x16\x00\x04\x00\x01\x01\x00\x00" \ ... b"\x00\x80\x04\x00\x06\x00\x01\x00\x59\x00\x78\x01\x06\x00\x00\x00" \ ... b"\x16\x00\x00\x00\x64\x64\x73\x2e\x73\x79\x73\x5f\x69\x6e\x66\x6f" \ ... b"\x2e\x68\x6f\x73\x74\x6e\x61\x6d\x65\x00\x00\x00\x0d\x00\x00\x00" \ ... b"\x64\x66\x30\x62\x36\x64\x38\x33\x61\x62\x34\x36\x00\x00\x00\x00" \ ... b"\x18\x00\x00\x00\x64\x64\x73\x2e\x73\x79\x73\x5f\x69\x6e\x66\x6f" \ ... b"\x2e\x70\x72\x6f\x63\x65\x73\x73\x5f\x69\x64\x00\x05\x00\x00\x00" \ ... b"\x34\x38\x33\x30\x00\x00\x00\x00\x21\x00\x00\x00\x64\x64\x73\x2e" \ ... b"\x73\x79\x73\x5f\x69\x6e\x66\x6f\x2e\x65\x78\x65\x63\x75\x74\x61" \ ... b"\x62\x6c\x65\x5f\x66\x69\x6c\x65\x70\x61\x74\x68\x00\x00\x00\x00" \ ... b"\x42\x00\x00\x00\x2f\x75\x73\x72\x2f\x6c\x6f\x63\x61\x6c\x2f\x73" \ ... b"\x72\x63\x2f\x72\x74\x69\x2f\x72\x65\x73\x6f\x75\x72\x63\x65\x2f" \ ... b"\x61\x70\x70\x2f\x62\x69\x6e\x2f\x78\x36\x34\x4c\x69\x6e\x75\x78" \ ... b"\x32\x2e\x36\x67\x63\x63\x34\x2e\x34\x2e\x35\x2f\x72\x74\x69\x64" \ ... b"\x64\x73\x73\x70\x79\x00\x00\x00\x14\x00\x00\x00\x64\x64\x73\x2e" \ ... b"\x73\x79\x73\x5f\x69\x6e\x66\x6f\x2e\x74\x61\x72\x67\x65\x74\x00" \ ... b"\x14\x00\x00\x00\x78\x36\x34\x4c\x69\x6e\x75\x78\x32\x2e\x36\x67" \ ... b"\x63\x63\x34\x2e\x34\x2e\x35\x00\x20\x00\x00\x00\x64\x64\x73\x2e" \ ... b"\x73\x79\x73\x5f\x69\x6e\x66\x6f\x2e\x63\x72\x65\x61\x74\x69\x6f" \ ... b"\x6e\x5f\x74\x69\x6d\x65\x73\x74\x61\x6d\x70\x00\x14\x00\x00\x00" \ ... b"\x32\x30\x32\x31\x2d\x30\x36\x2d\x37\x20\x30\x34\x3a\x30\x39\x3a" \ ... b"\x30\x32\x5a\x00\x21\x00\x00\x00\x64\x64\x73\x2e\x73\x79\x73\x5f" \ ... b"\x69\x6e\x66\x6f\x2e\x65\x78\x65\x63\x75\x74\x69\x6f\x6e\x5f\x74" \ ... b"\x69\x6d\x65\x73\x74\x61\x6d\x70\x00\x00\x00\x00\x14\x00\x00\x00" \ ... b"\x32\x30\x32\x31\x2d\x31\x32\x2d\x31\x20\x30\x39\x3a\x31\x35\x3a" \ ... b"\x32\x39\x5a\x00\x31\x00\x18\x00\x01\x00\x00\x00\xf3\x1c\x00\x00" \ ... b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\x31\x00\x18\x00\x00\x00\x00\x01\xf3\x1c\x00\x00\x61\xab\xd9\x79" \ ... b"\xb5\x7c\x13\xa5\x29\x49\x2c\xa3\x00\x00\x00\x00\x32\x00\x18\x00" \ ... b"\x01\x00\x00\x00\xf2\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ ... b"\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\x18\x00\x00\x00\x00\x01" \ ... b"\xf2\x1c\x00\x00\x61\xab\xd9\x79\xb5\x7c\x13\xa5\x29\x49\x2c\xa3" \ ... b"\x00\x00\x00\x00\x33\x00\x18\x00\x01\x00\x00\x00\xe8\x1c\x00\x00" \ ... b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xef\xff\x00\x01" \ ... b"\x02\x00\x08\x00\x06\x00\x00\x00\xff\xff\xff\x7f\x01\x80\x04\x00" \ ... b"\xff\xff\x00\x00\x62\x00\x28\x00\x22\x00\x00\x00\x52\x54\x49\x20" \ ... b"\x44\x61\x74\x61\x20\x44\x69\x73\x74\x72\x69\x62\x75\x74\x69\x6f" \ ... b"\x6e\x20\x53\x65\x72\x76\x69\x63\x65\x20\x53\x70\x79\x00\x00\x00" \ ... b"\x0f\x00\x04\x00\x00\x00\x00\x00\x0f\x80\x04\x00\x00\x00\x00\x00" \ ... b"\x10\x80\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\xe3\xff\x00\x00" \ ... b"\x00\x00\x00\x01\x00\x00\x01\x00\x16\x80\x08\x00\x10\x00\x00\x00" \ ... b"\x00\x00\x00\x00\x17\x80\x04\x00\x03\x00\x00\x00\x01\x00\x00\x00" >>> >>> p0 = RTPS(d) >>> p1 = RTPS( ... protocolVersion=ProtocolVersionPacket(major=2, minor=3), ... vendorId=VendorIdPacket(vendor_id=0x0101), ... guidPrefix=GUIDPrefixPacket( ... hostId=16855226, appId=2826640846, instanceId=3005816387 ... ), ... magic=b"RTPS", ... ) / RTPSMessage( ... submessages=[ ... RTPSSubMessage_INFO_TS( ... submessageId=9, ... submessageFlags=1, ... octetsToNextHeader=8, ... ts_seconds=1638425814, ... ts_fraction=2083784982, ... ), ... RTPSSubMessage_DATA( ... submessageId=21, ... submessageFlags=5, ... octetsToNextHeader=732, ... extraFlags=0, ... octetsToInlineQoS=16, ... readerEntityIdKey=0, ... readerEntityIdKind=0, ... writerEntityIdKey=256, ... writerEntityIdKind=194, ... writerSeqNumHi=0, ... writerSeqNumLow=1, ... data=DataPacket( ... encapsulationKind=3, ... encapsulationOptions=0, ... parameterList=ParameterListPacket( ... parameterValues=[ ... PID_PARTICIPANT_GUID( ... parameterId=80, ... parameterLength=16, ... guid=GUIDPacket( ... hostId=16855226, ... appId=2826640846, ... instanceId=3005816387, ... entityId=449, ... ), ... ), ... PID_BUILTIN_ENDPOINT_SET( ... parameterId=88, ... parameterLength=4, ... parameterData=b"?\x0c\x00\x00", ... ), ... PID_BUILTIN_ENDPOINT_QOS( ... parameterId=119, ... parameterLength=4, ... parameterData=b"\x01\x00\x00\x00", ... ), ... PID_PROTOCOL_VERSION( ... parameterId=21, ... parameterLength=4, ... protocolVersion=ProtocolVersionPacket(major=2, minor=3), ... padding=b"\x00\x00", ... ), ... PID_VENDOR_ID( ... parameterId=22, ... parameterLength=4, ... vendorId=VendorIdPacket(vendor_id=0x0101), ... padding=b"\x00\x00", ... ), ... PID_PRODUCT_VERSION( ... parameterId=32768, ... parameterLength=4, ... productVersion=ProductVersionPacket( ... major=6, minor=0, release=1, revision=0 ... ), ... ), ... PID_PROPERTY_LIST( ... parameterId=89, ... parameterLength=376, ... parameterData=b"\x06\x00\x00\x00\x16\x00\x00\x00dds.sys_info.hostname\x00\x00\x00\r\x00\x00\x00df0b6d83ab46\x00\x00\x00\x00\x18\x00\x00\x00dds.sys_info.process_id\x00\x05\x00\x00\x004830\x00\x00\x00\x00!\x00\x00\x00dds.sys_info.executable_filepath\x00\x00\x00\x00B\x00\x00\x00/usr/local/src/rti/resource/app/bin/x64Linux2.6gcc4.4.5/rtiddsspy\x00\x00\x00\x14\x00\x00\x00dds.sys_info.target\x00\x14\x00\x00\x00x64Linux2.6gcc4.4.5\x00 \x00\x00\x00dds.sys_info.creation_timestamp\x00\x14\x00\x00\x002021-06-7 04:09:02Z\x00!\x00\x00\x00dds.sys_info.execution_timestamp\x00\x00\x00\x00\x14\x00\x00\x002021-12-1 09:15:29Z\x00", ... ), ... PID_DEFAULT_UNICAST_LOCATOR( ... parameterId=49, ... parameterLength=24, ... locator=LocatorPacket( ... locatorKind=1, port=7411, address="0.0.0.0" ... ), ... ), ... PID_DEFAULT_UNICAST_LOCATOR( ... parameterId=49, ... parameterLength=24, ... locator=LocatorPacket( ... locatorKind=16777216, ... port=7411, ... hostId=b"a\xab\xd9y\xb5|\x13\xa5)I,\xa3\x00\x00\x00\x00", ... ), ... ), ... PID_METATRAFFIC_UNICAST_LOCATOR( ... parameterId=50, ... parameterLength=24, ... locator=LocatorPacket( ... locatorKind=1, port=7410, address="0.0.0.0" ... ), ... ), ... PID_METATRAFFIC_UNICAST_LOCATOR( ... parameterId=50, ... parameterLength=24, ... locator=LocatorPacket( ... locatorKind=16777216, ... port=7410, ... hostId=b"a\xab\xd9y\xb5|\x13\xa5)I,\xa3\x00\x00\x00\x00", ... ), ... ), ... PID_METATRAFFIC_MULTICAST_LOCATOR( ... parameterId=51, ... parameterLength=24, ... locator=LocatorPacket( ... locatorKind=1, port=7400, address="239.255.0.1" ... ), ... ), ... PID_PARTICIPANT_LEASE_DURATION( ... parameterId=2, ... parameterLength=8, ... parameterData=b"\x06\x00\x00\x00\xff\xff\xff\x7f", ... ), ... PID_PLUGIN_PROMISCUITY_KIND( ... parameterId=32769, parameterLength=4, promiscuityKind=65535 ... ), ... PID_ENTITY_NAME( ... parameterId=98, ... parameterLength=40, ... parameterData=b'"\x00\x00\x00RTI Data Distribution Service Spy\x00\x00\x00', ... ), ... PID_DOMAIN_ID( ... parameterId=15, ... parameterLength=4, ... parameterData=b"\x00\x00\x00\x00", ... ), ... PID_RTI_DOMAIN_ID( ... parameterId=32783, parameterLength=4, domainId=0 ... ), ... PID_TRANSPORT_INFO_LIST( ... transportInfo=[ ... TransportInfoPacket(classID=1, messageSizeMax=65507), ... TransportInfoPacket( ... classID=16777216, messageSizeMax=65536 ... ), ... ], ... parameterId=32784, ... parameterLength=20, ... padding=b"\x02\x00\x00\x00", ... ), ... PID_REACHABILITY_LEASE_DURATION( ... parameterId=32790, ... parameterLength=8, ... lease_duration=LeaseDurationPacket( ... seconds=268435456, fraction=0 ... ), ... ), ... PID_VENDOR_BUILTIN_ENDPOINT_SET( ... parameterId=32791, parameterLength=4, flags=3 ... ), ... ], ... sentinel=PID_SENTINEL(parameterId=1, parameterLength=0), ... ), ... ), ... ), ... ] ... ) >>> assert p0.build() == d >>> assert p1.build() == d >>> assert p1 == p0 ###### ## Test for pr #3914 ###### ###(006)=[passed] RTPS Heartbeat SequenceNumber_t packing and dissection >>> d = b"\x52\x54\x50\x53\x02\x02\x01\x0f\x01\x0f\x45\xd2\xb3\xf5\x58\xb9" \ ... b"\x01\x00\x00\x00\x07\x01\x1c\x00\x00\x00\x03\xc7\x00\x00\x03\xc2" \ ... b"\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" \ ... b"\x01\x00\x00\x00" >>> >>> p0 = RTPS(d) >>> >>> p1 = RTPS( ... protocolVersion=ProtocolVersionPacket(major=2, minor=2), ... vendorId=VendorIdPacket(vendor_id=0x010f), ... guidPrefix=GUIDPrefixPacket( ... hostId=0x010f45d2, appId=0xb3f558b9, instanceId=0x01000000 ... ), ... magic=b"RTPS", ... ) / RTPSMessage( ... submessages=[ ... RTPSSubMessage_HEARTBEAT( ... submessageId=0x07, ... submessageFlags=0x01, ... octetsToNextHeader=28, ... reader_id=b"\x00\x00\x03\xc7", ... writer_id=b"\x00\x00\x03\xc2", ... firstAvailableSeqNumHi=0, ... firstAvailableSeqNumLow=1, ... lastSeqNumHi=0, ... lastSeqNumLow=1, ... count=1 ... ) ... ] ... ) >>> >>> assert p0.build() == d >>> assert p1.build() == d >>> assert p0 == p1 ###### ## Test for pr #3915 ###### ###(007)=[passed] RTPS ACKNACK count packing and dissection >>> d = b"\x52\x54\x50\x53\x02\x02\x01\x0f\x01\x0f\x45\xd2\xb3\xf5\x58\xb9" \ ... b"\x01\x00\x00\x00\x06\x03\x18\x00\x00\x00\x03\xc7\x00\x00\x03\xc2" \ ... b"\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" >>> p0 = RTPS(d) >>> >>> p1 = RTPS( ... protocolVersion=ProtocolVersionPacket(major=2, minor=2), ... vendorId=VendorIdPacket(vendor_id=0x010f), ... guidPrefix=GUIDPrefixPacket( ... hostId=0x010f45d2, appId=0xb3f558b9, instanceId=0x01000000 ... ), ... magic=b"RTPS", ... ) / RTPSMessage( ... submessages=[ ... RTPSSubMessage_ACKNACK( ... submessageId=6, ... submessageFlags=3, ... octetsToNextHeader=0x18, ... reader_id=b'\x00\x00\x03\xc7', ... writer_id=b'\x00\x00\x03\xc2', ... readerSNState=b'\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00', ... count=1 ... ) ... ] ... ) >>> >>> assert p0.build() == d >>> assert p1.build() == d >>> assert p0 == p1 Test campaign ━ Run at 01:43:10 from [test/contrib/rtr.uts] by UTscapy in 0.1043403148651123 └ Passed=42 └ Failed=0 ###### ## RTR Serial Notify ###### ###(000)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRSerialNotify() >>> raw(pkt) == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00' True ###(001)=[passed] default values build >>> pkt = IP()/TCP(dport=323)/RTRSerialNotify() >>> RTRSerialNotify in pkt and pkt.rtr_version == 0 and pkt.pdu_type == 0 and pkt.session_id == 0 and pkt.length == 12 and pkt.serial_number == 0 True ###(002)=[passed] filled values build >>> pkt = IP()/TCP(dport=323)/RTRSerialNotify(session_id=12345, length=12, serial_number=789) >>> raw(pkt) == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00]#\x00\x00\x00\x0009\x00\x00\x00\x0c\x00\x00\x03\x15' True ###(003)=[passed] dissection >>> pkt = Ether(b'\x00\x16>\xa9\x04\x1a\x84x\xac[\x82\xc2\x08\x00E\x00\x16\xd4\xb9\xa5@\x005\x06\x93\xd5\x8d\x16\x1c\xdc\xb9\x1a~\x9c Z\xcb\xa2\nF2`J\xe2\x8c\xc0\x80\x10\x00\xe3\xf8o\x00\x00\x01\x01\x08\n\xeaX\x9f\x82\x81\xfb\xc4\n\x00\x00\x00\x00\x00\x00\xcc!\x00\x04\x00\x00') >>> pkt.session_id == 0 and pkt.length == 52257 and pkt.serial_number == 262144 True ###### ## RTR Serial Query ###### ###(004)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRSerialQuery() >>> raw(pkt) == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90p\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00' True ###(005)=[passed] default values build >>> pkt = IP()/TCP(dport=323)/RTRSerialQuery() >>> RTRSerialQuery in pkt and pkt.rtr_version == 0 and pkt.pdu_type == 1 and pkt.session_id == 0 and pkt.length == 12 and pkt.serial_number == 0 True ###(006)=[passed] filled values build >>> pkt = IP()/TCP(dport=323)/RTRSerialQuery(session_id=17, length=12, serial_number=55463) >>> raw(pkt) == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb7\xb7\x00\x00\x00\x01\x00\x11\x00\x00\x00\x0c\x00\x00\xd8\xa7' True ###(007)=[passed] dissection >>> pkt = Ether(b'\x00\x07\xb4\x00+\x02\x00\x16>\xa9\x04\x1a\x08\x00E\x00\x00@I2@\x00@\x06\x0f\xdd\xb9\x1a~\x9c\x8d\x16\x1c\xdc\xcb\xa2 ZJ\xe2\x8c\xc0\nR\xdbD\x80\x18\x05#\xe1\xdb\x00\x00\x01\x01\x08\n\x81\xfb\xcf\xca\xeaX\xcd\x92\x00\x01\x13/\x00\x00\x00\x0c\x00\x00\x81\x7f') >>> pkt.session_id == 4911 and pkt.length == 12 and pkt.serial_number == 33151 True ###### ## RTR Reset Query ###### ###(008)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRResetQuery() >>> raw(pkt) == b'E\x00\x000\x00\x01\x00\x00@\x06|\xc5\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90w\x00\x00\x00\x02\x00\x00\x00\x00\x00\x08' True ###(009)=[passed] default values build >>> pkt = IP()/TCP(dport=323)/RTRResetQuery() >>> RTRResetQuery in pkt and pkt.reserved == 0 and pkt.length == 8 True ###(010)=[passed] dissection >>> pkt = Ether(b"\x00\x07\xb4\x00+\x02\x00\x16>\xa9\x04\x1a\x08\x00E\x00\x00>> pkt.reserved == 0 and pkt.length == 8 True ###### ## RTR Cache Response ###### ###(011)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse() >>> raw(pkt) == b'E\x00\x000\x00\x01\x00\x00@\x06|\xc5\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90v\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08' True ###(012)=[passed] default values build >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse() >>> RTRCacheResponse in pkt and pkt.session_id == 0 and pkt.length == 8 True ###(013)=[passed] filled values build >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse(session_id=12345) >>> raw(pkt) == b'E\x00\x000\x00\x01\x00\x00@\x06|\xc5\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00`=\x00\x00\x00\x0309\x00\x00\x00\x08' True ###(014)=[passed] dissection >>> pkt = Ether(b"\x00\x16>\xa9\x04\x1a\x84x\xac[\x82\xc2\x08\x00E\x00\x0b\x84\xb9\xa3@\x005\x06\x9f'\x8d\x16\x1c\xdc\xb9\x1a~\x9c Z\xcb\xa2\nF'\x10J\xe2\x8c\xc0\x80\x10\x00\xe3\xed\x1f\x00\x00\x01\x01\x08\n\xeaX\x9f\x82\x81\xfb\xc4\n\x00\x03\x13/\x00\x00\x00\x08") >>> pkt.session_id == 4911 and pkt.length == 8 True ###### ## RTR IPv4 Prefix ###### ###(015)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv4Prefix() >>> raw(pkt) == b'E\x00\x00D\x00\x01\x00\x00@\x06|\xb1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90J\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08\x00\x04\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(016)=[passed] default values build >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv4Prefix() >>> RTRIPv4Prefix in pkt and pkt.shortest_length == 0 and pkt.longest_length == 0 and pkt.prefix == "0.0.0.0" and pkt.asn == 0 True ###(017)=[passed] filled values build >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv4Prefix(prefix="192.0.2.0", asn=45000, shortest_length=20, longest_length=20) >>> raw(pkt) == b'E\x00\x00D\x00\x01\x00\x00@\x06|\xb1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\nm\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08\x00\x04\x00\x00\x00\x00\x00\x14\x00\x14\x14\x00\xc0\x00\x02\x00\x00\x00\xaf\xc8' True ###(018)=[passed] dissection >>> pkt = Ether(b"\x00\x16>\xa9\x04\x1a\x84x\xac[\x82\xc2\x08\x00E\x00\x0b\x84\xb9\xa3@\x005\x06\x9f'\x8d\x16\x1c\xdc\xb9\x1a~\x9c Z\xcb\xa2\nF'\x10J\xe2\x8c\xc0\x80\x10\x00\xe3\xed\x1f\x00\x00\x01\x01\x08\n\xeaX\x9f\x82\x81\xfb\xc4\n\x00\x03\x13/\x00\x00\x00\x08\x00\x04\x00\x00\x00\x00\x00\x14\x01\x13\x13\x00Y\xb9\xe0\x00\x00\x00a\x8b") >>> pkt.asn == 24971 and pkt.prefix == "89.185.224.0"and pkt.shortest_length == 19 and pkt.longest_length == 19 True ###### ## RTR IPv6 Prefix ###### ###(019)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv6Prefix() >>> raw(pkt) == b'E\x00\x00P\x00\x01\x00\x00@\x06|\xa5\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x900\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08\x00\x06\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(020)=[passed] default value build >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv6Prefix() >>> RTRIPv6Prefix in pkt and pkt.shortest_length == 0 and pkt.longest_length == 0 and pkt.prefix == "::" and pkt.asn == 0 True ###(021)=[passed] filled values build >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv6Prefix(prefix="2001:db8::", asn=45000, shortest_length=32, longest_length=32) >>> pkt.prefix == "2001:db8::" and pkt.asn == 45000 and pkt.shortest_length == 32 and pkt.longest_length == 32 True ###(022)=[passed] dissection >>> pkt = Ether(b"\x00\x16>\xa9\x04\x1a\x84x\xac[\x82\xc2\x08\x00E\x00\x0b\x84\xb9\xa3@\x005\x06\x9f'\x8d\x16\x1c\xdc\xb9\x1a~\x9c Z\xcb\xa2\nF'\x10J\xe2\x8c\xc0\x80\x10\x00\xe3\xed\x1f\x00\x00\x01\x01\x08\n\xeaX\x9f\x82\x81\xfb\xc4\n\x00\x03\x13/\x00\x00\x00\x08\x00\x06\x00\x00\x00\x00\x00 \x01 \x00*\x03\xcd\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xe2") >>> pkt.prefix == "2a03:cd80::" and pkt.asn == 16354 and pkt.shortest_length == 32 and pkt.longest_length == 32 True ###### ## RTR End of Data version 0 ###### ###(023)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTREndofDatav0() >>> raw(pkt) == b'E\x00\x00<\x00\x01\x00\x00@\x06|\xb9\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90W\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08\x00\x07\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00' True ###(024)=[passed] default values build >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTREndofDatav0() >>> RTREndofDatav0 in pkt and pkt.session_id == 0 and pkt.serial_number == 0 True ###(025)=[passed] filled values build >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse(session_id=12345)/RTREndofDatav0(session_id=12345, serial_number=17) >>> pkt.serial_number == 17 and pkt.session_id == 12345 True ###(026)=[passed] dissection >>> pkt = IP(b'E\x00\x00<\x00\x01\x00\x00@\x06|\xb9\x7f\x00\x00\x01\x7f\x00\x00\x01 Z\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x0f\x8e\x00\x00\x00\x0309\x00\x00\x00\x08\x00\x0709\x00\x00\x00\x0c\x00\x00\x00\x11') >>> RTREndofDatav0 in pkt and pkt.serial_number == 17 and pkt.session_id == 12345 True ###### ## RTR End of Data version 1 ###### ###(027)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTREndofDatav1() >>> raw(pkt) == b'E\x00\x00H\x00\x01\x00\x00@\x06|\xad\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f?\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08\x01\x07\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(028)=[passed] default values build >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTREndofDatav1() >>> RTREndofDatav1 in pkt and pkt.session_id == 0 and pkt.serial_number == 0 and pkt.refresh_interval == 0 and pkt.retry_interval == 0 and pkt.expire_interval == 0 True ###(029)=[passed] filled values build >>> pkt = IP()/TCP(dport=323)/RTRCacheResponse(session_id=12345)/RTREndofDatav1(session_id=12345, serial_number=17, refresh_interval=500 , retry_interval=200, expire_interval=1800) >>> pkt.serial_number == 17 and pkt.session_id == 12345 True ###(030)=[passed] dissection >>> pkt = IP(b'E\x00\x00H\x00\x01\x00\x00@\x06|\xad\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00$\xf8\x00\x00\x00\x0309\x00\x00\x00\x08\x01\x0709\x00\x00\x00\x18\x00\x00\x00\x11\x00\x00\x01\xf4\x00\x00\x00\xc8\x00\x00\x07\x08') >>> RTREndofDatav1 in pkt and pkt.serial_number == 17 and pkt.session_id == 12345 True ###### ## RTR Cache Reset ###### ###(031)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRCacheReset() >>> raw(pkt) == b'E\x00\x000\x00\x01\x00\x00@\x06|\xc5\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90q\x00\x00\x00\x08\x00\x00\x00\x00\x00\x08' True ###(032)=[passed] default values build >>> pkt = IP()/TCP(dport=323)/RTRCacheReset() >>> RTRCacheReset in pkt and pkt.reserved == 0 True ###(033)=[passed] dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x000\x00\x01\x00\x00@\x06|\xc5\x7f\x00\x00\x01\x7f\x00\x00\x01 Z\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00p+\x00\x00\x00\x08\x00\x00\x00\x00\x00\x08') >>> RTRCacheReset in pkt and pkt.reserved == 0 True ###### ## RTR Router Key ###### ###(034)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRRouterKey() >>> raw(pkt) == b'E\x00\x00H\x00\x01\x00\x00@\x06|\xad\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f>\x00\x00\x01\t\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(035)=[passed] default values build >>> pkt = IP()/TCP(dport=323)/RTRRouterKey() >>> RTRRouterKey in pkt and pkt.zeros == 0 and pkt.subject_key_identifier == b'' and pkt.asn == 0 and pkt.subject_PKI == b'' True ###(036)=[passed] filled values build >>> pkt = IP()/TCP(dport=323)/RTRRouterKey(subject_key_identifier='7dd65f58882efc148edd', asn=45000, subject_PKI='Scapy ROA') >>> pkt.asn == 45000 and pkt.subject_PKI == b'Scapy ROA' and pkt.subject_key_identifier == b'7dd65f58882efc148edd' True ###(037)=[passed] dissection >>> pkt = IP(b'E\x00\x00Q\x00\x01\x00\x00@\x06|\xa4\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00x\xe8\x00\x00\x01\t\x00\x00\x00+\x00\x007dd65f58882efc148edd\x00\x00\xaf\xc8Scapy ROA') >>> RTRRouterKey in pkt #and pkt.asn == 45000 and pkt.subject_PKI == b'Scapy ROA' and pkt.zeros == 0 and pkt.subject_key_identifier == b'7dd65f58882efc148edd' True ###### ## RTR Error Report ###### ###(038)=[passed] default instantiation >>> pkt = IP()/TCP(dport=323)/RTRErrorReport() >>> raw(pkt) == b'E\x00\x008\x00\x01\x00\x00@\x06|\xbd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90]\x00\x00\x00\n\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(039)=[passed] default values build >>> pkt = IP()/TCP(dport=323)/RTRErrorReport() >>> RTRErrorReport in pkt and pkt.error_code == 0 and pkt.erroneous_PDU == b'' and pkt.error_text == b'' True ###(040)=[passed] filled values build >>> pkt = IP()/TCP(dport=323)/RTRErrorReport(error_code=1, error_text='Internal Error') >>> RTRErrorReport in pkt and pkt.error_code == 1 and pkt.error_text == b'Internal Error' True ###(041)=[passed] dissection >>> pkt = IP(b'E\x00\x00F\x00\x01\x00\x00@\x06|\xaf\x7f\x00\x00\x01\x7f\x00\x00\x01 Z\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xdc\x15\x00\x00\x00\n\x00\x01\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x0eInternal Error') >>> RTRErrorReport in pkt and pkt.error_code == 1 and pkt.error_text == b'Internal Error' True RTSP tests ━ Run at 01:43:10 from [test/contrib/rtsp.uts] by UTscapy in 0.009844541549682617 └ Passed=4 └ Failed=0 ###### ## RTSP - Dissection and Build tests ###### ###(000)=[passed] RTSP request - dissection >>> pkt = Ether(b'\xbc\xdf \x00\x02\x00\x00\x00\x02\x00\x00\x00\x08\x00E\x00\x01\xde\x16\xca@\x00\x80\x06\xf9\xb8Q\x83\xe7CR\xd3\\\xfd\x0fU\x02*\xbf\xd4\xcb\xa4~\n\x19DP\x18"8\x86n\x00\x00DESCRIBE rtsp://EMAP1.planetwideradio.com/tfm RTSP/1.0\r\nUser-Agent: WMPlayer/10.0.0.380 guid/7405E143-26AC-4B37-9802-A35EE8C6CFA7\r\nAccept: application/sdp\r\nAccept-Charset: UTF-8, *;q=0.1\r\nX-Accept-Authentication: Negotiate, NTLM, Digest, Basic\r\nAccept-Language: en-GB, *;q=0.1\r\nCSeq: 1\r\nSupported: com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.eosmsg, com.microsoft.wm.predstrm, com.microsoft.wm.startupprofile\r\n\r\n') >>> assert RTSPRequest in pkt >>> assert pkt.Method == b"DESCRIBE" >>> assert pkt.Request_Uri == b"rtsp://EMAP1.planetwideradio.com/tfm" >>> assert pkt.Version == b"RTSP/1.0" >>> assert pkt.Accept == b"application/sdp" >>> assert pkt.User_Agent == b"WMPlayer/10.0.0.380 guid/7405E143-26AC-4B37-9802-A35EE8C6CFA7" ###(001)=[passed] RTSP request - build >>> rebuild = RTSP() / RTSPRequest(Accept=b'application/sdp', Accept_Language=b'en-GB, *;q=0.1', User_Agent=b'WMPlayer/10.0.0.380 guid/7405E143-26AC-4B37-9802-A35EE8C6CFA7', Unknown_Headers={b'Accept-Charset': b'UTF-8, *;q=0.1', b'X-Accept-Authentication': b'Negotiate, NTLM, Digest, Basic', b'CSeq': b'1', b'Supported': b'com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.eosmsg, com.microsoft.wm.predstrm, com.microsoft.wm.startupprofile'}, Method=b'DESCRIBE', Request_Uri=b'rtsp://EMAP1.planetwideradio.com/tfm', Version=b'RTSP/1.0') >>> assert bytes(rebuild) == b'DESCRIBE rtsp://EMAP1.planetwideradio.com/tfm RTSP/1.0\r\nAccept: application/sdp\r\nAccept-Language: en-GB, *;q=0.1\r\nUser-Agent: WMPlayer/10.0.0.380 guid/7405E143-26AC-4B37-9802-A35EE8C6CFA7\r\nAccept-Charset: UTF-8, *;q=0.1\r\nX-Accept-Authentication: Negotiate, NTLM, Digest, Basic\r\nCSeq: 1\r\nSupported: com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.eosmsg, com.microsoft.wm.predstrm, com.microsoft.wm.startupprofile\r\n\r\n' ###(002)=[passed] RTSP response - dissection >>> pkt = Ether(b'\x00\x02\xb3L\xf6\xb2\x00 \x9cR\x93`\x08\x00E\x80\x02cY\x13@\x00p\x06\xa9\x91\xd8@\xbe=\n\xc9d)\x02*\t\x9d\xf7p\xe8O\x10\xfcz\x9fP\x18\xfc\xc0\x91L\x00\x00RTSP/1.0 200 OK\r\nTransport: RTP/AVP/UDP;unicast;server_port=5004-5005;client_port=2462-2463;ssrc=927717de;mode=PLAY\r\nDate: Sun, 06 Nov 2005 12:19:47 GMT\r\nCSeq: 2\r\nSession: 17555940012607716235;timeout=60\r\nServer: WMServer/9.1.1.3814\r\nSupported: com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.eosmsg, com.microsoft.wm.fastcache, com.microsoft.wm.packetpairssrc, com.microsoft.wm.startupprofile\r\nLast-Modified: Thu, 20 Oct 2005 16:30:11 GMT\r\nCache-Control: x-wms-content-size=84457, max-age=86398, must-revalidate, proxy-revalidate\r\nEtag: "84457"\r\n\r\n') >>> assert RTSPResponse in pkt >>> assert pkt.Version == b"RTSP/1.0" >>> assert pkt.Status_Code == b"200" >>> assert pkt.Reason_Phrase == b"OK" >>> assert pkt.Server == b"WMServer/9.1.1.3814" ###(003)=[passed] RTSP response - build >>> rebuild = RTSP() / RTSPResponse(Server=b'WMServer/9.1.1.3814', Unknown_Headers={b'Transport': b'RTP/AVP/UDP;unicast;server_port=5004-5005;client_port=2462-2463;ssrc=927717de;mode=PLAY', b'Date': b'Sun, 06 Nov 2005 12:19:47 GMT', b'CSeq': b'2', b'Session': b'17555940012607716235;timeout=60', b'Supported': b'com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.eosmsg, com.microsoft.wm.fastcache, com.microsoft.wm.packetpairssrc, com.microsoft.wm.startupprofile', b'Last-Modified': b'Thu, 20 Oct 2005 16:30:11 GMT', b'Cache-Control': b'x-wms-content-size=84457, max-age=86398, must-revalidate, proxy-revalidate', b'Etag': b'"84457"'}, Version=b'RTSP/1.0', Status_Code=b'200', Reason_Phrase=b'OK') >>> assert bytes(rebuild) == b'RTSP/1.0 200 OK\r\nServer: WMServer/9.1.1.3814\r\nTransport: RTP/AVP/UDP;unicast;server_port=5004-5005;client_port=2462-2463;ssrc=927717de;mode=PLAY\r\nDate: Sun, 06 Nov 2005 12:19:47 GMT\r\nCSeq: 2\r\nSession: 17555940012607716235;timeout=60\r\nSupported: com.microsoft.wm.srvppair, com.microsoft.wm.sswitch, com.microsoft.wm.eosmsg, com.microsoft.wm.fastcache, com.microsoft.wm.packetpairssrc, com.microsoft.wm.startupprofile\r\nLast-Modified: Thu, 20 Oct 2005 16:30:11 GMT\r\nCache-Control: x-wms-content-size=84457, max-age=86398, must-revalidate, proxy-revalidate\r\nEtag: "84457"\r\n\r\n' SDNV library tests ━ Run at 01:43:10 from [test/contrib/sdnv.uts] by UTscapy in 0.020940780639648438 └ Passed=6 └ Failed=0 ###### ## Test SDNV encoding/decoding ###### ###(000)=[passed] Load SDNVUtil >>> load_contrib("sdnv") ###(001)=[passed] Define utils >>> def doTestVector(vec): ... # Test numbers individually ... for n in vec: ... ba = SDNVUtil.encode(n) ... (num, sdnvLen) = SDNVUtil.decode(ba, 0) ... if num != n: ... print("Error encoding/decoding", n) ... return False ... # Encode them all in a bunch ... ba = bytearray() ... for n in vec: ... temp = SDNVUtil.encode(n) ... ba = ba + temp ... offset = 0 ... outNums = [] ... for n in vec: ... (num, sdnvLen) = SDNVUtil.decode(ba, offset) ... outNums.append(num) ... offset += sdnvLen ... if outNums != vec: ... print("Failed on multi-number encode/decode") ... return False ... return True ... ###(002)=[passed] Vector tests: small ints >>> ba = bytearray() >>> theNums = [0, 1, 2, 5, 126, 127, 128, 129, ... 130, 150, 190, 220, 254, 255, 256] >>> assert doTestVector(theNums) ###(003)=[passed] Vector tests: big ints >>> theNums = [0, 1, 0, 1, 0, 128, 32765, ... SDNVUtil.maxValue - 10, 4, 32766, 32767, 32768, 32769] >>> assert doTestVector(theNums) ###(004)=[passed] 100 random vector tests >>> import random >>> >>> def doRandomTestVector(howMany): ... vec = [] ... for i in range(0, howMany): ... vec.append(random.randint(0, SDNVUtil.maxValue)) ... result = doTestVector(vec) ... return result ... >>> assert doRandomTestVector(100) ###(005)=[passed] SDVN tests >>> s = SDNV(30) >>> b = s.encode(17) >>> theNums = [0, 4, 20, 29, 30, 31, 33] >>> not_enc = [] >>> for n in theNums: ... try: ... b = s.encode(n) ... except SDNVValueError as e: ... print("Could not encode", n, "-- maximum value is:", e.maxValue) ... not_enc.append(n) ... Could not encode 31 -- maximum value is: 30 Could not encode 33 -- maximum value is: 30 >>> not_enc.sort() >>> assert not_enc == [31, 33] Test campaign ━ Run at 01:43:10 from [test/contrib/sebek.uts] by UTscapy in 0.01780080795288086 └ Passed=7 └ Failed=0 ###### ## Sebek protocol ###### ###(000)=[passed] Layer binding 1 >>> pkt = IP() / UDP() / SebekHead() / SebekV1(cmd="diepotato") >>> assert pkt.sport == pkt.dport == 1101 and pkt[SebekHead].version == 1 >>> assert pkt.summary() == "IP / UDP / SebekHead / Sebek v1 read (b'diepotato')" ###(001)=[passed] Packet dissection 1 >>> pkt = IP(raw(pkt)) >>> pkt.sport == pkt.dport == 1101 and pkt[SebekHead].version == 1 True ###(002)=[passed] Layer binding 2 >>> pkt = IP() / UDP() / SebekHead() / SebekV2Sock(cmd="diepotato") >>> assert pkt.sport == pkt.dport == 1101 and pkt[SebekHead].version == 2 and pkt[SebekHead].type ==2 >>> assert pkt.summary() == "IP / UDP / SebekHead / Sebek v2 socket (b'diepotato')" ###(003)=[passed] Packet dissection 2 >>> pkt = IP(raw(pkt)) >>> pkt.sport == pkt.dport == 1101 and pkt[SebekHead].version == 2 and pkt[SebekHead].type ==2 True ###(004)=[passed] Layer binding 3 >>> pkt = IPv6()/UDP()/SebekHead()/SebekV3() >>> assert pkt.sport == pkt.dport == 1101 and pkt[SebekHead].version == 3 >>> assert pkt.summary() == "IPv6 / UDP / SebekHead / Sebek v3 read (b'')" ###(005)=[passed] Packet dissection 3 >>> pkt = IPv6(raw(pkt)) >>> pkt.sport == pkt.dport == 1101 and pkt[SebekHead].version == 3 True ###(006)=[passed] Nonsense summaries >>> assert SebekHead(version=2).summary() == "Sebek Header v2 read" >>> assert SebekV1(cmd="diepotato").summary() == "Sebek v1 (b'diepotato')" >>> assert SebekV2(cmd="diepotato").summary() == "Sebek v2 (b'diepotato')" >>> assert (SebekHead()/SebekV2(cmd="nottoday")).summary() == "SebekHead / Sebek v2 read (b'nottoday')" >>> assert SebekV3(cmd="diepotato").summary() == "Sebek v3 (b'diepotato')" >>> assert (SebekHead()/SebekV3(cmd="nottoday")).summary() == "SebekHead / Sebek v3 read (b'nottoday')" >>> assert SebekV3Sock(cmd="diepotato").summary() == "Sebek v3 socket (b'diepotato')" >>> assert (SebekHead()/SebekV3Sock(cmd="nottoday")).summary() == "SebekHead / Sebek v3 socket (b'nottoday')" >>> assert SebekV2Sock(cmd="diepotato").summary() == "Sebek v2 socket (b'diepotato')" >>> assert (SebekHead()/SebekV2Sock(cmd="nottoday")).summary() == "SebekHead / Sebek v2 socket (b'nottoday')" Test campaign ━ Run at 01:43:10 from [test/contrib/send.uts] by UTscapy in 0.01842212677001953 └ Passed=4 └ Failed=0 ###### ## SEND (IPv6) tests ###### ###(000)=[passed] ICMPv6NDOptRsaSig build and dissection >>> pkt = Ether()/IPv6()/ICMPv6ND_NS()/ICMPv6NDOptRsaSig(signature_pad = b"\x01" * 12) >>> pkt = Ether(raw(pkt)) >>> >>> assert ICMPv6NDOptRsaSig in pkt >>> assert pkt[ICMPv6NDOptRsaSig].signature_pad == b"\x01" * 12 ###(001)=[passed] ICMPv6NDOptCGA build and dissection >>> pkt = Ether()/IPv6()/ICMPv6ND_NS()/ICMPv6NDOptCGA(CGA_PARAMS=CGA_Params()) >>> pkt = Ether(raw(pkt)) >>> >>> assert ICMPv6NDOptCGA in pkt >>> assert isinstance(pkt[ICMPv6NDOptCGA].CGA_PARAMS.pubkey, X509_SubjectPublicKeyInfo) >>> assert len(pkt) == 142 ###(002)=[passed] ICMPv6NDOptTmstp build and dissection >>> pkt = Ether()/IPv6()/ICMPv6ND_NS()/ICMPv6NDOptTmstp(timestamp=int(time.mktime(time.gmtime()))) >>> pkt = Ether(raw(pkt)) >>> pkt.show() ###[ Ethernet ]### dst = 33:33:00:00:00:01 src = 52:54:00:a3:0b:7c type = IPv6 ###[ IPv6 ]### version = 6 tc = 0 fl = 0 plen = 36 nh = ICMPv6 hlim = 255 src = fe80::5054:ff:fea3:b7c dst = ff02::1 ###[ ICMPv6 Neighbor Discovery - Neighbor Solicitation ]### type = Neighbor Solicitation code = 0 cksum = 0xb1a3 res = 0 tgt = :: ###[ ICMPv6NDOptTmstp ]### type = 13 len = 2 reserved = 0 timestamp = Sun, 08 Dec 2024 01:43:10 (1733622190) >>> >>> assert ICMPv6NDOptTmstp in pkt >>> assert pkt[ICMPv6NDOptTmstp].len == 2 ###(003)=[passed] ICMPv6NDOptNonce build and dissection >>> pkt = Ether()/IPv6()/ICMPv6ND_NS()/ICMPv6NDOptNonce(nonce=b"\x31\x32\x33\x34\x35\x36") >>> pkt = Ether(raw(pkt)) >>> >>> assert ICMPv6NDOptNonce in pkt >>> assert raw(ICMPv6NDOptNonce(nonce=b"\x31\x32\x33\x34\x35\x36")) == b'\x0e\x01123456' Test campaign ━ Run at 01:43:10 from [test/contrib/socks.uts] by UTscapy in 0.030992984771728516 └ Passed=3 └ Failed=0 ###### ## SOCKS 4/5 tests ###### ###(000)=[passed] Basic build and dissection - test version dispatch >>> p1 = Ether(raw(Ether()/IP()/TCP()/SOCKS()/SOCKS5Request())) >>> p2 = Ether(raw(Ether()/IP()/TCP()/SOCKS()/SOCKS5Reply())) >>> p3 = Ether(raw(Ether()/IP()/TCP()/SOCKS()/SOCKS4Request())) >>> p4 = Ether(raw(Ether()/IP()/TCP()/SOCKS()/SOCKS4Reply())) >>> >>> assert p1[TCP].dport == 1080 >>> assert p1[SOCKS].vn == 0x5 >>> assert SOCKS5Request in p1 >>> >>> assert p2[TCP].sport == 1080 >>> assert p2[SOCKS].vn == 0x5 >>> assert SOCKS5Reply in p2 >>> >>> assert p3[TCP].dport == 1080 >>> assert p3[SOCKS].vn == 0x4 >>> assert SOCKS4Request in p3 >>> >>> assert p4[TCP].sport == 1080 >>> assert p4[SOCKS].vn == 0x0 >>> assert SOCKS4Reply in p4 ###(001)=[passed] SOCKS5Request build and dissection >>> pkt = IP(dst="127.0.0.1", src="127.0.0.1")/TCP(sport=123)/SOCKS()/SOCKS5Request(atyp=0x3, addr="scapy.net") >>> assert raw(pkt) == b'E\x00\x009\x00\x01\x00\x00@\x06|\xbc\x7f\x00\x00\x01\x7f\x00\x00\x01\x049\x048\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xf2*\x00\x00\x05\x00\x00\x03\x05scapy\x03net\x00\x00P' >>> pkt = IP(raw(pkt)) >>> >>> assert SOCKS5Request in pkt >>> assert pkt[SOCKS5Request].addr == b'scapy.net.' ###(002)=[passed] Test SOCKSv5 over UDP >>> pkt = Ether()/IP()/UDP()/SOCKS5UDP(port=53)/DNS() >>> pkt = Ether(raw(pkt)) >>> assert DNS in pkt STAMP regression tests for Scapy ━ Run at 01:43:10 from [test/contrib/stamp.uts] by UTscapy in 0.020028114318847656 └ Passed=3 └ Failed=0 ###### ## STAMP tests ###### ###(000)=[passed] Load module >>> load_contrib("stamp") ###(001)=[passed] Test STAMP Session-Sender Test (Unauthenticated) >>> created = STAMPSessionSenderTestUnauthenticated( ... seq=0x1234, ... ts=1234.5678, ... err_estimate=ErrorEstimate( ... S=1, ... Z=0, ... scale=0x12, ... multiplier=0x34 ... ), ... ssid=1357 ... ) >>> assert raw(created) == b'\x00\x00\x12\x34\x00\x00\x04\xD2\x91\x5B\x57\x3E\x92\x34\x05\x4D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> parsed = STAMPSessionSenderTestUnauthenticated(raw(created)) >>> assert parsed.seq == 0x1234 >>> assert parsed.ts == 1234.5678 >>> assert parsed.err_estimate.S == 1 >>> assert parsed.err_estimate.Z == 0 >>> assert parsed.err_estimate.scale == 0x12 >>> assert parsed.err_estimate.multiplier == 0x34 >>> assert parsed.ssid == 1357 >>> assert parsed.mbz == 0 >>> assert not parsed.tlv_objects ###(002)=[passed] Test STAMP Session-Reflector Test (Unauthenticated) >>> created = STAMPSessionReflectorTestUnauthenticated( ... seq=0x1234, ... ts=1234.5678, ... err_estimate=ErrorEstimate( ... S=1, ... Z=0, ... scale=0x12, ... multiplier=0x34 ... ), ... ssid=1357, ... ts_rx=4321.8765, ... seq_sender=0x4321, ... ts_sender=2143.6587, ... err_estimate_sender=ErrorEstimate( ... S=0, ... Z=0, ... scale=0x21, ... multiplier=0x43 ... ), ... ttl_sender=111 ... ) >>> assert raw(created) == b'\x00\x00\x12\x34\x00\x00\x04\xD2\x91\x5B\x57\x3E\x92\x34\x05\x4D\x00\x00\x10\xE1\xE0\x62\x4D\xD2\x00\x00\x43\x21\x00\x00\x08\x5F\xA8\xA0\x90\x2D\x21\x43\x00\x00\x6F\x00\x00\x00' >>> parsed = STAMPSessionReflectorTestUnauthenticated(raw(created)) >>> assert parsed.seq == 0x1234 >>> assert parsed.ts == 1234.5678 >>> assert parsed.err_estimate.S == 1 >>> assert parsed.err_estimate.Z == 0 >>> assert parsed.err_estimate.scale == 0x12 >>> assert parsed.err_estimate.multiplier == 0x34 >>> assert parsed.ssid == 1357 >>> assert parsed.ts_rx == 4321.8765 >>> assert parsed.seq_sender == 0x4321 >>> assert parsed.ts_sender == 2143.6587 >>> assert parsed.err_estimate_sender.S == 0 >>> assert parsed.err_estimate_sender.Z == 0 >>> assert parsed.err_estimate_sender.scale == 0x21 >>> assert parsed.err_estimate_sender.multiplier == 0x43 >>> assert parsed.mbz1 == 0 >>> assert parsed.ttl_sender == 111 >>> assert parsed.mbz2 == 0 >>> assert not parsed.tlv_objects STUN regression tests for Scapy ━ Run at 01:43:10 from [test/contrib/stun.uts] by UTscapy in 0.03484964370727539 └ Passed=7 └ Failed=0 ###### ## STUN Binding messages ###### ###(000)=[passed] test STUN binding request 1 >>> raw = b"\x00\x01\x00\x64\x21\x12\xa4\x42\xcf\xac\xb2\xa4\x3a\xa2\xde\x5a" \ ... b"\x9d\x56\xd8\x5a\x00\x25\x00\x00\x00\x24\x00\x04\x6e\x20\x00\xff" \ ... b"\x80\x2a\x00\x08\x1b\x0a\xb9\x8b\x6e\x8e\xff\xa6\x00\x06\x00\x25" \ ... b"\x6f\x4e\x70\x68\x3a\x48\x74\x31\x31\x4d\x61\x52\x5a\x48\x63\x34" \ ... b"\x47\x4f\x4c\x4a\x55\x73\x62\x75\x31\x52\x33\x59\x43\x73\x37\x32" \ ... b"\x48\x59\x4e\x32\x35\x20\x20\x20\x00\x08\x00\x14\xfc\xbc\x47\x21" \ ... b"\x68\x1f\xdb\x59\x91\x33\x42\xbe\x96\x19\x9e\x7f\x3e\xf0\xe7\x77" \ ... b"\x80\x28\x00\x04\x87\x18\xc3\xa4" >>> >>> parsed = STUN(raw) >>> assert parsed.RESERVED == 0x00, parsed.RESERVED >>> assert STUN.stun_message_type.i2repr(None, parsed.stun_message_type) == "Binding request" >>> assert parsed.length == 100 >>> assert parsed.magic_cookie == 0x2112A442 >>> assert parsed.transaction_id == 0xcfacb2a43aa2de5a9d56d85a, parsed.transaction_id >>> assert parsed.attributes == [ ... STUNUseCandidate(), ... STUNPriority(priority=1847591167), ... STUNIceControlling(tie_breaker=0x1b0ab98b6e8effa6), ... STUNUsername(length=37, username="oNph:Ht11MaRZHc4GOLJUsbu1R3YCs72HYN25"), ... STUNMessageIntegrity(hmac_sha1=0xfcbc4721681fdb59913342be96199e7f3ef0e777), ... STUNFingerprint(crc_32=0x8718c3a4) ... ] ###(001)=[passed] test STUN binding request 2 >>> raw = b"\x00\x01\x00\x6c\x21\x12\xa4\x42\x34\x79\x47\x65\x34\x63\x59\x36" \ ... b"\x31\x6a\x79\x6a\x00\x06\x00\x25\x48\x74\x31\x31\x4d\x61\x52\x5a" \ ... b"\x48\x63\x34\x47\x4f\x4c\x4a\x55\x73\x62\x75\x31\x52\x33\x59\x43" \ ... b"\x73\x37\x32\x48\x59\x4e\x32\x35\x3a\x6f\x4e\x70\x68\x00\x00\x00" \ ... b"\xc0\x57\x00\x04\x00\x00\x03\xe7\x80\x2a\x00\x08\xa6\x96\x81\x9e" \ ... b"\x91\xc9\x37\xda\x00\x25\x00\x00\x00\x24\x00\x04\x6e\x00\x1e\xff" \ ... b"\x00\x08\x00\x14\xc1\x87\xaa\xfa\xb1\xe0\xf3\x12\x31\x43\x3a\xb1" \ ... b"\x4d\x67\x6b\xc7\xb9\x89\xbd\x5f\x80\x28\x00\x04\xc9\x56\x6c\xfc" >>> >>> parsed = STUN(raw) >>> assert parsed.RESERVED == 0x00, parsed.RESERVED >>> assert STUN.stun_message_type.i2repr(None, parsed.stun_message_type) == "Binding request" >>> assert parsed.length == 108 >>> assert parsed.magic_cookie == 0x2112A442 >>> assert parsed.transaction_id == 0x3479476534635936316a796a >>> assert parsed.attributes == [ ... STUNUsername(length=37, username='Ht11MaRZHc4GOLJUsbu1R3YCs72HYN25:oNph'), ... STUNGoogNetworkInfo(), ... STUNIceControlling(tie_breaker=0xa696819e91c937da), ... STUNUseCandidate(), ... STUNPriority(priority=1845501695), ... STUNMessageIntegrity(hmac_sha1=0xc187aafab1e0f31231433ab14d676bc7b989bd5f), ... STUNFingerprint(crc_32=0xc9566cfc) ... ... ] ###(002)=[passed] test STUN binding success response 1 >>> raw = b"\x01\x01\x00\x2c\x21\x12\xa4\x42\xcf\xac\xb2\xa4\x3a\xa2\xde\x5a" \ ... b"\x9d\x56\xd8\x5a\x00\x20\x00\x08\x00\x01\xbf\x32\x8d\x06\xa4\x68" \ ... b"\x00\x08\x00\x14\xb7\x1f\xc9\x23\x58\x97\xc8\x02\xe3\xff\xf8\xe3" \ ... b"\xd8\x89\xfa\x41\x42\x8d\x96\x7d\x80\x28\x00\x04\xea\x9b\x65\x59" >>> >>> parsed = STUN(raw) >>> assert parsed.RESERVED == 0x00, parsed.RESERVED >>> assert STUN.stun_message_type.i2repr(None, parsed.stun_message_type) == "Binding success response" >>> assert parsed.length == 44 >>> assert parsed.magic_cookie == 0x2112A442 >>> assert parsed.transaction_id == 0xcfacb2a43aa2de5a9d56d85a, parsed.transaction_id >>> assert parsed.attributes == [ ... STUNXorMappedAddress(xport=40480, xip="172.20.0.42"), ... STUNMessageIntegrity(hmac_sha1=0xb71fc9235897c802e3fff8e3d889fa41428d967d), ... STUNFingerprint(crc_32=0xea9b6559) ... ] ###(003)=[passed] test STUN binding success response 2 >>> raw = b"\x01\x01\x00\x58\x21\x12\xa4\x42\x34\x79\x47\x65\x34\x63\x59\x36" \ ... b"\x31\x6a\x79\x6a\x00\x20\x00\x08\x00\x01\x40\xba\x8d\x06\xa4\x8a" \ ... b"\x00\x06\x00\x25\x48\x74\x31\x31\x4d\x61\x52\x5a\x48\x63\x34\x47" \ ... b"\x4f\x4c\x4a\x55\x73\x62\x75\x31\x52\x33\x59\x43\x73\x37\x32\x48" \ ... b"\x59\x4e\x32\x35\x3a\x6f\x4e\x70\x68\x20\x20\x20\x00\x08\x00\x14" \ ... b"\x4b\x67\x03\x6d\xfb\x65\xca\x84\xd6\x3b\xca\xc8\x6c\x8d\x59\x81" \ ... b"\xdf\x65\x70\x31\x80\x28\x00\x04\x40\x41\xe9\xc3" >>> >>> parsed = STUN(raw) >>> assert parsed.RESERVED == 0x00, parsed.RESERVED >>> assert STUN.stun_message_type.i2repr(None, parsed.stun_message_type) == "Binding success response" >>> assert parsed.length == 88 >>> assert parsed.magic_cookie == 0x2112A442 >>> assert parsed.transaction_id == 0x3479476534635936316a796a, parsed.transaction_id >>> assert parsed.attributes[0] == STUNXorMappedAddress(xport=25000, xip="172.20.0.200"), parsed.attributes >>> assert parsed.attributes == [ ... STUNXorMappedAddress(xport=25000, xip="172.20.0.200"), ... STUNUsername(length=37, username="Ht11MaRZHc4GOLJUsbu1R3YCs72HYN25:oNph"), ... STUNMessageIntegrity(hmac_sha1=0x4b67036dfb65ca84d63bcac86c8d5981df657031), ... STUNFingerprint(crc_32=0x4041e9c3) ... ] ###(004)=[passed] test STUN binding indication 1 >>> raw = b"\x00\x11\x00\x08\x21\x12\xa4\x42\x29\x3d\x68\x7b\x0f\xbc\x44\x7c" \ ... b"\x01\xb5\x8d\x2e\x80\x28\x00\x04\xc8\x84\xfe\x99" >>> >>> parsed = STUN(raw) >>> assert parsed.RESERVED == 0x00, parsed.RESERVED >>> assert STUN.stun_message_type.i2repr(None, parsed.stun_message_type) == "Binding indication" >>> assert parsed.length == 8 >>> assert parsed.magic_cookie == 0x2112A442 >>> assert parsed.transaction_id == 0x293d687b0fbc447c01b58d2e, parsed.transaction_id >>> assert parsed.attributes == [ ... STUNFingerprint(crc_32=0xc884fe99) ... ] ###(005)=[passed] test STUN binding indication 2 >>> raw = b"\x00\x11\x00\x08\x21\x12\xa4\x42\x1d\x93\x57\xa1\xe9\x4a\x20\x51" \ ... b"\x27\x19\x96\xd9\x80\x28\x00\x04\x53\x80\x0d\x81" >>> >>> parsed = STUN(raw) >>> assert parsed.RESERVED == 0x00, parsed.RESERVED >>> assert STUN.stun_message_type.i2repr(None, parsed.stun_message_type) == "Binding indication" >>> assert parsed.length == 8 >>> assert parsed.magic_cookie == 0x2112A442 >>> assert parsed.transaction_id == 0x1d9357a1e94a2051271996d9, parsed.transaction_id >>> assert parsed.attributes == [ ... STUNFingerprint(crc_32=0x53800d81) ... ] ###(006)=[passed] test STUN packet build >>> stun = STUN( ... stun_message_type="Binding request", ... transaction_id=0x7664047a24772b5748c0f173 ... ) >>> built = stun.build() >>> parsed = STUN(built) >>> >>> assert parsed.build() == built Test campaign ━ Run at 01:43:10 from [test/contrib/tacacs.uts] by UTscapy in 0.11476469039916992 └ Passed=36 └ Failed=0 ###### ## Tacacs+ header ###### ###(000)=[passed] default instantiation >>> pkt = IP()/TCP(dport=49)/TacacsHeader() >>> raw(pkt) == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xd0p\x00\x00\xc0\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00' True ###(001)=[passed] default values build >>> pkt = IP()/TCP(dport=49)/TacacsHeader() >>> pkt.session_id == 0 and TacacsHeader in pkt True ###(002)=[passed] filled values build >>> pkt = IP()/TCP(dport=49)/TacacsHeader(seq=5, session_id=165) >>> raw(pkt) == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xcb\xcb\x00\x00\xc0\x01\x05\x00\x00\x00\x00\xa5\x00\x00\x00\x00' True ###(003)=[passed] dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x1c4\x00\x00\xc0\x01\x01\x00\x00Y\xb3\xe3\x00\x00\x00\x00') >>> pkt.session_id == 5878755 True ###### ## Tacacs+ Authentication Start ###### ###(004)=[passed] default instantiation >>> pkt = IP()/TCP(dport=49)/TacacsHeader()/TacacsAuthenticationStart() >>> raw(pkt) == b'E\x00\x00<\x00\x01\x00\x00@\x06|\xb9\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xce\xfb\x00\x00\xc0\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x08R\x0f\x9e\xe7\xe0\xd1/\x9c' True ###(005)=[passed] default values build >>> pkt = IP()/TCP(dport=49)/TacacsHeader()/TacacsAuthenticationStart() >>> TacacsAuthenticationStart in pkt and pkt.action == 1 and pkt.priv_lvl == 1 and pkt.authen_type == 1 and pkt.authen_service == 1 True ###(006)=[passed] filled values build -- SSH connection sample use scapy, secret = test >>> pkt = IP()/TCP(dport=49)/TacacsHeader(seq=1, flags=0, session_id=2424164486, length=28)/TacacsAuthenticationStart(user_len=5, port_len=4, rem_addr_len=11, data_len=0, user='scapy', port='tty2', rem_addr='172.10.10.1') >>> raw(pkt) == b"E\x00\x00P\x00\x01\x00\x00@\x06|\xa5\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xd4t\x00\x00\xc0\x01\x01\x00\x90}\xd0\x86\x00\x00\x00\x1c\x05\x00POza\xed\xee}\xa5R\xd3Vu+\xbb'\xae\x98\xaa\x1a\x9d\x17=\x90\xd2\x07q" True ###(007)=[passed] dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00P\x00\x01\x00\x00@\x06|\xa5\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xd5t\x00\x00\xc0\x01\x01\x00\x90}\xd0\x86\x00\x00\x00\x1c\x05\x00POza\xed\xee}\xa5R\xd3Vu+\xbb&\xae\x98\xaa\x1a\x9d\x17=\x90\xd2\x07q') >>> pkt.user == b'scapy' and pkt.port == b'tty3' True ###### ## Tacacs+ Authentication Reply ###### ###(008)=[passed] default instantiation >>> pkt = IP()/TCP(dport=49)/TacacsHeader()/TacacsAuthenticationReply() >>> raw(pkt) == b'E\x00\x00:\x00\x01\x00\x00@\x06|\xbb\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xfd\x9d\x00\x00\xc0\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06R\x0e\x9f\xe6\xe0\xd1' True ###(009)=[passed] default values build >>> pkt = IP()/TCP(dport=49)/TacacsHeader(seq=2)/TacacsAuthenticationReply() >>> TacacsAuthenticationReply in pkt and pkt.status == 1 True ###(010)=[passed] filled values build -- SSH connection sample use scapy, secret = test >>> pkt = IP()/TCP(dport=49)/TacacsHeader(seq=2, flags=0, session_id=2424164486, length=16)/TacacsAuthenticationReply(status=5, flags=1, server_msg_len=10, data_len=0, server_msg='Password: ') >>> raw(pkt) == b'E\x00\x00D\x00\x01\x00\x00@\x06|\xb1\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x0f\x87\x00\x00\xc0\x01\x02\x00\x90}\xd0\x86\x00\x00\x00\x10*\x0c\x1d\xa0\xa2[xE\x0b\t/s\xee\x8b\xd3o' True ###(011)=[passed] dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00D\x00\x01\x00\x00@\x06|\xb1\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x0f\x87\x00\x00\xc0\x01\x02\x00\x90}\xd0\x86\x00\x00\x00\x10*\x0c\x1d\xa0\xa2[xE\x0b\t/s\xee\x8b\xd3o') >>> pkt.server_msg == b'Password: ' True ###### ## Tacacs+ Authentication Continue ###### ###(012)=[passed] default instantiation >>> pkt = IP()/TCP(dport=49)/TacacsHeader()/TacacsAuthenticationContinue() >>> raw(pkt) == b'E\x00\x009\x00\x01\x00\x00@\x06|\xbc\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xfcp\x00\x00\xc0\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x05S\x0e\x9f\xe6\xe1' True ###(013)=[passed] default values build >>> pkt = TacacsAuthenticationContinue() >>> TacacsAuthenticationContinue in pkt and pkt.data == b'' and pkt.user_msg == b'' and pkt.data_len is None and pkt.user_msg_len is None True ###(014)=[passed] filled values build -- SSH connection sample secret = test, password = pass >>> pkt = IP()/TCP(dport=49)/TacacsHeader(seq=3, flags=0, session_id=2424164486, length=9)/TacacsAuthenticationContinue(flags=0, user_msg_len=4, data_len=0, user_msg='pass') >>> raw(pkt) == b'E\x00\x00=\x00\x01\x00\x00@\x06|\xb8\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00u\xfa\x00\x00\xc0\x01\x03\x00\x90}\xd0\x86\x00\x00\x00\t\xec8\xc1\x8d\xcc\xec(\xacT' True ###(015)=[passed] dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00A\x00\x01\x00\x00@\x06|\xb4\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb5\xfd\x00\x00\xc0\x01\x03\x00\x90}\xd0\x86\x00\x00\x00\r\xec4\xc1\x8d\xcc\xec(\xacT\xd2k&T') >>> pkt.user_msg == b'password' True ###### ## Tacacs+ Authorization Request ###### ###(016)=[passed] default instantiation >>> pkt = IP()/TCP()/TacacsHeader(type=2)/TacacsAuthorizationRequest() >>> raw(pkt) == b'E\x00\x00<\x00\x01\x00\x00@\x06|\xb9\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xcd\xdb\x00\x00\xc0\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x08S\x0f\x9e\xe7\xe0\xd1/\x9c' True ###(017)=[passed] default values build >>> pkt = IP()/TCP(dport=49)/TacacsHeader(type=2)/TacacsAuthorizationRequest() >>> TacacsAuthorizationRequest in pkt and pkt.priv_lvl == 1 and pkt.authen_type == 1 and pkt.authen_service == 1 True ###(018)=[passed] filled values build -- SSH connection sample secret = test >>> pkt = IP()/TCP(dport=49)/TacacsHeader(seq=1, type=2 , flags=0, session_id=135252, length=47)/TacacsAuthorizationRequest(authen_method=6, user_len=5, port_len=4, rem_addr_len=11, arg_cnt=2, arg_len_list=[13, 4], user='scapy', port='tty2', rem_addr='172.10.10.1')/TacacsPacketArguments(data='service=shell')/TacacsPacketArguments(data='cmd*') >>> raw(pkt) == b'E\x00\x00c\x00\x01\x00\x00@\x06|\x92\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb28\x00\x00\xc0\x02\x01\x00\x00\x02\x10T\x00\x00\x00/\xdd\xe0\xe8\xea\xba\xca$Y\xf7\x00\xc2Hh\xed\x03\x1eK84\x10\xb9h\xd7@\x0e\xd5\x13\xf0\xfaA\xfa\xbe;\x01\x82\xecl\xf9\xc6\xa0Z6\x98j\xfd\\9' True ###(019)=[passed] dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00c\x00\x01\x00\x00@\x06|\x92\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xc2D\x00\x00\xc0\x02\x01\x00R\xf2\x0e\xf4\x00\x00\x00/\xe6\x01\x03 \xd7\xa9\x91\x7fv\xf2\x15-\x88a\xac$\x14\x9f\xc0\xbb\xb8a\xe0\x86e\xf9\xd9\xa2\xc4\xe7\x0bRI\xc8\xdd\x97\xd5\x80\xcf\xce\x81*"\xbc\x15E\x95') >>> pkt.port == b'tty9' True ###### ## Tacacs+ Authorization Reply ###### ###(020)=[passed] default instantiation >>> pkt = IP()/TCP()/TacacsHeader(type=2)/TacacsAuthorizationReply() >>> raw(pkt) == b'E\x00\x00:\x00\x01\x00\x00@\x06|\xbb\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xfc}\x00\x00\xc0\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x06S\x0e\x9f\xe6\xe0\xd1' True ###(021)=[passed] default values build >>> pkt = TacacsHeader()/TacacsAuthorizationReply() >>> TacacsAuthorizationReply in pkt and pkt.status == 0 and pkt.arg_cnt is None and pkt.data_len is None True ###(022)=[passed] filled values build -- SSH connection sample secret = test >>> pkt = Ether()/IP()/TCP(dport=49)/TacacsHeader(seq=2, type=2 , flags=0, session_id=1391595252, length=20)/TacacsAuthorizationReply(status=1, arg_cnt=2, server_msg_len=0, data_len=0, arg_len_list=[11, 1])/TacacsPacketArguments(data='priv-lvl=15')/TacacsPacketArguments(data='a') >>> raw(pkt) == b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00H\x00\x01\x00\x00@\x06|\xad\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00|G\x00\x00\xc0\x02\x02\x00R\xf2\x0e\xf4\x00\x00\x00\x14\xce^Xp~Z\x9b^\xd8Y\xc9"\xf5\xb0&\xe5Ji\xa8\x15' True ###(023)=[passed] dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00H\x00\x01\x00\x00@\x06|\xad\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00|G\x00\x00\xc0\x02\x02\x00R\xf2\x0e\xf4\x00\x00\x00\x14\xce^Xp~Z\x9b^\xd8Y\xc9"\xf5\xb0&\xe5Ji\xa8\x15') >>> pkt.status == 1 True ###### ## Tacacs+ Accounting Request ###### ###(024)=[passed] default instantiation >>> pkt = IP()/TCP()/TacacsHeader(type=3)/TacacsAccountingRequest() >>> raw(pkt) == b'E\x00\x00=\x00\x01\x00\x00@\x06|\xb8\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb3\xd9\x00\x00\xc0\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\tS\x0e\x9e\xe7\xe1\xd1/\x9c\x19' True ###(025)=[passed] default value build >>> pkt = IP()/TCP()/TacacsHeader(type=3)/TacacsAccountingRequest() >>> TacacsAccountingRequest in pkt and pkt.authen_method == 0 and pkt.priv_lvl == 1 and pkt.authen_type == 1 True ###(026)=[passed] filled values build -- SSH connection sample secret = test >>> pkt = IP()/TCP(dport=49)/TacacsHeader(seq=1, type=3 , flags=0, session_id=3059434316, length=67)/TacacsAccountingRequest(flags=2, authen_method=6, priv_lvl=15, authen_type=1, authen_service=1, user_len=5, port_len=4, rem_addr_len=11, arg_cnt=3, arg_len_list=[10, 12, 13], user='scapy', port='tty2', rem_addr='172.10.10.1')/TacacsPacketArguments(data='task_id=24')/TacacsPacketArguments(data='timezone=CET')/TacacsPacketArguments(data='service=shell') >>> raw(pkt) == b'E\x00\x00w\x00\x01\x00\x00@\x06|~\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00sk\x00\x00\xc0\x03\x01\x00\xb6[CL\x00\x00\x00C\x1d\xfb\x81\xd52\xfb\x06\x8b\t\xb9\x0c87\xd3 i\x05\xb5|\x9f\x01l\xbf/\xd3\rc\x0f\nDr\xc0\xc9.\x88@*(S\xfeA\xd4\x19wFj=\xc3\x9f\x00!D\xbe$E\x04\x0e\xe75\x99\xd6\r\x0f\x16\xc7\x1d\xc2' True ###(027)=[passed] dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00w\x00\x01\x00\x00@\x06|~\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00|j\x00\x00\xc0\x03\x01\x00\xb6[CL\x00\x00\x00C\x1d\xfb\x81\xd52\xfb\x06\x8b\t\xb9\x0c87\xd3 i\x05\xb5|\x9f\x01l\xb1/\xd3\rc\x0f\nDr\xc0\xc9.\x88@*(S\xfeF\xd5\x19wFj=\xc3\x9f\x00!D\xbe$E\x04\x0e\xe75\x99\xd6\r\x0f\x16\xc7\x1d\xc2') >>> pkt.rem_addr == b'192.10.10.1' True ###### ## Tacacs+ Accounting Reply ###### ###(028)=[passed] default instantiation >>> pkt = IP()/TCP(dport=49)/TacacsHeader(seq=2, type=3)/TacacsAccountingReply() >>> raw(pkt) == b'E\x00\x009\x00\x01\x00\x00@\x06|\xbc\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00,\x07\x00\x00\xc0\x03\x02\x00\x00\x00\x00\x00\x00\x00\x00\x05B\xd2A\x8b\x1f' True ###(029)=[passed] default values build >>> pkt = IP()/TCP(dport=49)/TacacsHeader(seq=2, type=3)/TacacsAccountingReply() >>> TacacsAccountingReply in pkt and pkt.server_msg == b'' and pkt.server_msg_len is None and pkt.status is None True ###(030)=[passed] filled values build -- SSH connection sample secret = test >>> pkt = Ether()/IP()/TCP(dport=49)/TacacsHeader(seq=2, type=3 , flags=0, session_id=3059434316, length=5)/TacacsAccountingReply(status=1, server_msg_len=0, data_len=0) >>> raw(pkt) == b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x009\x00\x01\x00\x00@\x06|\xbc\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xc5\x7f\x00\x00\xc0\x03\x02\x00\xb6[CL\x00\x00\x00\x05\xf4\x0f\xad,o' True ###(031)=[passed] dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x009\x00\x01\x00\x00@\x06|\xbc\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xc5\x7f\x00\x00\xc0\x03\x02\x00\xb6[CL\x00\x00\x00\x05\xf4\x0f\xad,o') >>> pkt.status == 1 True ###### ## Changing secret to foobar ###### ###(032)=[passed] instantiation >>> scapy.contrib.tacacs.SECRET = 'foobar' >>> pkt = Ether()/IP()/TCP(dport=49)/TacacsHeader(session_id=441255181, type=3, seq=2, length=5)/TacacsAccountingReply(status=1, server_msg_len=0, data_len=0) >>> raw(pkt) == b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x009\x00\x01\x00\x00@\x06|\xbc\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00/,\x00\x00\xc0\x03\x02\x00\x1aM\x05\r\x00\x00\x00\x05S)\x9b\xb4\x92' True ###(033)=[passed] dissection >>> scapy.contrib.tacacs.SECRET = 'foobar' >>> >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x009\x00\x01\x00\x00@\x06|\xbc\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00/,\x00\x00\xc0\x03\x02\x00\x1aM\x05\r\x00\x00\x00\x05S)\x9b\xb4\x92') >>> pkt.status == 1 True ###### ## Unencrypted Authentication ###### ###(034)=[passed] instantiation >>> pkt = IP()/TCP(dport=49)/TacacsHeader(seq=1, flags=1, session_id=2424164486, length=28)/TacacsAuthenticationStart(user_len=5, port_len=4, rem_addr_len=11, data_len=0, user='scapy', port='tty2', rem_addr='172.10.10.1') >>> raw(pkt) == b"E\x00\x00P\x00\x01\x00\x00@\x06|\xa5\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00sG\x00\x00\xc0\x01\x01\x01\x90}\xd0\x86\x00\x00\x00\x1c\x01\x01\x01\x01\x05\x04\x0b\x00scapytty2172.10.10.1" True ###(035)=[passed] dissection >>> pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x00P\x00\x01\x00\x00@\x06|\xa5\x7f\x00\x00\x01\x7f\x00\x00\x01\x001\x001\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00sG\x00\x00\xc0\x01\x01\x01\x90}\xd0\x86\x00\x00\x00\x1c\x01\x01\x01\x01\x05\x04\x0b\x00scapytty2172.10.10.1') >>> pkt.user == b'scapy' and pkt.port == b'tty2' True Tests for RFC5925 TCP Authentication Option (TCP-AO) ━ Run at 01:43:10 from [test/contrib/tcpao.uts] by UTscapy in 0.1097726821899414 └ Passed=18 └ Failed=0 ###### ## Test Utilities ###### ###(000)=[passed] Test Utilities >>> def fromhex(hex): ... return bytes(bytearray.fromhex(hex.replace(" ", "").replace("\n", ""))) ... ###### ## TCP-AO Test Vectors ###### ###(001)=[passed] TCP-AO Test Vectors Utilities >>> from scapy.contrib import tcpao >>> master_key = b"testvector" >>> client_keyid = 61 >>> server_keyid = 84 >>> >>> def check( ... packet_hex, ... traffic_key_hex, ... mac_hex, ... src_isn, ... dst_isn, ... include_options=True, ... alg_name="HMAC-SHA-1-96", ... sne=0, ... ): ... packet_bytes = fromhex(packet_hex) ... # sanity check for ip version ... ipv = orb(packet_bytes[0]) >> 4 ... if ipv == 4: ... p = IP(fromhex(packet_hex)) ... assert p[IP].proto == socket.IPPROTO_TCP ... elif ipv == 6: ... p = IPv6(fromhex(packet_hex)) ... assert p[IPv6].nh == socket.IPPROTO_TCP ... else: ... raise ValueError("bad ipv={}".format(ipv)) ... # sanity check for seq/ack in SYN/ACK packets ... if p[TCP].flags.S and p[TCP].flags.A is False: ... assert p[TCP].seq == src_isn ... assert p[TCP].ack == 0 ... if p[TCP].flags.S and p[TCP].flags.A: ... assert p[TCP].seq == src_isn ... assert p[TCP].ack == dst_isn + 1 ... # check option bytes in header ... opt = get_tcpao(p[TCP]) ... assert opt is not None ... assert opt.keyid in [client_keyid, server_keyid] ... assert opt.rnextkeyid in [client_keyid, server_keyid] ... assert opt.mac == fromhex(mac_hex), "match parsed mac" ... # check traffic key ... alg = get_alg(alg_name) ... context_bytes = tcpao.build_context_from_packet(p, src_isn, dst_isn) ... traffic_key = alg.kdf(master_key, context_bytes) ... assert traffic_key == fromhex(traffic_key_hex), "match traffic key" ... # check mac ... message_bytes = tcpao.build_message_from_packet( ... p, include_options=include_options, sne=sne ... ) ... mac = alg.mac(traffic_key, message_bytes) ... assert mac == fromhex(mac_hex), "match computed mac" ... ###(002)=[passed] TCP-AO Test Vector 4.1.1: SHA-1 Send Syn >>> client_isn_41x = 0xFBFBAB5A >>> server_isn_41x = 0x11C14261 >>> >>> check( ... """ ... 45 e0 00 4c dd 0f 40 00 ff 06 bf 6b 0a 0b 0c 0d ... ac 1b 1c 1d e9 d7 00 b3 fb fb ab 5a 00 00 00 00 ... e0 02 ff ff ca c4 00 00 02 04 05 b4 01 03 03 08 ... 04 02 08 0a 00 15 5a b7 00 00 00 00 1d 10 3d 54 ... 2e e4 37 c6 f8 ed e6 d7 c4 d6 02 e7 ... """, ... "6d 63 ef 1b 02 fe 15 09 d4 b1 40 27 07 fd 7b 04 16 ab b7 4f", ... "2e e4 37 c6 f8 ed e6 d7 c4 d6 02 e7", ... client_isn_41x, ... 0, ... ) ###(003)=[passed] TCP-AO Test Vector 4.1.2 SHA-1 Recv Syn-Ack >>> check( ... """ ... 45 e0 00 4c 65 06 40 00 ff 06 37 75 ac 1b 1c 1d ... 0a 0b 0c 0d 00 b3 e9 d7 11 c1 42 61 fb fb ab 5b ... e0 12 ff ff 37 76 00 00 02 04 05 b4 01 03 03 08 ... 04 02 08 0a 84 a5 0b eb 00 15 5a b7 1d 10 54 3d ... ee ab 0f e2 4c 30 10 81 51 16 b3 be ... """, ... "d9 e2 17 e4 83 4a 80 ca 2f 3f d8 de 2e 41 b8 e6 79 7f ea 96", ... "ee ab 0f e2 4c 30 10 81 51 16 b3 be", ... server_isn_41x, ... client_isn_41x, ... ) ###(004)=[passed] TCP-AO Test Vector 4.1.3 SHA-1 Send Other >>> check( ... """ ... 45 e0 00 87 36 a1 40 00 ff 06 65 9f 0a 0b 0c 0d ... ac 1b 1c 1d e9 d7 00 b3 fb fb ab 5b 11 c1 42 62 ... c0 18 01 04 a1 62 00 00 01 01 08 0a 00 15 5a c1 ... 84 a5 0b eb 1d 10 3d 54 70 64 cf 99 8c c6 c3 15 ... c2 c2 e2 bf ff ff ff ff ff ff ff ff ff ff ff ff ... ff ff ff ff 00 43 01 04 da bf 00 b4 0a 0b 0c 0d ... 26 02 06 01 04 00 01 00 01 02 02 80 00 02 02 02 ... 00 02 02 42 00 02 06 41 04 00 00 da bf 02 08 40 ... 06 00 64 00 01 01 00 ... """, ... "d2 e5 9c 65 ff c7 b1 a3 93 47 65 64 63 b7 0e dc 24 a1 3d 71", ... "70 64 cf 99 8c c6 c3 15 c2 c2 e2 bf", ... client_isn_41x, ... server_isn_41x, ... ) ###(005)=[passed] TCP-AO Test Vector 4.1.4 SHA-1 Recv Other >>> check( ... """ ... 45 e0 00 87 1f a9 40 00 ff 06 7c 97 ac 1b 1c 1d ... 0a 0b 0c 0d 00 b3 e9 d7 11 c1 42 62 fb fb ab 9e ... c0 18 01 00 40 0c 00 00 01 01 08 0a 84 a5 0b f5 ... 00 15 5a c1 1d 10 54 3d a6 3f 0e cb bb 2e 63 5c ... 95 4d ea c7 ff ff ff ff ff ff ff ff ff ff ff ff ... ff ff ff ff 00 43 01 04 da c0 00 b4 ac 1b 1c 1d ... 26 02 06 01 04 00 01 00 01 02 02 80 00 02 02 02 ... 00 02 02 42 00 02 06 41 04 00 00 da c0 02 08 40 ... 06 00 64 00 01 01 00 ... """, ... "d9 e2 17 e4 83 4a 80 ca 2f 3f d8 de 2e 41 b8 e6 79 7f ea 96", ... "a6 3f 0e cb bb 2e 63 5c 95 4d ea c7", ... server_isn_41x, ... client_isn_41x, ... ) ###(006)=[passed] TCP-AO Test Vector 4.2.1 >>> client_isn_42x = 0xCB0EFBEE >>> server_isn_42x = 0xACD5B5E1 >>> check( ... """ ... 45 e0 00 4c 53 99 40 00 ff 06 48 e2 0a 0b 0c 0d ... ac 1b 1c 1d ff 12 00 b3 cb 0e fb ee 00 00 00 00 ... e0 02 ff ff 54 1f 00 00 02 04 05 b4 01 03 03 08 ... 04 02 08 0a 00 02 4c ce 00 00 00 00 1d 10 3d 54 ... 80 af 3c fe b8 53 68 93 7b 8f 9e c2 ... """, ... "30 ea a1 56 0c f0 be 57 da b5 c0 45 22 9f b1 0a 42 3c d7 ea", ... "80 af 3c fe b8 53 68 93 7b 8f 9e c2", ... client_isn_42x, ... 0, ... include_options=False, ... ) ###(007)=[passed] TCP-AO Test Vector 4.2.2 >>> check( ... """ ... 45 e0 00 4c 32 84 40 00 ff 06 69 f7 ac 1b 1c 1d ... 0a 0b 0c 0d 00 b3 ff 12 ac d5 b5 e1 cb 0e fb ef ... e0 12 ff ff 38 8e 00 00 02 04 05 b4 01 03 03 08 ... 04 02 08 0a 57 67 72 f3 00 02 4c ce 1d 10 54 3d ... 09 30 6f 9a ce a6 3a 8c 68 cb 9a 70 ... """, ... "b5 b2 89 6b b3 66 4e 81 76 b0 ed c6 e7 99 52 41 01 a8 30 7f", ... "09 30 6f 9a ce a6 3a 8c 68 cb 9a 70", ... server_isn_42x, ... client_isn_42x, ... include_options=False, ... ) ###(008)=[passed] TCP-AO Test Vector 4.2.3 >>> check( ... """ ... 45 e0 00 87 a8 f5 40 00 ff 06 f3 4a 0a 0b 0c 0d ... ac 1b 1c 1d ff 12 00 b3 cb 0e fb ef ac d5 b5 e2 ... c0 18 01 04 6c 45 00 00 01 01 08 0a 00 02 4c ce ... 57 67 72 f3 1d 10 3d 54 71 06 08 cc 69 6c 03 a2 ... 71 c9 3a a5 ff ff ff ff ff ff ff ff ff ff ff ff ... ff ff ff ff 00 43 01 04 da bf 00 b4 0a 0b 0c 0d ... 26 02 06 01 04 00 01 00 01 02 02 80 00 02 02 02 ... 00 02 02 42 00 02 06 41 04 00 00 da bf 02 08 40 ... 06 00 64 00 01 01 00 ... """, ... "f3 db 17 93 d7 91 0e cd 80 6c 34 f1 55 ea 1f 00 34 59 53 e3", ... "71 06 08 cc 69 6c 03 a2 71 c9 3a a5", ... client_isn_42x, ... server_isn_42x, ... include_options=False, ... ) ###(009)=[passed] TCP-AO Test Vector 4.2.4 >>> check( ... """ ... 45 e0 00 87 54 37 40 00 ff 06 48 09 ac 1b 1c 1d ... 0a 0b 0c 0d 00 b3 ff 12 ac d5 b5 e2 cb 0e fc 32 ... c0 18 01 00 46 b6 00 00 01 01 08 0a 57 67 72 f3 ... 00 02 4c ce 1d 10 54 3d 97 76 6e 48 ac 26 2d e9 ... ae 61 b4 f9 ff ff ff ff ff ff ff ff ff ff ff ff ... ff ff ff ff 00 43 01 04 da c0 00 b4 ac 1b 1c 1d ... 26 02 06 01 04 00 01 00 01 02 02 80 00 02 02 02 ... 00 02 02 42 00 02 06 41 04 00 00 da c0 02 08 40 ... 06 00 64 00 01 01 00 ... """, ... "b5 b2 89 6b b3 66 4e 81 76 b0 ed c6 e7 99 52 41 01 a8 30 7f", ... "97 76 6e 48 ac 26 2d e9 ae 61 b4 f9", ... server_isn_42x, ... client_isn_42x, ... include_options=False, ... ) ###(010)=[passed] TCP-AO Test Vector 5.1.1 >>> check( ... """ ... 45 e0 00 4c 7b 9f 40 00 ff 06 20 dc 0a 0b 0c 0d ... ac 1b 1c 1d c4 fa 00 b3 78 7a 1d df 00 00 00 00 ... e0 02 ff ff 5a 0f 00 00 02 04 05 b4 01 03 03 08 ... 04 02 08 0a 00 01 7e d0 00 00 00 00 1d 10 3d 54 ... e4 77 e9 9c 80 40 76 54 98 e5 50 91 ... """, ... "f5 b8 b3 d5 f3 4f db b6 eb 8d 4a b9 66 0e 60 e3", ... "e4 77 e9 9c 80 40 76 54 98 e5 50 91", ... 0x787A1DDF, ... 0, ... include_options=True, ... alg_name="AES-128-CMAC-96", ... ) ###(011)=[passed] TCP-AO Test Vector 6.1.1 >>> client_isn_61x = 0x176A833F >>> server_isn_61x = 0x3F51994B >>> check( ... """ ... 6e 08 91 dc 00 38 06 40 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 01 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 02 f7 e4 00 b3 17 6a 83 3f ... 00 00 00 00 e0 02 ff ff 47 21 00 00 02 04 05 a0 ... 01 03 03 08 04 02 08 0a 00 41 d0 87 00 00 00 00 ... 1d 10 3d 54 90 33 ec 3d 73 34 b6 4c 5e dd 03 9f ... """, ... "62 5e c0 9d 57 58 36 ed c9 b6 42 84 18 bb f0 69 89 a3 61 bb", ... "90 33 ec 3d 73 34 b6 4c 5e dd 03 9f", ... client_isn_61x, ... 0, ... include_options=True, ... ) ###(012)=[passed] TCP-AO Test Vector 6.1.2 >>> check( ... """ ... 6e 01 00 9e 00 38 06 40 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 02 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 01 00 b3 f7 e4 3f 51 99 4b ... 17 6a 83 40 e0 12 ff ff bf ec 00 00 02 04 05 a0 ... 01 03 03 08 04 02 08 0a bd 33 12 9b 00 41 d0 87 ... 1d 10 54 3d f1 cb a3 46 c3 52 61 63 f7 1f 1f 55 ... """, ... "e4 a3 7a da 2a 0a fc a8 71 14 34 91 3f e1 38 c7 71 eb cb 4a", ... "f1 cb a3 46 c3 52 61 63 f7 1f 1f 55", ... server_isn_61x, ... client_isn_61x, ... include_options=True, ... ) ###(013)=[passed] TCP-AO Test Vector 6.2.2 >>> client_isn_62x = 0x020C1E69 >>> server_isn_62x = 0xEBA3734D >>> check( ... """ ... 6e 0a 7e 1f 00 38 06 40 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 02 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 01 00 b3 c6 cd eb a3 73 4d ... 02 0c 1e 6a e0 12 ff ff 77 4d 00 00 02 04 05 a0 ... 01 03 03 08 04 02 08 0a 5e c9 9b 70 00 9d b9 5b ... 1d 10 54 3d 3c 54 6b ad 97 43 f1 2d f8 b8 01 0d ... """, ... "40 51 08 94 7f 99 65 75 e7 bd bc 26 d4 02 16 a2 c7 fa 91 bd", ... "3c 54 6b ad 97 43 f1 2d f8 b8 01 0d", ... server_isn_62x, ... client_isn_62x, ... include_options=False, ... ) ###(014)=[passed] TCP-AO Test Vector 6.2.4 >>> check( ... """ ... 6e 0a 7e 1f 00 73 06 40 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 02 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 01 00 b3 c6 cd eb a3 73 4e ... 02 0c 1e ad c0 18 01 00 71 6a 00 00 01 01 08 0a ... 5e c9 9b 7a 00 9d b9 65 1d 10 54 3d 55 9a 81 94 ... 45 b4 fd e9 8d 9e 13 17 ff ff ff ff ff ff ff ff ... ff ff ff ff ff ff ff ff 00 43 01 04 fd e8 00 b4 ... 01 01 01 7a 26 02 06 01 04 00 01 00 01 02 02 80 ... 00 02 02 02 00 02 02 42 00 02 06 41 04 00 00 fd ... e8 02 08 40 06 00 64 00 01 01 00 ... """, ... "40 51 08 94 7f 99 65 75 e7 bd bc 26 d4 02 16 a2 c7 fa 91 bd", ... "55 9a 81 94 45 b4 fd e9 8d 9e 13 17", ... server_isn_62x, ... client_isn_62x, ... include_options=False, ... ) ###(015)=[passed] TCP-AO Test Vector 7.1.2 >>> server_isn_71x = 0xA6744ECB >>> client_isn_71x = 0x193CCCEC >>> check( ... """ ... 6e 06 15 20 00 38 06 40 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 02 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 01 00 b3 f8 5a a6 74 4e cb ... 19 3c cc ed e0 12 ff ff ea bb 00 00 02 04 05 a0 ... 01 03 03 08 04 02 08 0a 71 da ab c8 13 e4 ab 99 ... 1d 10 54 3d dc 28 43 a8 4e 78 a6 bc fd c5 ed 80 ... """, ... "cf 1b 1e 22 5e 06 a6 36 16 76 4a 06 7b 46 f4 b1", ... "dc 28 43 a8 4e 78 a6 bc fd c5 ed 80", ... server_isn_71x, ... client_isn_71x, ... alg_name="AES-128-CMAC-96", ... include_options=True, ... ) ###(016)=[passed] TCP-AO Test Vector 7.1.4 >>> check( ... """ ... 6e 06 15 20 00 73 06 40 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 02 fd 00 00 00 00 00 00 00 ... 00 00 00 00 00 00 00 01 00 b3 f8 5a a6 74 4e cc ... 19 3c cd 30 c0 18 01 00 52 f4 00 00 01 01 08 0a ... 71 da ab d3 13 e4 ab a3 1d 10 54 3d c1 06 9b 7d ... fd 3d 69 3a 6d f3 f2 89 ff ff ff ff ff ff ff ff ... ff ff ff ff ff ff ff ff 00 43 01 04 fd e8 00 b4 ... 01 01 01 7a 26 02 06 01 04 00 01 00 01 02 02 80 ... 00 02 02 02 00 02 02 42 00 02 06 41 04 00 00 fd ... e8 02 08 40 06 00 64 00 01 01 00 ... """, ... "cf 1b 1e 22 5e 06 a6 36 16 76 4a 06 7b 46 f4 b1", ... "c1 06 9b 7d fd 3d 69 3a 6d f3 f2 89", ... server_isn_71x, ... client_isn_71x, ... alg_name="AES-128-CMAC-96", ... include_options=True, ... ) ###### ## TCP-AO Signature API ###### ###(017)=[passed] TCP-AO sign SYN packet build from scratch >>> master_key = b"hello" >>> alg = TCPAOAlg_HMAC_SHA1() >>> keyid = 12 >>> rnextkeyid = 34 >>> >>> p = IP() / TCP() >>> p[TCP].flags == "S" True >>> sisn = p[TCP].seq >>> disn = 0 >>> >>> traffic_key = calc_tcpao_traffic_key(p, alg, master_key, sisn, disn) >>> sign_tcpao(p, alg, traffic_key, keyid, rnextkeyid) >>> mac = calc_tcpao_mac(p, alg, traffic_key) >>> >>> p2 = IP(raw(p)) >>> ao = get_tcpao(p2[TCP]) >>> ao is not None True >>> ao.keyid == keyid True >>> ao.rnextkeyid == rnextkeyid True >>> ao.mac == mac False >>> >>> traffic_key2 = calc_tcpao_traffic_key(p2, alg, master_key, p2[TCP].seq, 0) >>> traffic_key == traffic_key2 True >>> mac2 = calc_tcpao_mac(p2, alg, traffic_key2) >>> mac == mac2 True TCPROS layer test campaign ━ Run at 01:43:10 from [test/contrib/tcpros.uts] by UTscapy in 0.005869388580322266 └ Passed=4 └ Failed=0 ###### ## Syntax check ###### ###(000)=[passed] Import the RTPS layer >>> from scapy.contrib.tcpros import * >>> >>> bind_layers(TCP, TCPROS, sport=11311) >>> bind_layers(HTTPRequest, XMLRPC) >>> bind_layers(HTTPResponse, XMLRPC) >>> >>> pkt = b"POST /RPC2 HTTP/1.1\r\nAccept-Encoding: gzip\r\nContent-Length: " \ ... b"227\r\nContent-Type: text/xml\r\nHost: 12.0.0.2:11311\r\nUser-Agent:" \ ... b"xmlrpclib.py/1.0.1 (by www.pythonware.com)\r\n\r\n\n\nshutdown\n" \ ... b"\n\n/rosparam-92418\n" \ ... b"\n\nBOOM" \ ... b"\n\n\n\n" >>> >>> p = TCPROS(pkt) b"POST /RPC2 HTTP/1.1\r\nAccept-Encoding: gzip\r\nContent-Length: 227\r\nContent-Type: text/xml\r\nHost: 12.0.0.2:11311\r\nUser-Agent:xmlrpclib.py/1.0.1 (by www.pythonware.com)\r\n\r\n\n\nshutdown\n\n\n/rosparam-92418\n\n\nBOOM\n\n\n\n" POST /RPC2 HTTP/1.1 Accept-Encoding: gzip Content-Length: 227 Content-Type: text/xml Host: 12.0.0.2:11311 User-Agent:xmlrpclib.py/1.0.1 (by www.pythonware.com) shutdown /rosparam-92418 BOOM total_length: 389 total_length_payload: 1414745936 remain: b" /RPC2 HTTP/1.1\r\nAccept-Encoding: gzip\r\nContent-Length: 227\r\nContent-Type: text/xml\r\nHost: 12.0.0.2:11311\r\nUser-Agent:xmlrpclib.py/1.0.1 (by www.pythonware.com)\r\n\r\n\n\nshutdown\n\n\n/rosparam-92418\n\n\nBOOM\n\n\n\n" False 8 119 ###### ## Test TCPROS ###### ###(001)=[passed] Test basic package composition >>> assert(HTTP in p) >>> assert(HTTPRequest in p) >>> assert(XMLRPC in p) >>> assert(XMLRPCCall in p) ###(002)=[passed] Test HTTPRequest within TCPROS >>> assert(p[HTTPRequest].Content_Length == b'227') >>> assert(p[HTTPRequest].Content_Type == b'text/xml') >>> assert(p[HTTPRequest].Host == b'12.0.0.2:11311') >>> assert(p[HTTPRequest].User_Agent == b'xmlrpclib.py/1.0.1 (by www.pythonware.com)') >>> assert(p[HTTPRequest].Method == b'POST') >>> assert(p[HTTPRequest].Path == b'/RPC2') >>> assert(p[HTTPRequest].Http_Version == b'HTTP/1.1') ###(003)=[passed] Test XMLRPCCall within TCPROS >>> assert(p[XMLRPCCall].version == b"\n") >>> assert(p[XMLRPCCall].methodcall_opentag == b'\n') >>> assert(p[XMLRPCCall].methodname == b'shutdown') >>> assert(p[XMLRPCCall].params == b'\n/rosparam-92418\n\n\nBOOM\n\n') TZSP test campaign ━ Run at 01:43:10 from [test/contrib/tzsp.uts] by UTscapy in 0.24710822105407715 └ Passed=25 └ Failed=0 ###### ## Basic layer handling ###### ###(000)=[passed] build basic TZSP frames >>> ###(001)=[passed] = basic TZSP header - keepalive >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \ ... IP(src='1.1.1.1', dst='2.2.2.2')/ \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \ ... TZSP(type=TZSP.TYPE_KEEPALIVE, encapsulated_protocol=0) >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_KEEPALIVE >>> assert not tzsp_lyr.payload ###(002)=[passed] = basic TZSP header - keepalive + ignored end tag >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \ ... IP(src='1.1.1.1', dst='2.2.2.2')/ \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \ ... TZSP(type=TZSP.TYPE_KEEPALIVE, encapsulated_protocol=0)/ \ ... TZSPTagEnd() >>> >>> frm = frm.build() >>> frm = Ether(frm) payload (1 bytes) in KEEPALIVE/NULL packet >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_KEEPALIVE >>> assert tzsp_lyr.guess_payload_class(tzsp_lyr.payload) is scapy.packet.Raw payload (1 bytes) in KEEPALIVE/NULL packet ###(003)=[passed] = basic TZSP header with RX Packet and EndTag >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_end = tzsp_lyr.payload >>> assert tzsp_tag_end.type == 1 >>> >>> encapsulated_payload = tzsp_lyr.get_encapsulated_payload() >>> encapsulated_ether_lyr = encapsulated_payload.getlayer(Ether) >>> assert encapsulated_ether_lyr.src == '00:03:03:03:03:03' ###(004)=[passed] = basic TZSP header with RX Packet and Padding >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagPadding() / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_padding = tzsp_lyr.payload >>> assert tzsp_tag_padding.type == 0 >>> >>> tzsp_tag_end = tzsp_tag_padding.payload >>> assert tzsp_tag_end.type == 1 ###(005)=[passed] = basic TZSP header with RX Packet and RAWRSSI (byte, short) >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagRawRSSIByte(raw_rssi=42) / \ ... TZSPTagRawRSSIShort(raw_rssi=12345) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_raw_rssi_byte = tzsp_lyr.payload >>> assert tzsp_tag_raw_rssi_byte.type == 10 >>> assert tzsp_tag_raw_rssi_byte.raw_rssi == 42 >>> >>> tzsp_tag_raw_rssi_short = tzsp_tag_raw_rssi_byte.payload >>> assert tzsp_tag_raw_rssi_short.type == 10 >>> assert tzsp_tag_raw_rssi_short.raw_rssi == 12345 >>> >>> tzsp_tag_end = tzsp_tag_raw_rssi_short.payload >>> assert tzsp_tag_end.type == 1 ###(006)=[passed] = basic TZSP header with RX Packet and SNR (byte, short) >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagSNRByte(snr=23) / \ ... TZSPTagSNRShort(snr=54321) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_snr_byte = tzsp_lyr.payload >>> assert tzsp_tag_snr_byte.type == 11 >>> assert tzsp_tag_snr_byte.len == 1 >>> assert tzsp_tag_snr_byte.snr == 23 >>> >>> tzsp_tag_snr_short = tzsp_tag_snr_byte.payload >>> assert tzsp_tag_snr_short.type == 11 >>> assert tzsp_tag_snr_short.len == 2 >>> assert tzsp_tag_snr_short.snr == 54321 >>> >>> tzsp_tag_end = tzsp_tag_snr_short.payload >>> assert tzsp_tag_end.type == 1 ###(007)=[passed] = basic TZSP header with RX Packet and DATA Rate >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagDataRate(data_rate=TZSPTagDataRate.DATA_RATE_33) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_data_rate = tzsp_lyr.payload >>> assert tzsp_tag_data_rate.type == 12 >>> assert tzsp_tag_data_rate.len == 1 >>> assert tzsp_tag_data_rate.data_rate == TZSPTagDataRate.DATA_RATE_33 >>> >>> tzsp_tag_end = tzsp_tag_data_rate.payload >>> assert tzsp_tag_end.type == 1 ###(008)=[passed] = basic TZSP header with RX Packet and Timestamp >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagTimestamp(timestamp=0x11223344) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_timestamp = tzsp_lyr.payload >>> assert tzsp_tag_timestamp.type == 13 >>> assert tzsp_tag_timestamp.len == 4 >>> assert tzsp_tag_timestamp.timestamp == 0x11223344 >>> >>> tzsp_tag_end = tzsp_tag_timestamp.payload >>> assert tzsp_tag_end.type == 1 ###(009)=[passed] = basic TZSP header with RX Packet and ContentionFree >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagContentionFree(contention_free=TZSPTagContentionFree.NO) / \ ... TZSPTagContentionFree(contention_free=TZSPTagContentionFree.YES) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_contention_free_no = tzsp_lyr.payload >>> assert tzsp_tag_contention_free_no.type == 15 >>> assert tzsp_tag_contention_free_no.len == 1 >>> assert tzsp_tag_contention_free_no.contention_free == TZSPTagContentionFree.NO >>> >>> tzsp_tag_contention_free_yes = tzsp_tag_contention_free_no.payload >>> assert tzsp_tag_contention_free_yes.type == 15 >>> assert tzsp_tag_contention_free_yes.len == 1 >>> assert tzsp_tag_contention_free_yes.contention_free == TZSPTagContentionFree.YES >>> >>> tzsp_tag_end = tzsp_tag_contention_free_yes.payload >>> assert tzsp_tag_end.type == 1 ###(010)=[passed] = basic TZSP header with RX Packet and Decrypted >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagDecrypted(decrypted=TZSPTagDecrypted.NO) / \ ... TZSPTagDecrypted(decrypted=TZSPTagDecrypted.YES) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_decrypted_no = tzsp_lyr.payload >>> assert tzsp_tag_decrypted_no.type == 16 >>> assert tzsp_tag_decrypted_no.len == 1 >>> assert tzsp_tag_decrypted_no.decrypted == TZSPTagDecrypted.NO >>> >>> tzsp_tag_decrypted_yes= tzsp_tag_decrypted_no.payload >>> assert tzsp_tag_decrypted_yes.type == 16 >>> assert tzsp_tag_decrypted_yes.len == 1 >>> assert tzsp_tag_decrypted_yes.decrypted == TZSPTagDecrypted.YES >>> >>> tzsp_tag_end = tzsp_tag_decrypted_yes.payload >>> assert tzsp_tag_end.type == 1 ###(011)=[passed] = basic TZSP header with RX Packet and FCS error >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagError(fcs_error=TZSPTagError.NO) / \ ... TZSPTagError(fcs_error=TZSPTagError.YES) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_error_no = tzsp_lyr.payload >>> assert tzsp_tag_error_no.type == 17 >>> assert tzsp_tag_error_no.len == 1 >>> assert tzsp_tag_error_no.fcs_error == TZSPTagError.NO >>> >>> tzsp_tag_error_yes = tzsp_tag_error_no.payload >>> assert tzsp_tag_error_yes.type == 17 >>> assert tzsp_tag_error_yes.len == 1 >>> assert tzsp_tag_error_yes.fcs_error == TZSPTagError.YES >>> >>> tzsp_tag_end = tzsp_tag_error_yes.payload >>> assert tzsp_tag_end.type == 1 ###(012)=[passed] = basic TZSP header with RX Packet and RXChannel >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagRXChannel(rx_channel=123) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_rx_channel = tzsp_lyr.payload >>> assert tzsp_tag_rx_channel.type == 18 >>> assert tzsp_tag_rx_channel.len == 1 >>> assert tzsp_tag_rx_channel.rx_channel == 123 >>> >>> tzsp_tag_end = tzsp_tag_rx_channel.payload >>> assert tzsp_tag_end.type == 1 ###(013)=[passed] = basic TZSP header with RX Packet and Packet count >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagPacketCount(packet_count=0x44332211) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_packet_count = tzsp_lyr.payload >>> assert tzsp_tag_packet_count.type == 40 >>> assert tzsp_tag_packet_count.len == 4 >>> assert tzsp_tag_packet_count.packet_count == 0x44332211 >>> >>> tzsp_tag_end = tzsp_tag_packet_count.payload >>> assert tzsp_tag_end.type == 1 ###(014)=[passed] = basic TZSP header with RX Packet and RXFrameLength >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagRXFrameLength(rx_frame_length=0xbad0) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_frame_length = tzsp_lyr.payload >>> assert tzsp_tag_frame_length.type == 41 >>> assert tzsp_tag_frame_length.len == 2 >>> assert tzsp_tag_frame_length.rx_frame_length == 0xbad0 >>> >>> tzsp_tag_end = tzsp_tag_frame_length.payload >>> assert tzsp_tag_end.type == 1 ###(015)=[passed] = basic TZSP header with RX Packet and WLAN RADIO HDR SERIAL >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> SENSOR_ID = b'1E:AT:DE:AD:BE:EF' >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagWlanRadioHdrSerial(sensor_id=SENSOR_ID) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr.type == TZSP.TYPE_RX_PACKET >>> >>> tzsp_tag_sensor_id = tzsp_lyr.payload >>> assert tzsp_tag_sensor_id.type == 60 >>> assert tzsp_tag_sensor_id.len == len(SENSOR_ID) >>> assert tzsp_tag_sensor_id.sensor_id == SENSOR_ID >>> >>> tzsp_tag_end = tzsp_tag_sensor_id.payload >>> assert tzsp_tag_end.type == 1 ###(016)=[passed] = handling of unknown tag >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> SENSOR_ID = b'1E:AT:DE:AD:BE:EF' >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagUnknown(len=6, data=b'\x06\x05\x04\x03\x02\x01') / \ ... TZSPTagWlanRadioHdrSerial(sensor_id=SENSOR_ID) / \ ... TZSPTagEnd() / \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04') / \ ... Raw('foobar') >>> >>> frm = frm.build() >>> frm = Ether(frm) invalid or unknown tag type (255) >>> >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr >>> tzsp_tag_unknown = tzsp_lyr.payload >>> assert type(tzsp_tag_unknown) is TZSPTagUnknown ###(017)=[passed] all layers stacked >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \ ... IP(src='1.1.1.1', dst='2.2.2.2')/ \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \ ... TZSP()/ \ ... TZSPTagRawRSSIByte(raw_rssi=12)/ \ ... TZSPTagRawRSSIShort(raw_rssi=1234)/ \ ... TZSPTagSNRByte(snr=12)/ \ ... TZSPTagSNRShort(snr=1234)/ \ ... TZSPTagDataRate(data_rate = TZSPTagDataRate.DATA_RATE_54)/ \ ... TZSPTagTimestamp(timestamp=12345)/ \ ... TZSPTagContentionFree(contention_free = TZSPTagContentionFree.NO)/ \ ... TZSPTagContentionFree(contention_free = TZSPTagContentionFree.YES)/ \ ... TZSPTagDecrypted(decrypted=TZSPTagDecrypted.NO)/ \ ... TZSPTagDecrypted(decrypted=TZSPTagDecrypted.YES)/ \ ... TZSPTagError(fcs_error = TZSPTagError.YES)/ \ ... TZSPTagError(fcs_error = TZSPTagError.NO)/ \ ... TZSPTagRXChannel(rx_channel = 42)/ \ ... TZSPTagPacketCount(packet_count = 987654)/ \ ... TZSPTagRXFrameLength(rx_frame_length = 0x0bad)/ \ ... TZSPTagWlanRadioHdrSerial(sensor_id = 'foobar')/ \ ... TZSPTagPadding()/ \ ... TZSPTagEnd()/ \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04')/ \ ... ARP() >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> >>> tzsp_lyr = frm.getlayer(TZSP) >>> >>> tzsp_raw_rssi_byte_lyr = tzsp_lyr.payload >>> assert tzsp_raw_rssi_byte_lyr.type == 10 >>> >>> tzsp_tag_raw_rssi_short = tzsp_raw_rssi_byte_lyr.payload >>> assert tzsp_tag_raw_rssi_short.type == 10 >>> >>> tzsp_tag_snr_byte = tzsp_tag_raw_rssi_short.payload >>> assert tzsp_tag_snr_byte.type == 11 >>> >>> tzsp_tag_snr_short = tzsp_tag_snr_byte.payload >>> assert tzsp_tag_snr_short.type == 11 >>> >>> tzsp_tag_data_rate = tzsp_tag_snr_short.payload >>> assert tzsp_tag_data_rate.type == 12 >>> >>> tzsp_tag_timestamp = tzsp_tag_data_rate.payload >>> assert tzsp_tag_timestamp.type == 13 >>> >>> tzsp_tag_contention_free_no = tzsp_tag_timestamp.payload >>> assert tzsp_tag_contention_free_no.type == 15 >>> >>> tzsp_tag_contention_free_yes = tzsp_tag_contention_free_no.payload >>> assert tzsp_tag_contention_free_yes.type == 15 >>> >>> tzsp_tag_decrypted_no = tzsp_tag_contention_free_yes.payload >>> assert tzsp_tag_decrypted_no.type == 16 >>> >>> tzsp_tag_decrypted_yes = tzsp_tag_decrypted_no.payload >>> assert tzsp_tag_decrypted_yes.type == 16 >>> >>> tzsp_tag_error_yes = tzsp_tag_decrypted_yes.payload >>> assert tzsp_tag_error_yes.type == 17 >>> >>> tzsp_tag_error_no = tzsp_tag_error_yes.payload >>> assert tzsp_tag_error_no.type == 17 >>> >>> tzsp_tag_rx_channel = tzsp_tag_error_no.payload >>> assert tzsp_tag_rx_channel.type == 18 >>> >>> tzsp_tag_packet_count = tzsp_tag_rx_channel.payload >>> assert tzsp_tag_packet_count.type == 40 >>> >>> tzsp_tag_frame_length = tzsp_tag_packet_count.payload >>> assert tzsp_tag_frame_length.type == 41 >>> >>> tzsp_tag_sensor_id = tzsp_tag_frame_length.payload >>> assert tzsp_tag_sensor_id.type == 60 >>> >>> tzsp_tag_padding = tzsp_tag_sensor_id.payload >>> assert tzsp_tag_padding.type == 0 >>> >>> tzsp_tag_end = tzsp_tag_padding.payload >>> assert tzsp_tag_end.type == 1 >>> >>> encapsulated_payload = tzsp_tag_end.payload >>> encapsulated_ether_lyr = encapsulated_payload.getlayer(Ether) >>> assert encapsulated_ether_lyr.src == '00:03:03:03:03:03' ###### ## corner cases ###### ###(018)=[passed] state tags value range >>> ###(019)=[passed] = TZSPTagContentionFree >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \ ... IP(src='1.1.1.1', dst='2.2.2.2')/ \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \ ... TZSP()/ \ ... TZSPTagContentionFree(contention_free = 0xff)/ \ ... TZSPTagEnd() >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_tag_contention_free = frm.getlayer(TZSPTagContentionFree) >>> assert tzsp_tag_contention_free >>> tzsp_tag_contention_free_attr = tzsp_tag_contention_free.get_field('contention_free') >>> assert tzsp_tag_contention_free_attr >>> symb_str = tzsp_tag_contention_free_attr.i2repr(tzsp_tag_contention_free, tzsp_tag_contention_free.contention_free) >>> assert symb_str == 'yes' ###(020)=[passed] = TZSPTagError >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \ ... IP(src='1.1.1.1', dst='2.2.2.2')/ \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \ ... TZSP()/ \ ... TZSPTagError(fcs_error=TZSPTagError.NO)/ \ ... TZSPTagEnd() >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_tag_error = frm.getlayer(TZSPTagError) >>> assert tzsp_tag_error >>> tzsp_tag_error_attr = tzsp_tag_error.get_field('fcs_error') >>> assert tzsp_tag_error_attr >>> symb_str = tzsp_tag_error_attr.i2repr(tzsp_tag_error, tzsp_tag_error.fcs_error) >>> assert symb_str == 'no' >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02')/ \ ... IP(src='1.1.1.1', dst='2.2.2.2')/ \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT)/ \ ... TZSP()/ \ ... TZSPTagError(fcs_error=TZSPTagError.YES + 1)/ \ ... TZSPTagEnd() >>> >>> frm = frm.build() >>> frm = Ether(frm) >>> tzsp_tag_error = frm.getlayer(TZSPTagError) >>> assert tzsp_tag_error >>> tzsp_tag_error_attr = tzsp_tag_error.get_field('fcs_error') >>> assert tzsp_tag_error_attr >>> symb_str = tzsp_tag_error_attr.i2repr(tzsp_tag_error, tzsp_tag_error.fcs_error) >>> assert symb_str == 'reserved' ###(021)=[passed] = missing TZSP header before end tag >>> frm = TZSPTagEnd()/ \ ... Ether(src='00:03:03:03:03:03', dst='00:04:04:04:04:04')/ \ ... ARP() >>> >>> frm = frm.build() >>> try: ... frm = TZSPTagEnd(frm) ... assert False ... except TZSPStructureException: ... pass ... ###(022)=[passed] = invalid length field for given tag >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... TZSPTagRawRSSIByte(len=3) / \ ... TZSPTagEnd() >>> >>> frm = frm.build() >>> frm = Ether(frm) invalid tag length 3 for tag type 10 >>> >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert type(tzsp_lyr.payload) is Raw ###(023)=[passed] = handling of unknown tag - payload to short >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> SENSOR_ID = '1E:AT:DE:AD:BE:EF' >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... Raw(b'\xff\x0a\x01\x02\x03\x04\x05') >>> >>> frm = frm.build() >>> frm = Ether(frm) invalid or unknown tag type (255) and too short packet - treat remaining data as Raw >>> frm.show() ###[ Ethernet ]### dst = 00:02:02:02:02:02 src = 00:01:01:01:01:01 type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 39 id = 1 flags = frag = 0 ttl = 64 proto = udp chksum = 0x74c0 src = 1.1.1.1 dst = 2.2.2.2 \options \ ###[ UDP ]### sport = italk dport = 37008 len = 19 chksum = 0x2fe7 ###[ TZSP ]### version = 1 type = RX_PACKET encapsulated_protocol= ETHERNET ###[ Raw ]### load = b'\xff\n\x01\x02\x03\x04\x05' >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr >>> raw_lyr = tzsp_lyr.payload >>> assert type(raw_lyr) is Raw >>> assert raw_lyr.load == b'\xff\x0a\x01\x02\x03\x04\x05' ###(024)=[passed] = handling of unknown tag - no payload after tag type >>> bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT) >>> >>> SENSOR_ID = '1E:AT:DE:AD:BE:EF' >>> >>> frm = Ether(src='00:01:01:01:01:01', dst='00:02:02:02:02:02') / \ ... IP(src='1.1.1.1', dst='2.2.2.2') / \ ... UDP(sport=12345, dport=TZSP_PORT_DEFAULT) / \ ... TZSP() / \ ... Raw(b'\xff') >>> >>> frm = frm.build() >>> frm = Ether(frm) invalid or unknown tag type (255) and too short packet - treat remaining data as Raw >>> >>> tzsp_lyr = frm.getlayer(TZSP) >>> assert tzsp_lyr >>> raw_lyr = tzsp_lyr.payload >>> assert type(raw_lyr) is Raw >>> assert raw_lyr.load == b'\xff' VQP tests ━ Run at 01:43:10 from [test/contrib/vqp.uts] by UTscapy in 0.004656553268432617 └ Passed=2 └ Failed=0 ###### ## Basic VQP tests ###### ###(000)=[passed] Build VQP >>> pkt = UDP()/VQP(type=2, ... seq=15)/VQPEntry(datatype=3073,data="1.2.3.4")/VQPEntry(datatype=3078, ... data="AA:AA:AA:AA:AA:AA") >>> >>> assert bytes(pkt) == b'\x065\x065\x00&\x00\x00\x01\x02\x00\x02\x00\x00\x00\x0f\x00\x00\x0c\x01\x00\x04\x01\x02\x03\x04\x00\x00\x0c\x06\x00\x06\xaa\xaa\xaa\xaa\xaa\xaa' No IP underlayer to compute checksum. Leaving null. ###(001)=[passed] Dissect VQP >>> pkt = UDP(b'\x065\x065\x00&\x00\x00\x01\x02\x00\x02\x00\x00\x00\x0f\x00\x00\x0c\x01\x00\x04\x01\x02\x03\x04\x00\x00\x0c\x06\x00\x06\xaa\xaa\xaa\xaa\xaa\xaa') >>> >>> assert pkt[VQP].sprintf("%type%") == "responseVLAN" >>> assert pkt.getlayer(VQPEntry, 1).len == 4 >>> assert pkt.getlayer(VQPEntry, 1).sprintf("%datatype%") == "clientIPAddress" >>> assert pkt.getlayer(VQPEntry, 2).len == 6 >>> assert pkt.getlayer(VQPEntry, 2).sprintf("%datatype%") == "ReqMACAddress" Test campaign ━ Run at 01:43:10 from [test/contrib/vtp.uts] by UTscapy in 0.0011997222900390625 └ Passed=1 └ Failed=0 ###### ## VTP ###### ###(000)=[passed] VTP, basic instantiation >>> pkt = VTP(vlaninfo=[VTPVlanInfo()]) >>> assert len(pkt) == 72 WireGuard tests ━ Run at 01:43:10 from [test/contrib/wireguard.uts] by UTscapy in 0.01141500473022461 └ Passed=4 └ Failed=0 ###### ## Build packets & dissect ###### ###(000)=[passed] Build and dissect Transport >>> wgTransport = Wireguard()/WireguardTransport(receiver_index=1234, counter=1337, encrypted_encapsulated_packet=b"test123") >>> assert bytes(wgTransport) == b'\x04\x00\x00\x00\xd2\x04\x00\x009\x05\x00\x00\x00\x00\x00\x00test123' >>> >>> wgTransport = Wireguard(b'\x04\x00\x00\x00\xe1\x10\x00\x00\x9a\x02\x00\x00\x00\x00\x00\x00test123') >>> assert wgTransport.message_type == 4 >>> assert wgTransport[WireguardTransport].receiver_index == 4321 >>> assert wgTransport[WireguardTransport].counter == 666 >>> assert wgTransport[WireguardTransport].encrypted_encapsulated_packet == b"test123" ###(001)=[passed] Build and dissect Init >>> wgInit = Wireguard()/WireguardInitiation(sender_index=12345, ... unencrypted_ephemeral=b"\xaf\xfe"*16, encrypted_static=b"lul", encrypted_timestamp=b"kukuk", mac1="\x01"*16, mac2="\x02"*16 ... ) >>> assert bytes(wgInit) == b'\x01\x00\x00\x0090\x00\x00\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfe\xaf\xfelul\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00kukuk\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x01' * 16 + b'\x02' * 16 >>> >>> wgInit = Wireguard(b'\x01\x00\x00\x0090\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffstatisch\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00nixgibts\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04\x04') >>> >>> assert wgInit.message_type == 1 >>> assert wgInit[WireguardInitiation].sender_index == 12345 >>> assert wgInit[WireguardInitiation].unencrypted_ephemeral == b"\xff"*32 >>> assert wgInit[WireguardInitiation].encrypted_static == b"statisch" + b"\x00" * 40 >>> assert wgInit[WireguardInitiation].encrypted_timestamp == b"nixgibts" + b"\x00" * 20 >>> assert wgInit[WireguardInitiation].mac1 == b"\x03" * 16 >>> assert wgInit[WireguardInitiation].mac2 == b"\x04" * 16 ###(002)=[passed] Build and dissect Response >>> wgResp = Wireguard()/WireguardResponse(sender_index=12345, receiver_index=7878, ... unencrypted_ephemeral=b"\x41"*32, encrypted_nothing=b"empty", mac1=b"mac1", mac2=b"mac2" ... ) >>> >>> assert bytes(wgResp) == b'\x02\x00\x00\x0090\x00\x00\xc6\x1e\x00\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAempty\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00mac1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00mac2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> >>> >>> wgResp = Wireguard(b'\x02\x00\x00\x00W\x04\x00\x00\xae\x08\x00\x00BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBnotempty\x00\x00\x00\x00\x00\x00\x00\x00mac1lol\x00\x00\x00\x00\x00\x00\x00\x00\x00mac2lol\x00\x00\x00\x00\x00\x00\x00\x00\x00') >>> >>> assert wgResp.message_type == 2 >>> assert wgResp[WireguardResponse].sender_index == 1111 >>> assert wgResp[WireguardResponse].receiver_index == 2222 >>> assert wgResp[WireguardResponse].unencrypted_ephemeral == b"B"*32 >>> assert wgResp[WireguardResponse].encrypted_nothing == b"notempty" + b"\x00" * 8 >>> assert wgResp[WireguardResponse].mac1 == b"mac1lol" + b"\x00" * 9 >>> assert wgResp[WireguardResponse].mac2 == b"mac2lol" + b"\x00" * 9 ###(003)=[passed] Build and dissect Cookie Response >>> wgCookie = Wireguard()/WireguardCookieReply(receiver_index=3333, ... nonce=b"C"*24, encrypted_cookie=b"D"*16 + b"E"*16 ... ) >>> >>> assert bytes(wgCookie) == b'\x03\x00\x00\x00\x05\r\x00\x00CCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEE' >>> >>> >>> wgCookie = Wireguard(b'\x03\x00\x00\x00\xb8"\x00\x00KKKKKKKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLMMMMMMMMMMMMMMMM') >>> >>> assert wgCookie.message_type == 3 >>> assert wgCookie[WireguardCookieReply].receiver_index == 8888 >>> assert wgCookie[WireguardCookieReply].nonce == b"K"*24 >>> assert wgCookie[WireguardCookieReply].encrypted_cookie == b"L" * 16 + b"M" * 16 Regression tests for isotpscanner ━ Run at 01:43:10 from [test/tools/isotpscanner.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for obdscanner ━ Run at 01:43:10 from [test/tools/obdscanner.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for the XCP_CAN ━ Run at 01:43:10 from [test/tools/xcpscanner.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for the CCP layer ━ Run at 01:43:11 from [test/contrib/automotive/ccp.uts] by UTscapy in 0.3024005889892578 └ Passed=63 └ Failed=0 ###### ## Configuration ###### ###(000)=[passed] Imports >>> from test.testsocket import TestSocket, cleanup_testsockets ###### ## Basic operations ###### ###(001)=[passed] Load module >>> load_contrib("automotive.ccp", globals_dict=globals()) ###(002)=[passed] Build CRO CONNECT >>> cro = CCP(identifier=0x700)/CRO(ctr=1)/CONNECT(station_address=0x02) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 1 >>> assert cro.cmd == 1 >>> assert cro.station_address == 0x02 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x01\x01\x02\x00\xff\xff\xff\xff' ###(003)=[passed] Dissect DTO CONNECT >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x01\xff\xff\xff\xff\xff') >>> >>> assert dto.answers(cro) >>> assert dto.identifier == 0x700 >>> assert dto.length == 8 >>> assert dto.flags == 0 >>> assert dto.ctr == 1 >>> assert dto.load == b"\xff" * 5 ###(004)=[passed] Build CRO EXCHANGE_ID >>> cro = CCP(identifier=0x700)/CRO(ctr=18)/EXCHANGE_ID(ccp_master_device_id=b'abcdef') >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 18 >>> assert cro.cmd == 0x17 >>> assert cro.ccp_master_device_id == b"abcdef" >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x17\x12abcdef' ###(005)=[passed] Dissect DTO EXCHANGE_ID >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x12\x04\x02\x03\x03\xff') >>> >>> assert dto.ctr == 18 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x04\x02\x03\x03\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 18 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.slave_device_ID_length == 4 >>> assert dto.data_type_qualifier == 2 >>> assert dto.resource_availability_mask == 3 >>> assert dto.resource_protection_mask == 3 >>> assert dto.ccp_reserved == b"\xff" ###(006)=[passed] Build CRO GET_SEED >>> cro = CCP(identifier=0x711)/CRO(ctr=19)/GET_SEED(resource=2) >>> >>> assert cro.identifier == 0x711 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 19 >>> assert cro.cmd == 0x12 >>> assert cro.resource == 2 >>> assert cro.ccp_reserved == b"\xff" * 5 >>> >>> assert bytes(cro) == b'\x00\x00\x07\x11\x08\x00\x00\x00\x12\x13\x02\xff\xff\xff\xff\xff' ###(007)=[passed] Dissect DTO GET_SEED >>> dto = CCP(b'\x00\x00\x07\x11\x08\x00\x00\x00\xff\x00\x13\x01\x14\x15\x16\x17') >>> >>> assert dto.ctr == 19 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x01\x14\x15\x16\x17' >>> assert dto.answers(cro) >>> assert dto.ctr == 19 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.protection_status == 0x1 >>> assert dto.seed == b'\x14\x15\x16\x17' ###(008)=[passed] Build CRO UNLOCK >>> cro = CCP(identifier=0x711)/CRO(ctr=20)/UNLOCK(key=b"123456") >>> >>> assert cro.identifier == 0x711 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 20 >>> assert cro.cmd == 0x13 >>> assert cro.key == b"123456" >>> >>> assert bytes(cro) == b'\x00\x00\x07\x11\x08\x00\x00\x00\x13\x14123456' ###(009)=[passed] Dissect DTO UNLOCK >>> dto = CCP(b'\x00\x00\x07\x11\x08\x00\x00\x00\xff\x00\x14\x02\xff\xff\xff\xff') >>> >>> assert dto.ctr == 20 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x02\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 20 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.privilege_status == 0x2 >>> assert dto.ccp_reserved == b"\xff" * 4 ###(010)=[passed] Build CRO SET_MTA >>> cro = CCP(identifier=0x711)/CRO(ctr=21)/SET_MTA(mta_num=0, address_extension=0x02, address=0x34002000) >>> >>> assert cro.identifier == 0x711 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 21 >>> assert cro.cmd == 0x02 >>> assert cro.mta_num == 0 >>> assert cro.address_extension == 2 >>> assert cro.address == 0x34002000 >>> >>> assert bytes(cro) == b'\x00\x00\x07\x11\x08\x00\x00\x00\x02\x15\x00\x02\x34\x00\x20\x00' ###(011)=[passed] Dissect DTO SET_MTA >>> dto = CCP(b'\x00\x00\x07\x11\x08\x00\x00\x00\xff\x00\x15\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 21 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 21 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True >>> assert dto.load == b"\xff" * 5 ###(012)=[passed] Build CRO DNLOAD >>> cro = CCP(identifier=0x700)/CRO(ctr=17)/DNLOAD(size=0x05, data=b'abcde') >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 17 >>> assert cro.cmd == 3 >>> assert cro.size == 0x05 >>> assert cro.data == b'abcde' >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x03\x11\x05abcde' ###(013)=[passed] Dissect DTO DNLOAD >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x11\x02\x34\x00\x20\x05') >>> >>> assert dto.ctr == 17 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x024\x00 \x05' >>> assert dto.answers(cro) >>> assert dto.ctr == 17 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.MTA0_extension == 2 >>> assert dto.MTA0_address == 0x34002005 ###(014)=[passed] Build CRO DNLOAD_6 >>> cro = CCP(identifier=0x700)/CRO(ctr=0x40)/DNLOAD_6(data=b'abcdef') >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x40 >>> assert cro.cmd == 0x23 >>> assert cro.data == b'abcdef' >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x23\x40abcdef' ###(015)=[passed] Dissect DTO DNLOAD_6 >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x40\x02\x34\x00\x20\x06') >>> >>> assert dto.ctr == 64 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x024\x00 \x06' >>> assert dto.answers(cro) >>> assert dto.ctr == 64 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.MTA0_extension == 2 >>> assert dto.MTA0_address == 0x34002006 ###(016)=[passed] Build CRO UPLOAD >>> cro = CCP(identifier=0x700)/CRO(ctr=0x41)/UPLOAD(size=4) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x41 >>> assert cro.cmd == 0x04 >>> assert cro.size == 4 >>> assert cro.ccp_reserved == b"\xff" * 5 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x04\x41\x04\xff\xff\xff\xff\xff' ###(017)=[passed] Dissect DTO UPLOAD >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x41\x10\x11\x12\x13\xff') >>> >>> assert dto.ctr == 65 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x10\x11\x12\x13\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 65 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.data == b"\x10\x11\x12\x13\xff" ###(018)=[passed] Build CRO SHORT_UP >>> cro = CCP(identifier=0x700)/CRO(ctr=0x42)/SHORT_UP(size=4, address_extension=0, address=0x12345678) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x42 >>> assert cro.cmd == 0x0f >>> assert cro.size == 4 >>> assert cro.address == 0x12345678 >>> assert cro.address_extension == 0 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x0f\x42\x04\x00\x12\x34\x56\x78' ###(019)=[passed] Dissect DTO SHORT_UP >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x42\x10\x11\x12\x13\xff') >>> >>> assert dto.ctr == 66 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x10\x11\x12\x13\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 66 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.data == b"\x10\x11\x12\x13\xff" ###(020)=[passed] Build CRO SELECT_CAL_PAGE >>> cro = CCP(identifier=0x700)/CRO(ctr=0x43)/SELECT_CAL_PAGE() >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x43 >>> assert cro.cmd == 0x11 >>> assert cro.ccp_reserved == b"\xff" * 6 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x11\x43\xff\xff\xff\xff\xff\xff' ###(021)=[passed] Dissect DTO SELECT_CAL_PAGE >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x43\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 67 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 67 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True >>> assert dto.load == b"\xff\xff\xff\xff\xff" ###(022)=[passed] Build CRO GET_DAQ_SIZE >>> cro = CCP(identifier=0x700)/CRO(ctr=0x44)/GET_DAQ_SIZE(DAQ_num=0x03, DTO_identifier=0x1020304) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x44 >>> assert cro.cmd == 0x14 >>> assert cro.DAQ_num == 0x03 >>> assert cro.ccp_reserved == 00 >>> assert cro.DTO_identifier == 0x01020304 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x14\x44\x03\x00\x01\x02\x03\x04' ###(023)=[passed] Dissect DTO GET_DAQ_SIZE >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x44\x10\x08\xff\xff\xff') >>> >>> assert dto.ctr == 68 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x10\x08\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 68 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.DAQ_list_size == 16 >>> assert dto.first_pid == 8 >>> assert dto.ccp_reserved == b"\xff\xff\xff" ###(024)=[passed] Build CRO SET_DAQ_PTR >>> cro = CCP(identifier=0x700)/CRO(ctr=0x45)/SET_DAQ_PTR(DAQ_num=3, ODT_num=5, ODT_element=2) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x45 >>> assert cro.cmd == 0x15 >>> assert cro.DAQ_num == 0x03 >>> assert cro.ODT_num == 5 >>> assert cro.ODT_element == 2 >>> assert cro.ccp_reserved == b"\xff\xff\xff" >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x15\x45\x03\x05\x02\xff\xff\xff' ###(025)=[passed] Dissect DTO SET_DAQ_PTR >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x45\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 69 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 69 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True >>> assert dto.load == b'\xff\xff\xff\xff\xff' ###(026)=[passed] Build CRO WRITE_DAQ >>> cro = CCP(identifier=0x700)/CRO(ctr=0x46)/WRITE_DAQ(DAQ_size=2, address_extension=1, address=0x2004200) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x46 >>> assert cro.cmd == 0x16 >>> assert cro.DAQ_size == 0x02 >>> assert cro.address_extension == 1 >>> assert cro.address == 0x2004200 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x16\x46\x02\x01\x02\x00\x42\x00' ###(027)=[passed] Dissect DTO WRITE_DAQ >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x46\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 70 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 70 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True >>> assert dto.load == b'\xff\xff\xff\xff\xff' ###(028)=[passed] Build CRO START_STOP >>> cro = CCP(identifier=0x700)/CRO(ctr=0x47)/START_STOP(mode=1, DAQ_num=3, ODT_num=7, event_channel=2, transmission_rate=1) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x47 >>> assert cro.cmd == 0x06 >>> assert cro.mode == 0x01 >>> assert cro.DAQ_num == 3 >>> assert cro.event_channel == 2 >>> assert cro.transmission_rate == 1 >>> assert cro.ODT_num == 7 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x06\x47\x01\x03\x07\x02\x00\x01' ###(029)=[passed] Dissect DTO START_STOP >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x47\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 71 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 71 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True >>> assert dto.load == b'\xff\xff\xff\xff\xff' ###(030)=[passed] Build CRO DISCONNECT >>> cro = CCP(identifier=0x700)/CRO(ctr=0x48)/DISCONNECT(type="temporary", station_address=0x208) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x48 >>> assert cro.cmd == 0x07 >>> assert cro.type == 0x00 >>> assert cro.station_address == 0x208 >>> assert cro.ccp_reserved0 == b"\xff" >>> assert cro.ccp_reserved == b"\xff" * 2 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x07\x48\x00\xff\x08\x02\xff\xff' ###(031)=[passed] Dissect DTO DISCONNECT >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x48\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 72 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 72 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True >>> assert dto.load == b'\xff\xff\xff\xff\xff' ###(032)=[passed] Build CRO SET_S_STATUS >>> cro = CCP(identifier=0x700)/CRO(ctr=0x49)/SET_S_STATUS(session_status="RUN+CAL") >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x49 >>> assert cro.cmd == 0x0c >>> assert cro.session_status == 0x81 >>> assert cro.ccp_reserved == b"\xff" * 5 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x0c\x49\x81\xff\xff\xff\xff\xff' ###(033)=[passed] Dissect DTO SET_S_STATUS >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x49\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 73 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 73 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True >>> assert dto.load == b'\xff\xff\xff\xff\xff' ###(034)=[passed] Build CRO GET_S_STATUS >>> cro = CCP(identifier=0x700)/CRO(ctr=0x4a)/GET_S_STATUS() >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x4a >>> assert cro.cmd == 0x0D >>> assert cro.ccp_reserved == b"\xff" * 6 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x0d\x4a\xff\xff\xff\xff\xff\xff' ###(035)=[passed] Dissect DTO GET_S_STATUS >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x4a\x81\xff\xff\xff\xff') >>> >>> assert dto.ctr == 74 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x81\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 74 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.session_status == 0x81 >>> assert dto.information_qualifier == 0xff >>> assert dto.information == b"\xff" * 3 ###(036)=[passed] Build CRO BUILD_CHKSUM >>> cro = CCP(identifier=0x700)/CRO(ctr=0x50)/BUILD_CHKSUM(size=0x8000) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x50 >>> assert cro.cmd == 0x0e >>> assert cro.size == 0x8000 >>> assert cro.ccp_reserved == b"\xff" * 2 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x0e\x50\x00\x00\x80\x00\xff\xff' ###(037)=[passed] Dissect DTO BUILD_CHKSUM >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x50\x02\x12\x34\xff\xff') >>> >>> assert dto.ctr == 80 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x02\x12\x34\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 80 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.checksum_size == 2 >>> assert dto.checksum_data == b'\x12\x34' >>> assert dto.ccp_reserved == b'\xff\xff' ###(038)=[passed] Dissect DTO BUILD_CHKSUM2 >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x50\x04\x12\x34\x56\x78') >>> >>> assert dto.ctr == 80 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x04\x12\x34\x56\x78' >>> assert dto.answers(cro) >>> assert dto.ctr == 80 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.checksum_size == 4 >>> assert dto.checksum_data == b'\x12\x34\x56\x78' >>> assert dto.ccp_reserved == b'' ###(039)=[passed] Build CRO CLEAR_MEMORY >>> cro = CCP(identifier=0x700)/CRO(ctr=0x51)/CLEAR_MEMORY(size=0x8000) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x51 >>> assert cro.cmd == 0x10 >>> assert cro.size == 0x8000 >>> assert cro.ccp_reserved == b"\xff" * 2 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x10\x51\x00\x00\x80\x00\xff\xff' ###(040)=[passed] Dissect DTO CLEAR_MEMORY >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x51\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 81 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 81 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True >>> assert dto.load == b'\xff\xff\xff\xff\xff' ###(041)=[passed] Build CRO PROGRAM >>> cro = CCP(identifier=0x700)/CRO(ctr=0x52)/PROGRAM(size=0x3, data=b"\x10\x11\x12") >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x52 >>> assert cro.cmd == 0x18 >>> assert cro.size == 0x3 >>> assert cro.data == b"\x10\x11\x12" >>> assert cro.ccp_reserved == b"\xff" * 5 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x18\x52\x03\x10\x11\x12\xff\xff' ###(042)=[passed] Dissect DTO PROGRAM >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x52\x02\x34\x00\x20\x03') >>> >>> assert dto.ctr == 82 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x02\x34\x00\x20\x03' >>> assert dto.answers(cro) >>> assert dto.ctr == 82 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.MTA0_extension == 2 >>> assert dto.MTA0_address == 0x34002003 ###(043)=[passed] Build CRO PROGRAM_6 >>> cro = CCP(identifier=0x700)/CRO(ctr=0x53)/PROGRAM_6(data=b"\x10\x11\x12\x10\x11\x12") >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x53 >>> assert cro.cmd == 0x22 >>> assert cro.data == b"\x10\x11\x12\x10\x11\x12" >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x22\x53\x10\x11\x12\x10\x11\x12' ###(044)=[passed] Dissect DTO PROGRAM_6 >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x53\x02\x34\x00\x20\x06') >>> >>> assert dto.ctr == 83 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x02\x34\x00\x20\x06' >>> assert dto.answers(cro) >>> assert dto.ctr == 83 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.MTA0_extension == 2 >>> assert dto.MTA0_address == 0x34002006 ###(045)=[passed] Build CRO MOVE >>> cro = CCP(identifier=0x700)/CRO(ctr=0x54)/MOVE(size=0x8000) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x54 >>> assert cro.cmd == 0x19 >>> assert cro.size == 0x8000 >>> assert cro.ccp_reserved == b'\xff\xff' >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x19\x54\x00\x00\x80\x00\xff\xff' ###(046)=[passed] Dissect DTO MOVE >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x54\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 84 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 84 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True ###(047)=[passed] Build CRO DIAG_SERVICE >>> cro = CCP(identifier=0x700)/CRO(ctr=0x55)/DIAG_SERVICE(diag_service=0x8000) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x55 >>> assert cro.cmd == 0x20 >>> assert cro.diag_service == 0x8000 >>> assert cro.ccp_reserved == b'\xff\xff\xff\xff' >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x20\x55\x80\x00\xff\xff\xff\xff' ###(048)=[passed] Dissect DTO DIAG_SERVICE >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x55\x20\x00\xff\xff\xff') >>> >>> assert dto.ctr == 85 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x20\x00\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 85 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.data_length == 0x20 >>> assert dto.data_type == 0x00 >>> assert dto.ccp_reserved == b"\xff\xff\xff" ###(049)=[passed] Build CRO ACTION_SERVICE >>> cro = CCP(identifier=0x700)/CRO(ctr=0x56)/ACTION_SERVICE(action_service=0x8000) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x56 >>> assert cro.cmd == 0x21 >>> assert cro.action_service == 0x8000 >>> assert cro.ccp_reserved == b'\xff\xff\xff\xff' >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x21\x56\x80\x00\xff\xff\xff\xff' ###(050)=[passed] Dissect DTO ACTION_SERVICE >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x56\x20\x00\xff\xff\xff') >>> >>> assert dto.ctr == 86 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x20\x00\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 86 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.data_length == 0x20 >>> assert dto.data_type == 0x00 >>> assert dto.ccp_reserved == b"\xff\xff\xff" ###(051)=[passed] Build CRO TEST >>> cro = CCP(identifier=0x700)/CRO(ctr=0x60)/TEST(station_address=0x80) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x60 >>> assert cro.cmd == 0x05 >>> assert cro.station_address == 0x80 >>> assert cro.ccp_reserved == b"\xff" * 4 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x05\x60\x80\x00\xff\xff\xff\xff' ###(052)=[passed] Dissect DTO TEST >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x60\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 96 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 96 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True >>> assert dto.load == b'\xff\xff\xff\xff\xff' ###(053)=[passed] Build CRO START_STOP_ALL >>> cro = CCP(identifier=0x700)/CRO(ctr=0x61)/START_STOP_ALL(type="start") >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x61 >>> assert cro.cmd == 0x08 >>> assert cro.type == 0x01 >>> assert cro.ccp_reserved == b"\xff" * 5 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x08\x61\x01\xff\xff\xff\xff\xff' ###(054)=[passed] Dissect DTO START_STOP_ALL >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x61\xff\xff\xff\xff\xff') >>> >>> assert dto.ctr == 97 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\xff\xff\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 97 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == True >>> assert dto.load == b'\xff\xff\xff\xff\xff' ###(055)=[passed] Build CRO GET_ACTIVE_CAL_PAGE >>> cro = CCP(identifier=0x700)/CRO(ctr=0x62)/GET_ACTIVE_CAL_PAGE() >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x62 >>> assert cro.cmd == 0x09 >>> assert cro.ccp_reserved == b"\xff" * 6 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x09\x62\xff\xff\xff\xff\xff\xff' ###(056)=[passed] Dissect DTO GET_ACTIVE_CAL_PAGE >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x62\x01\x11\x44\x77\x22') >>> >>> assert dto.ctr == 98 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x01\x11\x44\x77\x22' >>> assert dto.answers(cro) >>> assert dto.ctr == 98 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.address_extension == 1 >>> assert dto.address == 0x11447722 ###(057)=[passed] Build CRO GET_CCP_VERSION >>> cro = CCP(identifier=0x700)/CRO(ctr=0x63)/GET_CCP_VERSION(main_protocol_version=2, release_version=1) >>> >>> assert cro.identifier == 0x700 >>> assert cro.length == 8 >>> assert cro.flags == 0 >>> assert cro.ctr == 0x63 >>> assert cro.cmd == 0x1b >>> assert cro.main_protocol_version == 2 >>> assert cro.release_version == 1 >>> assert cro.ccp_reserved == b"\xff" * 4 >>> assert bytes(cro) == b'\x00\x00\x07\x00\x08\x00\x00\x00\x1b\x63\x02\x01\xff\xff\xff\xff' >>> >>> assert dto.hashret() != cro.hashret() >>> assert not dto.answers(cro) ###(058)=[passed] Dissect DTO GET_CCP_VERSION >>> dto = CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x63\x02\x01\xff\xff\xff') >>> >>> assert dto.ctr == 99 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert dto.load == b'\x02\x01\xff\xff\xff' >>> assert dto.answers(cro) >>> assert dto.ctr == 99 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.main_protocol_version == 2 >>> assert dto.release_version == 1 >>> assert dto.ccp_reserved == b"\xff" * 3 >>> >>> assert dto.hashret() == cro.hashret() ###### ## Tests on a virtual CAN-Bus ###### ###(059)=[passed] CAN Socket sr1 with dto.answers(cro) == True >>> sock1 = TestSocket(CCP) >>> sock2 = TestSocket(CAN) >>> sock1.pair(sock2) >>> >>> def answer(pkt): ... cro = CRO(pkt.data) ... assert cro.cmd == 0x22 ... assert cro.data == b"\x10\x11\x12\x10\x11\x12" ... sock2.send(CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x53\x02\x34\x00\x20\x06')) ... >>> sniffer = AsyncSniffer(opened_socket=sock2, count=1, timeout=5, prn=answer) >>> sniffer.start() >>> dto = sock1.sr1(CCP(identifier=0x700)/CRO(ctr=0x53)/PROGRAM_6(data=b"\x10\x11\x12\x10\x11\x12"), timeout=1, verbose=False) >>> sniffer.join(timeout=5) >>> sock1.close() >>> sock2.close() >>> >>> assert dto.ctr == 83 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 0 >>> assert hasattr(dto, "load") == False >>> assert dto.MTA0_extension == 2 >>> assert dto.MTA0_address == 0x34002006 ###(060)=[passed] CAN Socket sr1 with dto.answers(cro) == False >>> sock1 = TestSocket(CCP) >>> sock2 = TestSocket(CAN) >>> sock1.pair(sock2) >>> >>> def answer(pkt): ... cro = CRO(pkt.data) ... assert cro.cmd == 0x22 ... assert cro.data == b"\x10\x11\x12\x10\x11\x12" ... sock2.send(CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\x55\x02\x34\x00\x20\x06')) ... >>> sniffer = AsyncSniffer(opened_socket=sock2, count=1, timeout=5, prn=answer) >>> sniffer.start() >>> dto = sock1.sr1(CCP(identifier=0x700)/CRO(ctr=0x54)/PROGRAM_6(data=b"\x10\x11\x12\x10\x11\x12"), timeout=0.1, verbose=False) >>> sniffer.join(timeout=5) >>> sock1.close() >>> sock2.close() >>> assert dto is None ###(061)=[passed] CAN Socket sr1 with error code >>> sock1 = TestSocket(CCP) >>> sock2 = TestSocket(CAN) >>> sock1.pair(sock2) >>> >>> def answer(pkt): ... cro = CRO(pkt.data) ... assert cro.cmd == 0x22 ... assert cro.data == b"\x10\x11\x12\x10\x11\x12" ... sock2.send(CCP(b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x01\x55\xff\xff\xff\xff\xff')) ... >>> sniffer = AsyncSniffer(opened_socket=sock2, count=1, timeout=5, prn=answer) >>> sniffer.start() >>> dto = sock1.sr1(CCP(identifier=0x700)/CRO(ctr=0x55)/PROGRAM_6(data=b"\x10\x11\x12\x10\x11\x12"), timeout=1, verbose=False) >>> sniffer.join(timeout=5) >>> sock1.close() >>> sock2.close() >>> >>> assert dto.ctr == 85 >>> assert dto.packet_id == 0xff >>> assert dto.return_code == 1 >>> assert hasattr(dto, "load") == False >>> assert dto.MTA0_extension == 0xff >>> assert dto.MTA0_address == 0xffffffff ###### ## Cleanup ###### ###(062)=[passed] Delete TestSockets >>> cleanup_testsockets() Regression tests for the DoIP layer ━ Run at 01:43:12 from [test/contrib/automotive/doip.uts] by UTscapy in 1.873340129852295 └ Passed=39 └ Failed=0 ###### ## Doip contrib tests ###### ###(000)=[passed] Load Contrib Layer >>> from test.testsocket import TestSocket, cleanup_testsockets, UnstableSocket >>> >>> load_contrib("automotive.doip", globals_dict=globals()) Specify "conf.contribs['UDS'] = {'treat-response-pending-as-answer': True}" to treat a negative response 'requestCorrectlyReceived-ResponsePending' as answer of a request. The default value is False. >>> load_contrib("automotive.uds", globals_dict=globals()) ###(001)=[passed] Defaults test >>> p = DoIP(payload_type=1) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == None >>> assert p.payload_type == 1 ###(002)=[passed] Build test 0 >>> p = DoIP(bytes(DoIP(payload_type=0))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 1 >>> assert p.payload_type == 0 >>> assert p.nack == 0 ###(003)=[passed] Build test 1 >>> p = DoIP(bytes(DoIP(payload_type=1))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 0 >>> assert p.payload_type == 1 ###(004)=[passed] Build test 2 >>> p = DoIP(bytes(DoIP(payload_type=2))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 6 >>> assert p.payload_type == 2 >>> assert bytes(p.eid) == b"\x00" * 6 ###(005)=[passed] Build test 3 >>> p = DoIP(bytes(DoIP(payload_type=3))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 17 >>> assert p.payload_type == 3 >>> assert bytes(p.vin) == b"\x00" * 17 ###(006)=[passed] Build test 4 >>> p = DoIP(bytes(DoIP(payload_type=4))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 33 >>> assert p.payload_type == 4 >>> assert bytes(p.vin) == b"\x00" * 17 >>> assert p.logical_address == 0 >>> assert bytes(p.eid) == b"\x00" * 6 >>> assert bytes(p.gid) == b"\x00" * 6 >>> assert p.further_action == 0 >>> assert p.vin_gid_status == 0 ###(007)=[passed] Build test 5 >>> p = DoIP(bytes(DoIP(payload_type=5))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 7 >>> assert p.payload_type == 5 >>> assert p.source_address == 0 >>> assert p.activation_type == 0 >>> assert p.reserved_iso == 0 >>> assert p.reserved_oem == b"" ###(008)=[passed] Build test 5.1 >>> p = DoIP(bytes(DoIP(payload_type=5, reserved_oem=b"1234"))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 11 >>> assert p.payload_type == 5 >>> assert p.source_address == 0 >>> assert p.activation_type == 0 >>> assert p.reserved_iso == 0 >>> p.show() ###[ DoIP ]### protocol_version= 0x2 inverse_version= 0xfd payload_type= Routing activation request payload_length= 11 source_address= 0x0 activation_type= Default reserved_iso= 0x0 reserved_oem= 31323334 >>> print(p.reserved_oem) b'1234' >>> assert p.reserved_oem == b"1234" ###(009)=[passed] Build test 5.2 >>> p = DoIP(bytes(DoIP(payload_type=5, reserved_oem=b"12"))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 9 >>> assert p.payload_type == 5 >>> assert p.source_address == 0 >>> assert p.activation_type == 0 >>> assert p.reserved_iso == 0 >>> assert p.reserved_oem == b"12" ###(010)=[passed] Build test 6 >>> p = DoIP(bytes(DoIP(payload_type=6))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 9 >>> assert p.payload_type == 6 >>> assert p.logical_address_tester == 0 >>> assert p.logical_address_doip_entity == 0 >>> assert p.reserved_iso == 0 >>> assert p.reserved_oem == b"" ###(011)=[passed] Build test 7 >>> p = DoIP(bytes(DoIP(payload_type=7))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 0 >>> assert p.payload_type == 7 ###(012)=[passed] Build test 8 >>> p = DoIP(bytes(DoIP(payload_type=8))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 2 >>> assert p.payload_type == 8 >>> assert p.source_address == 0 ###(013)=[passed] Build test 4001 >>> p = DoIP(bytes(DoIP(payload_type=0x4001))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 0 >>> assert p.payload_type == 0x4001 ###(014)=[passed] Build test 4002 >>> p = DoIP(bytes(DoIP(payload_type=0x4002))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 7 >>> assert p.payload_type == 0x4002 >>> assert p.node_type == 0 >>> assert p.max_open_sockets == 1 >>> assert p.cur_open_sockets == 0 >>> assert p.max_data_size == 0 ###(015)=[passed] Build test 4003 >>> p = DoIP(bytes(DoIP(payload_type=0x4003))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 0 >>> assert p.payload_type == 0x4003 ###(016)=[passed] Build test 4004 >>> p = DoIP(bytes(DoIP(payload_type=0x4004))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 1 >>> assert p.payload_type == 0x4004 >>> assert p.diagnostic_power_mode == 0 ###(017)=[passed] Build test 8001 >>> p = DoIP(bytes(DoIP(payload_type=0x8001))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 4 >>> assert p.payload_type == 0x8001 >>> assert p.source_address == 0 >>> assert p.target_address == 0 ###(018)=[passed] Build test 8002 >>> p = DoIP(bytes(DoIP(payload_type=0x8002))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 5 >>> assert p.payload_type == 0x8002 >>> assert p.source_address == 0 >>> assert p.target_address == 0 >>> assert p.ack_code == 0 >>> assert p.previous_msg == b'' >>> >>> p = DoIP(bytes(DoIP(payload_type=0x8002, previous_msg=b'\x22\xfd\x32'))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 8 >>> assert p.payload_type == 0x8002 >>> assert p.source_address == 0 >>> assert p.target_address == 0 >>> assert p.ack_code == 0 >>> assert p.previous_msg == b'\x22\xfd\x32' >>> >>> p = DoIP(bytes(DoIP(payload_type=0x8002, previous_msg=b'\x19\x02\x09\x9C\x00'))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 10 >>> assert p.payload_type == 0x8002 >>> assert p.source_address == 0 >>> assert p.target_address == 0 >>> assert p.ack_code == 0 >>> assert p.previous_msg == b'\x19\x02\t\x9c\x00' >>> >>> p = DoIP(b'\x02\xfd\x80\x02\x00\x00\x00\x07\x00\x08\x00\x0e\x00\x10\x01') >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xFD >>> assert p.payload_length == 7 >>> assert p.payload_type == 0x8002 >>> assert p.source_address == 0x8 >>> assert p.target_address == 0xE >>> assert p.ack_code == 0 >>> assert p.previous_msg == b'\x10\x01' ###(019)=[passed] Build test 8003 >>> p = DoIP(bytes(DoIP(payload_type=0x8003))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 5 >>> assert p.payload_type == 0x8003 >>> assert p.source_address == 0 >>> assert p.target_address == 0 >>> assert p.nack_code == 0 >>> >>> >>> p = DoIP(bytes(DoIP(payload_type=0x8003, previous_msg=b'\x2E\xfd\x32\x01\x02'))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 10 >>> assert p.payload_type == 0x8003 >>> assert p.source_address == 0 >>> assert p.target_address == 0 >>> assert p.nack_code == 0 >>> assert p.previous_msg == b'.\xfd2\x01\x02' >>> >>> p = DoIP(bytes(DoIP(payload_type=0x8003, previous_msg=b'\x19\x02\x09\x9A\x00'))) >>> >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 10 >>> assert p.payload_type == 0x8003 >>> assert p.source_address == 0 >>> assert p.target_address == 0 >>> assert p.nack_code == 0 >>> assert p.previous_msg == b'\x19\x02\t\x9a\x00' >>> >>> p = DoIP(b'\x02\xfd\x80\x03\x00\x00\x00\x07\x00\x0A\x00\x0C\x00\x10\x03') >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xFD >>> assert p.payload_length == 7 >>> assert p.payload_type == 0x8003 >>> assert p.source_address == 0xA >>> assert p.target_address == 0xC >>> assert p.nack_code == 0 >>> assert p.previous_msg == b'\x10\x03' ###### ## pcap based tests ###### ###(020)=[passed] read diag_ack pcap file >>> pkt = rdpcap(scapy_path("test/pcaps/doip_ack.pcap")).res[0] >>> >>> assert len(pkt) == 70 ###(021)=[passed] dissect test of diag ACK with previous_msg field filled >>> assert pkt.protocol_version == 0x02 >>> assert pkt.inverse_version == 0xFD >>> assert pkt.payload_length == 8 >>> assert pkt.source_address == 0x4B >>> assert pkt.target_address == 0xE00 >>> assert pkt.ack_code == 0 >>> assert pkt.previous_msg == b'\x22\xFD\x31' ###(022)=[passed] read main pcap file >>> pkts = rdpcap(scapy_path("test/pcaps/doip.pcap.gz")) >>> ips = [p for p in pkts if p.proto == 6] >>> >>> assert len(ips) > 1 ###(023)=[passed] dissect test of routing activation pkts req >>> req = ips[0] >>> p = req >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 11 >>> assert p.payload_type == 0x5 >>> assert p.source_address == 0xe80 >>> assert p.activation_type == 0 >>> assert p.reserved_iso == 0 >>> assert p.reserved_oem == b"\x00\x00\x00\x00" ###(024)=[passed] dissect test of routing activation pkts resp >>> resp = ips[1] >>> p = resp >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 9 >>> assert p.payload_type == 0x6 >>> assert p.logical_address_tester == 0xe80 >>> assert p.logical_address_doip_entity == 0x4010 >>> assert p.routing_activation_response == 16 >>> assert p.reserved_iso == 0 ###(025)=[passed] answers test of routing activation pkts >>> assert resp.answers(req) >>> assert resp.hashret() == req.hashret() ###(026)=[passed] dissect diagnostic message >>> req = ips[-4] >>> resp = ips[-1] >>> >>> p = req >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 6 >>> assert p.payload_type == 0x8001 >>> assert p.source_address == 0xe80 >>> assert p.target_address == 0x4010 >>> assert bytes(p)[-2:] == bytes(UDS()/UDS_DSC(b"\x02")) >>> assert p.service == 0x10 >>> assert p.diagnosticSessionType == 2 >>> >>> p = resp >>> assert p.protocol_version == 0x02 >>> assert p.inverse_version == 0xfd >>> assert p.payload_length == 10 >>> assert p.payload_type == 0x8001 >>> assert p.target_address == 0xe80 >>> assert p.source_address == 0x4010 >>> assert bytes(p)[-6:] == bytes(UDS()/UDS_DSCPR(b"\x02\x002\x01\xf4")) >>> assert p.service == 0x50 >>> assert p.diagnosticSessionType == 2 >>> >>> assert req.hashret() == resp.hashret() >>> assert resp[3].answers(req[3]) >>> assert not req[3].answers(resp[3]) ###(027)=[passed] TCPSession Test >>> tmp_file = get_temp_file() >>> >>> wrpcap(tmp_file, [ ... IP(src="10.10.10.10", dst="10.10.10.11") / TCP(sport=61000, seq=1) / DoIP(payload_type=0x8001, payload_length=6) / b"\x3E", ... IP(src="10.10.10.10", dst="10.10.10.11") / TCP(sport=61000, dport=13400, seq=14) / Raw(load=b"\xff") ... ]) >>> >>> pkts = sniff(offline=tmp_file, session=TCPSession) >>> assert pkts[0].haslayer(UDS_TP) >>> assert pkts[0].service == 0x3E ###(028)=[passed] TCPSession Test multiple DoIP messages >>> filename = scapy_path("/test/pcaps/multiple_doip_layers.pcap.gz") >>> >>> pkts = sniff(offline=filename, session=TCPSession) >>> print(repr(pkts[0])) >>>>>> >>> print(repr(pkts[1])) >>>>>> >>> assert len(pkts) == 2 >>> assert pkts[0][DoIP].payload_length == 2 >>> assert pkts[0][DoIP:2].payload_length == 7 >>> assert pkts[1][DoIP].payload_length == 103 ###(029)=[passed] Doip logical addressing >>> filename = scapy_path("/test/pcaps/doip_functional_request.pcap.gz") >>> tx_sock = TestSocket(DoIP) >>> rx_sock = TestSocket(DoIP) >>> tx_sock.pair(rx_sock) >>> >>> for pkt in PcapReader(filename): ... if pkt.haslayer(DoIP): ... tx_sock.send(pkt[DoIP]) ... 15 17 14 13 14 14 14 14 14 14 14 14 :2: ResourceWarning: unclosed file <_io.BufferedReader name='/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/test/pcaps/doip_functional_request.pcap.gz'> ResourceWarning: Enable tracemalloc to get the object allocation traceback >>> ans, unans = rx_sock.sr(DoIP(bytes(DoIP(payload_type=0x8001, source_address=0xe80, target_address=0xe400) / UDS() / UDS_TP())), multi=True, timeout=0.1, verbose=False) >>> >>> cleanup_testsockets() >>> >>> ans.summary() DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR >>> if unans: ... unans.summary() ... >>> assert len(ans) == 8 >>> ans.summary() DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR DoIP / UDS / UDS_TP ==> DoIP / UDS / UDS_TPPR >>> assert len(unans) == 0 ###### ## DoIP Communication tests ###### ###(030)=[passed] Load libraries >>> import base64 >>> import ssl >>> import tempfile ###(031)=[passed] Test DoIPSocket >>> server_up = threading.Event() >>> sniff_up = threading.Event() >>> def server(): ... buffer = b'\x02\xfd\x80\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x02\xfd\x80\x01\x00\x00\x00\n\x10\x10\x0e\x80P\x03\x002\x01\xf4' ... sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ... try: ... sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) ... sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... sock.bind(('127.0.0.1', 13400)) ... sock.listen(1) ... server_up.set() ... connection, address = sock.accept() ... sniff_up.wait(timeout=1) ... connection.send(buffer) ... connection.close() ... finally: ... sock.close() ... >>> >>> server_thread = threading.Thread(target=server) >>> server_thread.start() >>> server_up.wait(timeout=1) True >>> sock = DoIPSocket(activate_routing=False) >>> >>> pkts = sock.sniff(timeout=1, count=2, started_callback=sniff_up.set) >>> server_thread.join(timeout=1) >>> assert len(pkts) == 2 ###(032)=[passed] Test DoIPSocket 2 >>> server_up = threading.Event() >>> sniff_up = threading.Event() >>> def server(): ... buffer = b'\x02\xfd\x80\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x02\xfd\x80\x01\x00\x00\x00\n\x10\x10\x0e\x80P\x03\x002\x01\xf4' ... sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ... try: ... sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) ... sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... sock.bind(('127.0.0.1', 13400)) ... sock.listen(1) ... server_up.set() ... connection, address = sock.accept() ... sniff_up.wait(timeout=1) ... for i in range(len(buffer)): ... connection.send(buffer[i:i+1]) ... time.sleep(0.01) ... connection.close() ... finally: ... sock.close() ... >>> >>> server_thread = threading.Thread(target=server) >>> server_thread.start() >>> server_up.wait(timeout=1) True >>> sock = DoIPSocket(activate_routing=False) >>> >>> pkts = sock.sniff(timeout=1, count=2, started_callback=sniff_up.set) >>> server_thread.join(timeout=1) >>> assert len(pkts) == 2 ###(033)=[passed] Test DoIPSocket 3 >>> server_up = threading.Event() >>> sniff_up = threading.Event() >>> def server(): ... buffer = b'\x02\xfd\x80\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x02\xfd\x80\x01\x00\x00\x00\n\x10\x10\x0e\x80P\x03\x002\x01\xf4' ... sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ... try: ... sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) ... sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... sock.bind(('127.0.0.1', 13400)) ... sock.listen(1) ... server_up.set() ... connection, address = sock.accept() ... sniff_up.wait(timeout=1) ... while buffer: ... randlen = random.randint(0, len(buffer)) ... connection.send(buffer[:randlen]) ... buffer = buffer[randlen:] ... time.sleep(0.01) ... connection.close() ... finally: ... sock.close() ... >>> >>> server_thread = threading.Thread(target=server) >>> server_thread.start() >>> server_up.wait(timeout=1) True >>> sock = DoIPSocket(activate_routing=False) >>> >>> pkts = sock.sniff(timeout=1, count=2, started_callback=sniff_up.set) >>> server_thread.join(timeout=1) >>> assert len(pkts) == 2 ###(034)=[passed] Test DoIPSocket6 >>> server_up = threading.Event() >>> sniff_up = threading.Event() >>> def server(): ... buffer = b'\x02\xfd\x80\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x02\xfd\x80\x01\x00\x00\x00\n\x10\x10\x0e\x80P\x03\x002\x01\xf4' ... sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) ... try: ... sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) ... sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... sock.bind(('::1', 13400)) ... sock.listen(1) ... server_up.set() ... connection, address = sock.accept() ... sniff_up.wait(timeout=1) ... connection.send(buffer) ... connection.close() ... finally: ... sock.close() ... >>> >>> server_thread = threading.Thread(target=server) >>> server_thread.start() >>> server_up.wait(timeout=1) True >>> sock = DoIPSocket(ip="::1", activate_routing=False) >>> >>> pkts = sock.sniff(timeout=1, count=2, started_callback=sniff_up.set) >>> server_thread.join(timeout=1) >>> assert len(pkts) == 2 ###(035)=[passed] Test DoIPSslSocket >>> certstring = """ ... LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2QUlCQURBTkJna3Foa2lHOXcwQkFRRUZB ... QVNDQktZd2dnU2lBZ0VBQW9JQkFRRFUvK0hRbVpzSDl2QVcKQ3ZMQjRxalpnZFJSSXE1b2JBanB4 ... YUhoUGxCVEMvUlBzMHIxRVF0V0FtbXNEZFE3UGlLaCtYa1hES3pNY3lJSQp1a0ZpNThUQW1idGFj ... N0U5VmJHSnNlTWp2RkJKSkFqQXVtbFdRZk5XcSs2TkZhdmRkTDQrSTNBTVJ5TldJTkJYCjhHMzRo ... dldIbDdTOGhhSFFZN0FXcUZWVTNVL2xKR2pubnF3MEJraEIvVGRCTWIwM0habzkrVjIrWU9RZmk5 ... QWsKTVRSRXpSeWVObWJqT0sxbHpXdFJXWkZZU0RnMEtqUVh4SkdFNVc5MzFPWitHL1NkbytTM1ZW ... SVRPdWxQbHRmVwpXMEdjeCsvZERSNFIxNG5mcUl5L1daMElHUVNXMlRsQytmeGJ0dURDUkFqelRz ... b0J3YjJ0cnpoR0VtYVFveUtNCnpBKzVSUHNyQWdNQkFBRUNnZ0VBRUJHaEoyWm5OVHh5YVY5TnZY ... QjI1NDNZQnRUMGVSUHBhanJLMXg0bk1OU3oKNE9LNFVzWlo1MnBnTHRHT1EzZm1aS0l0cEo1WlY1 ... cVBUejdwN3VjUzhnQWNZUnNJUnpCMHA5d3FpWExMK3h0RApxUjB4dnR4VDJpUGlFblVNNndudHpr ... SHpKK0g0QkZLT2FvdjNaK3Fha2E1UmFCcmhheGRuaDBDNklLQmZtM3cyCm5zUWI2N0lCYWwrSnBs ... L1g5TENWRkdRT2owb0lmVWI5ZFp3OWQ3MCthSGVVb2xvMGdYZmxxcXFFcnl3ZDlPN2QKNnp4dGlx ... cnRyZUJhK1IraWs3NE1SK0xvaFNVR3o2VTRQaXhWQ3l1SnQ2U0hvRHR2L3dtSnltWDd2a0FRS2w1 ... RQplK1JqUGVyakpUWTNzNXNXbEd2V21UTEtEbnVyS2pBYzZUOHhKb0pXWlFLQmdRRHdsd2RRdmww ... S28wNHhDUmtiCklYRGVJZE1jZkp2ejRGZEtka1BmVnZVT2xHVEpNZkRzbWNoUzZhcEJCQUdQMUU2 ... VkN2VzJmUFdjaXhScHE3MW8KR2xtbWZ5RnlJRW0rL08yamMvSFRXWHp6Qjdoc0JISEltQklHczFU ... TC9iWFU3amhVQW5kWDdMK3RSRDBKNWRGVwpiN1VOOXNxaWdtRG42REJWZkxaUHgxRnlWUUtCZ1FE ... aXBIT1BhNmVMSlk5R1FZdkw3OTIyTHNoU3ZYSUFVMERGCjBabTlqbjM2b3ZIY0kvWEZDdHVXank2 ... WG9wbk9pbjlycmtUY2FDUnBvSEFNb00ycHdiR0tFY0dVVEY2RHQ3akYKRHVnd2srR21sbDkrbjM2 ... M3Iwb09YNktSbWFhRStiZHoyNjNQVEhMaktYUnFyc3h5WEtMT3ZyTXhVNWNzMXJCeQpTMWI2ZGhr ... M2Z3S0JnRjlONUliMnNkS3ArQ3B5aVRCM0ljZk1yRjBuZTN1ekRjRWdjaWlCd05lQ3J4NElHNEVP ... Ck5nMnFKRmhXNXV0NzFaa3kyenpyNlR1VzJJSTNsdk1ySlFKUWNBWk9oZ2dURjJ2ZFhSazA1TXM4 ... N3JCVFhtTncKNGdzbmROck42UDZ0VTBEc0xTeDJTME91dVdNM1Y2S2U0NkRoZDBuQ3pmSnZ4dDNH ... WmszYURnaDFBb0dBWFhIcQpoNDZlZEx1V3VDUGNUTWhvUkc1RGdBSEdHQ1k3UlpTbTY4WHRZVUov ... c0FGUG10OWdMRko2cG1DUFE5NU1yUXdjCkxqZnVFM0xuMy8wSTd0NENvbWV4eGNBN0U5blRIOFNH ... clVpN3QrQzJITklNQUJZUTFaNU91L042K2Nhd0FkL28KYU5rZllWTzlRU015L2svOWZIcWFEVk5t ... dUVFSVhRZDlKQ1UvUG1jQ2dZQWI0RTBRWTdDZmlrV293OFIzSlhoZgo0MHFVVkdud09QKzJNbXE5 ... d2ZmWkpTRHNFSTQvb2g0VGRnN0sybHNNazVsWnRaMyszTjljSDVUc1pMYlJtd2FMCm9sRVl6K1BB ... WU91MlMrY1l2bFlNL0V2WmlpRHJybjZuTStNbTNnaXJPYkNwMzcxd1ZxRFVsUnB4OUlwWVdYcnAK ... T3YxUXFHdXkwODdyQkk1cStWL3hqQT09Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KLS0tLS1C ... RUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ3VENDQXRXZ0F3SUJBZ0lVVTNsendsTVNSa294Tkdk ... SFJzZllIcUtxcDAwd0RRWUpLb1pJaHZjTkFRRUwKQlFBd2dZVXhDekFKQmdOVkJBWVRBa1JGTVJN ... d0VRWURWUVFJREFwVGIyMWxMVk4wWVhSbE1Rd3dDZ1lEVlFRSApEQU5TUlVjeEVUQVBCZ05WQkFv ... TUNHUnBjM05sWTNSdk1Rd3dDZ1lEVlFRTERBTkVSVll4RFRBTEJnTlZCQU1NCkJGUkZVMVF4SXpB ... aEJna3Foa2lHOXcwQkNRRVdGR052Ym5SaFkzUXRkWE5BWkdsemMyVmpMblJ2TUI0WERUSTAKTURN ... eE9ERTVNek13TlZvWERUSTBNRFF4TnpFNU16TXdOVm93Z1lVeEN6QUpCZ05WQkFZVEFrUkZNUk13 ... RVFZRApWUVFJREFwVGIyMWxMVk4wWVhSbE1Rd3dDZ1lEVlFRSERBTlNSVWN4RVRBUEJnTlZCQW9N ... Q0dScGMzTmxZM1J2Ck1Rd3dDZ1lEVlFRTERBTkVSVll4RFRBTEJnTlZCQU1NQkZSRlUxUXhJekFo ... QmdrcWhraUc5dzBCQ1FFV0ZHTnYKYm5SaFkzUXRkWE5BWkdsemMyVmpMblJ2TUlJQklqQU5CZ2tx ... aGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBMVAvaDBKbWJCL2J3RmdyeXdlS28yWUhV ... VVNLdWFHd0k2Y1doNFQ1UVV3djBUN05LOVJFTFZnSnByQTNVCk96NGlvZmw1Rnd5c3pITWlDTHBC ... WXVmRXdKbTdXbk94UFZXeGliSGpJN3hRU1NRSXdMcHBWa0h6VnF2dWpSV3IKM1hTK1BpTndERWNq ... VmlEUVYvQnQrSWIxaDVlMHZJV2gwR093RnFoVlZOMVA1U1JvNTU2c05BWklRZjAzUVRHOQpOeDJh ... UGZsZHZtRGtINHZRSkRFMFJNMGNualptNHppdFpjMXJVVm1SV0VnNE5DbzBGOFNSaE9WdmQ5VG1m ... aHYwCm5hUGt0MVZTRXpycFQ1YlgxbHRCbk1mdjNRMGVFZGVKMzZpTXYxbWRDQmtFbHRrNVF2bjhX ... N2Jnd2tRSTgwN0sKQWNHOXJhODRSaEpta0tNaWpNd1B1VVQ3S3dJREFRQUJvMU13VVRBZEJnTlZI ... UTRFRmdRVVZhbUFkUjR1ZW8zQgpmV0RjUlMyUkQ3OEtlZXd3SHdZRFZSMGpCQmd3Rm9BVVZhbUFk ... UjR1ZW8zQmZXRGNSUzJSRDc4S2Vld3dEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5 ... dzBCQVFzRkFBT0NBUUVBRjE1TTNvL3RyUVdYeHdHamlxZjgKNXBUTEM0bHJwQkZaTFZDbStQdHd4 ... aENlN1ZSd2dLMElBb01EMW0vSjNEYnVJSjVURXlTVElnR2N0WHVNbG5pWgpsY3IwekZOZVVhQ08w ... YkdhaExYUXpCWTRxSkhTTUNWNnhiNXNqUDlEdk9HYnFxbHVTbk51ZFJ5UWNIbkd4SE0rCk1adXpO ... WUNseklOMEtYbFJuSTZqRXUrcG9XZ0pEMGN1NFM2b1lwT2R3bElRYmtaNnIrUE1jQ3hpRmhRd3E2 ... em4KcE1nQzB0WlpSM3pCOEpVcTJwRHlGVy9jVlFjWkp5YUhnQkkwWlJWWG5wbDFqYng2YlNIOCts ... cnMxVk1xZDlkcQozd1BMcjBheWI2VkpNa29WMjNWSXAzLzlYQVpTR3Z6Y0dadnM2VThSUTdFbUtx ... akJibWxudm1CTkpUMk9xbFFRCllRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=""" >>> >>> certstring = certstring.replace('\n', '') >>> >>> def _load_certificate_chain(context) -> None: ... with tempfile.NamedTemporaryFile(delete=False) as fp: ... fp.write(base64.b64decode(certstring)) ... fp.close() ... context.load_cert_chain(fp.name) ... >>> >>> server_up = threading.Event() >>> sniff_up = threading.Event() >>> def server(): ... context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ... _load_certificate_chain(context) ... context.check_hostname = False ... context.verify_mode = ssl.CERT_NONE ... buffer = b'\x02\xfd\x80\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x02\xfd\x80\x01\x00\x00\x00\n\x10\x10\x0e\x80P\x03\x002\x01\xf4' ... sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ... sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) ... sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... ssock = context.wrap_socket(sock) ... try: ... ssock.bind(('127.0.0.1', 3496)) ... ssock.listen(1) ... server_up.set() ... connection, address = ssock.accept() ... sniff_up.wait(timeout=1) ... connection.send(buffer) ... connection.close() ... finally: ... ssock.close() ... >>> >>> server_thread = threading.Thread(target=server) >>> server_thread.start() >>> server_up.wait(timeout=1) True >>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) >>> context.check_hostname = False >>> context.verify_mode = ssl.CERT_NONE >>> sock = DoIPSocket(activate_routing=False, force_tls=True, context=context) >>> >>> pkts = sock.sniff(timeout=1, count=2, started_callback=sniff_up.set) >>> server_thread.join(timeout=1) >>> assert len(pkts) == 2 ###(036)=[passed] Test DoIPSslSocket6 >>> server_up = threading.Event() >>> sniff_up = threading.Event() >>> def server(): ... context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ... _load_certificate_chain(context) ... context.check_hostname = False ... context.verify_mode = ssl.CERT_NONE ... buffer = b'\x02\xfd\x80\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x02\xfd\x80\x01\x00\x00\x00\n\x10\x10\x0e\x80P\x03\x002\x01\xf4' ... sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) ... sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) ... sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... ssock = context.wrap_socket(sock) ... try: ... ssock.bind(('::1', 3496)) ... ssock.listen(1) ... server_up.set() ... connection, address = ssock.accept() ... sniff_up.wait(timeout=1) ... connection.send(buffer) ... connection.close() ... finally: ... ssock.close() ... >>> >>> server_thread = threading.Thread(target=server) >>> server_thread.start() >>> server_up.wait(timeout=1) True >>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) >>> context.check_hostname = False >>> context.verify_mode = ssl.CERT_NONE >>> sock = DoIPSocket(ip="::1", activate_routing=False, force_tls=True, context=context) >>> >>> pkts = sock.sniff(timeout=1, count=2, started_callback=sniff_up.set) >>> server_thread.join(timeout=1) >>> assert len(pkts) == 2 ###(037)=[passed] Test UDS_DoIPSslSocket6 >>> server_up = threading.Event() >>> sniff_up = threading.Event() >>> def server(): ... context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ... _load_certificate_chain(context) ... context.check_hostname = False ... context.verify_mode = ssl.CERT_NONE ... buffer = b'\x02\xfd\x80\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x02\xfd\x80\x01\x00\x00\x00\n\x10\x10\x0e\x80P\x03\x002\x01\xf4' ... sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) ... sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) ... sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... ssock = context.wrap_socket(sock) ... try: ... ssock.bind(('::1', 3496)) ... ssock.listen(1) ... server_up.set() ... connection, address = ssock.accept() ... sniff_up.wait(timeout=1) ... connection.send(buffer) ... connection.close() ... finally: ... ssock.close() ... >>> >>> server_thread = threading.Thread(target=server) >>> server_thread.start() >>> server_up.wait(timeout=1) True >>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) >>> context.check_hostname = False >>> context.verify_mode = ssl.CERT_NONE >>> sock = UDS_DoIPSocket(ip="::1", activate_routing=False, force_tls=True, context=context) >>> >>> pkts = sock.sniff(timeout=1, count=2, started_callback=sniff_up.set) >>> server_thread.join(timeout=1) >>> assert len(pkts) == 2 ###(038)=[passed] Test UDS_DualDoIPSslSocket6 >>> server_tcp_up = threading.Event() >>> server_tls_up = threading.Event() >>> sniff_up = threading.Event() >>> def server_tls(): ... context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) ... _load_certificate_chain(context) ... context.check_hostname = False ... context.verify_mode = ssl.CERT_NONE ... buffer = bytes.fromhex("02fd0006000000090e8011061000000000") ... buffer += b'\x02\xfd\x80\x02\x00\x00\x00\x05\x00\x00\x00\x00\x00\x02\xfd\x80\x01\x00\x00\x00\n\x10\x10\x0e\x80P\x03\x002\x01\xf4' ... sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) ... sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) ... sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... ssock = context.wrap_socket(sock) ... try: ... ssock.bind(('::1', 3496)) ... ssock.listen(1) ... server_tls_up.set() ... connection, address = ssock.accept() ... sniff_up.wait(timeout=1) ... connection.send(buffer) ... connection.close() ... finally: ... ssock.close() ... >>> def server_tcp(): ... buffer = bytes.fromhex("02fd0006000000090e8011060700000000") ... sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) ... try: ... sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) ... sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... sock.bind(('::1', 13400)) ... sock.listen(1) ... server_tcp_up.set() ... connection, address = sock.accept() ... connection.send(buffer) ... connection.shutdown(socket.SHUT_RDWR) ... connection.close() ... finally: ... sock.close() ... >>> >>> server_tcp_thread = threading.Thread(target=server_tcp) >>> server_tcp_thread.start() >>> server_tcp_up.wait(timeout=1) True >>> server_tls_thread = threading.Thread(target=server_tls) >>> server_tls_thread.start() >>> server_tls_up.wait(timeout=1) True >>> context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) >>> context.check_hostname = False >>> context.verify_mode = ssl.CERT_NONE >>> >>> >>> sock = UDS_DoIPSocket(ip="::1", context=context) Routing activation failed! Response: Routing activation successful! Target address set to: 0x1106 >>> >>> pkts = sock.sniff(timeout=1, count=2, started_callback=sniff_up.set) >>> server_tcp_thread.join(timeout=1) >>> server_tls_thread.join(timeout=1) >>> assert len(pkts) == 2 Regression tests for the Ecu utility ━ Run at 01:43:13 from [test/contrib/automotive/ecu.uts] by UTscapy in 0.4779171943664551 └ Passed=31 └ Failed=0 ###### ## Setup ###### ###(000)=[passed] Load modules >>> import copy >>> import itertools >>> >>> load_contrib("isotp", globals_dict=globals()) >>> load_contrib("automotive.uds", globals_dict=globals()) >>> load_contrib("automotive.gm.gmlan", globals_dict=globals()) Specify "conf.contribs['GMLAN'] = {'treat-response-pending-as-answer': True}" to treat a negative response 'RequestCorrectlyReceived-ResponsePending' as answer of a request. The default value is False. >>> load_layer("can", globals_dict=globals()) >>> conf.contribs["CAN"]["swap-bytes"] = True ###(001)=[passed] Load Ecu module >>> load_contrib("automotive.ecu", globals_dict=globals()) >>> from scapy.contrib.automotive.uds_ecu_states import * >>> from scapy.contrib.automotive.uds_logging import * >>> from scapy.contrib.automotive.gm.gmlan_ecu_states import * >>> from scapy.contrib.automotive.gm.gmlan_logging import * ###### ## EcuState Basic checks ###### ###(002)=[passed] Check EcuState basic functionality >>> state = EcuState() >>> state["session"] = 2 >>> state["securityAccess"] = 4 >>> print(repr(state)) securityAccess4session2 >>> assert repr(state) == "securityAccess4session2" ###(003)=[passed] More complex tests >>> state = EcuState(ses=4) >>> assert state.ses == 4 >>> state.ses = 5 >>> assert state.ses == 5 ###(004)=[passed] Even more complex tests >>> state = EcuState(myinfo="42") >>> >>> state.ses = 5 >>> assert state.ses == 5 >>> >>> state["ses"] = None >>> assert state.ses is None >>> >>> state.ses = 5 >>> assert 5 == state.ses >>> >>> assert "42" == state.myinfo >>> assert repr(state) == "myinfo42ses5" ###(005)=[passed] Delete Attribute Test >>> state = EcuState(myinfo="42") >>> >>> state.ses = 5 >>> assert state.ses == 5 >>> >>> del state.ses >>> >>> try: ... x = state.ses ... assert False ... except (KeyError, AttributeError): ... assert state.myinfo == "42" ... ###(006)=[passed] Copy tests >>> state = EcuState(myinfo="42") >>> state.ses = 5 >>> >>> ns = copy.copy(state) >>> >>> ns.ses = 6 >>> >>> assert ns.ses == 6 >>> assert state.ses == 5 >>> assert ns.myinfo == "42" ###(007)=[passed] Move tests >>> state = EcuState(myinfo="42") >>> state.ses = 5 >>> >>> ns = state >>> >>> ns.ses = 6 >>> >>> assert ns.ses == 6 >>> assert state.ses == 6 >>> assert ns.myinfo == "42" ###(008)=[passed] equal tests >>> state = EcuState(myinfo="42") >>> state.ses = 5 >>> >>> ns = copy.copy(state) >>> >>> assert state == ns >>> assert hash(state) == hash(ns) >>> >>> ns.ses = 6 >>> >>> assert state != ns >>> assert hash(state) != hash(ns) >>> >>> ns.ses = 5 >>> >>> assert state == ns >>> assert hash(state) == hash(ns) >>> >>> ns.sa = 5 >>> >>> assert state != ns >>> assert hash(state) != hash(ns) ###(009)=[passed] hash tests >>> state = EcuState(myinfo="42") >>> state.ses = 5 >>> >>> ns = copy.copy(state) >>> >>> assert hash(state) == hash(ns) >>> >>> ns.ses = 6 >>> >>> assert hash(state) != hash(ns) >>> >>> ns.ses = 5 >>> >>> assert hash(state) == hash(ns) >>> >>> ns.sa = 5 >>> >>> assert hash(state) != hash(ns) ###(010)=[passed] command tests >>> state = EcuState(myinfo="42") >>> state.ses = 5 >>> >>> state.command() "EcuState(myinfo='42', ses=5)" >>> assert "EcuState(myinfo='42', ses=5)" == state.command() ###(011)=[passed] less than tests >>> s1 = EcuState() >>> s2 = EcuState() >>> >>> s1.a = 1 >>> s2.a = 2 >>> >>> assert s1 < s2 >>> >>> s1.b = 4 >>> >>> assert s1 > s2 >>> >>> s2.b = 1 >>> >>> assert s1 < s2 >>> >>> s1.a = 2 >>> >>> assert s1 > s2 ###(012)=[passed] less than tests 2 >>> s1 = EcuState() >>> s2 = EcuState() >>> >>> s1.c = "x" >>> s2.c = 4 >>> exception = False >>> >>> try: ... assert s1 < s2 ... except TypeError: ... exception = True ... >>> assert exception ###(013)=[passed] less than tests 3 >>> s1 = EcuState() >>> s2 = EcuState() >>> >>> >>> s1.A = 1 >>> s1.a = 2 >>> >>> s2.A = 2 >>> s2.a = 1 >>> >>> assert s1 < s2 ###(014)=[passed] less than tests 4 >>> s1 = EcuState() >>> s2 = EcuState() >>> >>> >>> s1.A = 1 >>> s1.a = 2 >>> >>> s2.A = 2 >>> s2.b = 100 >>> >>> assert s1 < s2 ###(015)=[passed] less than tests 5 >>> s1 = EcuState() >>> s2 = EcuState() >>> >>> >>> s1.A = 100 >>> s1.a = 2 >>> >>> s2.A = 2 >>> s2.b = 100 >>> >>> assert s1 > s2 >>> assert not s1 > s1 >>> assert not s1 < s1 ###(016)=[passed] less than tests 6 >>> s1 = EcuState() >>> s2 = EcuState() >>> >>> >>> s1.A = 100 >>> s1.B = 200 >>> >>> s2.a = 2 >>> s2.b = 1 >>> >>> assert s1 < s2 ###(017)=[passed] contains test >>> s1 = EcuState(ses=[1,2,3]) >>> s2 = EcuState(ses=1) >>> >>> assert s1 != s2 >>> assert s2 in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=[2,3]) >>> s2 = EcuState(ses=1) >>> >>> assert s1 != s2 >>> assert s2 not in s1 >>> assert s1 not in s2 >>> >>> >>> s1 = EcuState(ses=[1,2,3], security=5) >>> s2 = EcuState(ses=1) >>> >>> assert s1 != s2 >>> assert s2 not in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=range(4), security=[None, 5]) >>> s2 = EcuState(ses=1) >>> >>> assert s1 != s2 >>> assert s2 in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=range(4), security=[None, 5]) >>> s2 = EcuState(ses=range(2)) >>> >>> assert s1 != s2 >>> assert s2 < s1 >>> assert s2 in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=range(4), security=[None, 5]) >>> s2 = EcuState(ses=range(2), security=5) >>> >>> assert s1 != s2 >>> assert s2 in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=range(4), security=[None, 5]) >>> s2 = EcuState(ses=range(5)) >>> >>> assert s1 != s2 >>> assert s2 not in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=range(4), security=[None, range(5)]) >>> s2 = EcuState(ses=3) >>> >>> print(s1._expand()) [ses0, security0ses0, security1ses0, security2ses0, security3ses0, security4ses0, ses1, security0ses1, security1ses1, security2ses1, security3ses1, security4ses1, ses2, security0ses2, security1ses2, security2ses2, security3ses2, security4ses2, ses3, security0ses3, security1ses3, security2ses3, security3ses3, security4ses3] >>> print(s2._expand()) [ses3] >>> >>> assert s1 != s2 >>> assert s2 in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=range(4), security=[None, range(5), [5, 7, range(4), [range(10), 10]]]) >>> s2 = EcuState(ses=3, security=10) >>> >>> print(s1._expand()) [ses0, security0ses0, security1ses0, security2ses0, security3ses0, security4ses0, security5ses0, security7ses0, security0ses0, security1ses0, security2ses0, security3ses0, security0ses0, security1ses0, security2ses0, security3ses0, security4ses0, security5ses0, security6ses0, security7ses0, security8ses0, security9ses0, security10ses0, ses1, security0ses1, security1ses1, security2ses1, security3ses1, security4ses1, security5ses1, security7ses1, security0ses1, security1ses1, security2ses1, security3ses1, security0ses1, security1ses1, security2ses1, security3ses1, security4ses1, security5ses1, security6ses1, security7ses1, security8ses1, security9ses1, security10ses1, ses2, security0ses2, security1ses2, security2ses2, security3ses2, security4ses2, security5ses2, security7ses2, security0ses2, security1ses2, security2ses2, security3ses2, security0ses2, security1ses2, security2ses2, security3ses2, security4ses2, security5ses2, security6ses2, security7ses2, security8ses2, security9ses2, security10ses2, ses3, security0ses3, security1ses3, security2ses3, security3ses3, security4ses3, security5ses3, security7ses3, security0ses3, security1ses3, security2ses3, security3ses3, security0ses3, security1ses3, security2ses3, security3ses3, security4ses3, security5ses3, security6ses3, security7ses3, security8ses3, security9ses3, security10ses3] >>> print(s2._expand()) [security10ses3] >>> >>> assert s1 != s2 >>> assert s2 in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=range(4), security=[None, range(5), [5, 7, range(4), [range(10), "B"]]]) >>> s2 = EcuState(ses=3, security="B") >>> >>> print(s1._expand()) [ses0, security0ses0, security1ses0, security2ses0, security3ses0, security4ses0, security5ses0, security7ses0, security0ses0, security1ses0, security2ses0, security3ses0, security0ses0, security1ses0, security2ses0, security3ses0, security4ses0, security5ses0, security6ses0, security7ses0, security8ses0, security9ses0, securityBses0, ses1, security0ses1, security1ses1, security2ses1, security3ses1, security4ses1, security5ses1, security7ses1, security0ses1, security1ses1, security2ses1, security3ses1, security0ses1, security1ses1, security2ses1, security3ses1, security4ses1, security5ses1, security6ses1, security7ses1, security8ses1, security9ses1, securityBses1, ses2, security0ses2, security1ses2, security2ses2, security3ses2, security4ses2, security5ses2, security7ses2, security0ses2, security1ses2, security2ses2, security3ses2, security0ses2, security1ses2, security2ses2, security3ses2, security4ses2, security5ses2, security6ses2, security7ses2, security8ses2, security9ses2, securityBses2, ses3, security0ses3, security1ses3, security2ses3, security3ses3, security4ses3, security5ses3, security7ses3, security0ses3, security1ses3, security2ses3, security3ses3, security0ses3, security1ses3, security2ses3, security3ses3, security4ses3, security5ses3, security6ses3, security7ses3, security8ses3, security9ses3, securityBses3] >>> print(s2._expand()) [securityBses3] >>> >>> assert s1 != s2 >>> assert s2 in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=range(4), security=[None, range(5), [5, 7, range(4), [range(10), "B"]]]) >>> s2 = EcuState(ses=3, security="C") >>> >>> print(s1._expand()) [ses0, security0ses0, security1ses0, security2ses0, security3ses0, security4ses0, security5ses0, security7ses0, security0ses0, security1ses0, security2ses0, security3ses0, security0ses0, security1ses0, security2ses0, security3ses0, security4ses0, security5ses0, security6ses0, security7ses0, security8ses0, security9ses0, securityBses0, ses1, security0ses1, security1ses1, security2ses1, security3ses1, security4ses1, security5ses1, security7ses1, security0ses1, security1ses1, security2ses1, security3ses1, security0ses1, security1ses1, security2ses1, security3ses1, security4ses1, security5ses1, security6ses1, security7ses1, security8ses1, security9ses1, securityBses1, ses2, security0ses2, security1ses2, security2ses2, security3ses2, security4ses2, security5ses2, security7ses2, security0ses2, security1ses2, security2ses2, security3ses2, security0ses2, security1ses2, security2ses2, security3ses2, security4ses2, security5ses2, security6ses2, security7ses2, security8ses2, security9ses2, securityBses2, ses3, security0ses3, security1ses3, security2ses3, security3ses3, security4ses3, security5ses3, security7ses3, security0ses3, security1ses3, security2ses3, security3ses3, security0ses3, security1ses3, security2ses3, security3ses3, security4ses3, security5ses3, security6ses3, security7ses3, security8ses3, security9ses3, securityBses3] >>> print(s2._expand()) [securityCses3] >>> >>> assert s1 != s2 >>> assert s2 not in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=range(3), security=5) >>> s2 = EcuState(ses=1, security=5) >>> >>> assert s1 != s2 >>> assert s2 in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=range(3), security=(x for x in range(1, 10, 2))) >>> s2 = EcuState(ses=1, security=5) >>> >>> assert s1 != s2 >>> assert s2 in s1 >>> assert s1 not in s2 >>> >>> s1 = EcuState(ses=[1,2,3]) >>> s2 = EcuState(ses=[1,2,3]) >>> >>> assert s1 in s2 >>> assert s2 in s1 >>> assert s1 == s2 >>> >>> s1 = EcuState(ses=1) >>> s2 = EcuState(ses=1) >>> >>> assert s1 in s2 >>> assert s2 in s1 >>> assert s1 == s2 >>> >>> s1 = EcuState(ses=range(3), security=range(5)) >>> for ses, sec in itertools.product(range(3), range(5)): ... s2 = EcuState(ses=ses, security=sec) ... assert s1 != s2 ... assert s2 in s1 ... assert s1 not in s2 ... >>> >>> s1 = EcuState(ses=[0, 1, 2], security=[43, 44]) >>> for ses, sec in itertools.product(range(3), range(43, 45)): ... s2 = EcuState(ses=ses, security=sec) ... assert s1 != s2 ... assert s2 in s1 ... assert s1 not in s2 ... >>> s1 = EcuState(ses=[0, 1, 2], security=["a", "b"]) >>> for ses, sec in itertools.product(range(3), (x for x in "ab")): ... s2 = EcuState(ses=ses, security=sec) ... assert s1 != s2 ... assert s2 in s1 ... try: ... assert s1 not in s2 ... except TypeError: ... assert True ... >>> s1 = [EcuState(ses=1), EcuState(ses=2), EcuState(ses=3)] >>> s2 = EcuState(ses=3) >>> >>> assert s2 in s1 >>> assert s1 not in s2 >>> >>> >>> s1 = EcuState(ses=1, sa="SEC") >>> s2 = EcuState(ses=1, sa="SOC") >>> >>> assert s1 not in s2 >>> assert s2 not in s1 >>> assert s1 != s2 >>> >>> s1 = EcuState(ses=1, sa="SEC") >>> s2 = EcuState(ses=1, sa="SEC") >>> >>> assert s1 in s2 >>> assert s2 in s1 >>> assert s1 == s2 >>> >>> >>> s1 = EcuState(ses=1, sa="SEC") >>> s2 = EcuState(ses=1, sa=["SEC", "SOL"]) >>> >>> >>> assert s1 in s2 >>> assert s2 not in s1 >>> assert s1 != s2 >>> >>> >>> s1 = EcuState(ses=1, sa=b"SEC") >>> s2 = EcuState(ses=1, sa=[b"SEC", "SOL"]) >>> >>> assert s1 in s2 >>> assert s2 not in s1 >>> assert s1 != s2 ###### ## EcuState modification tests ###### ###(018)=[passed] Basic definitions for tests >>> class myPack1(Packet): ... fields_desc = [ ... IntField("fakefield", 1) ... ] ... >>> class myPack2(Packet): ... fields_desc = [ ... IntField("statefield", 1) ... ] ... >>> @EcuState.extend_pkt_with_modifier(myPack2) ... def modify_ecu_state(self, req, ecustate): ... # type: (Packet, Packet, EcuState) -> None ... ecustate.state = self.statefield ... >>> pkt = myPack1()/myPack2() >>> st = EcuState() >>> exception = False >>> >>> try: ... assert st.state == 1 ... except AttributeError: ... exception = True ... >>> assert exception == True >>> assert EcuState.is_modifier_pkt(pkt) >>> assert not EcuState.is_modifier_pkt(myPack1()) >>> >>> mod = EcuState.get_modified_ecu_state(pkt, Raw(), st) >>> assert mod != st >>> assert mod.state ==1 >>> >>> pkt2 = myPack1()/myPack1()/myPack1()/myPack2(statefield=5) >>> mod2 = EcuState.get_modified_ecu_state(pkt2, Raw(), mod) >>> >>> assert mod != mod2 >>> assert mod < mod2 >>> >>> pkt2 = myPack1()/myPack1()/myPack1()/myPack2(statefield=4)/myPack2(statefield=5) >>> mod2 = EcuState.get_modified_ecu_state(pkt2, Raw(), mod) >>> mod.state = 5 >>> assert mod != mod2 >>> assert mod > mod2 ###### ## EcuResponse tests ###### ###(019)=[passed] Basic checks >>> resp = EcuResponse(EcuState(session=1), UDS()/UDS_DSCPR(b"\x03")) >>> >>> assert not resp.supports_state(EcuState()) >>> assert not resp.supports_state(EcuState(session=2)) >>> assert resp.supports_state(EcuState(session=1)) >>> assert resp.answers(UDS()/UDS_DSC(b"\x03")) ###(020)=[passed] Command checks >>> resp = EcuResponse(EcuState(session=1), UDS()/UDS_DSCPR(b"\x03")) >>> cmd = resp.command() >>> >>> print(cmd) EcuResponse([EcuState(session=1)], responses=[UDS()/UDS_DSCPR(diagnosticSessionType=3, sessionParameterRecord=b'')]) >>> resp1 = eval(cmd) >>> assert resp1 == resp ###(021)=[passed] Command checks 2 >>> p1 = UDS(bytes(UDS()/UDS_NR(b"\x10\x00"))) >>> p2 = UDS(bytes(UDS()/UDS_DSCPR(b"\x03"))) >>> >>> resp = EcuResponse([EcuState(session=1), EcuState(session=3)], [p1, p2]) >>> cmd = resp.command() >>> >>> print(cmd) EcuResponse([EcuState(session=1), EcuState(session=3)], responses=[UDS(service=127)/UDS_NR(requestServiceId=16, negativeResponseCode=0), UDS(service=80)/UDS_DSCPR(diagnosticSessionType=3, sessionParameterRecord=b'')]) >>> resp1 = eval(cmd) >>> assert any(resp1.supports_state(s) for s in resp.states) >>> assert any(resp.supports_state(s) for s in resp1.states) >>> assert len(resp.responses) == len(resp1.responses) >>> assert all(bytes(x) == bytes(y) for x, y in zip(resp.responses, resp1.responses)) >>> assert resp1 == resp ###(022)=[passed] Compare check >>> p1 = UDS(bytes(UDS()/UDS_NR(b"\x10\x00"))) >>> p2 = UDS(bytes(UDS()/UDS_DSCPR(b"\x03"))) >>> >>> resp = EcuResponse([EcuState(session=1), EcuState(session=3)], [p1, p2]) >>> >>> resp1 = EcuResponse([EcuState(session=1)], [p1, p2]) >>> >>> resp2 = EcuResponse([EcuState(session=2)], [p1, p2]) >>> resp3 = EcuResponse([EcuState(session=1)], [p2]) >>> >>> >>> assert resp == resp1 >>> assert resp != resp2 >>> assert resp != resp3 ###(023)=[passed] Key response check >>> req = UDS()/UDS_DSC(b"\x03") >>> p1 = UDS(bytes(UDS()/UDS_NR(b"\x10\x00"))) >>> p2 = UDS(bytes(UDS()/UDS_DSCPR(b"\x03"))) >>> >>> resp = EcuResponse([EcuState(session=1), EcuState(session=3)], [p1, p2]) >>> >>> assert resp.answers(req) >>> assert resp.key_response.answers(req) ###### ## Ecu Simple operations ###### ###(024)=[passed] Log all commands applied to an Ecu >>> msgs = [UDS(service=16) / UDS_DSC(diagnosticSessionType=3), ... UDS(service=16) / UDS_DSC(diagnosticSessionType=4), ... UDS(service=16) / UDS_DSC(diagnosticSessionType=5), ... UDS(service=16) / UDS_DSC(diagnosticSessionType=6), ... UDS(service=16) / UDS_DSC(diagnosticSessionType=2)] >>> >>> ecu = Ecu(verbose=False, store_supported_responses=False) >>> ecu.update(PacketList(msgs)) >>> assert len(ecu.log["DiagnosticSessionControl"]) == 5 >>> timestamp, value = ecu.log["DiagnosticSessionControl"][0] >>> assert timestamp > 0 >>> assert value == "extendedDiagnosticSession" >>> assert ecu.log["DiagnosticSessionControl"][-1][1] == "programmingSession" ###(025)=[passed] Trace all commands applied to an Ecu >>> msgs = [UDS(service=16) / UDS_DSC(diagnosticSessionType=3), ... UDS(service=80) / UDS_DSCPR(diagnosticSessionType=3, sessionParameterRecord=b'\\x002\\x01\\xf4')] >>> >>> ecu = Ecu(verbose=True, logging=False, store_supported_responses=False) >>> ecu.update(PacketList(msgs)) > > >>> assert ecu.state.session == 3 ###(026)=[passed] Generate supported responses of an Ecu >>> msgs = [UDS(service=16) / UDS_DSC(diagnosticSessionType=3), ... UDS(service=80) / UDS_DSCPR(diagnosticSessionType=3, sessionParameterRecord=b'\\x002\\x01\\xf4'), ... UDS(service=16) / UDS_DSC(diagnosticSessionType=4)] >>> >>> ecu = Ecu(verbose=False, logging=False, store_supported_responses=True) >>> ecu.update(PacketList(msgs)) >>> supported_responses = ecu.supported_responses >>> unanswered_packets = ecu.unanswered_packets >>> assert ecu.state.session == 3 >>> assert len(supported_responses) == 1 >>> assert len(unanswered_packets) == 1 >>> >>> response = supported_responses[0] >>> print(response.command()) EcuResponse([EcuState()], responses=[UDS(service=80)/UDS_DSCPR(diagnosticSessionType=3, sessionParameterRecord=b'\\x002\\x01\\xf4')]) >>> assert response.supports_state(EcuState()) >>> assert response.key_response.service == 80 >>> assert unanswered_packets[0].diagnosticSessionType == 4 ###### ## Ecu Advanced checks ###### ###(027)=[passed] Analyze multiple UDS messages >>> udsmsgs = sniff(offline=scapy_path("test/pcaps/ecu_trace.pcap.gz"), ... session=ISOTPSession(use_ext_address=False, basecls=UDS), ... count=50, timeout=3) >>> >>> assert len(udsmsgs) == 50 >>> >>> ecu = Ecu() >>> ecu.update(udsmsgs) > > [+] [], responses=['UDS / UDS_DSCPR'] session3 > session3 > [+] [session3], responses=['UDS / UDS_RCPR'] session3 > session3 > session3 > session3 > [+] [session3], responses=['UDS / UDS_CDTCSPR'] session3 > session3 > session3 > session3 > session3 > [+] [session3], responses=['UDS / UDS_DSCPR'] session2 > session2 > [+] [session2], responses=['UDS / UDS_SAPR'] session2 > session2 > [+] [session2], responses=['UDS / UDS_SAPR'] security_level18session2 >> security_level18session2 > [+] [security_level18session2], responses=['UDS / UDS_WDBIPR'] security_level18session2 > security_level18session2 > [+] [security_level18session2], responses=['UDS / UDS_RDPR'] req_download{'service': 52}security_level18session2 > req_download{'service': 52}security_level18session2 \x9c\xb28#1q\x1ev\x8fk\x92\xe0Y\xc7\xd7\xef\xf6\x1c0\xf0P\xe9\xb7#\x1e\x01\xb0/\xe5\x82\xf4=|\xf3\xd9\xdb/\x9a\xac\xea\xbc"\xdf\xa3\xd1\x84\x83\xad\xc0\xbb\x9b\xf6\x00#\xb3sV0\x1c\x1a$-&\xc1^XkI\xe1\xbbS\x14\xaf@\xf3a\xb4\x14\xab\x17!\x16Y\xd2\xb9@::O\xfb\xcd\x14l\xd3\xc5\x92\xbe\xec[\x828\xb3\xfb\n\xcc\xb8(\x92\x1f8\x8b\ts\xb6k>f\x9d\x00\x8d\xf7S1v\x9egx\x05\xfa\x12\xdb\x18Y\xc0\x9f\xf6\xbf\xea\x11Z\xb9\x93\x87\x81`\xb2\x14\xfa\x97D\xc3\xd7[\x81PlN5C\xa4\x18\xe9\xd6XV9\xf5P)\x11\xca7\x9d8\xd0w\xf9\xb0\xda\xe5\x98+:\x89(\xd7\xc7\x1d\xd9\xc9\xeaYe%\xd4\xef\xfd\x85\x11\x95g/:"\x81\xfe\xa8\xde\x19\xc2:aH\xf8\xdc\xdf\x8bS\xa0\xd4\xc0\xaf\t\x03\xf3\x90\x06\xc5\x0f\x92g\xfd3~\xa6\x9bK_\xc6\xc0\x90\x92A;\'' |>> req_download{'service': 52}security_level18session2 > [+] [req_download{'service': 52}security_level18session2], responses=['UDS / UDS_TDPR'] req_download{'service': 52}security_level18session2 > req_download{'service': 52}security_level18session2 req_download{'service': 52}security_level18session2 [+] [req_download{'service': 52}security_level18session2], responses=['UDS'] download_complete{'service': 52}req_downloadsecurity_level18session2 >> download_complete{'service': 52}req_downloadsecurity_level18session2 >> [+] [download_complete{'service': 52}req_downloadsecurity_level18session2], responses=['UDS / UDS_RCPR / Raw'] download_complete{'service': 52}req_downloadsecurity_level18session2 >> download_complete{'service': 52}req_downloadsecurity_level18session2 >> [+] [download_complete{'service': 52}req_downloadsecurity_level18session2], responses=['UDS / UDS_RCPR / Raw'] download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_download{'service': 52}security_level18session2 > download_complete{'service': 52}req_download{'service': 52}security_level18session2 > download_complete{'service': 52}req_download{'service': 52}security_level18session2 > download_complete{'service': 52}req_download{'service': 52}security_level18session2 > download_complete{'service': 52}req_download{'service': 52}security_level18session2 download_complete{'service': 52}req_download{'service': 52}security_level18session2 download_complete{'service': 52}req_downloadsecurity_level18session2 \xea\x90\x9df3\xa680]\xe0x\xcd8\xcat\x1f\x82s\x99zk(\x127#\xb0X\xa3\xff\x83\xa9Dk\xc6\xb5\xde\x86xT\xb0.V\xbb\xb6\xaf\xbe!\xb9\xbe\xef\xb1\xcd\r^K\xa5\x96\xf0z\xe6\x15q\x15)U\xcdsF\xffR\xbc\x0e\xe5\x1b^\xf9\xcc\x8b\xd2\xa9\xb4\xb1\xd1!\xf5\xd6U]\xccU\x0c\xbf\xe5\xfe\x81\x84\xeau]\x85\x8c\xdb\x84\x0c\x87\xe8\xe01\xeb\x89\xbb\xcae-\xe4\xe8\xe3n\x11p&' |>>> download_complete{'service': 52}req_downloadsecurity_level18session2 >> download_complete{'service': 52}req_downloadsecurity_level18session2 >> download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > >>> response = ecu.supported_responses[0] >>> assert response.supports_state(EcuState()) >>> assert response.key_response.service == 80 >>> assert response.key_response.diagnosticSessionType == 3 >>> response = ecu.supported_responses[1] >>> assert response.supports_state(EcuState(session=3)) >>> assert response.key_response.service == 80 >>> assert response.key_response.diagnosticSessionType == 2 >>> response = ecu.supported_responses[4] >>> print(response) [security_level18session2], responses=['UDS / UDS_WDBIPR'] >>> state = EcuState(session=2, security_level=18) >>> print(state) security_level18session2 >>> assert response.supports_state(state) >>> assert response.key_response.service == 110 >>> assert response.key_response.dataIdentifier == 61786 >>> assert len(ecu.log["TransferData"]) == 2 ###### ## EcuSession tests ###### ###(028)=[passed] Analyze on the fly with EcuSession >>> session = EcuSession() >>> >>> with PcapReader(scapy_path("test/pcaps/ecu_trace.pcap.gz")) as sock: ... udsmsgs = sniff(session=ISOTPSession(supersession=session, use_ext_address=False, basecls=UDS), count=50, opened_socket=sock, timeout=3) ... > > [+] [], responses=['UDS / UDS_DSCPR'] session3 > session3 > [+] [session3], responses=['UDS / UDS_RCPR'] session3 > session3 > session3 > session3 > [+] [session3], responses=['UDS / UDS_CDTCSPR'] session3 > session3 > session3 > session3 > session3 > [+] [session3], responses=['UDS / UDS_DSCPR'] session2 > session2 > [+] [session2], responses=['UDS / UDS_SAPR'] session2 > session2 > [+] [session2], responses=['UDS / UDS_SAPR'] security_level18session2 >> security_level18session2 > [+] [security_level18session2], responses=['UDS / UDS_WDBIPR'] security_level18session2 > security_level18session2 > [+] [security_level18session2], responses=['UDS / UDS_RDPR'] req_download{'service': 52}security_level18session2 > req_download{'service': 52}security_level18session2 \x9c\xb28#1q\x1ev\x8fk\x92\xe0Y\xc7\xd7\xef\xf6\x1c0\xf0P\xe9\xb7#\x1e\x01\xb0/\xe5\x82\xf4=|\xf3\xd9\xdb/\x9a\xac\xea\xbc"\xdf\xa3\xd1\x84\x83\xad\xc0\xbb\x9b\xf6\x00#\xb3sV0\x1c\x1a$-&\xc1^XkI\xe1\xbbS\x14\xaf@\xf3a\xb4\x14\xab\x17!\x16Y\xd2\xb9@::O\xfb\xcd\x14l\xd3\xc5\x92\xbe\xec[\x828\xb3\xfb\n\xcc\xb8(\x92\x1f8\x8b\ts\xb6k>f\x9d\x00\x8d\xf7S1v\x9egx\x05\xfa\x12\xdb\x18Y\xc0\x9f\xf6\xbf\xea\x11Z\xb9\x93\x87\x81`\xb2\x14\xfa\x97D\xc3\xd7[\x81PlN5C\xa4\x18\xe9\xd6XV9\xf5P)\x11\xca7\x9d8\xd0w\xf9\xb0\xda\xe5\x98+:\x89(\xd7\xc7\x1d\xd9\xc9\xeaYe%\xd4\xef\xfd\x85\x11\x95g/:"\x81\xfe\xa8\xde\x19\xc2:aH\xf8\xdc\xdf\x8bS\xa0\xd4\xc0\xaf\t\x03\xf3\x90\x06\xc5\x0f\x92g\xfd3~\xa6\x9bK_\xc6\xc0\x90\x92A;\'' |>> req_download{'service': 52}security_level18session2 > [+] [req_download{'service': 52}security_level18session2], responses=['UDS / UDS_TDPR'] req_download{'service': 52}security_level18session2 > req_download{'service': 52}security_level18session2 req_download{'service': 52}security_level18session2 [+] [req_download{'service': 52}security_level18session2], responses=['UDS'] download_complete{'service': 52}req_downloadsecurity_level18session2 >> download_complete{'service': 52}req_downloadsecurity_level18session2 >> [+] [download_complete{'service': 52}req_downloadsecurity_level18session2], responses=['UDS / UDS_RCPR / Raw'] download_complete{'service': 52}req_downloadsecurity_level18session2 >> download_complete{'service': 52}req_downloadsecurity_level18session2 >> [+] [download_complete{'service': 52}req_downloadsecurity_level18session2], responses=['UDS / UDS_RCPR / Raw'] download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_download{'service': 52}security_level18session2 > download_complete{'service': 52}req_download{'service': 52}security_level18session2 > download_complete{'service': 52}req_download{'service': 52}security_level18session2 > download_complete{'service': 52}req_download{'service': 52}security_level18session2 > download_complete{'service': 52}req_download{'service': 52}security_level18session2 download_complete{'service': 52}req_download{'service': 52}security_level18session2 download_complete{'service': 52}req_downloadsecurity_level18session2 \xea\x90\x9df3\xa680]\xe0x\xcd8\xcat\x1f\x82s\x99zk(\x127#\xb0X\xa3\xff\x83\xa9Dk\xc6\xb5\xde\x86xT\xb0.V\xbb\xb6\xaf\xbe!\xb9\xbe\xef\xb1\xcd\r^K\xa5\x96\xf0z\xe6\x15q\x15)U\xcdsF\xffR\xbc\x0e\xe5\x1b^\xf9\xcc\x8b\xd2\xa9\xb4\xb1\xd1!\xf5\xd6U]\xccU\x0c\xbf\xe5\xfe\x81\x84\xeau]\x85\x8c\xdb\x84\x0c\x87\xe8\xe01\xeb\x89\xbb\xcae-\xe4\xe8\xe3n\x11p&' |>>> download_complete{'service': 52}req_downloadsecurity_level18session2 >> download_complete{'service': 52}req_downloadsecurity_level18session2 >> download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > download_complete{'service': 52}req_downloadsecurity_level18session2 > >>> assert len(udsmsgs) == 50 >>> >>> ecu = session.ecu >>> response = ecu.supported_responses[0] >>> assert response.supports_state(EcuState()) >>> assert response.key_response.service == 80 >>> assert response.key_response.diagnosticSessionType == 3 >>> response = ecu.supported_responses[1] >>> assert response.supports_state(EcuState(session=3)) >>> assert response.key_response.service == 80 >>> assert response.key_response.diagnosticSessionType == 2 >>> response = ecu.supported_responses[4] >>> print(response) [security_level18session2], responses=['UDS / UDS_WDBIPR'] >>> state = EcuState(session=2, security_level=18) >>> print(state) security_level18session2 >>> assert response.supports_state(state) >>> assert response.key_response.service == 110 >>> assert response.key_response.dataIdentifier == 61786 >>> assert len(ecu.log["TransferData"]) == 2 ###(029)=[passed] Analyze on the fly with EcuSession GMLAN1 >>> session = EcuSession() >>> >>> conf.contribs['CAN']['swap-bytes'] = True >>> >>> with PcapReader(scapy_path("test/pcaps/gmlan_trace.pcap.gz")) as sock: ... gmlanmsgs = sniff(session=ISOTPSession(supersession=session, rx_id=[0x241, 0x641, 0x101], basecls=GMLAN), count=2, opened_socket=sock, timeout=3) ... ecu = session.ecu ... print("Check 1 after change to diagnostic mode") ... assert len(ecu.supported_responses) == 1 ... assert ecu.state == EcuState(session=3) ... gmlanmsgs = sniff(session=ISOTPSession(supersession=session, rx_id=[0x241, 0x641, 0x101], basecls=GMLAN), count=6, opened_socket=sock) ... ecu = session.ecu ... print("Check 2 after some more messages were read1") ... assert len(ecu.supported_responses) == 3 ... print("Check 2 after some more messages were read2") ... assert ecu.state.session == 3 ... print("assert 1") ... assert ecu.state.communication_control == 1 ... gmlanmsgs = sniff(session=ISOTPSession(supersession=session, rx_id=[0x241, 0x641, 0x101], basecls=GMLAN), count=2, opened_socket=sock) ... ecu = session.ecu ... print("Check 3 after change to programming mode (bootloader)") ... assert len(ecu.supported_responses) == 4 ... assert ecu.state.session == 2 ... assert ecu.state.communication_control == 1 ... gmlanmsgs = sniff(session=ISOTPSession(supersession=session, rx_id=[0x241, 0x641, 0x101], basecls=GMLAN), count=6, opened_socket=sock) ... ecu = session.ecu ... print("Check 4 after gaining security access") ... assert len(ecu.supported_responses) == 6 ... assert ecu.state.session == 2 ... assert ecu.state.security_level == 2 ... assert ecu.state.communication_control == 1 ... > [+] [], responses=['GMLAN'] Check 1 after change to diagnostic mode session3 > session3 session3 session3 [+] [session3], responses=['GMLAN'] communication_control1session3 communication_control1session3 > [+] [communication_control1session3], responses=['GMLAN / GMLAN_RPSPR'] Check 2 after some more messages were read1 Check 2 after some more messages were read2 assert 1 communication_control1session3 > communication_control1session3 [+] [communication_control1session3], responses=['GMLAN'] Check 3 after change to programming mode (bootloader) communication_control1session2 > communication_control1session2 > communication_control1session2 > [+] [communication_control1session2], responses=['GMLAN / GMLAN_SAPR'] communication_control1session2 communication_control1session2 > communication_control1session2 > [+] [communication_control1session2], responses=['GMLAN / GMLAN_SAPR'] Check 4 after gaining security access ###(030)=[passed] Analyze on the fly with EcuSession GMLAN logging test >>> session = EcuSession(verbose=False, store_supported_responses=False) >>> >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 4 >>> conf.contribs['CAN']['swap-bytes'] = True >>> >>> conf.debug_dissector = True >>> gmlanmsgs = sniff(offline=scapy_path("test/pcaps/gmlan_trace.pcap.gz"), ... session=ISOTPSession(supersession=session, rx_id=[0x241, 0x641, 0x101], basecls=GMLAN), ... count=200, timeout=6) >>> >>> ecu = session.ecu >>> assert len(ecu.supported_responses) == 0 >>> >>> assert len([m for m in gmlanmsgs if m.sprintf("%GMLAN.service%") == "TransferData"]) == len(ecu.log["TransferData"]) >>> assert len([m for m in gmlanmsgs if m.sprintf("%GMLAN.service%") == "RequestDownload"]) == len(ecu.log["RequestDownload"]) >>> assert len([m for m in gmlanmsgs if m.sprintf("%GMLAN.service%") == "ReadDataByIdentifier"]) == len(ecu.log["ReadDataByIdentifier"]) >>> >>> assert len(ecu.log["SecurityAccess"]) == 2 >>> assert len(ecu.log["SecurityAccessPositiveResponse"]) == 2 >>> >>> assert ecu.log["TransferData"][-1][1][0] == "downloadAndExecuteOrExecute" Regression tests for EcuAnsweringMachine ━ Run at 01:43:15 from [test/contrib/automotive/ecu_am.uts] by UTscapy in 2.5274477005004883 └ Passed=10 └ Failed=0 ###### ## Configuration ###### ###(000)=[passed] Imports >>> from test.testsocket import TestSocket, cleanup_testsockets ###### ## Load general modules ###### ###(001)=[passed] Load contribution layer >>> load_contrib("automotive.uds", globals_dict=globals()) >>> load_contrib("automotive.ecu", globals_dict=globals()) >>> load_contrib("automotive.uds_ecu_states", globals_dict=globals()) >>> >>> ecu = TestSocket(UDS) >>> tester = TestSocket(UDS) >>> ecu.pair(tester) ###### ## Simulator tests ###### ###(002)=[passed] Simple check with RDBI and Negative Response >>> example_responses = \ ... [EcuResponse([EcuState(session=1)], responses=UDS() / UDS_RDBIPR(dataIdentifier=0x1234) / Raw(b"deadbeef"))] >>> >>> success = False >>> answering_machine = EcuAnsweringMachine(supported_responses=example_responses, main_socket=ecu, basecls=UDS, verbose=False) >>> sim = threading.Thread(target=answering_machine, kwargs={'timeout': 60, 'stop_filter': lambda p: p.service==0xff}) >>> sim.start() >>> try: ... resp = tester.sr1(UDS()/UDS_RDBI(identifiers=[0x123]), timeout=1, verbose=False) ... assert resp.negativeResponseCode == 0x10 ... assert resp.requestServiceId == 34 ... resp = tester.sr1(UDS(service=0x22), timeout=1, verbose=False) ... assert resp.negativeResponseCode == 0x10 ... assert resp.requestServiceId == 34 ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[0x1234]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 0x1234 ... assert resp.load == b"deadbeef" ... success = True ... except Exception as ex: ... print(ex) ... finally: ... tester.send(UDS(service=0xff)) ... sim.join(timeout=10) ... 1 >>> assert success ###(003)=[passed] Simple check with different Sessions >>> example_responses = \ ... [EcuResponse(EcuState(session=2), responses=UDS() / UDS_RDBIPR(dataIdentifier=2) / Raw(b"deadbeef1")), ... EcuResponse(EcuState(session=[3, 4]), responses=UDS() / UDS_RDBIPR(dataIdentifier=3) / Raw(b"deadbeef2")), ... EcuResponse(EcuState(session=[5, 6, 7]), responses=UDS() / UDS_RDBIPR(dataIdentifier=5) / Raw(b"deadbeef3")), ... EcuResponse(EcuState(session=[8, 9]), responses=UDS() / UDS_RDBIPR(dataIdentifier=9) / Raw(b"deadbeef4"))] >>> >>> success = False >>> >>> answering_machine = EcuAnsweringMachine(supported_responses=example_responses, main_socket=ecu, basecls=UDS) >>> sim = threading.Thread(target=answering_machine, kwargs={'timeout': 60, 'stop_filter': lambda p: p.service==0xff}) >>> sim.start() >>> try: ... resp = tester.sr1(UDS()/UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.negativeResponseCode == 0x10 ... assert resp.requestServiceId == 34 ... answering_machine.state.session = 2 ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 2 ... assert resp.load == b"deadbeef1" ... answering_machine.state.session = 4 ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 3 ... assert resp.load == b"deadbeef2" ... answering_machine.state.session = 6 ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 5 ... assert resp.load == b"deadbeef3" ... answering_machine.state.session = 9 ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 9 ... assert resp.load == b"deadbeef4" ... success = True ... except Exception as ex: ... print(ex) ... finally: ... tester.send(UDS(service=0xff)) ... sim.join(timeout=10) ... UDS / UDS_RDBI ==> ['UDS / UDS_NR'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] 1 UDS ==> ['UDS / UDS_NR'] >>> assert success ###(004)=[passed] Simple check with different Sessions and diagnosticSessionControl >>> example_responses = \ ... [EcuResponse(EcuState(session=2), responses=UDS() / UDS_RDBIPR(dataIdentifier=2) / Raw(b"deadbeef1")), ... EcuResponse(EcuState(session=range(3,5)), responses=UDS() / UDS_RDBIPR(dataIdentifier=3) / Raw(b"deadbeef2")), ... EcuResponse(EcuState(session=[5,6,7]), responses=UDS() / UDS_RDBIPR(dataIdentifier=5) / Raw(b"deadbeef3")), ... EcuResponse(EcuState(session=9), responses=UDS() / UDS_RDBIPR(dataIdentifier=9) / Raw(b"deadbeef4")), ... EcuResponse([EcuState(), EcuState(session=range(0,8))], responses=UDS() / UDS_DSCPR(diagnosticSessionType=1, sessionParameterRecord=b"dead")), ... EcuResponse([EcuState(), EcuState(session=range(0,8))], responses=UDS() / UDS_DSCPR(diagnosticSessionType=2, sessionParameterRecord=b"dead")), ... EcuResponse([EcuState(), EcuState(session=range(0,8))], responses=UDS() / UDS_DSCPR(diagnosticSessionType=3, sessionParameterRecord=b"dead")), ... EcuResponse([EcuState(), EcuState(session=range(0,8))], responses=UDS() / UDS_DSCPR(diagnosticSessionType=4, sessionParameterRecord=b"dead")), ... EcuResponse([EcuState(), EcuState(session=range(0,8))], responses=UDS() / UDS_DSCPR(diagnosticSessionType=5, sessionParameterRecord=b"dead")), ... EcuResponse([EcuState(), EcuState(session=range(0,8))], responses=UDS() / UDS_DSCPR(diagnosticSessionType=6, sessionParameterRecord=b"dead")), ... EcuResponse([EcuState(), EcuState(session=range(0,8))], responses=UDS() / UDS_DSCPR(diagnosticSessionType=7, sessionParameterRecord=b"dead")), ... EcuResponse([EcuState(), EcuState(session=range(0,8))], responses=UDS() / UDS_DSCPR(diagnosticSessionType=8, sessionParameterRecord=b"dead")), ... EcuResponse([EcuState(), EcuState(session=range(8,10))], responses=UDS() / UDS_DSCPR(diagnosticSessionType=9, sessionParameterRecord=b"dead1")), ... EcuResponse([EcuState(), EcuState(session=range(8,10))], responses=UDS() / UDS_DSCPR(diagnosticSessionType=9, sessionParameterRecord=b"dead2")), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x7f, requestServiceId=0x10))] >>> >>> success = False >>> >>> answering_machine = EcuAnsweringMachine(supported_responses=example_responses, main_socket=ecu, basecls=UDS) >>> sim = threading.Thread(target=answering_machine, kwargs={'timeout': 60, 'stop_filter': lambda p: p.service==0xff}) >>> sim.start() >>> try: ... resp = tester.sr1(UDS()/UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.negativeResponseCode == 0x10 ... assert resp.requestServiceId == 34 ... resp = tester.sr1(UDS()/UDS_DSC(diagnosticSessionType=2), timeout=1, verbose=False) ... assert resp.service == 0x50 ... assert resp.diagnosticSessionType == 2 ... assert resp.sessionParameterRecord == b"dead" ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 2 ... assert resp.load == b"deadbeef1" ... resp = tester.sr1(UDS()/UDS_DSC(diagnosticSessionType=4), timeout=1, verbose=False) ... assert resp.service == 0x50 ... assert resp.diagnosticSessionType == 4 ... assert resp.sessionParameterRecord == b"dead" ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 3 ... assert resp.load == b"deadbeef2" ... resp = tester.sr1(UDS()/UDS_DSC(diagnosticSessionType=6), timeout=1, verbose=False) ... assert resp.service == 0x50 ... assert resp.diagnosticSessionType == 6 ... assert resp.sessionParameterRecord == b"dead" ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 5 ... assert resp.load == b"deadbeef3" ... resp = tester.sr1(UDS()/UDS_DSC(diagnosticSessionType=8), timeout=1, verbose=False) ... assert resp.service == 0x50 ... assert resp.diagnosticSessionType == 8 ... assert resp.sessionParameterRecord == b"dead" ... resp = tester.sr1(UDS() / UDS_DSC(diagnosticSessionType=9), timeout=1, verbose=False) ... assert resp.service == 0x50 ... assert resp.diagnosticSessionType == 9 ... assert resp.sessionParameterRecord == b"dead1" ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 9 ... assert resp.load == b"deadbeef4" ... success = True ... except Exception as ex: ... print(ex) ... finally: ... tester.send(UDS(service=0xff)) ... sim.join(timeout=10) ... UDS / UDS_RDBI ==> ['UDS / UDS_NR'] UDS / UDS_DSC ==> ['UDS / UDS_DSCPR'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] UDS / UDS_DSC ==> ['UDS / UDS_DSCPR'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] UDS / UDS_DSC ==> ['UDS / UDS_DSCPR'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] UDS / UDS_DSC ==> ['UDS / UDS_DSCPR'] UDS / UDS_DSC ==> ['UDS / UDS_DSCPR'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] 1 UDS ==> ['UDS / UDS_NR'] >>> assert success ###(005)=[passed] Simple check with different Sessions and diagnosticSessionControl and answers hook >>> def custom_answers(resp, req): ... if req.service + 0x40 != resp.service: ... return False ... if hasattr(req, "diagnosticSessionType"): ... if 0 < req.diagnosticSessionType <= 8: ... resp.diagnosticSessionType = req.diagnosticSessionType ... return resp.answers(req) ... return False ... >>> example_responses = \ ... [EcuResponse(EcuState(session=2), responses=UDS() / UDS_RDBIPR(dataIdentifier=2) / Raw(b"deadbeef1")), ... EcuResponse(EcuState(session=range(3,5)), responses=UDS() / UDS_RDBIPR(dataIdentifier=3) / Raw(b"deadbeef2")), ... EcuResponse(EcuState(session=[5,6,7]), responses=UDS() / UDS_RDBIPR(dataIdentifier=5) / Raw(b"deadbeef3")), ... EcuResponse(EcuState(session=[9, 10]), responses=UDS() / UDS_RDBIPR(dataIdentifier=9) / Raw(b"deadbeef4")), ... EcuResponse(EcuState(session=range(0,8)), responses=UDS() / UDS_DSCPR(diagnosticSessionType=1, sessionParameterRecord=b"dead"), answers=custom_answers), ... EcuResponse(EcuState(session=range(8,10)), responses=UDS() / UDS_DSCPR(diagnosticSessionType=9, sessionParameterRecord=b"dead1")), ... EcuResponse(EcuState(session=range(8,10)), responses=UDS() / UDS_DSCPR(diagnosticSessionType=9, sessionParameterRecord=b"dead2")), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x7f, requestServiceId=0x10))] >>> >>> success = False >>> >>> answering_machine = EcuAnsweringMachine(supported_responses=example_responses, main_socket=ecu, basecls=UDS) >>> sim = threading.Thread(target=answering_machine, kwargs={'timeout': 60, 'stop_filter': lambda p: p.service==0xff}) >>> sim.start() >>> try: ... resp = tester.sr1(UDS()/UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.negativeResponseCode == 0x10 ... assert resp.requestServiceId == 34 ... resp = tester.sr1(UDS()/UDS_DSC(diagnosticSessionType=2), timeout=1, verbose=False) ... assert resp.service == 0x50 ... assert resp.diagnosticSessionType == 2 ... assert resp.sessionParameterRecord == b"dead" ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 2 ... assert resp.load == b"deadbeef1" ... resp = tester.sr1(UDS()/UDS_DSC(diagnosticSessionType=4), timeout=1, verbose=False) ... assert resp.service == 0x50 ... assert resp.diagnosticSessionType == 4 ... assert resp.sessionParameterRecord == b"dead" ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 3 ... assert resp.load == b"deadbeef2" ... resp = tester.sr1(UDS()/UDS_DSC(diagnosticSessionType=6), timeout=1, verbose=False) ... assert resp.service == 0x50 ... assert resp.diagnosticSessionType == 6 ... assert resp.sessionParameterRecord == b"dead" ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 5 ... assert resp.load == b"deadbeef3" ... resp = tester.sr1(UDS()/UDS_DSC(diagnosticSessionType=8), timeout=1, verbose=False) ... assert resp.service == 0x50 ... assert resp.diagnosticSessionType == 8 ... assert resp.sessionParameterRecord == b"dead" ... resp = tester.sr1(UDS() / UDS_DSC(diagnosticSessionType=9), timeout=1, verbose=False) ... assert resp.service == 0x50 ... assert resp.diagnosticSessionType == 9 ... assert resp.sessionParameterRecord == b"dead1" ... resp = tester.sr1(UDS() / UDS_RDBI(identifiers=[2, 3, 5, 9]), timeout=1, verbose=False) ... assert resp.service == 0x62 ... assert resp.dataIdentifier == 9 ... assert resp.load == b"deadbeef4" ... success = True ... except Exception as ex: ... print(ex) ... finally: ... tester.send(UDS(service=0xff)) ... sim.join(timeout=10) ... UDS / UDS_RDBI ==> ['UDS / UDS_NR'] UDS / UDS_DSC ==> ['UDS / UDS_DSCPR'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] UDS / UDS_DSC ==> ['UDS / UDS_DSCPR'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] UDS / UDS_DSC ==> ['UDS / UDS_DSCPR'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] UDS / UDS_DSC ==> ['UDS / UDS_DSCPR'] UDS / UDS_DSC ==> ['UDS / UDS_DSCPR'] UDS / UDS_RDBI ==> ['UDS / UDS_RDBIPR / Raw'] 1 UDS ==> ['UDS / UDS_NR'] >>> assert success ###(006)=[passed] Simple check with security access and answers hook >>> security_seed = b"abcd" >>> >>> def custom_answers(resp, req): ... global security_seed ... if req.service + 0x40 != resp.service or req.service != 0x27: ... return False ... if req.securityAccessType == 1: ... resp.securitySeed = security_seed ... return resp.answers(req) ... elif req.securityAccessType == 2: ... return resp.answers(req) and req.securityKey == security_seed + security_seed ... return False ... >>> example_responses = \ ... [EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_SAPR(securityAccessType=1, securitySeed=b"1234"), answers=custom_answers), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_SAPR(securityAccessType=2), answers=custom_answers), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x35, requestServiceId=0x27)), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x7f, requestServiceId=0x10))] >>> >>> success = False >>> >>> answering_machine = EcuAnsweringMachine(supported_responses=example_responses, main_socket=ecu, basecls=UDS) >>> sim = threading.Thread(target=answering_machine, kwargs={'timeout': 10, 'stop_filter': lambda p: p.service==0xff}) >>> sim.start() >>> try: ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=1), timeout=1, verbose=False) ... assert resp.service == 0x67 ... assert resp.securitySeed == b"abcd" ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=2, securityKey=resp.securitySeed), timeout=1, verbose=False) ... assert resp.service == 0x7f ... assert resp.negativeResponseCode == 0x35 ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=1), timeout=1, verbose=False) ... assert resp.service == 0x67 ... assert resp.securitySeed == b"abcd" ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=2, securityKey=resp.securitySeed+resp.securitySeed), timeout=1, verbose=False) ... assert resp.service == 0x67 ... success = True ... except Exception as ex: ... print(ex) ... finally: ... tester.send(UDS(service=0xff)) ... sim.join(timeout=10) ... UDS / UDS_SA ==> ['UDS / UDS_SAPR'] UDS / UDS_SA ==> ['UDS / UDS_NR'] UDS / UDS_SA ==> ['UDS / UDS_SAPR'] UDS / UDS_SA ==> ['UDS / UDS_SAPR'] 1 UDS ==> ['UDS / UDS_NR'] >>> assert success ###(007)=[passed] Simple check with security access and answers hook and request-correctly-received message >>> security_seed = b"abcd" >>> >>> def custom_answers(resp, req): ... global security_seed ... if req.service + 0x40 != resp.service or req.service != 0x27: ... return False ... if req.securityAccessType == 1: ... resp.securitySeed = security_seed ... return resp.answers(req) ... elif req.securityAccessType == 2: ... return resp.answers(req) and req.securityKey == security_seed + security_seed ... return False ... >>> example_responses = \ ... [EcuResponse(EcuState(session=range(0,255)), responses=[UDS()/UDS_NR(negativeResponseCode=0x78, requestServiceId=0x27), UDS() / UDS_SAPR(securityAccessType=1, securitySeed=b"1234")], answers=custom_answers), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_SAPR(securityAccessType=2), answers=custom_answers), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x35, requestServiceId=0x27)), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x7f, requestServiceId=0x10))] >>> >>> success = False >>> >>> answering_machine = EcuAnsweringMachine(supported_responses=example_responses, main_socket=ecu, basecls=UDS) >>> sim = threading.Thread(target=answering_machine, kwargs={'timeout': 10, 'stop_filter': lambda p: p.service==0xff}) >>> sim.start() >>> try: ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=1), timeout=2, verbose=False) ... assert resp.service == 0x67 ... assert resp.securitySeed == b"abcd" ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=2, securityKey=resp.securitySeed), timeout=2, verbose=False) ... assert resp.service == 0x7f ... assert resp.negativeResponseCode == 0x35 ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=1), timeout=2, verbose=False) ... assert resp.service == 0x67 ... assert resp.securitySeed == b"abcd" ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=2, securityKey=resp.securitySeed+resp.securitySeed), timeout=2, verbose=False) ... assert resp.service == 0x67 ... success = True ... except Exception as ex: ... print(ex) ... finally: ... tester.send(UDS(service=0xff)) ... sim.join(timeout=10) ... UDS / UDS_SA ==> ['UDS / UDS_NR', 'UDS / UDS_SAPR'] UDS / UDS_SA ==> ['UDS / UDS_NR'] UDS / UDS_SA ==> ['UDS / UDS_NR', 'UDS / UDS_SAPR'] UDS / UDS_SA ==> ['UDS / UDS_SAPR'] 1 UDS ==> ['UDS / UDS_NR'] >>> assert success ###(008)=[passed] Simple check with security access and answers hook and request-correctly-received message 2 >>> security_seed = b"abcd" >>> >>> def custom_answers(resp, req): ... global security_seed ... if req.service + 0x40 != resp.service or req.service != 0x27: ... return False ... if req.securityAccessType == 1: ... resp.securitySeed = security_seed ... return resp.answers(req) ... elif req.securityAccessType == 2: ... return resp.answers(req) and req.securityKey == security_seed + security_seed ... return False ... >>> example_responses = \ ... [EcuResponse(EcuState(session=range(0,255)), responses=[UDS()/UDS_NR(negativeResponseCode=0x78, requestServiceId=0x27), UDS() / UDS_SAPR(securityAccessType=1, securitySeed=b"1234")], answers=custom_answers), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_SAPR(securityAccessType=2), answers=custom_answers), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x35, requestServiceId=0x27)), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x7f, requestServiceId=0x10))] >>> >>> conf.contribs['UDS']['treat-response-pending-as-answer'] = True >>> >>> success = False >>> >>> answering_machine = EcuAnsweringMachine(supported_responses=example_responses, ... main_socket=ecu, basecls=UDS) >>> sim = threading.Thread(target=answering_machine, kwargs={'timeout':5, 'stop_filter': lambda p: p.service==0xff}) >>> sim.start() >>> try: ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=1), timeout=1, verbose=False) ... assert resp.service == 0x7f ... assert resp.negativeResponseCode == 0x78 ... resp = tester.sniff(timeout=2, count=1, verbose=False)[0] ... assert resp.service == 0x67 ... assert resp.securitySeed == b"abcd" ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=2, securityKey=resp.securitySeed), timeout=3, verbose=False) ... assert resp.service == 0x7f ... assert resp.negativeResponseCode == 0x35 ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=1), timeout=1, verbose=False) ... assert resp.service == 0x7f ... assert resp.negativeResponseCode == 0x78 ... resp = tester.sniff(timeout=2, count=1, verbose=False)[0] ... assert resp.service == 0x67 ... assert resp.securitySeed == b"abcd" ... resp = tester.sr1(UDS() / UDS_SA(securityAccessType=2, securityKey=resp.securitySeed+resp.securitySeed), timeout=1, verbose=False) ... assert resp.service == 0x67 ... success = True ... except Exception as ex: ... print(ex) ... finally: ... tester.send(UDS(service=0xff)) ... sim.join(timeout=10) ... UDS / UDS_SA ==> ['UDS / UDS_NR', 'UDS / UDS_SAPR'] UDS / UDS_SA ==> ['UDS / UDS_NR'] UDS / UDS_SA ==> ['UDS / UDS_NR', 'UDS / UDS_SAPR'] UDS / UDS_SA ==> ['UDS / UDS_SAPR'] 1 UDS ==> ['UDS / UDS_NR'] >>> assert success >>> >>> conf.contribs['UDS']['treat-response-pending-as-answer'] = False ###### ## Cleanup ###### ###(009)=[passed] Delete TestSockets >>> cleanup_testsockets() Regression tests for the KWP2000 layer ━ Run at 01:43:16 from [test/contrib/automotive/kwp.uts] by UTscapy in 0.19504499435424805 └ Passed=66 └ Failed=0 ###### ## Basic operations ###### ###(000)=[passed] Load module >>> load_contrib("automotive.kwp", globals_dict=globals()) Specify "conf.contribs['KWP'] = {'treat-response-pending-as-answer': True}" to treat a negative response 'requestCorrectlyReceived-ResponsePending' as answer of a request. The default value is False. ###(001)=[passed] Check if positive response answers >>> sds = KWP(b'\x10') >>> sdspr = KWP(b'\x50') >>> assert sdspr.answers(sds) ###(002)=[passed] Check hashret >>> sds.hashret() == sdspr.hashret() True ###(003)=[passed] Check if negative response answers >>> sds = KWP(b'\x10') >>> neg = KWP(b'\x7f\x10') >>> assert neg.answers(sds) ###(004)=[passed] CHECK hashret NEG >>> sds.hashret() == neg.hashret() True ###(005)=[passed] Check if negative response answers >>> conf.contribs['KWP']['treat-response-pending-as-answer'] = False >>> >>> sds = KWP(b'\x10') >>> neg = KWP(b'\x7f\x10\x78') >>> assert not neg.answers(sds) >>> >>> conf.contribs['KWP']['treat-response-pending-as-answer'] = True ###(006)=[passed] CHECK hashret NEG >>> sds.hashret() == neg.hashret() True ###(007)=[passed] Check if negative response answers not >>> sds = KWP(b'\x10') >>> neg = KWP(b'\x7f\x11') >>> assert not neg.answers(sds) ###(008)=[passed] Check if positive response answers not >>> sds = KWP(b'\x10') >>> somePacket = KWP(b'\x49') >>> assert not somePacket.answers(sds) ###(009)=[passed] Check KWP_SDS >>> sds = KWP(b'\x10\x01') >>> assert sds.service == 0x10 >>> assert sds.diagnosticSession == 0x01 ###(010)=[passed] Check KWP_SDS >>> sds = KWP()/KWP_SDS(b'\x01') >>> assert sds.service == 0x10 >>> assert sds.diagnosticSession == 0x01 ###(011)=[passed] Check KWP_SDSPR >>> sdspr = KWP(b'\x50\x02beef') >>> assert sdspr.service == 0x50 >>> assert sdspr.diagnosticSession == 0x02 >>> >>> assert not sdspr.answers(sds) ###(012)=[passed] Check KWP_SDSPR >>> sdspr = KWP()/KWP_SDSPR(b'\x01beef') >>> assert sdspr.service == 0x50 >>> assert sdspr.diagnosticSession == 0x01 >>> >>> assert sdspr.answers(sds) ###(013)=[passed] Check KWP_SDS >>> sds = KWP()/KWP_SDS(b'\x01') >>> assert sds.service == 0x10 >>> assert sds.diagnosticSession == 0x01 ###(014)=[passed] Check KWP_SDSPR >>> sdspr = KWP()/KWP_SDSPR(b'\x01beef') >>> assert sdspr.service == 0x50 >>> assert sdspr.diagnosticSession == 0x01 >>> >>> assert sdspr.answers(sds) ###(015)=[passed] Check KWP_ER >>> er = KWP(b'\x11\x01') >>> assert er.service == 0x11 >>> assert er.resetMode == 0x01 ###(016)=[passed] Check KWP_ER >>> er = KWP()/KWP_ER(resetMode="powerOnReset") >>> assert er.service == 0x11 >>> assert er.resetMode == 0x01 ###(017)=[passed] Check KWP_ERPR >>> erpr = KWP(b'\x51') >>> assert erpr.service == 0x51 >>> >>> assert erpr.answers(er) ###(018)=[passed] Check KWP_SA >>> sa = KWP(b'\x27\x00c0ffee') >>> assert sa.service == 0x27 >>> assert sa.accessMode == 0x0 >>> assert sa.key == b'c0ffee' ###(019)=[passed] Check KWP_SAPR >>> sapr = KWP(b'\x67') >>> assert sapr.service == 0x67 >>> >>> assert sapr.answers(sa) ###(020)=[passed] Check KWP_SA >>> sa = KWP(b'\x27\x01') >>> assert sa.service == 0x27 >>> assert sa.accessMode == 0x1 ###(021)=[passed] Check KWP_SAPR >>> sapr = KWP(b'\x67\x01c0ffee') >>> assert sapr.service == 0x67 >>> assert sapr.accessMode == 0x1 >>> assert sapr.seed == b'c0ffee' >>> >>> assert sapr.answers(sa) ###(022)=[passed] Check KWP_SA >>> sa = KWP(b'\x27\x00c0ffee') >>> assert sa.service == 0x27 >>> assert sa.accessMode == 0x0 >>> assert sa.key == b'c0ffee' ###(023)=[passed] Check KWP_SA >>> sa = KWP(b'\x27\x01c0ffee') >>> assert sa.service == 0x27 >>> assert sa.accessMode == 0x1 ###(024)=[passed] Check KWP_SAPR >>> sapr = KWP(b'\x67\x01c0ffee') >>> assert sapr.service == 0x67 >>> assert sapr.accessMode == 0x1 >>> assert sapr.seed == b'c0ffee' ###(025)=[passed] Check KWP_DNT >>> cc = KWP(b'\x28\x01') >>> assert cc.service == 0x28 >>> assert cc.responseRequired == 0x1 ###(026)=[passed] Check KWP_DNMTPR >>> ccpr = KWP(b'\x68') >>> assert ccpr.service == 0x68 >>> assert ccpr.answers(cc) ###(027)=[passed] Check KWP_DNMTPR >>> ccpr = KWP(b'\x68abcd') >>> assert ccpr.service == 0x68 >>> assert ccpr.answers(cc) >>> >>> assert (KWP()/KWP_DNMTPR()).answers(cc) ###(028)=[passed] Check KWP_TP >>> tp = KWP(b'\x3E\x01') >>> assert tp.service == 0x3e >>> assert tp.responseRequired == 1 ###(029)=[passed] Check KWP_TPPR >>> tppr = KWP(b'\x7E') >>> assert tppr.service == 0x7e >>> >>> assert tppr.answers(tp) >>> >>> assert (KWP()/KWP_TPPR()).answers(tp) ###(030)=[passed] Check KWP_CDTCS >>> cdtcs = KWP(b'\x85\x01\x40\x00\x01') >>> assert cdtcs.service == 0x85 >>> assert cdtcs.responseRequired == 1 >>> assert cdtcs.groupOfDTC == 0x4000 >>> assert cdtcs.DTCSettingMode == 1 ###(031)=[passed] Check KWP_CDTCSPR >>> cdtcspr = KWP(b'\xC5\x00') >>> assert cdtcspr.service == 0xC5 >>> >>> assert cdtcspr.answers(cdtcs) ###(032)=[passed] Check KWP_ROE >>> roe = KWP(b'\x86\x01\x10\x00') >>> assert roe.service == 0x86 >>> assert roe.responseRequired == 1 >>> assert roe.eventType == 0 >>> assert roe.eventWindowTime == 16 ###(033)=[passed] Check KWP_ROEPR >>> roepr = KWP(b'\xC6\x00\x01') >>> assert roepr.service == 0xC6 >>> assert roepr.numberOfActivatedEvents == 0 >>> assert roepr.eventType == 0 >>> >>> assert roepr.answers(roe) ###(034)=[passed] Check KWP_RDBI >>> rdbi = KWP(b'\x22\x01\x02') >>> assert rdbi.service == 0x22 >>> assert rdbi.identifier == 0x0102 ###(035)=[passed] Build KWP_RDBI >>> rdbi = KWP()/KWP_RDBI(identifier=0x102) >>> assert rdbi.service == 0x22 >>> assert rdbi.identifier == 0x0102 >>> assert bytes(rdbi) == b'\x22\x01\x02' ###(036)=[passed] Check KWP_RDBI2 >>> rdbi = KWP(b'\x22\x01\x02') >>> assert rdbi.service == 0x22 >>> assert rdbi.identifier == 0x0102 >>> assert raw(rdbi) == b'\x22\x01\x02' ###(037)=[passed] Build KWP_RDBI2 >>> rdbi = KWP()/KWP_RDBI(identifier=0x304) >>> assert rdbi.service == 0x22 >>> assert rdbi.identifier == 0x0304 >>> assert raw(rdbi) == b'\x22\x03\x04' ###(038)=[passed] Test observable dict used in KWP_RDBI, setter >>> KWP_RDBI.dataIdentifiers[0x102] = "turbo" At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 >>> KWP_RDBI.dataIdentifiers[0x103] = "fullspeed" At : Change to fullspeed at 0x103 At : Change to fullspeed at 0x103 At : Change to fullspeed at 0x103 At : Change to fullspeed at 0x103 >>> >>> rdbi = KWP()/KWP_RDBI(identifier=0x102) >>> >>> assert "turbo" in plain_str(repr(rdbi)) >>> >>> rdbi = KWP()/KWP_RDBI(identifier=0x103) >>> >>> assert "fullspeed" in plain_str(repr(rdbi)) ###(039)=[passed] Test observable dict used in KWP_RDBI, deleter >>> KWP_RDBI.dataIdentifiers[0x102] = "turbo" At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 >>> >>> rdbi = KWP()/KWP_RDBI(identifier=0x102) >>> assert "turbo" in plain_str(repr(rdbi)) >>> >>> del KWP_RDBI.dataIdentifiers[0x102] At : Delete value at 0x102 At : Delete value at 0x102 At : Delete value at 0x102 At : Delete value at 0x102 >>> KWP_RDBI.dataIdentifiers[0x103] = "slowspeed" At : Change to slowspeed at 0x103 At : Change to slowspeed at 0x103 At : Change to slowspeed at 0x103 At : Change to slowspeed at 0x103 >>> >>> rdbi = KWP()/KWP_RDBI(identifier=0x102) >>> >>> assert "turbo" not in plain_str(repr(rdbi)) >>> >>> rdbi = KWP()/KWP_RDBI(identifier=0x103) >>> >>> assert "slowspeed" in plain_str(repr(rdbi)) ###(040)=[passed] Check KWP_RDBIPR >>> rdbipr = KWP(b'\x62\x01\x03dieselgate') >>> assert rdbipr.service == 0x62 >>> assert rdbipr.identifier == 0x0103 >>> assert rdbipr.load == b'dieselgate' >>> >>> assert rdbipr.answers(rdbi) ###(041)=[passed] Check KWP_RMBA >>> rmba = KWP(b'\x23\x11\x02\x02\x11') >>> assert rmba.service == 0x23 >>> assert rmba.memoryAddress == 0x110202 >>> assert rmba.memorySize == 17 ###(042)=[passed] Check KWP_RMBAPR >>> rmbapr = KWP(b'\x63muchData') >>> assert rmbapr.service == 0x63 >>> assert rmbapr.dataRecord == b'muchData' >>> >>> assert rmbapr.answers(rmba) ###(043)=[passed] Check KWP_DDLI >>> dddi = KWP(b'\x2c\x12\x44coffee') >>> assert dddi.service == 0x2c >>> assert dddi.dynamicallyDefineLocalIdentifier == 0x12 >>> assert dddi.definitionMode == 0x44 >>> assert dddi.dataRecord == b'coffee' ###(044)=[passed] Check KWP_DDLIPR >>> dddipr = KWP(b'\x6c\x12\x44\x01') >>> assert dddipr.service == 0x6c >>> assert dddipr.dynamicallyDefineLocalIdentifier == 0x12 >>> >>> assert dddipr.answers(dddi) ###(045)=[passed] Check KWP_WDBI >>> wdbi = KWP(b'\x2e\x01\x02dieselgate') >>> assert wdbi.service == 0x2e >>> assert wdbi.identifier == 0x0102 >>> assert wdbi.load == b'dieselgate' ###(046)=[passed] Build KWP_WDBI >>> wdbi = KWP()/KWP_WDBI(identifier=0x0102)/Raw(load=b'dieselgate') >>> assert wdbi.service == 0x2e >>> assert wdbi.identifier == 0x0102 >>> assert wdbi.load == b'dieselgate' >>> assert bytes(wdbi) == b'\x2e\x01\x02dieselgate' ###(047)=[passed] Check KWP_WDBI >>> wdbi = KWP(b'\x2e\x01\x02dieselgate') >>> assert wdbi.service == 0x2e >>> assert wdbi.identifier == 0x0102 >>> assert wdbi.load == b'dieselgate' >>> >>> wdbi = KWP(b'\x2e\x02\x02benzingate') >>> assert wdbi.service == 0x2e >>> assert wdbi.identifier == 0x0202 >>> assert wdbi.load == b'benzingate' ###(048)=[passed] Check KWP_WDBIPR >>> wdbipr = KWP(b'\x6e\x02\x02') >>> assert wdbipr.service == 0x6e >>> assert wdbipr.identifier == 0x0202 >>> >>> assert wdbipr.answers(wdbi) ###(049)=[passed] Check KWP_WMBA >>> wmba = KWP(b'\x3d\x11\x02\x02\x02muchData') >>> assert wmba.service == 0x3d >>> assert wmba.memoryAddress == 0x110202 >>> assert wmba.memorySize == 2 >>> assert wmba.dataRecord == b'muchData' ###(050)=[passed] Check KWP_WMBAPR >>> wmbapr = KWP(b'\x7d\x11\x02\x02') >>> assert wmbapr.service == 0x7d >>> assert wmbapr.memoryAddress == 0x110202 >>> >>> assert wmbapr.answers(wmba) ###(051)=[passed] Check KWP_CDI >>> cdtci = KWP(b'\x14\x44\x02\x03') >>> assert cdtci.service == 0x14 >>> assert cdtci.groupOfDTC == 0x4402 >>> >>> cdtcipr = KWP(b'\x54\x44\x02\x03') >>> assert cdtcipr.service == 0x54 >>> assert cdtcipr.groupOfDTC == 0x4402 >>> >>> assert cdtcipr.answers(cdtci) ###(052)=[passed] Check KWP_RC >>> rc = KWP(b'\x31\xff\xee\xdd\xaa') >>> assert rc.service == 0x31 >>> assert rc.routineLocalIdentifier == 0xff >>> assert rc.load == b'\xee\xdd\xaa' ###(053)=[passed] Check KWP_RC >>> rc = KWP(b'\x31\xff\xee\xdd\xaa') >>> assert rc.service == 0x31 >>> assert rc.routineLocalIdentifier == 0xff >>> assert rc.load == b'\xee\xdd\xaa' ###(054)=[passed] Check KWP_RCPR >>> rcpr = KWP(b'\x71\xff\xee\xdd\xaa') >>> assert rcpr.service == 0x71 >>> assert rcpr.routineLocalIdentifier == 0xff >>> assert rcpr.load == b'\xee\xdd\xaa' >>> >>> assert rcpr.answers(rc) ###(055)=[passed] Check KWP_RD >>> rd = KWP(b'\x34\xaa\x11\x02\x02\x10\x00\x00') >>> >>> assert rd.service == 0x34 >>> assert rd.memoryAddress == 0xaa1102 >>> assert rd.compression == 0 >>> assert rd.encryption == 2 >>> assert rd.uncompressedMemorySize == 0x100000 ###(056)=[passed] Check KWP_RDPR >>> rdpr = KWP(b'\x74\x02\x02\x02\x02\x03\x03\x03\x03') >>> assert rdpr.service == 0x74 >>> assert rdpr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03' >>> rdpr.show() ###[ KWP ]### service = RequestDownloadPositiveResponse ###[ RequestDownloadPositiveResponse ]### maxNumberOfBlockLength= b'\x02\x02\x02\x02\x03\x03\x03\x03' >>> assert rdpr.answers(rd) ###(057)=[passed] Check KWP_RU >>> ru = KWP(b'\x35\x11\x02\x02\xa0\xff\xff\xff') >>> assert ru.service == 0x35 >>> assert ru.memoryAddress == 0x110202 >>> assert ru.compression == 10 >>> assert ru.encryption == 0 >>> assert ru.uncompressedMemorySize == 0xffffff ###(058)=[passed] Check KWP_RUPR >>> rupr = KWP(b'\x75\x02\x02\x02\x02\x03\x03\x03\x03') >>> assert rupr.service == 0x75 >>> assert rupr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03' >>> >>> assert rupr.answers(ru) ###(059)=[passed] Check KWP_TD >>> td = KWP(b'\x36\xaapayload') >>> assert td.service == 0x36 >>> assert td.blockSequenceCounter == 0xaa >>> assert td.transferDataRequestParameter == b'payload' ###(060)=[passed] Check KWP_TDPR >>> tdpr = KWP(b'\x76\xaapayload') >>> assert tdpr.service == 0x76 >>> assert tdpr.blockSequenceCounter == 0xaa >>> assert tdpr.transferDataRequestParameter == b'payload' >>> >>> assert tdpr.answers(td) ###(061)=[passed] Check KWP_RTE >>> rte = KWP(b'\x37payload') >>> assert rte.service == 0x37 >>> assert rte.transferDataRequestParameter == b'payload' ###(062)=[passed] Check KWP_RTEPR >>> rtepr = KWP(b'\x77payload') >>> assert rtepr.service == 0x77 >>> assert rtepr.transferDataRequestParameter == b'payload' >>> >>> assert rtepr.answers(rte) ###(063)=[passed] Check KWP_IOCBI >>> iocbi = KWP(b'\x30\x23\xffcoffee') >>> assert iocbi.service == 0x30 >>> assert iocbi.localIdentifier == 0x23 >>> assert iocbi.inputOutputControlParameter == 255 >>> assert iocbi.controlState == b'coffee' ###(064)=[passed] Check KWP_IOCBIPR >>> iocbipr = KWP(b'\x70\x23\xffcoffee') >>> assert iocbipr.service == 0x70 >>> assert iocbipr.localIdentifier == 0x23 >>> assert iocbipr.inputOutputControlParameter == 255 >>> assert iocbipr.controlState == b'coffee' >>> >>> assert iocbipr.answers(iocbi) ###(065)=[passed] Check KWP_NRC >>> nrc = KWP(b'\x7f\x22\x33') >>> assert nrc.service == 0x7f >>> assert nrc.requestServiceId == 0x22 >>> assert nrc.negativeResponseCode == 0x33 Test campaign ━ Run at 01:43:16 from [test/contrib/automotive/someip.uts] by UTscapy in 0.2618541717529297 └ Passed=56 └ Failed=0 ###### ## Basic operations ###### ###(000)=[passed] Load module >>> load_contrib("automotive.someip", globals_dict=globals()) ###### ## SOME/IP operation ###### ###(001)=[passed] Basic build >>> p = SOMEIP() >>> pstr = bytes(p) >>> binstr = b"\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x01\x01\x00\x00" >>> assert pstr == binstr ###(002)=[passed] Build with empty payload >>> p.payload = Raw(b"") >>> pstr = bytes(p) >>> binstr = b"\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x01\x01\x00\x00" >>> assert pstr == binstr ###(003)=[passed] Build with non-empty payload >>> p.payload = Raw(b"\xde\xad\xbe\xef") >>> pstr = bytes(p) >>> binstr = b"\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x00\x00\xde\xad\xbe\xef" >>> assert pstr == binstr ###(004)=[passed] Dissect EVENT_ID packet >>> p = SOMEIP(b"\x11\x11\x81\x11\x00\x00\x00\x08\x33\x33\x44\x44\x02\x03\x04\x05") >>> >>> assert p.srv_id == 0x1111 >>> assert p.sub_id == 0x8111 >>> assert p.client_id == 0x3333 >>> assert p.session_id == 0x4444 >>> assert p.proto_ver == 0x02 >>> assert p.iface_ver == 0x03 >>> assert p.msg_type == 0x04 >>> assert p.retcode == 0x05 ###(005)=[passed] Dissect METHOD_ID packet >>> p = SOMEIP(b"\x11\x11\x01\x11\x00\x00\x00\x08\x33\x33\x44\x44\x02\x03\x04\x05") >>> >>> assert p.srv_id == 0x1111 >>> assert p.sub_id == 0x0111 >>> assert p.client_id == 0x3333 >>> assert p.session_id == 0x4444 >>> assert p.proto_ver == 0x02 >>> assert p.iface_ver == 0x03 >>> assert p.msg_type == 0x04 >>> assert p.retcode == 0x05 ###### ## SOME/IP-TP operation ###### ###(006)=[passed] Build TP >>> p = SOMEIP() >>> p.msg_type = 0x20 >>> >>> pstr = bytes(p) >>> print(pstr) b'\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01 \x00\x00\x00\x00\x00' >>> binstr = b'\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x20\x00\x00\x00\x00\x00' >>> assert pstr == binstr >>> >>> p.more_seg = 1 >>> pstr = bytes(p) >>> binstr = b'\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x20\x00\x00\x00\x00\x01' >>> assert pstr == binstr >>> >>> p.msg_type = 0x00 >>> pstr = bytes(p) >>> binstr = b'\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x01\x01\x00\x00' >>> assert pstr == binstr ###(007)=[passed] Dissect TP >>> p = SOMEIP(b'\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x21\x00\x00\x00\x00\x01') >>> >>> assert p.msg_type == 0x21 >>> assert p.more_seg == 1 >>> assert p.len == 12 >>> >>> p.msg_type = 0x00 >>> >>> pstr = bytes(p) >>> binstr = b"\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x00\x00" >>> assert pstr == binstr ###(008)=[passed] Build TP fragmented >>> p = SOMEIP() >>> p.msg_type = 0x20 >>> p.add_payload(Raw("A"*1400)) >>> >>> f = p.fragment() >>> >>> assert f[0].len == 1404 >>> assert f[1].len == 20 >>> assert f[0].payload == Raw("A"*1392) >>> assert f[1].payload == Raw("A"*8) >>> assert f[0].more_seg == 1 >>> assert f[1].more_seg == 0 ###### ## SD Entry Service ###### ###(009)=[passed] Check packet length on empty build >>> p = SDEntry_Service() >>> assert len(bytes(p)) == SDENTRY_OVERALL_LEN ###(010)=[passed] Build 1 >>> p = SDEntry_Service(type = SDENTRY_TYPE_SRV_OFFERSERVICE, ... index_1 = 0x11, index_2 = 0x22, srv_id = 0x3333, ... inst_id = 0x4444, major_ver = 0x55, ... ttl = 0x666666, minor_ver = 0xdeadbeef) >>> p_str = bytes(p) >>> bin_str = b"\x01\x11\x22\x00\x33\x33\x44\x44\x55\x66\x66\x66\xde\xad\xbe\xef" >>> assert p_str == bin_str >>> assert len(p_str) == SDENTRY_OVERALL_LEN ###(011)=[passed] Build 2 >>> p = SDEntry_Service(n_opt_1 = 0xf1, n_opt_2 = 0xf2) >>> p_str = bytes(p) >>> bin_str = b"\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" >>> assert p_str == bin_str >>> assert len(p_str) == SDENTRY_OVERALL_LEN ###(012)=[passed] Dissect >>> p = SDEntry_Service( ... b"\x01\x22\x33\x00\x44\x44\x55\x55\x66\x77\x77\x77\xde\xad\xbe\xef") >>> assert p.type == SDENTRY_TYPE_SRV_OFFERSERVICE >>> assert p.index_1 == 0x22 >>> assert p.index_2 == 0x33 >>> assert p.srv_id == 0x4444 >>> assert p.inst_id == 0x5555 >>> assert p.major_ver == 0x66 >>> assert p.ttl == 0x777777 >>> assert p.minor_ver == 0xdeadbeef ###### ## SD Entry Eventgroup ###### ###(013)=[passed] Check packet length on empty build >>> p = SDEntry_EventGroup() >>> assert len(bytes(p)) == SDENTRY_OVERALL_LEN ###(014)=[passed] Build >>> p = SDEntry_EventGroup(index_1 = 0x11, index_2 = 0x22, srv_id = 0x3333, ... inst_id = 0x4444, major_ver = 0x55, ttl = 0x666666, ... cnt = 0x7, eventgroup_id = 0x8888) >>> p_str = bytes(p) >>> bin_str = b"\x06\x11\x22\x00\x33\x33\x44\x44\x55\x66\x66\x66\x00\x07\x88\x88" >>> assert p_str == bin_str >>> assert len(bytes(p)) == SDENTRY_OVERALL_LEN ###(015)=[passed] Dissect >>> p = SDEntry_EventGroup( ... b"\x06\x11\x22\x00\x33\x33\x44\x44\x55\x66\x66\x66\x00\x07\x88\x88") >>> assert p.index_1 == 0x11 >>> assert p.index_2 == 0x22 >>> assert p.srv_id == 0x3333 >>> assert p.inst_id == 0x4444 >>> assert p.major_ver == 0x55 >>> assert p.ttl == 0x666666 >>> assert p.cnt == 0x7 >>> assert p.eventgroup_id == 0x8888 ###### ## SD Flags ###### ###(016)=[passed] Build and check flags >>> p = SD() >>> p.flags = "REBOOT" >>> assert p.flags == 0x80 >>> >>> p.flags = "" >>> assert p.flags == 0x00 >>> >>> p.flags = "UNICAST" >>> assert p.flags == 0x40 >>> >>> p.flags = "" >>> assert p.flags == 0x00 >>> >>> p.flags = "EXPLICIT_INITIAL_DATA_CONTROL" >>> assert p.flags == 0x20 >>> >>> p.flags = "" >>> assert p.flags == 0x00 >>> >>> p.flags = "REBOOT+UNICAST+EXPLICIT_INITIAL_DATA_CONTROL" >>> assert p.flags == 0xe0 ###### ## SD Get SOME/IP Packet ###### ###(017)=[passed] Build empty >>> p = SOMEIP() / SD() >>> assert len(bytes(p)) == SOMEIP._OVERALL_LEN_NOPAYLOAD + 12 ###(018)=[passed] Verify constants against spec TR_SOMEIP_00250 >>> assert SD.SOMEIP_MSGID_SRVID == 0xffff >>> assert SD.SOMEIP_MSGID_SUBID == 0x8100 >>> assert SD.SOMEIP_CLIENT_ID == 0x0000 >>> assert SD.SOMEIP_MINIMUM_SESSION_ID == 0x0001 >>> assert SD.SOMEIP_PROTO_VER == 0x01 >>> assert SD.SOMEIP_IFACE_VER == 0x01 >>> assert SD.SOMEIP_MSG_TYPE == 0x02 >>> assert SD.SOMEIP_RETCODE == 0x00 ###(019)=[passed] check that values are bound >>> assert p[SOMEIP].srv_id == SD.SOMEIP_MSGID_SRVID >>> assert p[SOMEIP].sub_id == SD.SOMEIP_MSGID_SUBID >>> assert p[SOMEIP].client_id == SD.SOMEIP_CLIENT_ID >>> assert p[SOMEIP].session_id != 0x0000 >>> assert p[SOMEIP].session_id >= SD.SOMEIP_MINIMUM_SESSION_ID >>> assert p[SOMEIP].proto_ver == SD.SOMEIP_PROTO_VER >>> assert p[SOMEIP].iface_ver == SD.SOMEIP_IFACE_VER >>> assert p[SOMEIP].msg_type == SD.SOMEIP_MSG_TYPE >>> assert p[SOMEIP].retcode == SD.SOMEIP_RETCODE ###### ## SD ###### ###(020)=[passed] Check length of package without entries nor options >>> p = SD() >>> assert len(bytes(p)) == 12 ###(021)=[passed] Check entries to array and size check >>> p.set_entryArray([SDEntry_Service(), SDEntry_EventGroup()]) >>> assert struct.unpack("!L", bytes(p)[4:8])[0] == 32 >>> >>> p.set_entryArray([]) >>> assert struct.unpack("!L", bytes(p)[4:8])[0] == 0 ###(022)=[passed] Check Options to array and size check >>> p.set_optionArray([SDOption_IP4_EndPoint(), SDOption_IP4_EndPoint()]) >>> assert struct.unpack("!L", bytes(p)[8:12])[0] == 24 >>> >>> p.set_optionArray([]) >>> assert struct.unpack("!L", bytes(p)[8:12])[0] == 0 ###(023)=[passed] Check Entries & Options to array and size check >>> p.set_entryArray([SDEntry_Service(), SDEntry_EventGroup()]) >>> p.set_optionArray([SDOption_IP4_EndPoint(), SDOption_IP4_EndPoint()]) >>> >>> assert struct.unpack("!L", bytes(p)[4:8])[0] == 32 >>> assert struct.unpack("!L", bytes(p)[40:44])[0] == 24 ###### ## Git issue 2348: SOME/IP-SD Entry-Array is broken by building it from RAW ###### ###(024)=[passed] Single SD entry >>> ea1 = SDEntry_Service() >>> ea1.type = 1 >>> ea1.srv_id = 0x1234 >>> ea1.inst_id = 0x5678 >>> ea1.ttl = 0x333333 >>> >>> ea2 = SDEntry_EventGroup() >>> ea2.type = 0x6 >>> ea2.srv_id = 0x8765 >>> ea2.inst_id = 0x4321 >>> ea2.ttl = 0x222222 >>> ea2.eventgroup_id = 0x1357 >>> >>> sd1 = SD() >>> sd1.set_entryArray([ea1]) >>> sd1.len_entry_array = 16 >>> sd1.len_option_array = 0 >>> >>> assert sd1.show(dump=True) == SD(sd1.build()).show(dump=True) ###(025)=[passed] Double SD entry >>> sd2 = SD() >>> sd2.set_entryArray([ea2,ea1]) >>> sd2.len_entry_array = 32 >>> sd2.len_option_array = 0 >>> >>> assert sd2.show(dump=True) == SD(sd2.build()).show(dump=True) ###(026)=[passed] Flipped double SD entry >>> sd2.set_entryArray([ea1,ea2]) >>> assert sd2.show(dump=True) == SD(sd2.build()).show(dump=True) ###### ## SD Options (individual) ###### ###(027)=[passed] Verifying constants against spec >>> assert SDOPTION_CFG_TYPE == 0x01 >>> assert SDOPTION_LOADBALANCE_TYPE == 0x02 >>> assert SDOPTION_LOADBALANCE_LEN == 0x05 >>> assert SDOPTION_IP4_ENDPOINT_TYPE == 0x04 >>> assert SDOPTION_IP4_ENDPOINT_LEN == 0x0009 >>> assert SDOPTION_IP4_MCAST_TYPE == 0x14 >>> assert SDOPTION_IP4_MCAST_LEN == 0x0009 >>> assert SDOPTION_IP4_SDENDPOINT_TYPE == 0x24 >>> assert SDOPTION_IP4_SDENDPOINT_LEN == 0x0009 >>> assert SDOPTION_IP6_ENDPOINT_TYPE == 0x06 >>> assert SDOPTION_IP6_ENDPOINT_LEN == 0x0015 >>> assert SDOPTION_IP6_MCAST_TYPE == 0x16 >>> assert SDOPTION_IP6_MCAST_LEN == 0x0015 >>> assert SDOPTION_IP6_SDENDPOINT_TYPE == 0x26 >>> assert SDOPTION_IP6_SDENDPOINT_LEN == 0x0015 ###(028)=[passed] SDOption_Config: Verify make_string() method from dict >>> data = { "hello": "world" } >>> out = SDOption_Config.make_string(data) >>> assert out == b"\x0bhello=world\x00" ###(029)=[passed] SDOption_Config: Verify make_string() method from list >>> data = [ ... ("x", "y"), ... ("abc", "def"), ... ("123", "456") ... ] >>> out = SDOption_Config.make_string(data) >>> assert out == b"\x03x=y\x07abc=def\x07123=456\x00" ###(030)=[passed] SDOption_Config: Build and dissect empty >>> opt = SDOption_Config() >>> optraw = opt.build() >>> assert optraw == b"\x00\x02\x01\x00\x00" >>> >>> opt = SDOption_Config(optraw) >>> assert opt.len == 0x2 >>> assert opt.type == SDOPTION_CFG_TYPE >>> assert opt.res_hdr == 0x0 >>> assert opt.cfg_str == b"\x00" ###(031)=[passed] SDOption_Config: Build and dissect spec example >>> tststr = b"\x05abc=x\x07def=123\x00" >>> opt = SDOption_Config(cfg_str=tststr) >>> optraw = opt.build() >>> assert optraw == b"\x00\x10\x01\x00" + tststr >>> >>> opt = SDOption_Config(optraw) >>> assert opt.len == 0x10 >>> assert opt.type == SDOPTION_CFG_TYPE >>> assert opt.res_hdr == 0x00 >>> assert opt.cfg_str == tststr ###(032)=[passed] SDOption_Config: Build and dissect fully populated >>> tststr = b"abcdefghijklmnopqrstuvwxyz" >>> opt = SDOption_Config(len=0x1234, type=0x56, res_hdr=0x78, cfg_str=tststr) >>> optraw = opt.build() >>> assert optraw == b"\x12\x34\x56\x78" + tststr >>> >>> opt = SDOption_Config(optraw) >>> assert opt.len == 0x1234 >>> assert opt.type == 0x56 >>> assert opt.res_hdr == 0x78 >>> assert opt.cfg_str == tststr ###(033)=[passed] SDOption_LoadBalance: Build and dissect empty >>> opt = SDOption_LoadBalance() >>> optraw = opt.build() >>> assert optraw == b"\x00\x05\x02\x00\x00\x00\x00\x00" >>> >>> opt = SDOption_LoadBalance(optraw) >>> assert opt.len == SDOPTION_LOADBALANCE_LEN >>> assert opt.type == SDOPTION_LOADBALANCE_TYPE >>> assert opt.res_hdr == 0x0 >>> assert opt.priority == 0x0 >>> assert opt.weight == 0x0 ###(034)=[passed] SDOption_LoadBalance: Build and dissect example >>> opt = SDOption_LoadBalance(priority=0x1234, weight=0x5678) >>> optraw = opt.build() >>> assert optraw == b"\x00\x05\x02\x00\x12\x34\x56\x78" >>> >>> opt = SDOption_LoadBalance(optraw) >>> assert opt.len == SDOPTION_LOADBALANCE_LEN >>> assert opt.type == SDOPTION_LOADBALANCE_TYPE >>> assert opt.res_hdr == 0x00 >>> assert opt.priority == 0x1234 >>> assert opt.weight == 0x5678 ###(035)=[passed] SDOption_LoadBalance: Build and dissect fully populated >>> opt = SDOption_LoadBalance(len=0x1234, type=0x56, res_hdr=0x78, priority=0x9abc, weight=0xdef0) >>> optraw = opt.build() >>> assert optraw == b"\x12\x34\x56\x78\x9a\xbc\xde\xf0" >>> >>> opt = SDOption_LoadBalance(optraw) >>> assert opt.len == 0x1234 >>> assert opt.type == 0x56 >>> assert opt.res_hdr == 0x78 >>> assert opt.priority == 0x9abc >>> assert opt.weight == 0xdef0 ###(036)=[passed] SDOption_IP4_EndPoint: Build and dissect empty >>> opt = SDOption_IP4_EndPoint() >>> optraw = opt.build() >>> assert optraw == b"\x00\x09\x04\x00\x00\x00\x00\x00\x00\x11\x00\x00" >>> >>> opt = SDOption_IP4_EndPoint(optraw) >>> assert opt.len == SDOPTION_IP4_ENDPOINT_LEN >>> assert opt.type == SDOPTION_IP4_ENDPOINT_TYPE >>> assert opt.res_hdr == 0x0 >>> assert opt.addr == "0.0.0.0" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x11 >>> assert opt.port == 0x0 ###(037)=[passed] SDOption_IP4_EndPoint: Build and dissect example >>> opt = SDOption_IP4_EndPoint(addr = "192.168.123.45", l4_proto = "TCP", port = 0x1234) >>> optraw = opt.build() >>> assert optraw == b"\x00\x09\x04\x00\xc0\xa8\x7b\x2d\x00\x06\x12\x34" >>> >>> opt = SDOption_IP4_EndPoint(optraw) >>> assert opt.len == SDOPTION_IP4_ENDPOINT_LEN >>> assert opt.type == SDOPTION_IP4_ENDPOINT_TYPE >>> assert opt.res_hdr == 0x00 >>> assert opt.addr == "192.168.123.45" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x06 >>> assert opt.port == 0x1234 ###(038)=[passed] SDOption_IP4_EndPoint: Build and dissect fully populated >>> opt = SDOption_IP4_EndPoint(len=0x1234, type=0x56, res_hdr=0x78, addr = "11.22.33.44", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0) >>> optraw = opt.build() >>> assert optraw == b"\x12\x34\x56\x78\x0b\x16\x21\x2c\x9a\xbc\xde\xf0" >>> >>> opt = SDOption_IP4_EndPoint(optraw) >>> assert opt.len == 0x1234 >>> assert opt.type == 0x56 >>> assert opt.res_hdr == 0x78 >>> assert opt.addr == "11.22.33.44" >>> assert opt.res_tail == 0x9a >>> assert opt.l4_proto == 0xbc >>> assert opt.port == 0xdef0 ###(039)=[passed] SDOption_IP4_Multicast: Build and dissect empty >>> opt = SDOption_IP4_Multicast() >>> optraw = opt.build() >>> assert optraw == b"\x00\x09\x14\x00\x00\x00\x00\x00\x00\x11\x00\x00" >>> >>> opt = SDOption_IP4_Multicast(optraw) >>> assert opt.len == SDOPTION_IP4_MCAST_LEN >>> assert opt.type == SDOPTION_IP4_MCAST_TYPE >>> assert opt.res_hdr == 0x0 >>> assert opt.addr == "0.0.0.0" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x11 >>> assert opt.port == 0x0 ###(040)=[passed] SDOption_IP4_Multicast: Build and dissect example >>> opt = SDOption_IP4_Multicast(addr = "192.168.123.45", l4_proto = "TCP", port = 0x1234) >>> optraw = opt.build() >>> assert optraw == b"\x00\x09\x14\x00\xc0\xa8\x7b\x2d\x00\x06\x12\x34" >>> >>> opt = SDOption_IP4_Multicast(optraw) >>> assert opt.len == SDOPTION_IP4_MCAST_LEN >>> assert opt.type == SDOPTION_IP4_MCAST_TYPE >>> assert opt.res_hdr == 0x00 >>> assert opt.addr == "192.168.123.45" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x06 >>> assert opt.port == 0x1234 ###(041)=[passed] SDOption_IP4_Multicast: Build and dissect fully populated >>> opt = SDOption_IP4_Multicast(len=0x1234, type=0x56, res_hdr=0x78, addr = "11.22.33.44", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0) >>> optraw = opt.build() >>> assert optraw == b"\x12\x34\x56\x78\x0b\x16\x21\x2c\x9a\xbc\xde\xf0" >>> >>> opt = SDOption_IP4_Multicast(optraw) >>> assert opt.len == 0x1234 >>> assert opt.type == 0x56 >>> assert opt.res_hdr == 0x78 >>> assert opt.addr == "11.22.33.44" >>> assert opt.res_tail == 0x9a >>> assert opt.l4_proto == 0xbc >>> assert opt.port == 0xdef0 ###(042)=[passed] SDOption_IP4_SD_EndPoint: Build and dissect empty >>> opt = SDOption_IP4_SD_EndPoint() >>> optraw = opt.build() >>> assert optraw == b"\x00\x09\x24\x00\x00\x00\x00\x00\x00\x11\x00\x00" >>> >>> opt = SDOption_IP4_SD_EndPoint(optraw) >>> assert opt.len == SDOPTION_IP4_SDENDPOINT_LEN >>> assert opt.type == SDOPTION_IP4_SDENDPOINT_TYPE >>> assert opt.res_hdr == 0x0 >>> assert opt.addr == "0.0.0.0" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x11 >>> assert opt.port == 0x0 ###(043)=[passed] SDOption_IP4_SD_EndPoint: Build and dissect example >>> opt = SDOption_IP4_SD_EndPoint(addr = "192.168.123.45", l4_proto = "TCP", port = 0x1234) >>> optraw = opt.build() >>> assert optraw == b"\x00\x09\x24\x00\xc0\xa8\x7b\x2d\x00\x06\x12\x34" >>> >>> opt = SDOption_IP4_SD_EndPoint(optraw) >>> assert opt.len == SDOPTION_IP4_SDENDPOINT_LEN >>> assert opt.type == SDOPTION_IP4_SDENDPOINT_TYPE >>> assert opt.res_hdr == 0x00 >>> assert opt.addr == "192.168.123.45" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x06 >>> assert opt.port == 0x1234 ###(044)=[passed] SDOption_IP4_SD_EndPoint: Build and dissect fully populated >>> opt = SDOption_IP4_SD_EndPoint(len=0x1234, type=0x56, res_hdr=0x78, addr = "11.22.33.44", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0) >>> optraw = opt.build() >>> assert optraw == b"\x12\x34\x56\x78\x0b\x16\x21\x2c\x9a\xbc\xde\xf0" >>> >>> opt = SDOption_IP4_SD_EndPoint(optraw) >>> assert opt.len == 0x1234 >>> assert opt.type == 0x56 >>> assert opt.res_hdr == 0x78 >>> assert opt.addr == "11.22.33.44" >>> assert opt.res_tail == 0x9a >>> assert opt.l4_proto == 0xbc >>> assert opt.port == 0xdef0 ###(045)=[passed] SDOption_IP6_EndPoint: Build and dissect empty >>> opt = SDOption_IP6_EndPoint() >>> optraw = opt.build() >>> assert optraw == b"\x00\x15\x06\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x11\x00\x00" >>> >>> opt = SDOption_IP6_EndPoint(optraw) >>> assert opt.len == SDOPTION_IP6_ENDPOINT_LEN >>> assert opt.type == SDOPTION_IP6_ENDPOINT_TYPE >>> assert opt.res_hdr == 0x0 >>> assert opt.addr == "::" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x11 >>> assert opt.port == 0x0 ###(046)=[passed] SDOption_IP6_EndPoint: Build and dissect example >>> opt = SDOption_IP6_EndPoint(addr = "2001:cdba::3257:9652", l4_proto = "TCP", port = 0x1234) >>> optraw = opt.build() >>> assert optraw == b"\x00\x15\x06\x00" + b"\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52" + b"\x00\x06\x12\x34" >>> >>> opt = SDOption_IP6_EndPoint(optraw) >>> assert opt.len == SDOPTION_IP6_ENDPOINT_LEN >>> assert opt.type == SDOPTION_IP6_ENDPOINT_TYPE >>> assert opt.res_hdr == 0x00 >>> assert opt.addr == "2001:cdba::3257:9652" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x06 >>> assert opt.port == 0x1234 ###(047)=[passed] SDOption_IP6_EndPoint: Build and dissect fully populated >>> opt = SDOption_IP6_EndPoint(len=0x1234, type=0x56, res_hdr=0x78, addr = "1234:5678:9abc:def0:0fed:cba9:8765:4321", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0) >>> optraw = opt.build() >>> assert optraw == b"\x12\x34\x56\x78" + b"\x12\x34\x56\x78\x9a\xbc\xde\xf0\x0f\xed\xcb\xa9\x87\x65\x43\x21" + b"\x9a\xbc\xde\xf0" >>> >>> opt = SDOption_IP6_EndPoint(optraw) >>> assert opt.len == 0x1234 >>> assert opt.type == 0x56 >>> assert opt.res_hdr == 0x78 >>> assert opt.addr == "1234:5678:9abc:def0:fed:cba9:8765:4321" >>> assert opt.res_tail == 0x9a >>> assert opt.l4_proto == 0xbc >>> assert opt.port == 0xdef0 ###(048)=[passed] SDOption_IP6_Multicast: Build and dissect empty >>> opt = SDOption_IP6_Multicast() >>> optraw = opt.build() >>> assert optraw == b"\x00\x15\x16\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x11\x00\x00" >>> >>> opt = SDOption_IP6_Multicast(optraw) >>> assert opt.len == SDOPTION_IP6_MCAST_LEN >>> assert opt.type == SDOPTION_IP6_MCAST_TYPE >>> assert opt.res_hdr == 0x0 >>> assert opt.addr == "::" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x11 >>> assert opt.port == 0x0 ###(049)=[passed] SDOption_IP6_Multicast: Build and dissect example >>> opt = SDOption_IP6_Multicast(addr = "2001:cdba::3257:9652", l4_proto = "TCP", port = 0x1234) >>> optraw = opt.build() >>> assert optraw == b"\x00\x15\x16\x00" + b"\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52" + b"\x00\x06\x12\x34" >>> >>> opt = SDOption_IP6_Multicast(optraw) >>> assert opt.len == SDOPTION_IP6_MCAST_LEN >>> assert opt.type == SDOPTION_IP6_MCAST_TYPE >>> assert opt.res_hdr == 0x00 >>> assert opt.addr == "2001:cdba::3257:9652" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x06 >>> assert opt.port == 0x1234 ###(050)=[passed] SDOption_IP6_Multicast: Build and dissect fully populated >>> opt = SDOption_IP6_Multicast(len=0x1234, type=0x56, res_hdr=0x78, addr = "1234:5678:9abc:def0:0fed:cba9:8765:4321", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0) >>> optraw = opt.build() >>> assert optraw == b"\x12\x34\x56\x78" + b"\x12\x34\x56\x78\x9a\xbc\xde\xf0\x0f\xed\xcb\xa9\x87\x65\x43\x21" + b"\x9a\xbc\xde\xf0" >>> >>> opt = SDOption_IP6_Multicast(optraw) >>> assert opt.len == 0x1234 >>> assert opt.type == 0x56 >>> assert opt.res_hdr == 0x78 >>> assert opt.addr == "1234:5678:9abc:def0:fed:cba9:8765:4321" >>> assert opt.res_tail == 0x9a >>> assert opt.l4_proto == 0xbc >>> assert opt.port == 0xdef0 ###(051)=[passed] SDOption_IP6_SD_EndPoint: Build and dissect empty >>> opt = SDOption_IP6_SD_EndPoint() >>> optraw = opt.build() >>> assert optraw == b"\x00\x15\x26\x00" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x11\x00\x00" >>> >>> opt = SDOption_IP6_SD_EndPoint(optraw) >>> assert opt.len == SDOPTION_IP6_SDENDPOINT_LEN >>> assert opt.type == SDOPTION_IP6_SDENDPOINT_TYPE >>> assert opt.res_hdr == 0x0 >>> assert opt.addr == "::" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x11 >>> assert opt.port == 0x0 ###(052)=[passed] SDOption_IP6_SD_EndPoint: Build and dissect example >>> opt = SDOption_IP6_SD_EndPoint(addr = "2001:cdba::3257:9652", l4_proto = "TCP", port = 0x1234) >>> optraw = opt.build() >>> assert optraw == b"\x00\x15\x26\x00" + b"\x20\x01\xcd\xba\x00\x00\x00\x00\x00\x00\x00\x00\x32\x57\x96\x52" + b"\x00\x06\x12\x34" >>> >>> opt = SDOption_IP6_SD_EndPoint(optraw) >>> assert opt.len == SDOPTION_IP6_SDENDPOINT_LEN >>> assert opt.type == SDOPTION_IP6_SDENDPOINT_TYPE >>> assert opt.res_hdr == 0x00 >>> assert opt.addr == "2001:cdba::3257:9652" >>> assert opt.res_tail == 0x0 >>> assert opt.l4_proto == 0x06 >>> assert opt.port == 0x1234 ###(053)=[passed] SDOption_IP6_SD_EndPoint: Build and dissect fully populated >>> opt = SDOption_IP6_SD_EndPoint(len=0x1234, type=0x56, res_hdr=0x78, addr = "1234:5678:9abc:def0:0fed:cba9:8765:4321", res_tail = 0x9a, l4_proto = 0xbc, port = 0xdef0) >>> optraw = opt.build() >>> assert optraw == b"\x12\x34\x56\x78" + b"\x12\x34\x56\x78\x9a\xbc\xde\xf0\x0f\xed\xcb\xa9\x87\x65\x43\x21" + b"\x9a\xbc\xde\xf0" >>> >>> opt = SDOption_IP6_SD_EndPoint(optraw) >>> assert opt.len == 0x1234 >>> assert opt.type == 0x56 >>> assert opt.res_hdr == 0x78 >>> assert opt.addr == "1234:5678:9abc:def0:fed:cba9:8765:4321" >>> assert opt.res_tail == 0x9a >>> assert opt.l4_proto == 0xbc >>> assert opt.port == 0xdef0 ###(054)=[passed] verify building and parsing of multiple SDOptions >>> def _opts_check(opts): ... optslen = sum([len(o) for o in opts]) ... sd = SD() ... sd.set_optionArray(opts) ... sd.len_entry_array = 0 ... sd.len_option_array = optslen ... sd.show() ... SD(sd.build()).show() ... assert sd.show(dump=True) == SD(sd.build()).show(dump=True) ... >>> opts = [ ... SDOption_Config(SDOption_Config(cfg_str="hello world").build()), ... SDOption_LoadBalance(SDOption_LoadBalance().build()), ... SDOption_IP4_EndPoint(SDOption_IP4_EndPoint().build()), ... SDOption_IP4_Multicast(SDOption_IP4_Multicast().build()), ... SDOption_IP4_SD_EndPoint(SDOption_IP4_SD_EndPoint().build()), ... SDOption_IP6_EndPoint(SDOption_IP6_EndPoint().build()), ... SDOption_IP6_Multicast(SDOption_IP6_Multicast().build()), ... SDOption_IP6_SD_EndPoint(SDOption_IP6_SD_EndPoint().build()), ... ] >>> _opts_check(opts[0:0]) ###[ SD ]### flags = res = 0x0 len_entry_array= 0 \entry_array\ len_option_array= 0 \option_array\ ###[ SD ]### flags = res = 0x0 len_entry_array= 0 \entry_array\ len_option_array= 0 \option_array\ >>> _opts_check(opts[0:2]) ###[ SD ]### flags = res = 0x0 len_entry_array= 0 \entry_array\ len_option_array= 23 \option_array\ |###[ Config Option ]### | len = 12 | type = Configuration | res_hdr = 0x0 | cfg_str = b'hello world' |###[ LoadBalance Option ]### | len = 5 | type = LoadBalancing | res_hdr = 0x0 | priority = 0 | weight = 0 ###[ SD ]### flags = res = 0x0 len_entry_array= 0 \entry_array\ len_option_array= 23 \option_array\ |###[ Config Option ]### | len = 12 | type = Configuration | res_hdr = 0x0 | cfg_str = b'hello world' |###[ LoadBalance Option ]### | len = 5 | type = LoadBalancing | res_hdr = 0x0 | priority = 0 | weight = 0 >>> _opts_check(opts) ###[ SD ]### flags = res = 0x0 len_entry_array= 0 \entry_array\ len_option_array= 131 \option_array\ |###[ Config Option ]### | len = 12 | type = Configuration | res_hdr = 0x0 | cfg_str = b'hello world' |###[ LoadBalance Option ]### | len = 5 | type = LoadBalancing | res_hdr = 0x0 | priority = 0 | weight = 0 |###[ IP4 EndPoint Option ]### | len = 9 | type = IPv4Endpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 Multicast Option ]### | len = 9 | type = IPv4MultiCast | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 SDEndPoint Option ]### | len = 9 | type = IPv4SDEndpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 EndPoint Option ]### | len = 21 | type = IPv6Endpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 Multicast Option ]### | len = 21 | type = IPv6MultiCast | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 SDEndPoint Option ]### | len = 21 | type = IPv6SDEndpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 ###[ SD ]### flags = res = 0x0 len_entry_array= 0 \entry_array\ len_option_array= 131 \option_array\ |###[ Config Option ]### | len = 12 | type = Configuration | res_hdr = 0x0 | cfg_str = b'hello world' |###[ LoadBalance Option ]### | len = 5 | type = LoadBalancing | res_hdr = 0x0 | priority = 0 | weight = 0 |###[ IP4 EndPoint Option ]### | len = 9 | type = IPv4Endpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 Multicast Option ]### | len = 9 | type = IPv4MultiCast | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 SDEndPoint Option ]### | len = 9 | type = IPv4SDEndpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 EndPoint Option ]### | len = 21 | type = IPv6Endpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 Multicast Option ]### | len = 21 | type = IPv6MultiCast | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 SDEndPoint Option ]### | len = 21 | type = IPv6SDEndpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 >>> _opts_check(opts[::-1]) ###[ SD ]### flags = res = 0x0 len_entry_array= 0 \entry_array\ len_option_array= 131 \option_array\ |###[ IP6 SDEndPoint Option ]### | len = 21 | type = IPv6SDEndpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 Multicast Option ]### | len = 21 | type = IPv6MultiCast | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 EndPoint Option ]### | len = 21 | type = IPv6Endpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 SDEndPoint Option ]### | len = 9 | type = IPv4SDEndpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 Multicast Option ]### | len = 9 | type = IPv4MultiCast | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 EndPoint Option ]### | len = 9 | type = IPv4Endpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ LoadBalance Option ]### | len = 5 | type = LoadBalancing | res_hdr = 0x0 | priority = 0 | weight = 0 |###[ Config Option ]### | len = 12 | type = Configuration | res_hdr = 0x0 | cfg_str = b'hello world' ###[ SD ]### flags = res = 0x0 len_entry_array= 0 \entry_array\ len_option_array= 131 \option_array\ |###[ IP6 SDEndPoint Option ]### | len = 21 | type = IPv6SDEndpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 Multicast Option ]### | len = 21 | type = IPv6MultiCast | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 EndPoint Option ]### | len = 21 | type = IPv6Endpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 SDEndPoint Option ]### | len = 9 | type = IPv4SDEndpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 Multicast Option ]### | len = 9 | type = IPv4MultiCast | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 EndPoint Option ]### | len = 9 | type = IPv4Endpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ LoadBalance Option ]### | len = 5 | type = LoadBalancing | res_hdr = 0x0 | priority = 0 | weight = 0 |###[ Config Option ]### | len = 12 | type = Configuration | res_hdr = 0x0 | cfg_str = b'hello world' >>> _opts_check(opts + opts[::-1]) ###[ SD ]### flags = res = 0x0 len_entry_array= 0 \entry_array\ len_option_array= 262 \option_array\ |###[ Config Option ]### | len = 12 | type = Configuration | res_hdr = 0x0 | cfg_str = b'hello world' |###[ LoadBalance Option ]### | len = 5 | type = LoadBalancing | res_hdr = 0x0 | priority = 0 | weight = 0 |###[ IP4 EndPoint Option ]### | len = 9 | type = IPv4Endpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 Multicast Option ]### | len = 9 | type = IPv4MultiCast | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 SDEndPoint Option ]### | len = 9 | type = IPv4SDEndpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 EndPoint Option ]### | len = 21 | type = IPv6Endpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 Multicast Option ]### | len = 21 | type = IPv6MultiCast | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 SDEndPoint Option ]### | len = 21 | type = IPv6SDEndpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 SDEndPoint Option ]### | len = 21 | type = IPv6SDEndpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 Multicast Option ]### | len = 21 | type = IPv6MultiCast | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 EndPoint Option ]### | len = 21 | type = IPv6Endpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 SDEndPoint Option ]### | len = 9 | type = IPv4SDEndpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 Multicast Option ]### | len = 9 | type = IPv4MultiCast | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 EndPoint Option ]### | len = 9 | type = IPv4Endpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ LoadBalance Option ]### | len = 5 | type = LoadBalancing | res_hdr = 0x0 | priority = 0 | weight = 0 |###[ Config Option ]### | len = 12 | type = Configuration | res_hdr = 0x0 | cfg_str = b'hello world' ###[ SD ]### flags = res = 0x0 len_entry_array= 0 \entry_array\ len_option_array= 262 \option_array\ |###[ Config Option ]### | len = 12 | type = Configuration | res_hdr = 0x0 | cfg_str = b'hello world' |###[ LoadBalance Option ]### | len = 5 | type = LoadBalancing | res_hdr = 0x0 | priority = 0 | weight = 0 |###[ IP4 EndPoint Option ]### | len = 9 | type = IPv4Endpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 Multicast Option ]### | len = 9 | type = IPv4MultiCast | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 SDEndPoint Option ]### | len = 9 | type = IPv4SDEndpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 EndPoint Option ]### | len = 21 | type = IPv6Endpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 Multicast Option ]### | len = 21 | type = IPv6MultiCast | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 SDEndPoint Option ]### | len = 21 | type = IPv6SDEndpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 SDEndPoint Option ]### | len = 21 | type = IPv6SDEndpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 Multicast Option ]### | len = 21 | type = IPv6MultiCast | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP6 EndPoint Option ]### | len = 21 | type = IPv6Endpoint | res_hdr = 0x0 | addr = :: | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 SDEndPoint Option ]### | len = 9 | type = IPv4SDEndpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 Multicast Option ]### | len = 9 | type = IPv4MultiCast | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ IP4 EndPoint Option ]### | len = 9 | type = IPv4Endpoint | res_hdr = 0x0 | addr = 0.0.0.0 | res_tail = 0x0 | l4_proto = UDP | port = 0 |###[ LoadBalance Option ]### | len = 5 | type = LoadBalancing | res_hdr = 0x0 | priority = 0 | weight = 0 |###[ Config Option ]### | len = 12 | type = Configuration | res_hdr = 0x0 | cfg_str = b'hello world' ###(055)=[passed] build test SOMEIP/TP >>> p = SOMEIP(srv_id=1234, sub_id=4321, msg_type=0xff, retcode=0xff, offset=4294967040, data=[Raw(b"deadbeef")]) >>> >>> assert p.data[0].load == b"deadbeef" Regression tests for TestSocket ━ Run at 01:43:18 from [test/contrib/automotive/testsocket.uts] by UTscapy in 1.7587029933929443 └ Passed=7 └ Failed=0 ###### ## Configuration ###### ###(000)=[passed] Imports >>> from test.testsocket import TestSocket, cleanup_testsockets ###(001)=[passed] Create Dummy Packet >>> class TestPacket(Packet): ... fields_desc = [ ... IntField("identifier", 0), ... StrField("data", b"") ... ] ... def answers(self, other): ... if other.__class__ != self.__class__: ... return False ... if self.identifier % 2: ... return False ... if self.identifier == (other.identifier + 1): ... return True ... return False ... def hashret(self): ... return struct.pack('I', self.identifier + (self.identifier % 2)) ... ###(002)=[passed] Create Sockets >>> sender = TestSocket(TestPacket) >>> receiver = TestSocket(TestPacket) >>> sender.pair(receiver) ###### ## Basic tests ###### ###(003)=[passed] Simple ping pong >>> def create_answer(p): ... ans = TestPacket(identifier=p.identifier + 1, data=p.data + b"_answer") ... receiver.send(ans) ... >>> t = AsyncSniffer(timeout=50, prn=create_answer, opened_socket=receiver) >>> t.start() >>> >>> pks = PacketList() >>> >>> for i in range(1, 2000, 2): ... txp = TestPacket(identifier=i, data=b"hello"*i) ... rxp = sender.sr1(txp, verbose=False, timeout=0.5) ... pks.append(txp) ... pks.append(rxp) ... >>> t.stop(join=True) >>> convs = pks.sr() >>> >>> sender.close() >>> receiver.close() >>> >>> assert len(t.results) == 1000 >>> assert len(pks) == 2000 >>> assert len(convs[0]) == 1000 ###(004)=[passed] Simple ping pong with sr with packet generator 500 >>> testlen = 500 >>> >>> sender = TestSocket(TestPacket) >>> receiver = TestSocket(TestPacket) >>> sender.pair(receiver) >>> >>> t = AsyncSniffer(timeout=10, prn=create_answer, opened_socket=receiver) >>> t.start() >>> >>> txp = TestPacket(identifier=range(1, testlen * 2, 2), data=b"test1") >>> rxp = sender.sr(txp, timeout=10, verbose=False, prebuild=True) >>> t.stop(join=True) >>> >>> print(rxp) (, ) >>> print(rxp[0].summary()) TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket TestPacket ==> TestPacket None >>> >>> sender.close() >>> receiver.close() >>> >>> assert len(t.results) == testlen >>> assert len(rxp[0]) == testlen ###(005)=[passed] Simple ping pong with sr with generated packets >>> sender = TestSocket(TestPacket) >>> receiver = TestSocket(TestPacket) >>> sender.pair(receiver) >>> >>> t = AsyncSniffer(timeout=10, prn=create_answer, opened_socket=receiver) >>> t.start() >>> >>> txp = [TestPacket(identifier=i, data=b"hello") for i in range(1, 2000, 2)] >>> rxp = sender.sr(txp, timeout=10, verbose=False) >>> t.stop(join=True) >>> >>> print(rxp) (, ) >>> assert len(t.results) == 1000 >>> assert len(rxp[0]) == 1000 ###### ## Cleanup ###### ###(006)=[passed] Delete TestSockets >>> cleanup_testsockets() Regression tests for the UDS layer ━ Run at 01:43:18 from [test/contrib/automotive/uds.uts] by UTscapy in 0.3892052173614502 └ Passed=159 └ Failed=0 ###### ## Basic operations ###### ###(000)=[passed] Load module >>> load_contrib("automotive.uds", globals_dict=globals()) >>> load_contrib("automotive.ecu", globals_dict=globals()) >>> >>> from scapy.contrib.automotive.uds_ecu_states import * ###(001)=[passed] Check if positive response answers >>> dsc = UDS(b'\x10') >>> dscpr = UDS(b'\x50') >>> assert dscpr.answers(dsc) ###(002)=[passed] Check hashret >>> dsc.hashret() == dscpr.hashret() True ###(003)=[passed] Check if negative response answers >>> dsc = UDS(b'\x10') >>> neg = UDS(b'\x7f\x10\x00') >>> assert neg.answers(dsc) ###(004)=[passed] CHECK hashret NEG >>> dsc.hashret() == neg.hashret() True ###(005)=[passed] Check if negative response answers not >>> dsc = UDS(b'\x10') >>> neg = UDS(b'\x7f\x11\x00') >>> assert not neg.answers(dsc) ###(006)=[passed] Check if positive response answers not >>> dsc = UDS(b'\x10') >>> somePacket = UDS(b'\x49') >>> assert not somePacket.answers(dsc) ###(007)=[passed] Check UDS_DSC >>> dsc = UDS(b'\x10\x01') >>> assert dsc.service == 0x10 >>> assert dsc.diagnosticSessionType == 0x01 ###(008)=[passed] Check UDS_DSC >>> dsc = UDS()/UDS_DSC(b'\x01') >>> assert dsc.service == 0x10 >>> assert dsc.diagnosticSessionType == 0x01 ###(009)=[passed] Check UDS_DSCPR >>> dscpr = UDS(b'\x50\x02beef') >>> assert dscpr.service == 0x50 >>> assert dscpr.diagnosticSessionType == 0x02 >>> >>> assert not dscpr.answers(dsc) ###(010)=[passed] Check UDS_DSCPR >>> dscpr = UDS()/UDS_DSCPR(b'\x01beef') >>> assert dscpr.service == 0x50 >>> assert dscpr.diagnosticSessionType == 0x01 >>> assert dscpr.sessionParameterRecord == b"beef" >>> >>> assert dscpr.answers(dsc) ###(011)=[passed] Check UDS_DSC >>> dsc = UDS()/UDS_DSC(b'\x01') >>> assert dsc.service == 0x10 >>> assert dsc.diagnosticSessionType == 0x01 ###(012)=[passed] Check UDS_DSCPR >>> dscpr = UDS()/UDS_DSCPR(b'\x01beef') >>> assert dscpr.service == 0x50 >>> assert dscpr.diagnosticSessionType == 0x01 >>> assert dscpr.sessionParameterRecord == b"beef" >>> >>> assert dscpr.answers(dsc) ###(013)=[passed] Check UDS_DSC modifies ecu state >>> dsc = UDS()/UDS_DSC(b'\x09') >>> assert dsc.service == 0x10 >>> assert dsc.diagnosticSessionType == 0x09 ###(014)=[passed] Check UDS_DSCPR modifies ecu state >>> dscpr = UDS()/UDS_DSCPR(b'\x09beef') >>> assert dscpr.service == 0x50 >>> assert dscpr.diagnosticSessionType == 0x09 >>> assert dscpr.sessionParameterRecord == b"beef" >>> >>> ecu = Ecu() >>> ecu.update(dsc) > >>> ecu.update(dscpr) > [+] [], responses=['UDS / UDS_DSCPR'] >>> assert ecu.state.session == 9 ###(015)=[passed] Check UDS_ER >>> er = UDS(b'\x11\x01') >>> assert er.service == 0x11 >>> assert er.resetType == 0x01 ###(016)=[passed] Check UDS_ER >>> er = UDS()/UDS_ER(resetType="hardReset") >>> assert er.service == 0x11 >>> assert er.resetType == 0x01 ###(017)=[passed] Check UDS_ERPR >>> erpr = UDS(b'\x51\x01') >>> assert erpr.service == 0x51 >>> assert erpr.resetType == 0x01 >>> >>> assert erpr.answers(er) ###(018)=[passed] Check UDS_ERPR >>> erpr = UDS(b'\x51\x04\x10') >>> assert erpr.service == 0x51 >>> assert erpr.resetType == 0x04 >>> assert erpr.powerDownTime == 0x10 ###(019)=[passed] Check UDS_ERPR modifies ecu state >>> erpr = UDS(b'\x51\x01') >>> assert erpr.service == 0x51 >>> assert erpr.resetType == 0x01 >>> >>> ecu = Ecu() >>> ecu.state.security_level = 5 >>> ecu.state.session = 3 >>> ecu.state.communication_control = 4 >>> ecu.update(er) communication_control4security_level5session3 > >>> ecu.update(erpr) communication_control4security_level5session3 > [+] [communication_control4security_level5session3], responses=['UDS / UDS_ERPR'] >>> >>> assert ecu.state.session == 1 ###(020)=[passed] Check UDS_SA >>> sa = UDS(b'\x27\x00c0ffee') >>> assert sa.service == 0x27 >>> assert sa.securityAccessType == 0x0 >>> assert sa.securityKey == b'c0ffee' ###(021)=[passed] Check UDS_SAPR >>> sapr = UDS(b'\x67\x00') >>> assert sapr.service == 0x67 >>> assert sapr.securityAccessType == 0x0 >>> >>> assert sapr.answers(sa) ###(022)=[passed] Check UDS_SA >>> sa = UDS(b'\x27\x01c0ffee') >>> assert sa.service == 0x27 >>> assert sa.securityAccessType == 0x1 >>> assert sa.securityAccessDataRecord == b'c0ffee' ###(023)=[passed] Check UDS_SAPR >>> sapr = UDS(b'\x67\x01c0ffee') >>> assert sapr.service == 0x67 >>> assert sapr.securityAccessType == 0x1 >>> assert sapr.securitySeed == b'c0ffee' >>> >>> assert sapr.answers(sa) ###(024)=[passed] Check UDS_SA >>> sa = UDS(b'\x27\x06c0ffee') >>> assert sa.service == 0x27 >>> assert sa.securityAccessType == 0x6 >>> assert sa.securityKey == b'c0ffee' ###(025)=[passed] Check UDS_SAPR modifies ecu state >>> sapr = UDS(b'\x67\x06') >>> assert sapr.service == 0x67 >>> assert sapr.securityAccessType == 0x6 >>> >>> ecu = Ecu() >>> ecu.update(sa) > >>> ecu.update(sapr) > [+] [], responses=['UDS / UDS_SAPR'] >>> assert ecu.state.security_level == 6 ###(026)=[passed] Check UDS_SA >>> sa = UDS(b'\x27\x01c0ffee') >>> assert sa.service == 0x27 >>> assert sa.securityAccessType == 0x1 >>> assert sa.securityAccessDataRecord == b'c0ffee' ###(027)=[passed] Check UDS_SAPR >>> sapr = UDS(b'\x67\x01c0ffee') >>> assert sapr.service == 0x67 >>> assert sapr.securityAccessType == 0x1 >>> assert sapr.securitySeed == b'c0ffee' ###(028)=[passed] Check UDS_CC >>> cc = UDS(b'\x28\x01\xff') >>> assert cc.service == 0x28 >>> assert cc.controlType == 0x1 >>> assert cc.communicationType0 == 0x3 >>> assert cc.communicationType1 == 0x3 >>> assert cc.communicationType2 == 0xf ###(029)=[passed] Check UDS_CCPR >>> ccpr = UDS(b'\x68\x01') >>> assert ccpr.service == 0x68 >>> assert ccpr.controlType == 0x1 >>> >>> assert ccpr.answers(cc) ###(030)=[passed] Check UDS_CCPR modifies ecu state >>> ccpr = UDS(b'\x68\x01') >>> assert ccpr.service == 0x68 >>> assert ccpr.controlType == 0x1 >>> >>> ecu = Ecu() >>> ecu.update(cc) > >>> ecu.update(ccpr) > [+] [], responses=['UDS / UDS_CCPR'] >>> assert ecu.state.communication_control == 1 ###(031)=[passed] Check UDS_AUTH >>> auth = UDS(b"\x29\x00") >>> assert auth.service == 0x29 >>> assert auth.subFunction == 0x0 ###(032)=[passed] Build UDS_AUTH >>> auth_build = UDS()/UDS_AUTH(subFunction=0x0) >>> assert bytes(auth_build) == bytes(auth) ###(033)=[passed] Check UDS_AUTHPR >>> authpr = UDS(b"\x69\x00\x00") >>> assert authpr.service == 0x69 >>> assert authpr.subFunction == 0x0 >>> assert authpr.returnValue == 0x0 >>> >>> assert authpr.answers(auth) ###(034)=[passed] Build UDS_AUTHPR >>> authpr_build = UDS()/UDS_AUTHPR(subFunction=0x0, returnValue=0x0) >>> assert bytes(authpr_build) == bytes(authpr) ###(035)=[passed] Check UDS_AUTH >>> auth = UDS(b"\x29\x01\x01\x00\x01\xFF\x00\x01\xFF") >>> assert auth.service == 0x29 >>> assert auth.subFunction == 0x1 >>> assert auth.communicationConfiguration == 0x1 >>> assert auth.lengthOfCertificateClient == 0x1 >>> assert auth.certificateClient == b"\xFF" >>> assert auth.lengthOfChallengeClient == 0x1 >>> assert auth.challengeClient == b"\xFF" ###(036)=[passed] Build UDS_AUTH >>> auth_build = UDS()/UDS_AUTH(subFunction=0x1, communicationConfiguration=0x1, ... certificateClient=b"\xFF", challengeClient=b"\xFF") >>> assert bytes(auth_build) == bytes(auth) ###(037)=[passed] Check UDS_AUTHPR >>> authpr = UDS(b"\x69\x01\x00\x00\x01\xFF\x00\x01\xFE") >>> assert authpr.service == 0x69 >>> assert authpr.subFunction == 0x1 >>> assert authpr.returnValue == 0x0 >>> assert authpr.lengthOfChallengeServer == 0x1 >>> assert authpr.challengeServer == b"\xFF" >>> assert authpr.lengthOfEphemeralPublicKeyServer == 0x1 >>> assert authpr.ephemeralPublicKeyServer == b"\xFE" >>> >>> assert authpr.answers(auth) ###(038)=[passed] Build UDS_AUTHPR >>> authpr_build = UDS()/UDS_AUTHPR(subFunction=0x1, returnValue=0x0, ... challengeServer=b"\xFF", ... ephemeralPublicKeyServer=b"\xFE") >>> assert bytes(authpr_build) == bytes(authpr) ###(039)=[passed] Check UDS_AUTH >>> auth = UDS(b"\x29\x02\x01\x00\x01\xFF\x00\x01\xFF") >>> assert auth.service == 0x29 >>> assert auth.subFunction == 0x2 >>> assert auth.communicationConfiguration == 0x1 >>> assert auth.lengthOfCertificateClient == 0x1 >>> assert auth.certificateClient == b"\xFF" >>> assert auth.lengthOfChallengeClient == 0x1 >>> assert auth.challengeClient == b"\xFF" ###(040)=[passed] Build UDS_AUTH >>> auth_build = UDS()/UDS_AUTH(subFunction=0x2, communicationConfiguration=0x1, ... certificateClient=b"\xFF", challengeClient=b"\xFF") >>> assert bytes(auth_build) == bytes(auth) ###(041)=[passed] Check UDS_AUTHPR >>> authpr = UDS(b"\x69\x02\x00\x00\x01\xFF\x00\x03\xC0\xFF\xEE\x00\x01\x56\x00" + ... b"\x01\xFE") >>> assert authpr.service == 0x69 >>> assert authpr.subFunction == 0x2 >>> assert authpr.returnValue == 0x0 >>> assert authpr.lengthOfChallengeServer == 0x1 >>> assert authpr.challengeServer == b"\xFF" >>> assert authpr.lengthOfCertificateServer == 0x3 >>> assert authpr.certificateServer == b"\xC0\xFF\xEE" >>> assert authpr.lengthOfProofOfOwnershipServer == 0x1 >>> assert authpr.proofOfOwnershipServer == b"\x56" >>> assert authpr.lengthOfEphemeralPublicKeyServer == 0x1 >>> assert authpr.ephemeralPublicKeyServer == b"\xFE" >>> >>> assert authpr.answers(auth) ###(042)=[passed] Build UDS_AUTHPR >>> authpr_build = UDS()/UDS_AUTHPR(subFunction=0x2, returnValue=0x0, ... challengeServer=b"\xFF", ... certificateServer=b"\xC0\xFF\xEE", ... proofOfOwnershipServer=b"\x56", ... ephemeralPublicKeyServer=b"\xFE") >>> assert bytes(authpr_build) == bytes(authpr) ###(043)=[passed] Check UDS_AUTH >>> auth = UDS(b"\x29\x03\x00\x01\xFF\x00\x02\xFF\xFE") >>> assert auth.service == 0x29 >>> assert auth.subFunction == 0x3 >>> assert auth.lengthOfProofOfOwnershipClient == 0x1 >>> assert auth.proofOfOwnershipClient == b"\xFF" >>> assert auth.lengthOfEphemeralPublicKeyClient == 0x2 >>> assert auth.ephemeralPublicKeyClient == b"\xFF\xFE" ###(044)=[passed] Build UDS_AUTH >>> auth_build = UDS()/UDS_AUTH(subFunction=0x3, proofOfOwnershipClient=b"\xFF", ... ephemeralPublicKeyClient=b"\xFF\xFE") >>> assert bytes(auth_build) == bytes(auth) ###(045)=[passed] Check UDS_AUTHPR >>> authpr = UDS(b"\x69\x03\x00\x00\x01\xFE") >>> assert authpr.service == 0x69 >>> assert authpr.subFunction == 0x3 >>> assert authpr.returnValue == 0x0 >>> assert authpr.lengthOfSessionKeyInfo == 0x1 >>> assert authpr.sessionKeyInfo == b"\xFE" >>> >>> assert authpr.answers(auth) ###(046)=[passed] Build UDS_AUTHPR >>> authpr_build = UDS()/UDS_AUTHPR(subFunction=0x3, returnValue=0x0, ... sessionKeyInfo=b"\xFE") >>> assert bytes(authpr_build) == bytes(authpr) ###(047)=[passed] Check UDS_AUTH >>> auth = UDS(b"\x29\x04\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE") >>> assert auth.service == 0x29 >>> assert auth.subFunction == 0x4 >>> assert auth.certificateEvaluationId == 0x3 >>> assert auth.lengthOfCertificateData == 0x5 >>> assert auth.certificateData == b"\xFF\x00\x02\xFF\xFE" ###(048)=[passed] Build UDS_AUTH >>> auth_build = UDS()/UDS_AUTH(subFunction=0x4, certificateEvaluationId=0x3, ... certificateData=b"\xFF\x00\x02\xFF\xFE") >>> assert bytes(auth_build) == bytes(auth) ###(049)=[passed] Check UDS_AUTHPR >>> authpr = UDS(b"\x69\x04\x00") >>> assert authpr.service == 0x69 >>> assert authpr.subFunction == 0x4 >>> assert authpr.returnValue == 0x0 >>> >>> assert authpr.answers(auth) ###(050)=[passed] Build UDS_AUTHPR >>> authpr_build = UDS()/UDS_AUTHPR(subFunction=0x4, returnValue=0x0) >>> assert bytes(authpr_build) == bytes(authpr) ###(051)=[passed] Check UDS_AUTH >>> auth = UDS(b"\x29\x05\x01\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" + ... b"\xFF\xEE\x20\x01") >>> assert auth.service == 0x29 >>> assert auth.subFunction == 0x5 >>> assert auth.communicationConfiguration == 0x1 >>> assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" + ... b"\x34\x56\x03\xFF\xEE\x20\x01") ###(052)=[passed] Build UDS_AUTH >>> auth_build = UDS()/UDS_AUTH(subFunction=0x5, communicationConfiguration=0x1, ... algorithmIndicator=(b"\x03\x00\x05\xFF\x00\x02" + ... b"\xFF\xFE\xBE\x34\x56\x03" + ... b"\xFF\xEE\x20\x01")) >>> assert bytes(auth_build) == bytes(auth) ###(053)=[passed] Check UDS_AUTHPR >>> authpr = UDS(b"\x69\x05\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" + ... b"\xFF\xEE\x20\x01\x00\x01\xFF\x00\x00") >>> assert authpr.service == 0x69 >>> assert authpr.subFunction == 0x5 >>> assert authpr.returnValue == 0x0 >>> assert authpr.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" + ... b"\x34\x56\x03\xFF\xEE\x20\x01") >>> assert authpr.lengthOfChallengeServer == 0x1 >>> assert authpr.challengeServer == b"\xFF" >>> assert authpr.lengthOfNeededAdditionalParameter == 0x0 >>> assert authpr.neededAdditionalParameter == b"" >>> >>> assert authpr.answers(auth) ###(054)=[passed] Build UDS_AUTHPR >>> authpr_build = UDS()/UDS_AUTHPR(subFunction=0x5, returnValue=0x0, ... algorithmIndicator=(b"\x03\x00\x05\xFF\x00" + ... b"\x02\xFF\xFE\xBE\x34" + ... b"\x56\x03\xFF\xEE\x20" + ... b"\x01"), ... challengeServer=b"\xFF") >>> assert bytes(authpr_build) == bytes(authpr) ###(055)=[passed] Check UDS_AUTH >>> auth = UDS(b"\x29\x06\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03\xFF" + ... b"\xEE\x20\x01\x00\x01\xFF\x00\x01\xFF\x00\x00") >>> assert auth.service == 0x29 >>> assert auth.subFunction == 0x6 >>> assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" + ... b"\x34\x56\x03\xFF\xEE\x20\x01") >>> assert auth.lengthOfProofOfOwnershipClient == 0x1 >>> assert auth.proofOfOwnershipClient == b"\xFF" >>> assert auth.lengthOfChallengeClient == 0x1 >>> assert auth.challengeClient == b"\xFF" >>> assert auth.lengthOfAdditionalParameter == 0x0 >>> assert auth.additionalParameter == b"" ###(056)=[passed] Build UDS_AUTH >>> auth_build = UDS()/UDS_AUTH(subFunction=0x6, ... algorithmIndicator=(b"\x03\x00\x05\xFF\x00\x02" + ... b"\xFF\xFE\xBE\x34\x56\x03" + ... b"\xFF\xEE\x20\x01"), ... proofOfOwnershipClient=b"\xFF", ... challengeClient=b"\xFF") >>> assert bytes(auth_build) == bytes(auth) ###(057)=[passed] Check UDS_AUTHPR >>> authpr = UDS(b"\x69\x06\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" + ... b"\xFF\xEE\x20\x01\x00\x01\xFE") >>> assert authpr.service == 0x69 >>> assert authpr.subFunction == 0x6 >>> assert authpr.returnValue == 0x0 >>> assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" + ... b"\x34\x56\x03\xFF\xEE\x20\x01") >>> assert authpr.lengthOfSessionKeyInfo == 0x1 >>> assert authpr.sessionKeyInfo == b"\xFE" >>> >>> assert authpr.answers(auth) ###(058)=[passed] Build UDS_AUTHPR >>> authpr_build = UDS()/UDS_AUTHPR(subFunction=0x6, returnValue=0x0, ... algorithmIndicator=(b"\x03\x00\x05\xFF\x00" + ... b"\x02\xFF\xFE\xBE\x34" + ... b"\x56\x03\xFF\xEE\x20\x01" ... ), ... sessionKeyInfo=b"\xFE") >>> assert bytes(authpr_build) == bytes(authpr) ###(059)=[passed] Check UDS_AUTH >>> auth = UDS(b"\x29\x07\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03\xFF" + ... b"\xEE\x20\x01\x00\x01\xFF\x00\x01\xFF\x00\x02\xC0\xCA") >>> assert auth.service == 0x29 >>> assert auth.subFunction == 0x7 >>> assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" + ... b"\x34\x56\x03\xFF\xEE\x20\x01") >>> assert auth.lengthOfProofOfOwnershipClient == 0x1 >>> assert auth.proofOfOwnershipClient == b"\xFF" >>> assert auth.lengthOfChallengeClient == 0x1 >>> assert auth.challengeClient == b"\xFF" >>> assert auth.lengthOfAdditionalParameter == 0x2 >>> assert auth.additionalParameter == b"\xC0\xCA" ###(060)=[passed] Build UDS_AUTH >>> auth_build = UDS()/UDS_AUTH(subFunction=0x7, ... algorithmIndicator=(b"\x03\x00\x05\xFF\x00\x02" + ... b"\xFF\xFE\xBE\x34\x56\x03" + ... b"\xFF\xEE\x20\x01"), ... proofOfOwnershipClient=b"\xFF", ... challengeClient=b"\xFF", ... additionalParameter=b"\xC0\xCA") >>> assert bytes(auth_build) == bytes(auth) ###(061)=[passed] Check UDS_AUTHPR >>> authpr = UDS(b"\x69\x07\x00\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE\x34\x56\x03" + ... b"\xFF\xEE\x20\x01\x00\x02\xFE\x20\x00\x01\xFE") >>> assert authpr.service == 0x69 >>> assert authpr.subFunction == 0x7 >>> assert authpr.returnValue == 0x0 >>> assert auth.algorithmIndicator == (b"\x03\x00\x05\xFF\x00\x02\xFF\xFE\xBE" + ... b"\x34\x56\x03\xFF\xEE\x20\x01") >>> assert authpr.lengthOfProofOfOwnershipServer == 0x2 >>> assert authpr.proofOfOwnershipServer == b"\xFE\x20" >>> assert authpr.lengthOfSessionKeyInfo == 0x1 >>> assert authpr.sessionKeyInfo == b"\xFE" >>> >>> assert authpr.answers(auth) ###(062)=[passed] Build UDS_AUTHPR >>> authpr_build = UDS()/UDS_AUTHPR(subFunction=0x7, returnValue=0x0, ... algorithmIndicator=(b"\x03\x00\x05\xFF\x00" + ... b"\x02\xFF\xFE\xBE\x34" + ... b"\x56\x03\xFF\xEE\x20\x01" ... ), ... proofOfOwnershipServer=b"\xFE\x20", ... sessionKeyInfo=b"\xFE") >>> assert bytes(authpr_build) == bytes(authpr) ###(063)=[passed] Check UDS_AUTH >>> auth = UDS(b"\x29\x08") >>> assert auth.service == 0x29 >>> assert auth.subFunction == 0x8 ###(064)=[passed] Build UDS_AUTH >>> auth_build = UDS()/UDS_AUTH(subFunction=0x8) >>> assert bytes(auth_build) == bytes(auth) ###(065)=[passed] Check UDS_AUTHPR >>> authpr = UDS(b"\x69\x08\x00") >>> assert authpr.service == 0x69 >>> assert authpr.subFunction == 0x8 >>> assert authpr.returnValue == 0x0 >>> >>> assert authpr.answers(auth) ###(066)=[passed] Build UDS_AUTHPR >>> authpr_build = UDS()/UDS_AUTHPR(subFunction=0x8) >>> assert bytes(authpr_build) == bytes(authpr) ###(067)=[passed] Check UDS_TP >>> tp = UDS(b'\x3E\x01') >>> assert tp.service == 0x3e >>> assert tp.subFunction == 0x1 ###(068)=[passed] Check UDS_TPPR >>> tppr = UDS(b'\x7E\x01') >>> assert tppr.service == 0x7e >>> assert tppr.zeroSubFunction == 0x1 >>> >>> assert tppr.answers(tp) ###(069)=[passed] Check UDS_ATP >>> atp = UDS(b'\x83\x01') >>> assert atp.service == 0x83 >>> assert atp.timingParameterAccessType == 0x1 ###(070)=[passed] Check UDS_ATPPR >>> atppr = UDS(b'\xc3\x01') >>> assert atppr.service == 0xc3 >>> assert atppr.timingParameterAccessType == 0x1 >>> >>> assert atppr.answers(atp) ###(071)=[passed] Check UDS_ATP >>> atp = UDS(b'\x83\x04coffee') >>> assert atp.service == 0x83 >>> assert atp.timingParameterAccessType == 0x4 >>> assert atp.timingParameterRequestRecord == b'coffee' ###(072)=[passed] Check UDS_ATPPR >>> atppr = UDS(b'\xc3\x03coffee') >>> assert atppr.service == 0xc3 >>> assert atppr.timingParameterAccessType == 0x3 >>> assert atppr.timingParameterResponseRecord == b'coffee' ###(073)=[passed] Check UDS_SDT >>> sdt = UDS(b'\x84\x80\x00\x01\x12\x34\x13\x37\x01coffee') >>> assert sdt.service == 0x84 >>> assert sdt.requestMessage == 0x1 >>> assert sdt.preEstablishedKeyUsed == 0x0 >>> assert sdt.encryptedMessage == 0x0 >>> assert sdt.signedMessage == 0x0 >>> assert sdt.signedResponseRequested == 0x0 >>> assert sdt.signatureEncryptionCalculation == 0x1 >>> assert sdt.signatureLength == 0x1234 >>> assert sdt.antiReplayCounter == 0x1337 >>> assert sdt.internalMessageServiceRequestId == 0x1 >>> assert sdt.dataRecord == b'coffee' ###(074)=[passed] Build UDS_SDT >>> sdt = UDS()/UDS_SDT(requestMessage=0x1, signatureEncryptionCalculation=0x1, ... signatureLength=0x1234, antiReplayCounter=0x1337, ... internalMessageServiceRequestId=0x1, dataRecord=b'coffee') >>> assert sdt.service == 0x84 >>> assert sdt.requestMessage == 0x1 >>> assert sdt.preEstablishedKeyUsed == 0x0 >>> assert sdt.encryptedMessage == 0x0 >>> assert sdt.signedMessage == 0x0 >>> assert sdt.signedResponseRequested == 0x0 >>> assert sdt.signatureEncryptionCalculation == 0x1 >>> assert sdt.signatureLength == 0x1234 >>> assert sdt.antiReplayCounter == 0x1337 >>> assert sdt.internalMessageServiceRequestId == 0x1 >>> assert sdt.dataRecord == b'coffee' ###(075)=[passed] Check UDS_SDTPR >>> sdtpr = UDS(b'\xC4\x04\x00\x01\x12\x34\x13\x37\x01coffee') >>> assert sdtpr.service == 0xC4 >>> assert sdtpr.requestMessage == 0x0 >>> assert sdtpr.preEstablishedKeyUsed == 0x0 >>> assert sdtpr.encryptedMessage == 0x0 >>> assert sdtpr.signedMessage == 0x1 >>> assert sdtpr.signedResponseRequested == 0x0 >>> assert sdtpr.signatureEncryptionCalculation == 0x1 >>> assert sdtpr.signatureLength == 0x1234 >>> assert sdtpr.antiReplayCounter == 0x1337 >>> assert sdtpr.internalMessageServiceResponseId == 0x1 >>> assert sdtpr.dataRecord == b'coffee' >>> >>> assert sdtpr.answers(sdt) ###(076)=[passed] Check UDS_CDTCS >>> cdtcs = UDS(b'\x85\x00coffee') >>> assert cdtcs.service == 0x85 >>> assert cdtcs.DTCSettingType == 0 >>> assert cdtcs.DTCSettingControlOptionRecord == b'coffee' ###(077)=[passed] Check UDS_CDTCSPR >>> cdtcspr = UDS(b'\xC5\x00') >>> assert cdtcspr.service == 0xC5 >>> assert cdtcspr.DTCSettingType == 0 >>> >>> assert cdtcspr.answers(cdtcs) ###(078)=[passed] Check UDS_ROE >>> roe = UDS(b'\x86\x00\x10coffee') >>> assert roe.service == 0x86 >>> assert roe.eventType == 0 >>> assert roe.eventWindowTime == 16 >>> assert roe.eventTypeRecord == b'coffee' ###(079)=[passed] Check UDS_ROEPR >>> roepr = UDS(b'\xC6\x00\x01\x10coffee') >>> assert roepr.service == 0xC6 >>> assert roepr.eventType == 0 >>> assert roepr.numberOfIdentifiedEvents == 1 >>> assert roepr.eventWindowTime == 16 >>> assert roepr.eventTypeRecord == b'coffee' >>> >>> assert roepr.answers(roe) ###(080)=[passed] Check UDS_LC >>> lc = UDS(b'\x87\x01\x02') >>> assert lc.service == 0x87 >>> assert lc.linkControlType == 0x01 >>> assert lc.baudrateIdentifier == 0x02 ###(081)=[passed] Check UDS_LCPR >>> lcpr = UDS(b'\xC7\x01') >>> assert lcpr.service == 0xC7 >>> assert lcpr.linkControlType == 0x01 >>> >>> assert lcpr.answers(lc) ###(082)=[passed] Check UDS_LC >>> lc = UDS(b'\x87\x02\x02\x03\x04') >>> assert lc.service == 0x87 >>> assert lc.linkControlType == 0x02 >>> assert lc.baudrateHighByte == 0x02 >>> assert lc.baudrateMiddleByte == 0x03 >>> assert lc.baudrateLowByte == 0x04 ###(083)=[passed] Check UDS_RDBI >>> rdbi = UDS(b'\x22\x01\x02') >>> assert rdbi.service == 0x22 >>> assert rdbi.identifiers[0] == 0x0102 ###(084)=[passed] Build UDS_RDBI >>> rdbi = UDS()/UDS_RDBI(identifiers=[0x102]) >>> assert rdbi.service == 0x22 >>> assert rdbi.identifiers[0] == 0x0102 >>> assert bytes(rdbi) == b'\x22\x01\x02' ###(085)=[passed] Check UDS_RDBI2 >>> rdbi = UDS(b'\x22\x01\x02\x03\x04') >>> assert rdbi.service == 0x22 >>> assert rdbi.identifiers[0] == 0x0102 >>> assert rdbi.identifiers[1] == 0x0304 >>> assert raw(rdbi) == b'\x22\x01\x02\x03\x04' ###(086)=[passed] Build UDS_RDBI2 >>> rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x304]) >>> assert rdbi.service == 0x22 >>> assert rdbi.identifiers[0] == 0x0102 >>> assert rdbi.identifiers[1] == 0x0304 >>> assert raw(rdbi) == b'\x22\x01\x02\x03\x04' ###(087)=[passed] Test observable dict used in UDS_RDBI, setter >>> UDS_RDBI.dataIdentifiers[0x102] = "turbo" At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 >>> UDS_RDBI.dataIdentifiers[0x103] = "fullspeed" At : Change to fullspeed at 0x103 At : Change to fullspeed at 0x103 At : Change to fullspeed at 0x103 At : Change to fullspeed at 0x103 At : Change to fullspeed at 0x103 At : Change to fullspeed at 0x103 >>> >>> rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x103]) >>> >>> assert "turbo" in plain_str(repr(rdbi)) >>> assert "fullspeed" in plain_str(repr(rdbi)) ###(088)=[passed] Test observable dict used in UDS_RDBI, deleter >>> UDS_RDBI.dataIdentifiers[0x102] = "turbo" At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 At : Change to turbo at 0x102 >>> >>> rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x103]) >>> assert "turbo" in plain_str(repr(rdbi)) >>> >>> del UDS_RDBI.dataIdentifiers[0x102] At : Delete value at 0x102 At : Delete value at 0x102 At : Delete value at 0x102 At : Delete value at 0x102 At : Delete value at 0x102 At : Delete value at 0x102 >>> UDS_RDBI.dataIdentifiers[0x103] = "slowspeed" At : Change to slowspeed at 0x103 At : Change to slowspeed at 0x103 At : Change to slowspeed at 0x103 At : Change to slowspeed at 0x103 At : Change to slowspeed at 0x103 At : Change to slowspeed at 0x103 >>> >>> rdbi = UDS()/UDS_RDBI(identifiers=[0x102, 0x103]) >>> >>> assert "turbo" not in plain_str(repr(rdbi)) >>> assert "slowspeed" in plain_str(repr(rdbi)) ###(089)=[passed] Check UDS_RDBIPR >>> rdbipr = UDS(b'\x62\x01\x02dieselgate') >>> assert rdbipr.service == 0x62 >>> assert rdbipr.dataIdentifier == 0x0102 >>> assert rdbipr.load == b'dieselgate' >>> >>> assert rdbipr.answers(rdbi) ###(090)=[passed] Check UDS_RMBA >>> rmba = UDS(b'\x23\x11\x02\x02') >>> assert rmba.service == 0x23 >>> assert rmba.memorySizeLen == 1 >>> assert rmba.memoryAddressLen == 1 >>> assert rmba.memoryAddress1 == 2 >>> assert rmba.memorySize1 == 2 ###(091)=[passed] Check UDS_RMBA >>> rmba = UDS(b'\x23\x22\x02\x02\x03\x03') >>> assert rmba.service == 0x23 >>> assert rmba.memorySizeLen == 2 >>> assert rmba.memoryAddressLen == 2 >>> assert rmba.memoryAddress2 == 0x202 >>> assert rmba.memorySize2 == 0x303 ###(092)=[passed] Check UDS_RMBA >>> rmba = UDS(b'\x23\x33\x02\x02\x02\x03\x03\x03') >>> assert rmba.service == 0x23 >>> assert rmba.memorySizeLen == 3 >>> assert rmba.memoryAddressLen == 3 >>> assert rmba.memoryAddress3 == 0x20202 >>> assert rmba.memorySize3 == 0x30303 ###(093)=[passed] Check UDS_RMBA >>> rmba = UDS(b'\x23\x44\x02\x02\x02\x02\x03\x03\x03\x03') >>> assert rmba.service == 0x23 >>> assert rmba.memorySizeLen == 4 >>> assert rmba.memoryAddressLen == 4 >>> assert rmba.memoryAddress4 == 0x2020202 >>> assert rmba.memorySize4 == 0x3030303 ###(094)=[passed] Check UDS_RMBAPR >>> rmbapr = UDS(b'\x63muchData') >>> assert rmbapr.service == 0x63 >>> assert rmbapr.dataRecord == b'muchData' >>> >>> assert rmbapr.answers(rmba) ###(095)=[passed] Check UDS_RSDBI >>> rsdbi = UDS(b'\x24\x12\x34') >>> assert rsdbi.service == 0x24 >>> assert rsdbi.dataIdentifier == 0x1234 ###(096)=[passed] Check UDS_RSDBIPR >>> rsdbipr = UDS(b'\x64\x12\x34\xffmuchData') >>> assert rsdbipr.service == 0x64 >>> assert rsdbipr.dataIdentifier == 0x1234 >>> assert rsdbipr.scalingByte == 255 >>> assert rsdbipr.dataRecord == b'muchData' >>> >>> assert rsdbipr.answers(rsdbi) ###(097)=[passed] Check UDS_RSDBPI >>> rsdbpi = UDS(b'\x2a\x12\x34coffee') >>> assert rsdbpi.service == 0x2a >>> assert rsdbpi.transmissionMode == 0x12 >>> assert rsdbpi.periodicDataIdentifier == 0x34 >>> assert rsdbpi.furtherPeriodicDataIdentifier == b'coffee' ###(098)=[passed] Check UDS_RSDBPIPR >>> rsdbpipr = UDS(b'\x6a\xff\x12\x34') >>> assert rsdbpipr.service == 0x6a >>> assert rsdbpipr.periodicDataIdentifier == 255 >>> assert rsdbpipr.dataRecord == b'\x12\x34' >>> >>> assert not rsdbpipr.answers(rsdbpi) ###(099)=[passed] Check UDS_RSDBPIPR >>> rsdbpipr = UDS(b'\x6a\x34\x12\x34') >>> assert rsdbpipr.service == 0x6a >>> assert rsdbpipr.periodicDataIdentifier == 0x34 >>> assert rsdbpipr.dataRecord == b'\x12\x34' >>> >>> assert rsdbpipr.answers(rsdbpi) ###(100)=[passed] Check UDS_DDDI >>> dddi = UDS(b'\x2c\x12coffee') >>> assert dddi.service == 0x2c >>> assert dddi.subFunction == 0x12 >>> assert dddi.dataRecord == b'coffee' ###(101)=[passed] Check UDS_DDDIPR >>> dddipr = UDS(b'\x6c\x12\x44\x55') >>> assert dddipr.service == 0x6c >>> assert dddipr.subFunction == 0x12 >>> assert dddipr.dynamicallyDefinedDataIdentifier == 0x4455 >>> >>> assert dddipr.answers(dddi) ###(102)=[passed] Check UDS_WDBI >>> wdbi = UDS(b'\x2e\x01\x02dieselgate') >>> assert wdbi.service == 0x2e >>> assert wdbi.dataIdentifier == 0x0102 >>> assert wdbi.load == b'dieselgate' ###(103)=[passed] Build UDS_WDBI >>> wdbi = UDS()/UDS_WDBI(dataIdentifier=0x0102)/Raw(load=b'dieselgate') >>> assert wdbi.service == 0x2e >>> assert wdbi.dataIdentifier == 0x0102 >>> assert wdbi.load == b'dieselgate' >>> assert bytes(wdbi) == b'\x2e\x01\x02dieselgate' ###(104)=[passed] Check UDS_WDBI >>> wdbi = UDS(b'\x2e\x01\x02dieselgate') >>> assert wdbi.service == 0x2e >>> assert wdbi.dataIdentifier == 0x0102 >>> assert wdbi.load == b'dieselgate' >>> >>> wdbi = UDS(b'\x2e\x02\x02benzingate') >>> assert wdbi.service == 0x2e >>> assert wdbi.dataIdentifier == 0x0202 >>> assert wdbi.load == b'benzingate' ###(105)=[passed] Check UDS_WDBIPR >>> wdbipr = UDS(b'\x6e\x02\x02') >>> assert wdbipr.service == 0x6e >>> assert wdbipr.dataIdentifier == 0x0202 >>> >>> assert wdbipr.answers(wdbi) ###(106)=[passed] Check UDS_WMBA >>> wmba = UDS(b'\x3d\x11\x02\x02muchData') >>> assert wmba.service == 0x3d >>> assert wmba.memorySizeLen == 1 >>> assert wmba.memoryAddressLen == 1 >>> assert wmba.memoryAddress1 == 2 >>> assert wmba.memorySize1 == 2 >>> assert wmba.dataRecord == b'muchData' ###(107)=[passed] Check UDS_WMBAPR >>> wmbapr = UDS(b'\x7d\x11\x02\x02') >>> assert wmbapr.service == 0x7d >>> assert wmbapr.memorySizeLen == 1 >>> assert wmbapr.memoryAddressLen == 1 >>> assert wmbapr.memoryAddress1 == 2 >>> assert wmbapr.memorySize1 == 2 >>> >>> assert wmbapr.answers(wmba) ###(108)=[passed] Check UDS_WMBA >>> wmba = UDS(b'\x3d\x22\x02\x02\x03\x03muchData') >>> assert wmba.service == 0x3d >>> assert wmba.memorySizeLen == 2 >>> assert wmba.memoryAddressLen == 2 >>> assert wmba.memoryAddress2 == 0x202 >>> assert wmba.memorySize2 == 0x303 >>> assert wmba.dataRecord == b'muchData' ###(109)=[passed] Check UDS_WMBAPR >>> wmbapr = UDS(b'\x7d\x22\x02\x02\x03\x03') >>> assert wmbapr.service == 0x7d >>> assert wmbapr.memorySizeLen == 2 >>> assert wmbapr.memoryAddressLen == 2 >>> assert wmbapr.memoryAddress2 == 0x202 >>> assert wmbapr.memorySize2 == 0x303 >>> >>> assert wmbapr.answers(wmba) ###(110)=[passed] Check UDS_WMBA >>> wmba = UDS(b'\x3d\x33\x02\x02\x02\x03\x03\x03muchData') >>> assert wmba.service == 0x3d >>> assert wmba.memorySizeLen == 3 >>> assert wmba.memoryAddressLen == 3 >>> assert wmba.memoryAddress3 == 0x20202 >>> assert wmba.memorySize3 == 0x30303 >>> assert wmba.dataRecord == b'muchData' ###(111)=[passed] Check UDS_WMBA >>> wmba = UDS(b'\x3d\x44\x02\x02\x02\x02\x03\x03\x03\x03muchData') >>> assert wmba.service == 0x3d >>> assert wmba.memorySizeLen == 4 >>> assert wmba.memoryAddressLen == 4 >>> assert wmba.memoryAddress4 == 0x2020202 >>> assert wmba.memorySize4 == 0x3030303 >>> assert wmba.dataRecord == b'muchData' ###(112)=[passed] Check UDS_WMBAPR >>> wmbapr = UDS(b'\x7d\x33\x02\x02\x02\x03\x03\x03') >>> assert wmbapr.service == 0x7d >>> assert wmbapr.memorySizeLen == 3 >>> assert wmbapr.memoryAddressLen == 3 >>> assert wmbapr.memoryAddress3 == 0x20202 >>> assert wmbapr.memorySize3 == 0x30303 >>> >>> assert not wmbapr.answers(wmba) ###(113)=[passed] Check UDS_WMBAPR >>> wmbapr = UDS(b'\x7d\x44\x02\x02\x02\x02\x03\x03\x03\x03') >>> assert wmbapr.service == 0x7d >>> assert wmbapr.memorySizeLen == 4 >>> assert wmbapr.memoryAddressLen == 4 >>> assert wmbapr.memoryAddress4 == 0x2020202 >>> assert wmbapr.memorySize4 == 0x3030303 >>> >>> assert wmbapr.answers(wmba) ###(114)=[passed] Check UDS_CDTCI >>> cdtci = UDS(b'\x14\x44\x02\x03') >>> assert cdtci.service == 0x14 >>> assert cdtci.groupOfDTCHighByte == 0x44 >>> assert cdtci.groupOfDTCMiddleByte == 0x02 >>> assert cdtci.groupOfDTCLowByte == 0x3 ###(115)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x44') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x44 ###(116)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x01\xff') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x01 >>> assert rdtci.DTCStatusMask == 0xff ###(117)=[passed] Check UDS_RDTCIPR >>> rdtcipr = UDS(b'\x59\x01\xff\xee\xdd\xaa') >>> assert rdtcipr.service == 0x59 >>> assert rdtcipr.reportType == 1 >>> assert rdtcipr.DTCStatusAvailabilityMask == 0xff >>> assert rdtcipr.DTCFormatIdentifier == 0xee >>> assert rdtcipr.DTCCount == 0xddaa >>> >>> assert rdtcipr.answers(rdtci) >>> >>> rdtcipr1 = UDS(b'\x59\x02\xff\x11\x07\x11\'\x022\x12\'\x01\x07\x11\'\x01\x18\x12\'\x01\x13\x12\'\x01"\x11\'\x06C\x00\'\x06S\x00\'\x161\x00\'\x14\x03\x12\'') >>> >>> assert len(rdtcipr1.DTCAndStatusRecord) == 10 >>> assert rdtcipr1.DTCAndStatusRecord[0].dtc.system == 0 >>> assert rdtcipr1.DTCAndStatusRecord[0].dtc.type == 1 >>> assert rdtcipr1.DTCAndStatusRecord[0].dtc.numeric_value_code == 263 >>> assert rdtcipr1.DTCAndStatusRecord[0].dtc.additional_information_code == 17 >>> assert rdtcipr1.DTCAndStatusRecord[0].status == 0x27 >>> assert rdtcipr1.DTCAndStatusRecord[-1].dtc.system == 0 >>> assert rdtcipr1.DTCAndStatusRecord[-1].dtc.type == 1 >>> assert rdtcipr1.DTCAndStatusRecord[-1].dtc.numeric_value_code == 1027 >>> assert rdtcipr1.DTCAndStatusRecord[-1].dtc.additional_information_code == 18 >>> assert rdtcipr1.DTCAndStatusRecord[-1].status == 0x27 ###(118)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x02\xff') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x02 >>> assert rdtci.DTCStatusMask == 0xff ###(119)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x0f\xff') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x0f >>> assert rdtci.DTCStatusMask == 0xff ###(120)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x11\xff') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x11 >>> assert rdtci.DTCStatusMask == 0xff ###(121)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x12\xff') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x12 >>> assert rdtci.DTCStatusMask == 0xff ###(122)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x13\xff') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x13 >>> assert rdtci.DTCStatusMask == 0xff ###(123)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x03\xff\xee\xdd\xaa') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x03 >>> assert rdtci.dtc == DTC(bytes.fromhex("ffeedd")) >>> assert rdtci.DTCSnapshotRecordNumber == 0xaa ###(124)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x04\xff\xee\xdd\xaa') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x04 >>> assert rdtci.dtc == DTC(bytes.fromhex("ffeedd")) >>> assert rdtci.DTCSnapshotRecordNumber == 0xaa ###(125)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x05\xaa') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x05 >>> assert rdtci.DTCSnapshotRecordNumber == 0xaa ###(126)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x06\xff\xee\xdd\xaa') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x06 >>> assert rdtci.dtc == DTC(bytes.fromhex("ffeedd")) >>> assert rdtci.DTCExtendedDataRecordNumber == 0xaa ###(127)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x07\xaa\xbb') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x07 >>> assert rdtci.DTCSeverityMask == 0xaa >>> assert rdtci.DTCStatusMask == 0xbb ###(128)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x08\xaa\xbb') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x08 >>> assert rdtci.DTCSeverityMask == 0xaa >>> assert rdtci.DTCStatusMask == 0xbb ###(129)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x09\xff\xee\xdd') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x09 >>> assert rdtci.dtc == DTC(bytes.fromhex("ffeedd")) ###(130)=[passed] Check UDS_RDTCI >>> rdtci = UDS(b'\x19\x10\xff\xee\xdd\xaa') >>> assert rdtci.service == 0x19 >>> assert rdtci.reportType == 0x10 >>> assert rdtci.dtc == DTC(bytes.fromhex("ffeedd")) >>> assert rdtci.DTCExtendedDataRecordNumber == 0xaa ###(131)=[passed] Check UDS_RDTCIPR >>> rdtcipr = UDS(b'\x59\x02\xff\xee\xdd\xaa\x02') >>> rdtcipr.show() ###[ UDS ]### service = ReadDTCInformationPositiveResponse ###[ ReadDTCInformationPositiveResponse ]### reportType= reportDTCByStatusMask DTCStatusAvailabilityMask= TestFailed+TestFailedThisOperationCycle+PendingDTC+ConfirmedDTC+TestNotCompletedSinceLastClear+TestFailedSinceLastClear+TestNotCompletedThisOperationCycle+WarningIndicatorRequested \DTCAndStatusRecord\ |###[ DTC and status record ]### | \dtc \ | |###[ Diagnostic Trouble Code ]### | | system = Network | | type = Generic | | numeric_value_code= 3805 | | additional_information_code= 170 | status = TestFailedThisOperationCycle >>> assert rdtcipr.service == 0x59 >>> assert rdtcipr.reportType == 2 >>> assert rdtcipr.DTCStatusAvailabilityMask == 0xff >>> assert rdtcipr.DTCAndStatusRecord[0].dtc.system == 3 >>> assert rdtcipr.DTCAndStatusRecord[0].dtc.type == 2 >>> assert rdtcipr.DTCAndStatusRecord[0].dtc.numeric_value_code == 3805 >>> assert rdtcipr.DTCAndStatusRecord[0].dtc.additional_information_code == 170 >>> assert rdtcipr.DTCAndStatusRecord[0].status == 2 >>> >>> assert not rdtcipr.answers(rdtci) ###(132)=[passed] Check UDS_RDTCIPR >>> rdtcipr = UDS(b'\x59\x03\xff\xee\xdd\xaa') >>> assert rdtcipr.service == 0x59 >>> assert rdtcipr.reportType == 3 >>> assert rdtcipr.dataRecord == b'\xff\xee\xdd\xaa' ###(133)=[passed] Check UDS_RDTCIPR 2 >>> req = UDS(bytes.fromhex("1904480a46ff")) >>> resp = UDS(bytes.fromhex("5904480a46af000b170002ff6417010a8278fa170c2ff1800000800104800200028003400a8004808005054002400a400004010b170002ff6417010a82ec69170c2f2c800000800100800200028003400a80048080050540024017400004")) >>> >>> assert resp.answers(req) >>> >>> req = UDS(bytes.fromhex("1904480a47ff")) >>> resp = UDS(bytes.fromhex("5904480a46af000b170002ff6417010a8278fa170c2ff1800000800104800200028003400a8004808005054002400a400004010b170002ff6417010a82ec69170c2f2c800000800100800200028003400a80048080050540024017400004")) >>> >>> assert not resp.answers(req) >>> >>> req = UDS(bytes.fromhex("1906480a46ff")) >>> resp = UDS(bytes.fromhex("5906480a46af010002070328")) >>> >>> assert resp.answers(req) ###(134)=[passed] Check UDS_RC >>> rc = UDS(b'\x31\x03\xff\xee\xdd\xaa') >>> assert rc.service == 0x31 >>> assert rc.routineControlType == 3 >>> assert rc.routineIdentifier == 0xffee >>> assert rc.load == b'\xdd\xaa' ###(135)=[passed] Check UDS_RC >>> rc = UDS(b'\x31\x03\xff\xee\xdd\xaa') >>> assert rc.service == 0x31 >>> assert rc.routineControlType == 3 >>> assert rc.routineIdentifier == 0xffee >>> assert rc.load == b'\xdd\xaa' ###(136)=[passed] Check UDS_RCPR >>> rcpr = UDS(b'\x71\x03\xff\xee\xdd\xaa') >>> assert rcpr.service == 0x71 >>> assert rcpr.routineControlType == 3 >>> assert rcpr.routineIdentifier == 0xffee >>> assert rcpr.load == b'\xdd\xaa' ###(137)=[passed] Check UDS_RD >>> rd = UDS(b'\x34\xaa\x11\x02\x02') >>> assert rd.service == 0x34 >>> assert rd.dataFormatIdentifier == 0xaa >>> assert rd.memorySizeLen == 1 >>> assert rd.memoryAddressLen == 1 >>> assert rd.memoryAddress1 == 2 >>> assert rd.memorySize1 == 2 ###(138)=[passed] Check UDS_RD >>> rd = UDS(b'\x34\xaa\x22\x02\x02\x03\x03') >>> assert rd.service == 0x34 >>> assert rd.dataFormatIdentifier == 0xaa >>> assert rd.memorySizeLen == 2 >>> assert rd.memoryAddressLen == 2 >>> assert rd.memoryAddress2 == 0x202 >>> assert rd.memorySize2 == 0x303 ###(139)=[passed] Check UDS_RD >>> rd = UDS(b'\x34\xaa\x33\x02\x02\x02\x03\x03\x03') >>> assert rd.service == 0x34 >>> assert rd.dataFormatIdentifier == 0xaa >>> assert rd.memorySizeLen == 3 >>> assert rd.memoryAddressLen == 3 >>> assert rd.memoryAddress3 == 0x20202 >>> assert rd.memorySize3 == 0x30303 ###(140)=[passed] Check UDS_RD >>> rd = UDS(b'\x34\xaa\x44\x02\x02\x02\x02\x03\x03\x03\x03') >>> assert rd.service == 0x34 >>> assert rd.dataFormatIdentifier == 0xaa >>> assert rd.memorySizeLen == 4 >>> assert rd.memoryAddressLen == 4 >>> assert rd.memoryAddress4 == 0x2020202 >>> assert rd.memorySize4 == 0x3030303 ###(141)=[passed] Check UDS_RDPR >>> rdpr = UDS(b'\x74\x40\x02\x02\x02\x02\x03\x03\x03\x03') >>> assert rdpr.service == 0x74 >>> assert rdpr.memorySizeLen == 4 >>> assert rdpr.reserved == 0 >>> assert rdpr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03' >>> >>> assert rdpr.answers(rd) ###(142)=[passed] Check UDS_RU >>> ru = UDS(b'\x35\xaa\x11\x02\x02') >>> assert ru.service == 0x35 >>> assert ru.dataFormatIdentifier == 0xaa >>> assert ru.memorySizeLen == 1 >>> assert ru.memoryAddressLen == 1 >>> assert ru.memoryAddress1 == 2 >>> assert ru.memorySize1 == 2 ###(143)=[passed] Check UDS_RU >>> ru = UDS(b'\x35\xaa\x22\x02\x02\x03\x03') >>> assert ru.service == 0x35 >>> assert ru.dataFormatIdentifier == 0xaa >>> assert ru.memorySizeLen == 2 >>> assert ru.memoryAddressLen == 2 >>> assert ru.memoryAddress2 == 0x202 >>> assert ru.memorySize2 == 0x303 ###(144)=[passed] Check UDS_RU >>> ru = UDS(b'\x35\xaa\x33\x02\x02\x02\x03\x03\x03') >>> assert ru.service == 0x35 >>> assert ru.dataFormatIdentifier == 0xaa >>> assert ru.memorySizeLen == 3 >>> assert ru.memoryAddressLen == 3 >>> assert ru.memoryAddress3 == 0x20202 >>> assert ru.memorySize3 == 0x30303 ###(145)=[passed] Check UDS_RU >>> ru = UDS(b'\x35\xaa\x44\x02\x02\x02\x02\x03\x03\x03\x03') >>> assert ru.service == 0x35 >>> assert ru.dataFormatIdentifier == 0xaa >>> assert ru.memorySizeLen == 4 >>> assert ru.memoryAddressLen == 4 >>> assert ru.memoryAddress4 == 0x2020202 >>> assert ru.memorySize4 == 0x3030303 ###(146)=[passed] Check UDS_RUPR >>> rupr = UDS(b'\x75\x40\x02\x02\x02\x02\x03\x03\x03\x03') >>> assert rupr.service == 0x75 >>> assert rupr.memorySizeLen == 4 >>> assert rupr.reserved == 0 >>> assert rupr.maxNumberOfBlockLength == b'\x02\x02\x02\x02\x03\x03\x03\x03' >>> >>> assert rupr.answers(ru) ###(147)=[passed] Check UDS_TD >>> td = UDS(b'\x36\xaapayload') >>> assert td.service == 0x36 >>> assert td.blockSequenceCounter == 0xaa >>> assert td.transferRequestParameterRecord == b'payload' ###(148)=[passed] Check UDS_TD >>> td = UDS(b'\x36\xaapayload') >>> assert td.service == 0x36 >>> assert td.blockSequenceCounter == 0xaa >>> assert td.transferRequestParameterRecord == b'payload' ###(149)=[passed] Check UDS_TDPR >>> tdpr = UDS(b'\x76\xaapayload') >>> assert tdpr.service == 0x76 >>> assert tdpr.blockSequenceCounter == 0xaa >>> assert tdpr.transferResponseParameterRecord == b'payload' >>> >>> assert tdpr.answers(td) ###(150)=[passed] Check UDS_RTE >>> rte = UDS(b'\x37payload') >>> assert rte.service == 0x37 >>> assert rte.transferRequestParameterRecord == b'payload' ###(151)=[passed] Check UDS_RTEPR >>> rtepr = UDS(b'\x77payload') >>> assert rtepr.service == 0x77 >>> assert rtepr.transferResponseParameterRecord == b'payload' >>> >>> assert rtepr.answers(rte) ###(152)=[passed] Check UDS_IOCBI >>> iocbi = UDS(b'\x2f\x23\x34\xffcoffee') >>> assert iocbi.service == 0x2f >>> assert iocbi.dataIdentifier == 0x2334 >>> assert iocbi.load == b'\xffcoffee' ###(153)=[passed] Check UDS_RFT >>> rft = UDS(b'\x38\x01\x00\x1ED:\\mapdata\\europe\\germany1.yxz\x11\x02\xC3\x50\x75\x30') >>> assert rft.service == 0x38 >>> assert rft.modeOfOperation == 0x01 >>> assert rft.filePathAndNameLength == 0x001e >>> assert rft.filePathAndName == b'D:\\mapdata\\europe\\germany1.yxz' >>> assert rft.compressionMethod == 1 >>> assert rft.encryptingMethod == 1 >>> assert rft.fileSizeParameterLength == 0x02 >>> assert rft.fileSizeUnCompressed == b'\xc3\x50' >>> assert rft.fileSizeCompressed == b'\x75\x30' ###(154)=[passed] Build UDS_RFT >>> rft_build = UDS()/UDS_RFT(modeOfOperation=0x1, ... filePathAndName=(b'D:\\mapdata\\europe\\' + ... b'germany1.yxz'), ... compressionMethod=1, encryptingMethod=1, ... fileSizeUnCompressed=b'\xc3\x50', ... fileSizeCompressed=b'\x75\x30') >>> assert bytes(rft_build) == bytes(rft) ###(155)=[passed] Check UDS_RFTPR >>> rftpr = UDS(b'\x78\x01\x02\xc3\x50\x11') >>> assert rftpr.service == 0x78 >>> assert rftpr.modeOfOperation == 0x01 >>> assert rftpr.lengthFormatIdentifier == 0x02 >>> assert rftpr.maxNumberOfBlockLength == b'\xc3\x50' >>> assert rftpr.compressionMethod == 1 >>> assert rftpr.encryptingMethod == 1 >>> >>> assert rftpr.answers(rft) ###(156)=[passed] Build UDS_RFTPR >>> rftpr_build = UDS()/UDS_RFTPR(modeOfOperation=0x1, ... maxNumberOfBlockLength=b'\xc3\x50', ... compressionMethod=1, encryptingMethod=1) >>> assert bytes(rftpr_build) == bytes(rftpr) ###(157)=[passed] Check (invalid) UDS_NRC, no reply-to service >>> nrc = UDS(b'\x7f') >>> assert nrc.service == 0x7f ###(158)=[passed] Check UDS_NRC >>> nrc = UDS(b'\x7f\x22\x33') >>> assert nrc.service == 0x7f >>> assert nrc.requestServiceId == 0x22 >>> assert nrc.negativeResponseCode == 0x33 Regression tests for the OBD layer ━ Run at 01:43:18 from [test/contrib/automotive/obd/obd.uts] by UTscapy in 0.3073251247406006 └ Passed=90 └ Failed=0 ###### ## Basic operations ###### ###(000)=[passed] Load module >>> load_contrib("automotive.obd.obd", globals_dict=globals()) Specify "conf.contribs['OBD'] = {'treat-response-pending-as-answer': True}" to treat a negative response 'requestCorrectlyReceived-ResponsePending' as answer of a request. The default value is False. ###(001)=[passed] Check if positive response answers >>> req = OBD(b'\x01\x2f') >>> res = OBD(b'\x41\x2f\x1a') >>> assert res.answers(req) ###(002)=[passed] Check hashret >>> assert req.hashret() == res.hashret() ###(003)=[passed] Check if negative response answers >>> req = OBD(b'\x01\x2f') >>> res = OBD(b'\x7f\x01\x11') >>> assert res.answers(req) ###(004)=[passed] Check if negative response request_correctly_received_response_pending answers not >>> req = OBD(b'\x01\x2f') >>> res = OBD(b'\x7f\x01\x78') >>> assert not res.answers(req) ###(005)=[passed] Check if negative response request_correctly_received_response_pending answers >>> conf.contribs['OBD']['treat-response-pending-as-answer'] = True >>> >>> req = OBD(b'\x01\x2f') >>> res = OBD(b'\x7f\x01\x78') >>> assert res.answers(req) ###(006)=[passed] Check hashret >>> assert req.hashret() == res.hashret() ###(007)=[passed] Check hashret for Service 0x40 >>> req = OBD(b'\x40') >>> res = OBD(b'\x7F\x40\x11') >>> assert req.hashret() == res.hashret() >>> assert res.answers(req) ###(008)=[passed] Check hashret for Service 0x51 >>> req = OBD(b'\x51') >>> res = OBD(b'\x7F\x51\x11') >>> assert req.hashret() == res.hashret() >>> assert res.answers(req) ###(009)=[passed] Check dissecting a request for Service 01 PID 00 >>> p = OBD(b'\x01\x00') >>> assert p.service == 0x01 >>> assert p.pid[0] == 0x00 ###(010)=[passed] Check dissecting a request for Service 01 PID 75 >>> p = OBD(b'\x01\x75') >>> assert p.service == 0x01 >>> assert p.pid[0] == 0x75 ###(011)=[passed] Check dissecting a request for Service 01 PID 78 >>> p = OBD(b'\x01\x78') >>> assert p.service == 0x01 >>> assert p.pid[0] == 0x78 ###(012)=[passed] Check dissecting a request for Service 01 PID 7F >>> p = OBD(b'\x01\x7F') >>> assert p.service == 0x01 >>> assert p.pid[0] == 0x7F ###(013)=[passed] Check dissecting a request for Service 01 PID 89 >>> p = OBD(b'\x01\x89') >>> assert p.service == 0x01 >>> assert p.pid[0] == 0x89 ###(014)=[passed] Check dissecting a request for Service 02 PID 00 >>> p = OBD(b'\x02\x00\x01') >>> assert p.service == 0x02 >>> assert p.requests[0].pid == 0x00 >>> assert p.requests[0].frame_no == 0x01 ###(015)=[passed] Check dissecting a request for Service 02 PID 75 >>> p = OBD(b'\x02\x75\x01') >>> assert p.service == 0x02 >>> assert p.requests[0].pid == 0x75 >>> assert p.requests[0].frame_no == 0x01 ###(016)=[passed] Check dissecting a request for Service 02 PID 78 >>> p = OBD(b'\x02\x78\x01') >>> assert p.service == 0x02 >>> assert p.requests[0].pid == 0x78 >>> assert p.requests[0].frame_no == 0x01 ###(017)=[passed] Check dissecting a request for Service 02 PID 7F >>> p = OBD(b'\x02\x7F\x01') >>> assert p.service == 0x02 >>> assert p.requests[0].pid == 0x7F >>> assert p.requests[0].frame_no == 0x01 ###(018)=[passed] Check dissecting a request for Service 02 PID 89 >>> p = OBD(b'\x02\x89\x01') >>> assert p.service == 0x02 >>> assert p.requests[0].pid == 0x89 >>> assert p.requests[0].frame_no == 0x01 ###(019)=[passed] Check dissecting a request for Service 03 >>> p = OBD(b'\x03') >>> assert p.service == 0x03 ###(020)=[passed] Check dissecting a request for Service 06 >>> p = OBD(b'\x06\x01') >>> assert p.service == 0x06 >>> assert p.mid[0] == 0x01 ###(021)=[passed] Check dissecting a request for Service 06 MID 00 >>> p = OBD(b'\x06\x00') >>> assert p.service == 0x06 >>> assert p.mid[0] == 0x00 ###(022)=[passed] Check dissecting a request for Service 06 MID 00,01,02,03,04 >>> p = OBD(b'\x06\x00\x01\x02\x03\x04') >>> assert p.service == 0x06 >>> assert p.mid[0] == 0x00 >>> assert p.mid[1] == 0x01 >>> assert p.mid[2] == 0x02 >>> assert p.mid[3] == 0x03 >>> assert p.mid[4] == 0x04 ###(023)=[passed] Check dissecting a response for Service 06 MID 00 >>> r = OBD(b'\x06\x00') >>> p = OBD(b'\x46\x00\x00\x00\x00\x00') >>> assert p.service == 0x46 >>> assert p.data_records[0].mid == 0x00 >>> assert p.data_records[0].supported_mids == "" >>> assert p.answers(r) ###(024)=[passed] Check dissecting a response for Service 06 MID 00 and MID 20 >>> r = OBD(b'\x06\x20\x00') >>> p = OBD(b'\x46\x00\x01\x02\x03\x04\x20\x01\x02\x03\x04') >>> assert p.service == 0x46 >>> assert p.data_records[0].mid == 0x00 >>> assert p.data_records[0].supported_mids == "MID1E+MID18+MID17+MID0F+MID08" >>> assert p.data_records[1].mid == 0x20 >>> assert p.data_records[1].supported_mids == "MID3E+MID38+MID37+MID2F+MID28" >>> assert p.answers(r) >>> r = OBD(b'\x06\x20\x00\x40\x60') >>> assert p.answers(r) >>> r = OBD(b'\x06\x20') >>> assert not p.answers(r) ###(025)=[passed] Check dissecting a response for Service 06 MID 00, 20, 40, 60, 80, A0 >>> p = OBD(b'\x46\x00\x01\x02\x03\x04\x20\x01\x02\x03\x04\x40\x01\x02\x03\x04\x60\x01\x02\x03\x04\x80\x01\x02\x03\x04\xA0\x01\x02\x03\x04') >>> assert p.service == 0x46 >>> assert p.data_records[0].mid == 0x00 >>> assert p.data_records[0].supported_mids == "MID1E+MID18+MID17+MID0F+MID08" >>> assert p.data_records[1].mid == 0x20 >>> assert p.data_records[1].supported_mids == "MID3E+MID38+MID37+MID2F+MID28" >>> assert p.data_records[2].mid == 0x40 >>> assert p.data_records[2].supported_mids == "MID5E+MID58+MID57+MID4F+MID48" >>> assert p.data_records[3].mid == 0x60 >>> assert p.data_records[3].supported_mids == "MID7E+MID78+MID77+MID6F+MID68" >>> assert p.data_records[4].mid == 0x80 >>> assert p.data_records[4].supported_mids == "MID9E+MID98+MID97+MID8F+MID88" >>> assert p.data_records[5].mid == 0xA0 >>> assert p.data_records[5].supported_mids == "MIDBE+MIDB8+MIDB7+MIDAF+MIDA8" >>> assert len(p.data_records) == 6 >>> r = OBD(b'\x06\x00\x20\x40\x60\x80\xA0') >>> assert p.answers(r) ###(026)=[passed] Check dissecting a response for Service 06 MID 01 >>> p = OBD(b'\x46\x01\x01\x0A\x0B\xB0\x0B\xB0\x0B\xB0\x01\x05\x10\x00\x48\x00\x00\x00\x64\x01\x85\x24\x00\x96\x00\x4B\xFF\xFF') >>> assert p.service == 0x46 >>> assert p.data_records[0].mid == 0x01 >>> assert p.data_records[0].standardized_test_id == 1 >>> assert p.data_records[0].unit_and_scaling_id == 10 >>> assert p.data_records[0].test_value == 365.024 >>> assert p.data_records[0].min_limit == 365.024 >>> assert p.data_records[0].max_limit == 365.024 >>> assert "Voltage" in p.data_records[0].__repr__() >>> assert "365.024 mV" in p.data_records[0].__repr__() >>> assert p.data_records[1].mid == 0x01 >>> assert p.data_records[1].standardized_test_id == 5 >>> assert p.data_records[1].unit_and_scaling_id == 16 >>> assert p.data_records[1].test_value == 72 >>> assert p.data_records[1].min_limit == 0 >>> assert p.data_records[1].max_limit == 100 >>> assert "Time" in p.data_records[1].__repr__() >>> assert "72 ms" in p.data_records[1].__repr__() >>> assert p.data_records[2].mid == 0x01 >>> assert p.data_records[2].standardized_test_id == 0x85 >>> assert p.data_records[2].unit_and_scaling_id == 0x24 >>> assert p.data_records[2].test_value == 150 >>> assert p.data_records[2].min_limit == 75 >>> assert p.data_records[2].max_limit == 65535 >>> assert "Counts" in p.data_records[2].__repr__() >>> assert "150 counts" in p.data_records[2].__repr__() >>> assert len(p.data_records) == 3 >>> r = OBD(b'\x06\x01') >>> assert p.answers(r) >>> r = OBD(b'\x06\x01\x01\x01') >>> assert p.answers(r) >>> r = OBD(b'\x06\x01\x02') >>> assert p.answers(r) ###(027)=[passed] Check dissecting a response for Service 06 MID 21 >>> p = OBD(b'\x46\x21\x87\x2F\x00\x00\x00\x00\x00\x00') >>> p.show() ###[ On-board diagnostics ]### service = OnBoardMonitoringTestResultsResponse ###[ On-Board monitoring IDs ]### \data_records\ |###[ On-Board diagnostic monitoring ID ]### | mid = Catalyst Monitor Bank 1 |###[ OBD MID data record ]### | standardized_test_id= 135 | unit_and_scaling_id= Percent | test_value= 0.0 % | min_limit = 0.0 % | max_limit = 0.0 % >>> assert p.service == 0x46 >>> assert p.data_records[0].mid == 0x21 >>> assert p.data_records[0].standardized_test_id == 135 >>> assert p.data_records[0].unit_and_scaling_id == 0x2F >>> assert p.data_records[0].test_value == 0 >>> assert p.data_records[0].min_limit == 0 >>> assert p.data_records[0].max_limit == 0 >>> assert "Percent" in p.data_records[0].__repr__() >>> assert "0 %" in p.data_records[0].__repr__() >>> assert len(p.data_records) == 1 >>> r = OBD(b'\x06\x21') >>> assert p.answers(r) ###(028)=[passed] Check dissecting a request for Service 09 IID 00 >>> p = OBD(b'\x09\x00') >>> assert p.service == 0x09 >>> assert p.iid[0] == 0x00 ###(029)=[passed] Check dissecting a request for Service 09 IID 02 >>> p = OBD(b'\x09\x02') >>> assert p.service == 0x09 >>> assert p.iid[0] == 0x02 ###(030)=[passed] Check dissecting a request for Service 09 IID 04 >>> p = OBD(b'\x09\x04') >>> assert p.service == 0x09 >>> assert p.iid[0] == 0x04 ###(031)=[passed] Check dissecting a request for Service 09 IID 00 and IID 02 and IID 04 >>> p = OBD(b'\x09\x00\x02\x04') >>> assert p.service == 0x09 >>> assert p.iid[0] == 0x00 >>> assert p.iid[1] == 0x02 >>> assert p.iid[2] == 0x04 ###(032)=[passed] Check dissecting a request for Service 09 IID 0A >>> p = OBD(b'\x09\x0A') >>> assert p.service == 0x09 >>> assert p.iid[0] == 0x0A ###(033)=[passed] Check dissecting a response for Service 01 PID 75 >>> p = OBD(b'\x41\x75\x0a\x00\x11\x22\x33\x44\x55') >>> assert p.service == 0x41 >>> assert p.data_records[0].pid == 0x75 >>> assert p.data_records[0].reserved == 0 >>> assert p.data_records[0].turbo_a_turbine_outlet_temperature_supported == 1 >>> assert p.data_records[0].turbo_a_turbine_inlet_temperature_supported == 0 >>> assert p.data_records[0].turbo_a_compressor_outlet_temperature_supported == 1 >>> assert p.data_records[0].turbo_a_compressor_inlet_temperature_supported == 0 >>> assert p.data_records[0].turbocharger_a_compressor_inlet_temperature == 0x00-40 >>> assert p.data_records[0].turbocharger_a_compressor_outlet_temperature == 0x11-40 >>> assert p.data_records[0].turbocharger_a_turbine_inlet_temperature == \ ... round((0x2233 * 0.1) - 40, 3) >>> assert p.data_records[0].turbocharger_a_turbine_outlet_temperature == \ ... round((0x4455 * 0.1) - 40, 3) >>> >>> r = OBD(b'\x01\x75') >>> assert p.answers(r) ###(034)=[passed] Check dissecting a response for Service 01 PID 00 and PID 20 >>> p = OBD(b'\x41\x00\xBF\xBF\xA8\x91\x20\x80\x00\x00\x00') >>> assert p.service == 0x41 >>> assert p.data_records[0].pid == 0 >>> assert p.data_records[0].supported_pids == "PID20+PID1C+PID19+PID15+PID13+PID11+PID10+PID0F+PID0E+PID0D+PID0C+PID0B+PID09+PID08+PID07+PID06+PID05+PID04+PID03+PID01" >>> assert p.data_records[1].pid == 0x20 >>> assert p.data_records[1].supported_pids == "PID21" >>> assert len(p.data_records) == 2 >>> r = OBD(b'\x01\x00\x20') >>> assert p.answers(r) ###(035)=[passed] Check dissecting a response for Service 01 PID 05,01,15,0C,03 >>> p = OBD(b'\x41\x05\x6e\x01\x83\x33\xff\x63\x15\xa0\x78\x0c\x0a\x6b\x03\x02\x00') >>> p.show() ###[ On-board diagnostics ]### service = CurrentPowertrainDiagnosticDataResponse ###[ Parameter IDs ]### \data_records\ |###[ OBD_S01_PR_Record ]### | pid = 0x5 |###[ PID_05_EngineCoolantTemperature ]### | data = 70.0 deg. C |###[ OBD_S01_PR_Record ]### | pid = 0x1 |###[ PID_01_MonitorStatusSinceDtcsCleared ]### | mil = on | dtc_count = 3 | reserved1 = 0 | continuous_tests_ready= misfire+fuelSystem | reserved2 = 0 | continuous_tests_supported= misfire+fuel_system | once_per_trip_tests_supported= egr+oxygenSensorHeater+oxygenSensor+acSystemRefrigerant+secondaryAirSystem+evaporativeSystem+heatedCatalyst+catalyst | once_per_trip_tests_ready= egr+oxygenSensorHeater+evaporativeSystem+heatedCatalyst |###[ OBD_S01_PR_Record ]### | pid = 0x15 |###[ PID_15_OxygenSensor2 ]### | outputVoltage= 0.8 V | trim = -6.25 % |###[ OBD_S01_PR_Record ]### | pid = 0xc |###[ PID_0C_EngineRpm ]### | data = 666.75 min-1 |###[ OBD_S01_PR_Record ]### | pid = 0x3 |###[ PID_03_FuelSystemStatus ]### | fuel_system1= ClosedLoop | fuel_system2= OpenLoopInsufficientEngineTemperature >>> assert p.service == 0x41 >>> assert p.data_records[0].pid == 5 >>> assert p.data_records[0].data == 70.0 >>> assert p.data_records[1].pid == 0x1 >>> assert p.data_records[2].pid == 0x15 >>> assert p.data_records[2].outputVoltage == 0.8 >>> assert p.data_records[2].trim == -6.25 >>> assert p.data_records[3].pid == 12 >>> assert p.data_records[3].data == 666.75 >>> assert p.data_records[4].pid == 3 >>> assert p.data_records[4].fuel_system1 == 0x02 >>> assert p.data_records[4].fuel_system2 == 0 >>> assert len(p.data_records) == 5 >>> >>> r = OBD(b'\x01\x05\x01\x15\x0c\x03') >>> assert p.answers(r) >>> r = OBD(b'\x01\x05\x01\x15') >>> assert not p.answers(r) >>> r = OBD(b'\x01\x02') >>> assert not p.answers(r) >>> >>> >>> p = OBD(b'\x41\x00\xBF\xBF\xA8\x91\x20\x80\x00\x00\x00') >>> p.show() ###[ On-board diagnostics ]### service = CurrentPowertrainDiagnosticDataResponse ###[ Parameter IDs ]### \data_records\ |###[ OBD_S01_PR_Record ]### | pid = 0x0 |###[ PID_00_PIDsSupported ]### | supported_pids= PID20+PID1C+PID19+PID15+PID13+PID11+PID10+PID0F+PID0E+PID0D+PID0C+PID0B+PID09+PID08+PID07+PID06+PID05+PID04+PID03+PID01 |###[ OBD_S01_PR_Record ]### | pid = 0x20 |###[ PID_20_PIDsSupported ]### | supported_pids= PID21 >>> assert p.service == 0x41 >>> assert p.data_records[0].pid == 0 >>> assert p.data_records[0].supported_pids == "PID20+PID1C+PID19+PID15+PID13+PID11+PID10+PID0F+PID0E+PID0D+PID0C+PID0B+PID09+PID08+PID07+PID06+PID05+PID04+PID03+PID01" >>> assert p.data_records[1].pid == 0x20 >>> assert p.data_records[1].supported_pids == "PID21" >>> assert len(p.data_records) == 2 >>> r = OBD(b'\x01\x00\x20') >>> assert p.answers(r) ###(036)=[passed] Check dissecting a response for Service 01 PID 78 >>> p = OBD(b'\x41\x78ABCDEFGHI') >>> assert p.service == 0x41 >>> assert p.data_records[0].pid == 0x78 >>> assert p.data_records[0].reserved == 4 >>> assert p.data_records[0].sensor1_supported == 1 >>> assert p.data_records[0].sensor2_supported == 0 >>> assert p.data_records[0].sensor3_supported == 0 >>> assert p.data_records[0].sensor4_supported == 0 >>> assert p.data_records[0].sensor1 == 1656.3 >>> assert p.data_records[0].sensor2 == 1707.7 >>> assert p.data_records[0].sensor3 == 1759.1 >>> assert p.data_records[0].sensor4 == 1810.5 >>> r = OBD(b'\x01\x78') >>> assert p.answers(r) ###(037)=[passed] Check dissecting a response for Service 01 PID 7F >>> p = OBD(b'\x41\x7F\x0a' ... b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' ... b'\x01\x02\x03\x04\x05\x06\x07\x08' ... b'\x00\x11\x22\x33\x44\x55\x66\x77') >>> assert p.service == 0x41 >>> assert p.data_records[0].pid == 0x7F >>> assert p.data_records[0].reserved == 1 >>> assert p.data_records[0].total_with_pto_active_supported == 0 >>> assert p.data_records[0].total_idle_supported == 1 >>> assert p.data_records[0].total_supported == 0 >>> assert p.data_records[0].total == 0xFFFFFFFFFFFFFFFF >>> assert p.data_records[0].total_idle == 0x0102030405060708 >>> assert p.data_records[0].total_with_pto_active == 0x0011223344556677 >>> r = OBD(b'\x01\x7f') >>> assert p.answers(r) ###(038)=[passed] Check dissecting a response for Service 01 PID 89 >>> p = OBD(b'\x41\x89ABCDEFGHIKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP') >>> assert p.service == 0x41 >>> assert p.data_records[0].pid == 0x89 >>> assert p.data_records[0].data == b'ABCDEFGHIKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP' >>> r = OBD(b'\x01\x89') >>> assert p.answers(r) ###(039)=[passed] Check dissecting a response for Service 02 PID 75 >>> p = OBD(b'\x42\x75\01\x0a\x00\x11\x22\x33\x44\x55') >>> assert p.service == 0x42 >>> assert p.data_records[0].pid == 0x75 >>> assert p.data_records[0].frame_no == 0x01 >>> assert p.data_records[0].reserved == 0 >>> assert p.data_records[0].turbo_a_turbine_outlet_temperature_supported == 1 >>> assert p.data_records[0].turbo_a_turbine_inlet_temperature_supported == 0 >>> assert p.data_records[0].turbo_a_compressor_outlet_temperature_supported == 1 >>> assert p.data_records[0].turbo_a_compressor_inlet_temperature_supported == 0 >>> assert p.data_records[0].turbocharger_a_compressor_inlet_temperature == 0x00 - 40 >>> assert p.data_records[0].turbocharger_a_compressor_outlet_temperature == 0x11 - 40 >>> assert p.data_records[0].turbocharger_a_turbine_inlet_temperature == \ ... round((0x2233 * 0.1) - 40, 3) >>> assert p.data_records[0].turbocharger_a_turbine_outlet_temperature == \ ... round((0x4455 * 0.1) - 40, 3) >>> r = OBD(b'\x02\x75\x00') >>> assert p.answers(r) ###(040)=[passed] Check dissecting a response for Service 02 PID 78 >>> p = OBD(b'\x42\x78\x05ABCDEFGHI') >>> assert p.service == 0x42 >>> assert p.data_records[0].pid == 0x78 >>> assert p.data_records[0].frame_no == 0x05 >>> assert p.data_records[0].reserved == 4 >>> assert p.data_records[0].sensor1_supported == 1 >>> assert p.data_records[0].sensor2_supported == 0 >>> assert p.data_records[0].sensor3_supported == 0 >>> assert p.data_records[0].sensor4_supported == 0 >>> assert p.data_records[0].sensor1 == 1656.3 >>> assert p.data_records[0].sensor2 == 1707.7 >>> assert p.data_records[0].sensor3 == 1759.1 >>> assert p.data_records[0].sensor4 == 1810.5 >>> >>> r = OBD(b'\x02\x78\x00') >>> assert p.answers(r) ###(041)=[passed] Check dissecting a response for Service 02 PID 7F >>> p = OBD(b'\x42\x7F\x01\x03' ... b'\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF' ... b'\x01\x02\x03\x04\x05\x06\x07\x08' ... b'\x00\x11\x22\x33\x44\x55\x66\x77') >>> assert p.service == 0x42 >>> assert p.data_records[0].pid == 0x7F >>> assert p.data_records[0].frame_no == 0x01 >>> assert p.data_records[0].reserved == 0 >>> assert p.data_records[0].total_with_pto_active_supported == 0 >>> assert p.data_records[0].total_idle_supported == 1 >>> assert p.data_records[0].total_supported == 1 >>> assert p.data_records[0].total == 0xFFFFFFFFFFFFFFFF >>> assert p.data_records[0].total_idle == 0x0102030405060708 >>> assert p.data_records[0].total_with_pto_active == 0x0011223344556677 >>> >>> r = OBD(b'\x02\x7F\x00') >>> assert p.answers(r) ###(042)=[passed] Check dissecting a response for Service 02 PID 89 >>> p = OBD(b'\x42\x89\x01ABCDEFGHIKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP') >>> assert p.service == 0x42 >>> assert p.data_records[0].pid == 0x89 >>> assert p.data_records[0].frame_no == 0x01 >>> assert p.data_records[0].data == b'ABCDEFGHIKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOP' >>> >>> r = OBD(b'\x02\x89\x00') >>> assert p.answers(r) ###(043)=[passed] Check dissecting a response for Service 02 PID 0C, 05, 04 >>> p = OBD(b'\x42\x0c\x00\x20\x80\x04\x00\x80\x05\x00\x28') >>> assert p.service == 0x42 >>> assert p.data_records[0].pid == 0x0C >>> assert p.data_records[0].frame_no == 0x0 >>> assert p.data_records[0].data == 2080 >>> assert p.data_records[1].pid == 0x04 >>> assert p.data_records[1].frame_no == 0x0 >>> assert p.data_records[1].data == 50.196 >>> assert p.data_records[2].pid == 0x05 >>> assert p.data_records[2].frame_no == 0x0 >>> assert p.data_records[2].data == 0.0 >>> >>> r = OBD(b'\x02\x0c\x00\x04\x00\x05\x00') >>> r.show() ###[ On-board diagnostics ]### service = PowertrainFreezeFrameDataRequest ###[ S2_FreezeFrameData ]### \requests \ |###[ OBD_S02_Record ]### | pid = 0xc | frame_no = 0 |###[ OBD_S02_Record ]### | pid = 0x4 | frame_no = 0 |###[ OBD_S02_Record ]### | pid = 0x5 | frame_no = 0 >>> assert p.answers(r) ###(044)=[passed] Check dissecting a response for Service 03 >>> p = OBD(b'\x43\x06\x01\x43\x01\x96\x02\x34\x02\xcd\x03\x57\x0a\x24') >>> assert p.service == 0x43 >>> assert p.count == 6 >>> assert bytes(p.dtcs[0]) == b'\x01\x43' >>> assert bytes(p.dtcs[1]) == b'\x01\x96' >>> assert bytes(p.dtcs[2]) == b'\x02\x34' >>> assert bytes(p.dtcs[3]) == b'\x02\xcd' >>> assert bytes(p.dtcs[4]) == b'\x03\x57' >>> assert bytes(p.dtcs[5]) == b'\x0a\x24' >>> >>> r = OBD(b'\x03') >>> assert p.answers(r) ###(045)=[passed] Check dissecting a response for Service 07 >>> p = OBD(b'\x47\x06\x01\x43\x01\x96\x02\x34\x02\xcd\x03\x57\x0a\x24') >>> assert p.service == 0x47 >>> assert p.count == 6 >>> assert bytes(p.dtcs[0]) == b'\x01\x43' >>> assert bytes(p.dtcs[1]) == b'\x01\x96' >>> assert bytes(p.dtcs[2]) == b'\x02\x34' >>> assert bytes(p.dtcs[3]) == b'\x02\xcd' >>> assert bytes(p.dtcs[4]) == b'\x03\x57' >>> assert bytes(p.dtcs[5]) == b'\x0a\x24' >>> >>> r = OBD(b'\x07') >>> assert p.answers(r) ###(046)=[passed] Check dissecting a response for Service 08 Tid 00 >>> p = OBD(b'\x48\x00ABCD') >>> assert p.service == 0x48 >>> assert p.data_records[0].tid == 0x00 >>> assert p.data_records[0].supported_tids == "TID1E+TID1A+TID18+TID17+TID12+TID0F+TID0A+TID08+TID02" >>> r = OBD(b'\x08\x00') >>> assert p.answers(r) ###(047)=[passed] Check dissecting a response for Service 08 Tid 01 >>> p = OBD(b'\x48\x01\x00\x00"\xffd') >>> assert p.service == 0x48 >>> assert p.data_records[0].tid == 0x01 >>> assert p.data_records[0].data_a == 0.0 >>> assert p.data_records[0].data_b == 0.0 >>> assert p.data_records[0].data_c == 0.17 >>> assert p.data_records[0].data_d == 1.275 >>> assert p.data_records[0].data_e == 0.5 >>> r = OBD(b'\x08\x01') >>> assert p.answers(r) ###(048)=[passed] Check dissecting a response for Service 08 Tid 05 >>> p = OBD(b'\x48\x05\x00\x00\x2b\xff\x7d') >>> assert p.service == 0x48 >>> assert p.data_records[0].tid == 0x05 >>> assert p.data_records[0].data_a == 0.0 >>> assert p.data_records[0].data_b == 0.0 >>> assert p.data_records[0].data_c == 0.172 >>> assert p.data_records[0].data_d == 1.02 >>> assert p.data_records[0].data_e == 0.5 >>> r = OBD(b'\x08\x05') >>> assert p.answers(r) ###(049)=[passed] Check dissecting a response for Service 08 Tid 09 >>> p = OBD(b'\x48\x09\x00\x00\x04\x1a\x0c') >>> assert p.service == 0x48 >>> assert p.data_records[0].tid == 0x09 >>> assert p.data_records[0].data_a == 0.0 >>> assert p.data_records[0].data_b == 0.0 >>> assert p.data_records[0].data_c == 0.16 >>> assert p.data_records[0].data_d == 1.04 >>> assert p.data_records[0].data_e == 0.48 >>> r = OBD(b'\x08\x09') >>> assert p.answers(r) ###(050)=[passed] Check dissecting a response for Service 09 IID 00 >>> p = OBD(b'\x49\x00ABCD') >>> assert p.service == 0x49 >>> assert p.data_records[0].iid == 0x00 >>> assert p.data_records[0].supported_iids == "IID1E+IID1A+IID18+IID17+IID12+IID0F+IID0A+IID08+IID02" >>> r = OBD(b'\x09\x00') >>> assert p.answers(r) ###(051)=[passed] Check dissecting a response for Service 09 IID 02 with one VIN >>> p = OBD(b'\x49\x02\x01W0L000051T2123456') >>> assert p.service == 0x49 >>> assert p.data_records[0].iid == 0x02 >>> assert p.data_records[0].count == 0x01 >>> assert p.data_records[0].vehicle_identification_numbers[0] == b'W0L000051T2123456' >>> r = OBD(b'\x09\x02') >>> assert p.answers(r) ###(052)=[passed] Check dissecting a response for Service 09 IID 02 with two VINs >>> p = OBD(b'\x49\x02\x02W0L000051T2123456W0L000051T2123456') >>> assert p.service == 0x49 >>> assert p.data_records[0].iid == 0x02 >>> assert p.data_records[0].count == 0x02 >>> assert p.data_records[0].vehicle_identification_numbers[0] == b'W0L000051T2123456' >>> assert p.data_records[0].vehicle_identification_numbers[1] == b'W0L000051T2123456' >>> r = OBD(b'\x09\x02') >>> assert p.answers(r) ###(053)=[passed] Check dissecting a response for Service 09 IID 04 with one CID >>> p = OBD(b'\x49\x04\x01ABCDEFGHIJKLMNOP') >>> assert p.service == 0x49 >>> assert p.data_records[0].iid == 0x04 >>> assert p.data_records[0].count == 0x01 >>> assert p.data_records[0].calibration_identifications[0] == b'ABCDEFGHIJKLMNOP' >>> r = OBD(b'\x09\x04') >>> assert p.answers(r) ###(054)=[passed] Check dissecting a response for Service 09 IID 04 with two CID >>> p = OBD(b'\x49\x04\x02ABCDEFGHIJKLMNOPABCDEFGHIJKLMNOP') >>> assert p.service == 0x49 >>> assert p.data_records[0].iid == 0x04 >>> assert p.data_records[0].count == 0x02 >>> assert p.data_records[0].calibration_identifications[0] == b'ABCDEFGHIJKLMNOP' >>> assert p.data_records[0].calibration_identifications[1] == b'ABCDEFGHIJKLMNOP' >>> r = OBD(b'\x09\x04') >>> assert p.answers(r) ###(055)=[passed] Check dissecting a response for Service 09 IID 06 >>> p = OBD(b'\x49\x06\x02ABCDEFGH') >>> assert p.service == 0x49 >>> assert p.data_records[0].iid == 0x06 >>> assert p.data_records[0].count == 0x02 >>> assert p.data_records[0].calibration_verification_numbers[0] == b'ABCD' >>> assert p.data_records[0].calibration_verification_numbers[1] == b'EFGH' >>> r = OBD(b'\x09\x06') >>> assert p.answers(r) ###(056)=[passed] Check dissecting a response for Service 09 IID 08 >>> p = OBD(b'\x49\x08\x09\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00\x08\xFF\xFF') >>> assert p.service == 0x49 >>> assert p.data_records[0].iid == 0x08 >>> assert p.data_records[0].count == 0x09 >>> assert p.data_records[0].data[0] == 1 >>> assert p.data_records[0].data[1] == 2 >>> assert p.data_records[0].data[2] == 3 >>> assert p.data_records[0].data[3] == 4 >>> assert p.data_records[0].data[4] == 5 >>> assert p.data_records[0].data[5] == 6 >>> assert p.data_records[0].data[6] == 7 >>> assert p.data_records[0].data[7] == 8 >>> assert p.data_records[0].data[8] == 65535 >>> r = OBD(b'\x09\x08') >>> assert p.answers(r) ###(057)=[passed] Check dissecting a response for Service 09 IID 0A >>> p = OBD(b'\x49\x0A\x01ECM\x00-Engine Control\x00') >>> assert p.service == 0x49 >>> assert p.data_records[0].iid == 0x0A >>> assert p.data_records[0].count == 0x01 >>> assert p.data_records[0].ecu_names[0] == b'ECM\x00-Engine Control\x00' >>> r = OBD(b'\x09\x0a') >>> assert p.answers(r) ###(058)=[passed] Check dissecting a response for Service 09 IID 0B >>> p = OBD(b'\x49\x0B\x05\x00\x01\x00\x02\x00\x03\x00\x04\xFF\xFF') >>> assert p.service == 0x49 >>> assert p.data_records[0].iid == 0x0B >>> assert p.data_records[0].count == 0x05 >>> assert p.data_records[0].data[0] == 1 >>> assert p.data_records[0].data[1] == 2 >>> assert p.data_records[0].data[2] == 3 >>> assert p.data_records[0].data[3] == 4 >>> assert p.data_records[0].data[4] == 65535 >>> r = OBD(b'\x09\x0b') >>> assert p.answers(r) ###(059)=[passed] Check dissecting a response for Service 09 IID 02 and IID 04 >>> p = OBD(b'\x49\x02\x01ABCDEFGHIJKLMNOPQ\x04\x01ABCDEFGHIJKLMNOP') >>> assert p.service == 0x49 >>> assert p.data_records[0].iid == 0x02 >>> assert p.data_records[0].count == 0x01 >>> assert p.data_records[0].vehicle_identification_numbers[0] == b'ABCDEFGHIJKLMNOPQ' >>> assert p.data_records[1].iid == 0x04 >>> assert p.data_records[1].count == 0x01 >>> assert p.data_records[1].calibration_identifications[0] == b'ABCDEFGHIJKLMNOP' >>> r = OBD(b'\x09\x02\x04') >>> assert p.answers(r) >>> >>> b = bytes(p) >>> assert b[0:1] == b'\x49' >>> assert b[1:2] == b'\x02' >>> assert b[2:3] == b'\x01' >>> assert b[3:20] == b'ABCDEFGHIJKLMNOPQ' >>> assert b[20:21] == b'\x04' >>> assert b[21:22] == b'\x01' >>> assert b[22:] == b'ABCDEFGHIJKLMNOP' ###(060)=[passed] Check building a request for Service 01 PID 00 >>> p = OBD()/OBD_S01(pid=0x00) >>> b = bytes(p) >>> assert b[0:1] == b'\x01' >>> assert b[1:2] == b'\x00' ###(061)=[passed] Check building a request for Service 01 PID 75 >>> p = OBD()/OBD_S01(pid=0x75) >>> b = bytes(p) >>> assert b[0:1] == b'\x01' >>> assert b[1:2] == b'\x75' ###(062)=[passed] Check building a request for Service 01 PID 78 >>> p = OBD()/OBD_S01(pid=0x78) >>> b = bytes(p) >>> assert b[0:1] == b'\x01' >>> assert b[1:2] == b'\x78' ###(063)=[passed] Check building a request for Service 01 PID 7F >>> p = OBD()/OBD_S01(pid=0x7F) >>> b = bytes(p) >>> assert b[0:1] == b'\x01' >>> assert b[1:2] == b'\x7F' ###(064)=[passed] Check building a request for Service 01 PID 89 >>> p = OBD()/OBD_S01(pid=0x89) >>> b = bytes(p) >>> assert b[0:1] == b'\x01' >>> assert b[1:2] == b'\x89' ###(065)=[passed] Check building a request for Service 02 PID 00 >>> p = OBD()/OBD_S02(requests=[OBD_S02_Record(pid=0x00, frame_no=0x01)]) >>> b = bytes(p) >>> assert b[0:1] == b'\x02' >>> assert b[1:2] == b'\x00' >>> assert b[2:3] == b'\x01' ###(066)=[passed] Check building a request for Service 02 PID 75 >>> p = OBD()/OBD_S02(requests=[OBD_S02_Record(pid=0x75, frame_no=0x01)]) >>> b = bytes(p) >>> assert b[0:1] == b'\x02' >>> assert b[1:2] == b'\x75' >>> assert b[2:3] == b'\x01' ###(067)=[passed] Check building a request for Service 02 PID 78 >>> p = OBD()/OBD_S02(requests=[OBD_S02_Record(pid=0x78, frame_no=0x01)]) >>> b = bytes(p) >>> assert b[0:1] == b'\x02' >>> assert b[1:2] == b'\x78' >>> assert b[2:3] == b'\x01' ###(068)=[passed] Check building a request for Service 02 PID 7F >>> p = OBD()/OBD_S02(requests=[OBD_S02_Record(pid=0x7F, frame_no=0x01)]) >>> b = bytes(p) >>> assert b[0:1] == b'\x02' >>> assert b[1:2] == b'\x7F' >>> assert b[2:3] == b'\x01' ###(069)=[passed] Check building a request for Service 02 PID 89 >>> p = OBD()/OBD_S02(requests=[OBD_S02_Record(pid=0x89, frame_no=0x01)]) >>> b = bytes(p) >>> assert b[0:1] == b'\x02' >>> assert b[1:2] == b'\x89' >>> assert b[2:3] == b'\x01' ###(070)=[passed] Check building a request for Service 03 >>> p = OBD()/OBD_S03() >>> assert p.service == 0x03 ###(071)=[passed] Check building a request for Service 02 PID 7F >>> p = OBD()/OBD_S02(requests=[OBD_S02_Record(pid=0x7F, frame_no=0x01)]) >>> b = bytes(p) >>> assert b[0:1] == b'\x02' >>> assert b[1:2] == b'\x7F' >>> assert b[2:3] == b'\x01' ###(072)=[passed] Check building a request for Service 09 IID 00 >>> p = OBD()/OBD_S09(iid=0x00) >>> b = bytes(p) >>> assert b[0:1] == b'\x09' >>> assert b[1:2] == b'\x00' ###(073)=[passed] Check building a request for Service 09 IID 02 >>> p = OBD()/OBD_S09(iid=0x02) >>> b = bytes(p) >>> assert b[0:1] == b'\x09' >>> assert b[1:2] == b'\x02' ###(074)=[passed] Check building a request for Service 09 IID 04 >>> p = OBD()/OBD_S09(iid=0x04) >>> b = bytes(p) >>> assert b[0:1] == b'\x09' >>> assert b[1:2] == b'\x04' ###(075)=[passed] Check building a request for Service 09 IID 00 and IID 02 and IID 04 >>> p = OBD()/OBD_S09(iid=[0x00, 0x02, 0x04]) >>> b = bytes(p) >>> assert b[0:1] == b'\x09' >>> assert b[1:2] == b'\x00' >>> assert b[2:3] == b'\x02' >>> assert b[3:4] == b'\x04' ###(076)=[passed] Check building a request for Service 09 IID 0A >>> p = OBD()/OBD_S09(iid=0x0A) >>> b = bytes(p) >>> assert b[0:1] == b'\x09' >>> assert b[1:2] == b'\x0A' ###(077)=[passed] Check building a response for Service 03 >>> p = OBD()/OBD_S03_PR(dtcs=[OBD_DTC(), OBD_DTC(location='Powertrain', code1=1, code2=3, code3=0, code4=1)]) >>> b = bytes(p) >>> assert b[0:1] == b'\x43' >>> assert b[1:2] == b'\x02' >>> assert b[2:4] == b'\x00\x00' >>> assert b[4:6] == b'\x13\x01' >>> r = OBD(b'\x03') >>> assert p.answers(r) ###(078)=[passed] Check building a default response for Service 03 >>> p = OBD()/OBD_S03_PR() >>> b = bytes(p) >>> assert len(p) == 2 >>> assert b[0:1] == b'\x43' >>> assert b[1:2] == b'\x00' >>> assert p.dtcs == [] >>> r = OBD(b'\x03') >>> assert p.answers(r) ###(079)=[passed] Check building a response for Service 07 >>> p = OBD()/OBD_S07_PR(dtcs=[OBD_DTC(location='Chassis', code1=0, code2=5, code3=1, code4=0)]) >>> b = bytes(p) >>> assert b[0:1] == b'\x47' >>> assert b[1:2] == b'\x01' >>> assert b[2:4] == b'\x45\x10' >>> r = OBD(b'\x07') >>> assert p.answers(r) ###(080)=[passed] Check building a default response for Service 07 >>> p = OBD()/OBD_S07_PR() >>> b = bytes(p) >>> assert len(p) == 2 >>> assert b[0:1] == b'\x47' >>> assert b[1:2] == b'\x00' >>> assert p.dtcs == [] >>> r = OBD(b'\x07') >>> assert p.answers(r) ###(081)=[passed] Check building a response for Service 0A >>> p = OBD()/OBD_S0A_PR(dtcs=[OBD_DTC(), OBD_DTC(location='Body', code1=1, code2=7, code3=8, code4=2), OBD_DTC()]) >>> b = bytes(p) >>> assert b[0:1] == b'\x4A' >>> assert b[1:2] == b'\x03' >>> assert b[2:4] == b'\x00\x00' >>> assert b[4:6] == b'\x97\x82' >>> assert b[6:8] == b'\x00\x00' >>> r = OBD(b'\x0a') >>> assert p.answers(r) ###(082)=[passed] Check building a default response for Service 0A >>> p = OBD()/OBD_S0A_PR() >>> b = bytes(p) >>> assert len(p) == 2 >>> assert b[0:1] == b'\x4A' >>> assert b[1:2] == b'\x00' >>> assert p.dtcs == [] >>> r = OBD(b'\x0a') >>> assert p.answers(r) ###(083)=[passed] Check building a response for Service 09 IID 00 >>> p = OBD(service=0x49)/OBD_S09_PR(data_records=OBD_S09_PR_Record()/OBD_IID00(b'ABCD')) >>> b = bytes(p) >>> assert b[0:1] == b'\x49' >>> assert b[1:2] == b'\x00' >>> assert b[2:] == b'ABCD' >>> r = OBD(b'\x09\x00') >>> assert p.answers(r) ###(084)=[passed] Check building a response for Service 09 IID 02 with one VIN >>> p = OBD(service=0x49)/OBD_S09_PR(data_records=OBD_S09_PR_Record()/OBD_IID02(vehicle_identification_numbers=b'W0L000051T2123456')) >>> b = bytes(p) >>> assert b[0:1] == b'\x49' >>> assert b[1:2] == b'\x02' >>> assert b[2:3] == b'\x01' >>> assert b[3:] == b'W0L000051T2123456' >>> >>> r = OBD(b'\x09\x02') >>> assert p.answers(r) ###(085)=[passed] Check building a response for Service 09 IID 02 with two VINs >>> p = OBD(service=0x49)/OBD_S09_PR(data_records=OBD_S09_PR_Record()/OBD_IID02(vehicle_identification_numbers=[b'W0L000051T2123456', b'W0L000051T2123456'])) >>> b = bytes(p) >>> assert b[0:1] == b'\x49' >>> assert b[1:2] == b'\x02' >>> assert b[2:3] == b'\x02' >>> assert b[3:20] == b'W0L000051T2123456' >>> assert b[20:] == b'W0L000051T2123456' >>> >>> r = OBD(b'\x09\x02') >>> assert p.answers(r) ###(086)=[passed] Check building a response for Service 09 IID 04 with one CID >>> p = OBD(service=0x49)/OBD_S09_PR(data_records=OBD_S09_PR_Record()/OBD_IID04(calibration_identifications=b'ABCDEFGHIJKLMNOP')) >>> b = bytes(p) >>> assert b[0:1] == b'\x49' >>> assert b[1:2] == b'\x04' >>> assert b[2:3] == b'\x01' >>> assert b[3:] == b'ABCDEFGHIJKLMNOP' >>> >>> r = OBD(b'\x09\x04') >>> assert p.answers(r) ###(087)=[passed] Check building a response for Service 09 IID 04 with two CID >>> p = OBD(service=0x49)/OBD_S09_PR(data_records=OBD_S09_PR_Record()/OBD_IID04(calibration_identifications=[b'ABCDEFGHIJKLMNOP', b'ABCDEFGHIJKLMNOP'])) >>> b = bytes(p) >>> assert b[0:1] == b'\x49' >>> assert b[1:2] == b'\x04' >>> assert b[2:3] == b'\x02' >>> assert b[3:19] == b'ABCDEFGHIJKLMNOP' >>> assert b[19:] == b'ABCDEFGHIJKLMNOP' >>> >>> r = OBD(b'\x09\x04') >>> assert p.answers(r) ###(088)=[passed] Check building a response for Service 09 IID 0A >>> p = OBD(service=0x49)/OBD_S09_PR(data_records=OBD_S09_PR_Record()/OBD_IID0A(ecu_names=b'ABCDEFGHIJKLMNOPQRST')) >>> b = bytes(p) >>> assert b[0:1] == b'\x49' >>> assert b[1:2] == b'\x0A' >>> assert b[2:3] == b'\x01' >>> assert b[3:] == b'ABCDEFGHIJKLMNOPQRST' >>> >>> r = OBD(b'\x09\x0a') >>> assert p.answers(r) ###(089)=[passed] Check building a response for Service 09 IID 02 and IID 04 >>> p = OBD(service=0x49)/OBD_S09_PR(data_records=[ ... OBD_S09_PR_Record()/OBD_IID02(vehicle_identification_numbers=b'ABCDEFGHIJKLMNOPQ'), ... OBD_S09_PR_Record()/OBD_IID04(calibration_identifications=b'ABCDEFGHIJKLMNOP') ... ]) >>> b = bytes(p) >>> assert b[0:1] == b'\x49' >>> assert b[1:2] == b'\x02' >>> assert b[2:3] == b'\x01' >>> assert b[3:20] == b'ABCDEFGHIJKLMNOPQ' >>> assert b[20:21] == b'\x04' >>> assert b[21:22] == b'\x01' >>> assert b[22:] == b'ABCDEFGHIJKLMNOP' >>> >>> r = OBD(b'\x09\x02\x04') >>> assert p.answers(r) Regression tests for obd_scan ━ Run at 01:43:18 from [test/contrib/automotive/obd/scanner.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for automotive scanner configuration ━ Run at 01:43:18 from [test/contrib/automotive/scanner/configuration.uts] by UTscapy in 0.021356582641601562 └ Passed=8 └ Failed=0 ###### ## Load general modules ###### ###(000)=[passed] Load contribution layer >>> from scapy.contrib.automotive.scanner.test_case import AutomotiveTestCase >>> from scapy.contrib.automotive.scanner.configuration import AutomotiveTestCaseExecutorConfiguration >>> from scapy.contrib.automotive.scanner.staged_test_case import StagedAutomotiveTestCase ###### ## Basic checks ###### ###(001)=[passed] Definition of Test classes >>> class MyTestCase1(AutomotiveTestCase): ... _description = "MyTestCase1" ... def supported_responses(self): ... return [] ... >>> >>> class MyTestCase2(AutomotiveTestCase): ... _description = "MyTestCase2" ... def supported_responses(self): ... return [] ... >>> class MyTestCase3(AutomotiveTestCase): ... _description = "MyTestCase3" ... def supported_responses(self): ... return [] ... >>> class MyTestCase4(AutomotiveTestCase): ... _description = "MyTestCase4" ... def supported_responses(self): ... return [] ... ###(002)=[passed] creation of config with classes >>> config = AutomotiveTestCaseExecutorConfiguration( ... [MyTestCase1, MyTestCase2, MyTestCase3, MyTestCase4]) >>> >>> assert len(config.test_cases) == 4 >>> assert len(config.test_case_clss) == 4 >>> assert len(config.stages) == 0 >>> assert len(config.staged_test_cases) == 0 >>> assert config.verbose == False >>> assert config.debug == False ###(003)=[passed] creation of config with instances >>> config = AutomotiveTestCaseExecutorConfiguration( ... [MyTestCase1(), MyTestCase2(), MyTestCase3(), MyTestCase4()]) >>> >>> assert len(config.test_cases) == 4 >>> assert len(config.test_case_clss) == 4 >>> assert len(config.stages) == 0 >>> assert len(config.staged_test_cases) == 0 >>> assert config.verbose == False >>> assert config.debug == False ###(004)=[passed] creation of config with instances and classes >>> config = AutomotiveTestCaseExecutorConfiguration( ... [MyTestCase2(), MyTestCase2(), MyTestCase3, MyTestCase4]) >>> >>> assert len(config.test_cases) == 4 >>> assert len(config.test_case_clss) == 3 >>> assert len(config.stages) == 0 >>> assert len(config.staged_test_cases) == 0 >>> assert config.verbose == False >>> assert config.debug == False ###(005)=[passed] creation of config with instances and classes and global configuration and local configuration >>> config = AutomotiveTestCaseExecutorConfiguration( ... [MyTestCase2(), MyTestCase2(), MyTestCase3, MyTestCase4], ... global_config=42, verbose=True, MyTestCase2_kwargs={"local_config": 41}) >>> >>> assert len(config.test_cases) == 4 >>> assert len(config.test_case_clss) == 3 >>> assert len(config.stages) == 0 >>> assert len(config.staged_test_cases) == 0 >>> assert config.verbose == True >>> assert config.debug == False >>> assert config["MyTestCase2"]["global_config"] == 42 >>> assert config["MyTestCase2"]["local_config"] == 41 >>> assert config["MyTestCase2"]["verbose"] == True >>> try: ... print(config["MyTestCase1"]["global_config"]) ... raise AssertionError ... except KeyError: ... pass ... >>> assert len(config["MyTestCase3"]) == 3 >>> assert len(config["MyTestCase2"]) == 4 >>> >>> try: ... print(config["MyTestCase3"]["local_config"]) ... raise AssertionError ... except KeyError: ... pass ... ###(006)=[passed] creation of config with stages >>> st = StagedAutomotiveTestCase([MyTestCase1(), MyTestCase2()]) >>> >>> config = AutomotiveTestCaseExecutorConfiguration( ... [MyTestCase2(), MyTestCase2, MyTestCase3, MyTestCase4, st]) >>> >>> assert len(config.test_cases) == 5 >>> assert len(config.test_case_clss) == 5 >>> assert len(config.stages) == 1 >>> assert len(config.staged_test_cases) == 2 >>> assert config.verbose == False >>> assert config.debug == False >>> assert config.staged_test_cases[0].__class__ == MyTestCase1 >>> assert config.staged_test_cases[1].__class__ == MyTestCase2 >>> assert config.stages[0].__class__ == StagedAutomotiveTestCase ###(007)=[passed] creation of config with stages class >>> class myStagedTestCase(StagedAutomotiveTestCase): ... def __init__(self): ... # type: () -> None ... super(myStagedTestCase, self).__init__( ... [MyTestCase1(), MyTestCase2()], ... None) ... >>> >>> config = AutomotiveTestCaseExecutorConfiguration( ... [MyTestCase2(), MyTestCase2, MyTestCase3, MyTestCase4, myStagedTestCase]) >>> >>> assert len(config.test_cases) == 5 >>> assert len(config.test_case_clss) == 5 >>> assert len(config.stages) == 1 >>> assert len(config.staged_test_cases) == 2 >>> assert config.staged_test_cases[0].__class__ == MyTestCase1 >>> assert config.staged_test_cases[1].__class__ == MyTestCase2 >>> assert config.stages[0].__class__ == myStagedTestCase >>> assert config.verbose == False >>> assert config.debug == False Regression tests for enumerators ━ Run at 01:43:19 from [test/contrib/automotive/scanner/enumerator.uts] by UTscapy in 0.6665081977844238 └ Passed=42 └ Failed=0 ###### ## Load general modules ###### ###(000)=[passed] Load contribution layer >>> from scapy.contrib.automotive.scanner.enumerator import _AutomotiveTestCaseScanResult, ServiceEnumerator, StateGenerator, StateGeneratingServiceEnumerator >>> from scapy.contrib.automotive.scanner.test_case import TestCaseGenerator, AutomotiveTestCase >>> from scapy.contrib.automotive.scanner.executor import AutomotiveTestCaseExecutor >>> from scapy.contrib.isotp import ISOTP >>> from scapy.contrib.automotive.uds import * >>> from scapy.contrib.automotive.scanner.staged_test_case import StagedAutomotiveTestCase >>> from scapy.utils import SingleConversationSocket >>> from scapy.contrib.automotive.ecu import EcuState, EcuResponse >>> from scapy.contrib.automotive.uds_ecu_states import * >>> import copy ###### ## Basic checks ###### ###(001)=[passed] ServiceEnumerator basecls checks >>> pkts = [ ... _AutomotiveTestCaseScanResult(EcuState(session=1), UDS(b"\x20abcd"), UDS(b"\x60abcd"), 1.0, 1.9), ... _AutomotiveTestCaseScanResult(EcuState(session=2), UDS(b"\x20abcd"), None, 2.0, None), ... _AutomotiveTestCaseScanResult(EcuState(session=1), UDS(b"\x21abcd"), UDS(b"\x7fabcd"), 3.0, 3.1), ... _AutomotiveTestCaseScanResult(EcuState(session=2), UDS(b"\x21abcd"), UDS(b"\x7fa\x10cd"), 4.0, 4.5), ... ] >>> >>> class MyTestCase(ServiceEnumerator): ... _supported_kwargs = copy.copy(ServiceEnumerator._supported_kwargs) ... _supported_kwargs.update({ ... 'local_kwarg': ((int, str), None), ... 'verbose': (bool, None), ... 'global_arg': (str, None) ... }) ... def _get_initial_requests(self, **kwargs): ... # type: (Any) -> Iterable[Packet] ... return UDS(service=range(1, 11)) ... def _get_table_entry_y(self, tup): ... # type: (_AutomotiveTestCaseScanResult) -> str ... return "0x%02x: %s" % (tup[1].service, tup[1].sprintf("%UDS.service%")) ... def _get_table_entry_z(self, tup): ... # type: (_AutomotiveTestCaseScanResult) -> str ... return self._get_label(tup[2], "PR: Supported") ... @staticmethod ... def _get_negative_response_label(response): ... # type: (Packet) -> str ... return response.sprintf("NR: %UDS_NR.negativeResponseCode%") ... @staticmethod ... def _get_negative_response_code(resp): ... # type: (Packet) -> int ... return resp.negativeResponseCode ... @staticmethod ... def _get_negative_response_desc(nrc): ... # type: (int) -> str ... return UDS_NR(negativeResponseCode=nrc).sprintf( ... "%UDS_NR.negativeResponseCode%") ... >>> >>> e = MyTestCase() >>> for p in pkts: ... p.req.time = p.req_ts ... p.req.sent_time = p.req_ts ... if p.resp is not None: ... p.resp.time = p.resp_ts ... e._store_result(p.state, p.req, p.resp) ... ###(002)=[passed] ServiceEnumerator not completed check >>> assert e.completed == False ###(003)=[passed] ServiceEnumerator completed >>> e._state_completed[EcuState(session=1)] = True >>> e._state_completed[EcuState(session=2)] = True >>> >>> assert e.completed ###(004)=[passed] ServiceEnumerator stats check >>> stat_list = e._compute_statistics() >>> >>> stats = {label: value for state, label, value in stat_list if state == "all"} >>> print(stats) {'num_answered': '3', 'num_unanswered': '1', 'num_negative_resps': '2', 'answertime_min': '0.1', 'answertime_max': '0.9', 'answertime_avg': '0.5', 'answertime_min_nr': '0.1', 'answertime_max_nr': '0.5', 'answertime_avg_nr': '0.3', 'answertime_min_pr': '0.9', 'answertime_max_pr': '0.9', 'answertime_avg_pr': '0.9'} >>> >>> assert stats["num_answered"] == '3' >>> assert stats["num_unanswered"] == '1' >>> assert stats["answertime_max"] == '0.9' >>> assert stats["answertime_min"] == '0.1' >>> assert stats["answertime_avg"] == '0.5' >>> assert stats["num_negative_resps"] == '2' ###(005)=[passed] ServiceEnumerator scanned states >>> assert len(e.scanned_states) == 2 >>> assert {EcuState(session=1), EcuState(session=2)} == e.scanned_states ###(006)=[passed] ServiceEnumerator scanned results >>> assert len(e.results_with_positive_response) == 1 >>> assert len(e.results_with_negative_response) == 2 >>> assert len(e.results_without_response) == 1 >>> assert len(e.results_with_response) == 3 ###(007)=[passed] ServiceEnumerator get_label >>> assert e._get_label(pkts[0].resp) == "PR: PositiveResponse" >>> assert e._get_label(pkts[0].resp, lambda _: "positive") == "positive" >>> assert e._get_label(pkts[0].resp, lambda _: "positive" + hex(pkts[0].req.service)) == "positive" + "0x20" >>> assert e._get_label(pkts[1].resp) == "Timeout" >>> assert e._get_label(pkts[2].resp) == "NR: 98" >>> assert e._get_label(pkts[3].resp) == "NR: generalReject" ###(008)=[passed] ServiceEnumerator show >>> e.show(filtered=False) ============================ AutomotiveTestCase ---------------------------- 4 requests were sent, 3 answered, 1 unanswered Statistics per state -------------------+-----+----------+----------+ | all | session1 | session2 | -------------------+-----+----------+----------+ answertime_avg | 0.5 | 0.5 | 0.5 | answertime_avg_nr | 0.3 | 0.1 | 0.5 | answertime_avg_pr | 0.9 | 0.9 | - | answertime_max | 0.9 | 0.9 | 0.5 | answertime_max_nr | 0.5 | 0.1 | 0.5 | answertime_max_pr | 0.9 | 0.9 | - | answertime_min | 0.1 | 0.1 | 0.5 | answertime_min_nr | 0.1 | 0.1 | 0.5 | answertime_min_pr | 0.9 | 0.9 | - | num_answered | 3 | 2 | 1 | num_negative_resps | 2 | 1 | 1 | num_unanswered | 1 | 0 | 1 | -------------------+-----+----------+----------+ 2 negative responses were received These negative response codes were received 0x62 0x10 NRC 0x62: 98 received 1 times NRC 0x10: generalReject received 1 times -----------+---------------+-------------------+ | session1 | session2 | -----------+---------------+-------------------+ 0x20: 0x20 | PR: Supported | Timeout | 0x21: 0x21 | NR: 98 | NR: generalReject | -----------+---------------+-------------------+ >>> >>> dump = e.show(dump=True, filtered=False) >>> assert "NR: 98" in dump >>> assert "NR: generalReject" in dump >>> assert "PR: Supported" in dump >>> assert "Timeout" in dump >>> assert "session1" in dump >>> assert "session2" in dump >>> assert "0x20" in dump >>> assert "0x21" in dump ###(009)=[passed] ServiceEnumerator filtered results before show >>> print(len(e.filtered_results)) 2 >>> assert len(e.filtered_results) == 2 >>> assert e.filtered_results[0] == pkts[0] >>> assert e.filtered_results[1] == pkts[2] ###(010)=[passed] ServiceEnumerator show filtered >>> e.show(filtered=True) Removed NRC 0x10 to filter ============================ AutomotiveTestCase ---------------------------- 4 requests were sent, 3 answered, 1 unanswered Statistics per state -------------------+-----+----------+----------+ | all | session1 | session2 | -------------------+-----+----------+----------+ answertime_avg | 0.5 | 0.5 | 0.5 | answertime_avg_nr | 0.3 | 0.1 | 0.5 | answertime_avg_pr | 0.9 | 0.9 | - | answertime_max | 0.9 | 0.9 | 0.5 | answertime_max_nr | 0.5 | 0.1 | 0.5 | answertime_max_pr | 0.9 | 0.9 | - | answertime_min | 0.1 | 0.1 | 0.5 | answertime_min_nr | 0.1 | 0.1 | 0.5 | answertime_min_pr | 0.9 | 0.9 | - | num_answered | 3 | 2 | 1 | num_negative_resps | 2 | 1 | 1 | num_unanswered | 1 | 0 | 1 | -------------------+-----+----------+----------+ 2 negative responses were received These negative response codes were received 0x62 0x10 NRC 0x62: 98 received 1 times NRC 0x10: generalReject received 1 times The following negative response codes are blacklisted: ['serviceNotSupported'] -----------+---------------+-------------------+ | session1 | session2 | -----------+---------------+-------------------+ 0x20: 0x20 | PR: Supported | - | 0x21: 0x21 | NR: 98 | NR: generalReject | -----------+---------------+-------------------+ >>> >>> dump = e.show(dump=True, filtered=True) >>> assert "NR: 98" in dump >>> assert "NR: generalReject" in dump >>> assert "PR: Supported" in dump >>> assert "Timeout" not in dump >>> assert "session1" in dump >>> assert "session2" in dump >>> assert "all" in dump >>> assert "0x20" in dump >>> assert "0x21" in dump >>> assert "The following negative response codes are blacklisted: ['serviceNotSupported']" in dump ###(011)=[passed] ServiceEnumerator filtered results after show >>> assert len(e.filtered_results) == 3 >>> assert e.filtered_results[0] == pkts[0] >>> assert e.filtered_results[1] == pkts[2] ###(012)=[passed] ServiceEnumerator supported responses >>> assert len(e.supported_responses) == 3 ###(013)=[passed] ServiceEnumerator evaluate response >>> conf = {} >>> >>> assert False == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), None, **conf) >>> assert False == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x7f\x10\x10"), **conf) >>> conf = {"exit_if_service_not_supported": True, "retry_if_busy_returncode": False} >>> assert False == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x7f\x10\x21"), **conf) >>> assert False == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x7f\x10\x10"), **conf) >>> assert True == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x7f\x10\x11"), **conf) >>> assert True == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x7f\x10\x7f"), **conf) >>> conf = {"exit_if_service_not_supported": False, "retry_if_busy_returncode": True} >>> assert not e._retry_pkt[EcuState(session=1)] >>> assert False == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x7f\x10\x10"), **conf) >>> assert False == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x7f\x10\x11"), **conf) >>> assert False == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x7f\x10\x7f"), **conf) >>> assert not e._retry_pkt[EcuState(session=1)] >>> assert True == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x7f\x10\x21"), **conf) >>> assert e._retry_pkt[EcuState(session=1)] == UDS(b"\x10\x03abcd") >>> assert False == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x7f\x10\x21"), **conf) >>> assert not e._retry_pkt[EcuState(session=1)] >>> >>> assert True == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), UDS(b"\x50\x03\x00"), **conf) >>> assert False == e._evaluate_response(EcuState(session=1), UDS(b"\x11\x03abcd"), UDS(b"\x51\x03\x00"), **conf) >>> conf = {"retry_if_none_received": True} >>> assert True == e._evaluate_response(EcuState(session=1), UDS(b"\x10\x03abcd"), None, **conf) >>> assert e._retry_pkt[EcuState(session=1)] ###(014)=[passed] ServiceEnumerator execute >>> from queue import Queue >>> from scapy.supersocket import SuperSocket >>> >>> class MockISOTPSocket(SuperSocket): ... nonblocking_socket = True ... @property ... def closed(self): ... return False ... @closed.setter ... def closed(self, var): ... pass ... def __init__(self, rcvd_queue=None): ... self.rcvd_queue = Queue() ... self.sent_queue = Queue() ... if rcvd_queue is not None: ... for c in rcvd_queue: ... self.rcvd_queue.put(c) ... def recv_raw(self, x=MTU): ... pkt = bytes(self.rcvd_queue.get(True, 0.01)) ... return UDS, pkt, 10.0 ... def send(self, x): ... sx = raw(x) ... try: ... x.sent_time = 9.0 ... except AttributeError: ... pass ... self.sent_queue.put(sx) ... return len(sx) ... @staticmethod ... def select(sockets, remain=None): ... time.sleep(0) ... return sockets ... def sr(self, *args, **kargs): ... from scapy import sendrecv ... return sendrecv.sndrcv(self, *args, threaded=False, **kargs) ... def sr1(self, *args, **kargs): ... from scapy import sendrecv ... ans = sendrecv.sndrcv(self, *args, threaded=False, **kargs)[0] # type: SndRcvList ... if len(ans) > 0: ... pkt = ans[0][1] # type: Packet ... return pkt ... else: ... return None ... >>> sock = MockISOTPSocket() >>> sock.rcvd_queue.put(b"\x41") >>> sock.rcvd_queue.put(b"\x42") >>> sock.rcvd_queue.put(b"\x43") >>> sock.rcvd_queue.put(b"\x44") >>> sock.rcvd_queue.put(b"\x45") >>> sock.rcvd_queue.put(b"\x46") >>> sock.rcvd_queue.put(b"\x47") >>> sock.rcvd_queue.put(b"\x48") >>> sock.rcvd_queue.put(b"\x49") >>> sock.rcvd_queue.put(b"\x4A") >>> >>> e = MyTestCase() >>> >>> e.execute(sock, EcuState(session=1)) Finished iterator execution >>> >>> assert len(e.filtered_results) == 10 >>> assert len(e.results_with_response) == 10 >>> assert len(e.results_without_response) == 0 >>> >>> assert e.has_completed(EcuState(session=1)) >>> assert e.completed >>> >>> e.execute(sock, EcuState(session=2), timeout=0.01) Socket failed with ''. It was closed. Socket failed with ''. It was closed. more Socket failed with ''. It was closed. Finished iterator execution >>> >>> assert len(e.filtered_results) == 10 >>> assert len(e.results_with_response) == 10 >>> assert len(e.results_without_response) == 10 >>> >>> assert e.has_completed(EcuState(session=2)) >>> >>> e.execute(sock, EcuState(session=3), timeout=0.01, exit_if_no_answer_received=True) >>> >>> assert not e.has_completed(EcuState(session=3)) >>> assert not e.completed >>> assert len(e.scanned_states) == 3 >>> >>> e.execute(sock, EcuState(session=42), state_block_list=[EcuState(session=42)]) >>> >>> assert e.has_completed(EcuState(session=42)) >>> assert len(e.scanned_states) == 3 >>> >>> e.execute(sock, EcuState(session=13), state_block_list=EcuState(session=13)) >>> >>> assert e.has_completed(EcuState(session=13)) >>> assert len(e.scanned_states) == 3 >>> >>> e.execute(sock, EcuState(session=41), state_allow_list=[EcuState(session=42)]) >>> >>> assert e.has_completed(EcuState(session=41)) >>> assert len(e.scanned_states) == 3 >>> >>> e.execute(sock, EcuState(session=12), state_allow_list=EcuState(session=13)) >>> >>> assert e.has_completed(EcuState(session=12)) >>> assert len(e.scanned_states) == 3 ###(015)=[passed] Test negative response code service not supported >>> sock.rcvd_queue.put(b"\x7f\x01\x11") >>> sock.rcvd_queue.put(b"\x7f\x01\x7f") >>> >>> e = MyTestCase() >>> >>> e.execute(sock, EcuState(session=1), exit_if_service_not_supported=True) >>> >>> assert not e._retry_pkt[EcuState(session=1)] >>> assert len(e.results_with_response) == 1 >>> assert len(e.results_with_negative_response) == 1 >>> assert e.completed >>> >>> e.execute(sock, EcuState(session=2), exit_if_service_not_supported=True) >>> >>> assert not e._retry_pkt[EcuState(session=2)] >>> assert len(e.results_with_response) == 2 >>> assert len(e.results_with_negative_response) == 2 >>> assert e.completed ###(016)=[passed] Test negative response code retry if busy >>> sock.rcvd_queue.put(b"\x7f\x01\x21") >>> sock.rcvd_queue.put(b"\x7f\x01\x10") >>> >>> e = MyTestCase() >>> >>> e.execute(sock, EcuState(session=1)) >>> >>> assert e._retry_pkt[EcuState(session=1)] >>> assert len(e.results_with_response) == 1 >>> assert len(e.results_with_negative_response) == 1 >>> assert len(e.results_without_response) == 0 >>> assert not e.completed >>> >>> e.execute(sock, EcuState(session=1)) Finished iterator execution >>> >>> assert not e._retry_pkt[EcuState(session=1)] >>> assert len(e.results_with_response) == 2 >>> assert len(e.results_with_negative_response) == 2 >>> assert len(e.results_without_response) == 9 >>> assert e.completed >>> assert e.has_completed(EcuState(session=1)) ###(017)=[passed] Test negative response code don't retry if busy >>> sock.rcvd_queue.put(b"\x7f\x01\x21") >>> >>> e = MyTestCase() >>> >>> e.execute(sock, EcuState(session=1), retry_if_busy_returncode=False) Finished iterator execution >>> >>> assert not e._retry_pkt[EcuState(session=1)] >>> assert len(e.results_with_response) == 1 >>> assert len(e.results_with_negative_response) == 1 >>> assert len(e.results_without_response) == 9 >>> assert e.completed >>> assert e.has_completed(EcuState(session=1)) ###(018)=[passed] Test execution time >>> sock.rcvd_queue.put(b"\x7f\x01\x10") >>> >>> e = MyTestCase() >>> >>> e.execute(sock, EcuState(session=1), execution_time=-1) >>> >>> assert not e._retry_pkt[EcuState(session=1)] >>> assert len(e.results_with_response) == 1 >>> assert len(e.results_with_negative_response) == 1 >>> assert len(e.results_without_response) == 0 >>> assert not e.completed >>> assert not e.has_completed(EcuState(session=1)) ###### ## AutomotiveTestCaseExecutorConfiguration tests ###### ###(019)=[passed] Definitions >>> class MockSock(object): ... closed = False ... def sr1(self, *args, **kwargs): ... raise OSError ... >>> class TestCase1(MyTestCase): ... pass ... >>> class TestCase2(MyTestCase): ... pass ... >>> class Scanner(AutomotiveTestCaseExecutor): ... @property ... def default_test_case_clss(self): ... # type: () -> List[Type[AutomotiveTestCaseABC]] ... return [MyTestCase] ... ###(020)=[passed] Basic tests >>> tce = Scanner(MockSock(), test_cases=[TestCase1, TestCase2, MyTestCase], ... verbose=True, debug=True, ... global_arg="Whatever", TestCase1_kwargs={"local_kwarg": 42}) >>> >>> config = tce.configuration # type: AutomotiveTestCaseExecutorConfiguration >>> assert config.verbose >>> assert config.debug >>> assert len(config.test_cases) == 3 >>> assert len(config.stages) == 0 >>> assert len(config.staged_test_cases) == 0 >>> assert len(config.test_case_clss) == 3 >>> assert len(config.TestCase1.items()) == 5 >>> assert len(config.TestCase2.items()) == 4 >>> assert len(config["TestCase1"].items()) == 5 >>> assert len(config.MyTestCase.items()) == 4 >>> assert config.TestCase1["verbose"] >>> assert config.TestCase1["debug"] >>> assert config.TestCase1["local_kwarg"] == 42 >>> assert config.TestCase1["global_arg"] == "Whatever" >>> assert config.TestCase2["global_arg"] == "Whatever" >>> assert config.MyTestCase["global_arg"] == "Whatever" >>> assert isinstance(tce.socket, SingleConversationSocket) ###(021)=[passed] Basic tests with default values >>> tce = Scanner(MockSock()) >>> >>> config = tce.configuration # type: AutomotiveTestCaseExecutorConfiguration >>> assert not config.verbose >>> assert not config.debug >>> assert len(config.test_cases) == 1 >>> assert len(config.MyTestCase.items()) == 1 >>> assert isinstance(tce.socket, SingleConversationSocket) ###(022)=[passed] Basic test with stages >>> def connector(testcase1, _): ... scan_range = len(testcase1.results) ... return {"verbose": True, "scan_range": scan_range} ... >>> tc1 = TestCase1() >>> tc2 = TestCase2() >>> >>> pipeline = StagedAutomotiveTestCase([tc1, tc2], [None, connector]) >>> >>> tce = Scanner(MockSock(), test_cases=[pipeline]) >>> >>> config = tce.configuration # type: AutomotiveTestCaseExecutorConfiguration >>> assert not config.verbose >>> assert not config.debug >>> assert len(config.test_cases) == 1 >>> assert len(config.stages) == 1 >>> assert len(config.staged_test_cases) == 2 >>> assert len(config.test_case_clss) == 3 >>> assert len(config.StagedAutomotiveTestCase.items()) == 1 >>> assert isinstance(tce.socket, SingleConversationSocket) ###(023)=[passed] Basic tests with two stages >>> def connector(testcase1, testcase2): ... scan_range = len(testcase1.results) ... return {"verbose": True, "scan_range": scan_range} ... >>> tc1 = TestCase1() >>> tc2 = TestCase2() >>> >>> pipeline = StagedAutomotiveTestCase([tc1, tc2], [None, connector]) >>> >>> class StagedTest(StagedAutomotiveTestCase): ... pass ... >>> pipeline2 = StagedTest([MyTestCase(), MyTestCase()]) >>> >>> tce = Scanner(MockSock(), test_cases=[pipeline, pipeline2], verbose=True) >>> >>> config = tce.configuration # type: AutomotiveTestCaseExecutorConfiguration >>> assert config.verbose >>> assert not config.debug >>> assert len(config.test_cases) == 2 >>> assert len(config.stages) == 2 >>> assert len(config.staged_test_cases) == 4 >>> assert len(config.test_case_clss) == 5 >>> assert len(config.StagedAutomotiveTestCase.items()) == 2 >>> assert len(config.StagedTest.items()) == 2 >>> assert len(config.TestCase1.items()) == 2 >>> assert len(config.TestCase2.items()) == 2 >>> assert len(config.MyTestCase.items()) == 2 >>> >>> assert isinstance(tce.socket, SingleConversationSocket) >>> >>> assert len(tce.state_paths) == 1 >>> assert len(tce.final_states) == 1 >>> >>> tce.state_graph.add_edge((tce.final_states[0], EcuState(session=2))) >>> >>> assert len(tce.state_paths) == 2 >>> assert len(tce.final_states) == 2 >>> >>> assert not tce.scan_completed ###(024)=[passed] Reset Handler tests >>> reset_flag = False >>> >>> def reset_func(): ... global reset_flag ... reset_flag = True ... >>> tce = Scanner(MockSock(), reset_handler=reset_func) >>> tce.target_state = EcuState(session=2) >>> tce.reset_target() Target reset >>> >>> assert reset_flag >>> assert tce.target_state == EcuState(session=1) ###(025)=[passed] Reset Handler tests 2 >>> tce = Scanner(MockSock()) >>> tce.target_state = EcuState(session=2) >>> tce.reset_target() Target reset >>> >>> assert tce.target_state == EcuState(session=1) ###(026)=[passed] Reconnect Handler tests >>> class MockSocket2: ... closed = False ... >>> def reconnect_func(): ... return MockSocket2() ... >>> tce = Scanner(MockSock(), reconnect_handler=reconnect_func) >>> >>> print(tce.socket) >>> print(repr(tce.socket)) >>> assert isinstance(tce.socket._inner, MockSock) >>> tce.reconnect() Exception ''MockSock' object has no attribute 'close'' during socket.close Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/contrib/automotive/scanner/executor.py", line 162, in reconnect self.socket.close() ^^^^^^^^^^^^^^^^^ File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/utils.py", line 4016, in __getattr__ return getattr(self._inner, name) AttributeError: 'MockSock' object has no attribute 'close'. Did you mean: 'closed'? Target reconnect >>> assert isinstance(tce.socket._inner, MockSocket2) ###(027)=[passed] Reconnect Handler tests 2 >>> closed = False >>> >>> class MockSocket1: ... closed = False ... def close(self): ... global closed ... closed = True ... >>> class MockSocket2: ... closed = False ... >>> def reconnect_func(): ... return MockSocket2() ... >>> tce = Scanner(MockSocket1(), reconnect_handler=reconnect_func) >>> >>> print(tce.socket) >>> print(repr(tce.socket)) >>> assert isinstance(tce.socket._inner, MockSocket1) >>> tce.reconnect() Target reconnect >>> assert isinstance(tce.socket._inner, MockSocket2) >>> assert closed ###(028)=[passed] TestCase execute >>> pre_exec = False >>> execute = False >>> post_exec = False >>> >>> class TestCase42(MyTestCase): ... def pre_execute(self, ... socket, # type: _SocketUnion ... state, # type: EcuState ... global_configuration # type: AutomotiveTestCaseExecutorConfiguration # noqa: E501 ... ): # type: (...) -> None ... global pre_exec ... assert state == EcuState(session=1) ... assert global_configuration.TestCase42["local_kwarg"] == 42 ... assert global_configuration.TestCase42["verbose"] ... assert global_configuration.TestCase42["debug"] ... global_configuration.TestCase42["local_kwarg"] = 1 ... pre_exec = True ... def execute(self, socket, state, local_kwarg, verbose, debug, **kwargs): ... global execute ... assert verbose ... assert debug ... assert local_kwarg == 1 ... execute = True ... def post_execute(self, ... socket, # type: _SocketUnion ... state, # type: EcuState ... global_configuration # type: AutomotiveTestCaseExecutorConfiguration # noqa: E501 ... ): # type: (...) -> None ... global post_exec ... assert global_configuration.TestCase42["local_kwarg"] == 1 ... assert global_configuration.TestCase42["verbose"] ... assert global_configuration.TestCase42["debug"] ... post_exec = True ... >>> >>> tce = Scanner(MockSock(), test_cases=[TestCase42], ... verbose=True, debug=True, ... TestCase42_kwargs={"local_kwarg": 42}) >>> >>> tce.execute_test_case(TestCase42()) >>> assert pre_exec == execute == post_exec == True ###(029)=[passed] TestCase execute StateGenerator >>> transition_done = False >>> >>> def transition_func(sock, conf, kwargs): ... assert kwargs["arg42"] == "hello" ... assert conf.TestCase43["local_kwarg"] == "world" ... global transition_done ... transition_done = True ... return True ... >>> class TestCase43(MyTestCase, StateGenerator): ... def get_new_edge(self, socket, config): ... assert config.TestCase43["local_kwarg"] == "world" ... return EcuState(session=1), EcuState(session=2) ... def get_transition_function(self, socket, edge): ... assert edge[0] == EcuState(session=1) ... assert edge[1] == EcuState(session=2) ... return transition_func, {"arg42": "hello"}, None ... def execute(self, socket, state, **kwargs): ... return True ... >>> >>> tce = Scanner(MockSock(), test_cases=[TestCase43], ... TestCase43_kwargs={"local_kwarg": "world"}) >>> >>> assert len(tce.final_states) == 1 >>> >>> tce.execute_test_case(TestCase43()) >>> >>> assert len(tce.final_states) == 2 >>> assert EcuState(session=1) in tce.final_states and EcuState(session=2) in tce.final_states >>> assert tce.enter_state(EcuState(session=1), EcuState(session=2)) >>> assert transition_done ###(030)=[passed] TestCase execute StateGenerator no edge >>> class TestCase43(MyTestCase, StateGenerator): ... def get_new_edge(self, socket, config): ... assert config.TestCase43["local_kwarg"] == "world" ... return None ... def execute(self, socket, state, **kwargs): ... return True ... def get_transition_function(self, socket, edge): ... raise NotImplementedError() ... >>> tce = Scanner(MockSock(), test_cases=[TestCase43], ... TestCase43_kwargs={"local_kwarg": "world"}) >>> >>> assert len(tce.final_states) == 1 >>> >>> tce.execute_test_case(TestCase43()) >>> >>> assert len(tce.final_states) == 1 >>> assert EcuState(session=1) in tce.final_states >>> assert not tce.enter_state(EcuState(session=1), EcuState(session=2)) No transition function for (session1, session2) ###(031)=[passed] TestCase execute StateGenerator with cleanupfunc >>> transition_done = False >>> cleanup_done = False >>> >>> def transition_func(sock, conf, kwargs): ... assert kwargs["arg42"] == "hello" ... assert conf.TestCase43["local_kwarg"] == "world" ... global transition_done ... transition_done = True ... return True ... >>> def cleanup_func(sock, conf): ... assert conf.TestCase43["local_kwarg"] == "world" ... global cleanup_done ... cleanup_done = True ... return True ... >>> class TestCase43(MyTestCase, StateGenerator): ... def get_new_edge(self, socket, config): ... assert config.TestCase43["local_kwarg"] == "world" ... return EcuState(session=1), EcuState(session=2) ... def get_transition_function(self, socket, edge): ... assert edge[0] == EcuState(session=1) ... assert edge[1] == EcuState(session=2) ... return transition_func, {"arg42": "hello"}, cleanup_func ... def execute(self, socket, state, **kwargs): ... return True ... >>> >>> tce = Scanner(MockSock(), test_cases=[TestCase43], ... TestCase43_kwargs={"local_kwarg": "world"}) >>> >>> assert len(tce.final_states) == 1 >>> >>> tce.execute_test_case(TestCase43()) >>> >>> assert len(tce.final_states) == 2 >>> assert EcuState(session=1) in tce.final_states and EcuState(session=2) in tce.final_states >>> assert not len(tce.cleanup_functions) >>> assert tce.enter_state(EcuState(session=1), EcuState(session=2)) >>> assert transition_done >>> assert len(tce.cleanup_functions) >>> tce.cleanup_state() >>> assert not len(tce.cleanup_functions) >>> assert cleanup_done ###(032)=[passed] TestCase execute StateGenerator with not callable cleanupfunc >>> transition_done = False >>> >>> def transition_func(sock, conf, kwargs): ... assert kwargs["arg42"] == "hello" ... assert conf.TestCase43["local_kwarg"] == "world" ... global transition_done ... transition_done = True ... return True ... >>> class TestCase43(MyTestCase, StateGenerator): ... def get_new_edge(self, socket, config): ... assert config.TestCase43["local_kwarg"] == "world" ... return EcuState(session=1), EcuState(session=2) ... def get_transition_function(self, socket, edge): ... assert edge[0] == EcuState(session=1) ... assert edge[1] == EcuState(session=2) ... return transition_func, {"arg42": "hello"}, "fake" ... def execute(self, socket, state, **kwargs): ... return True ... >>> >>> tce = Scanner(MockSock(), test_cases=[TestCase43], ... TestCase43_kwargs={"local_kwarg": "world"}) >>> >>> assert len(tce.final_states) == 1 >>> >>> tce.execute_test_case(TestCase43()) >>> >>> assert len(tce.final_states) == 2 >>> assert EcuState(session=1) in tce.final_states and EcuState(session=2) in tce.final_states >>> assert not len(tce.cleanup_functions) >>> assert tce.enter_state(EcuState(session=1), EcuState(session=2)) >>> assert transition_done >>> assert len(tce.cleanup_functions) >>> tce.cleanup_state() >>> assert not len(tce.cleanup_functions) ###(033)=[passed] TestCase execute StateGenerator with cleanupfunc negative return >>> transition_done = False >>> cleanup_done = False >>> >>> def transition_func(sock, conf, kwargs): ... assert kwargs["arg42"] == "hello" ... assert conf.TestCase43["local_kwarg"] == "world" ... global transition_done ... transition_done = True ... return True ... >>> def cleanup_func(sock, conf): ... assert conf.TestCase43["local_kwarg"] == "world" ... global cleanup_done ... cleanup_done = True ... return False ... >>> class TestCase43(MyTestCase, StateGenerator): ... def get_new_edge(self, socket, config): ... assert config.TestCase43["local_kwarg"] == "world" ... return EcuState(session=1), EcuState(session=2) ... def get_transition_function(self, socket, edge): ... assert edge[0] == EcuState(session=1) ... assert edge[1] == EcuState(session=2) ... return transition_func, {"arg42": "hello"}, cleanup_func ... def execute(self, socket, state, **kwargs): ... return True ... >>> >>> tce = Scanner(MockSock(), test_cases=[TestCase43], ... TestCase43_kwargs={"local_kwarg": "world"}) >>> >>> assert len(tce.final_states) == 1 >>> >>> tce.execute_test_case(TestCase43()) >>> >>> assert len(tce.final_states) == 2 >>> assert EcuState(session=1) in tce.final_states and EcuState(session=2) in tce.final_states >>> assert not len(tce.cleanup_functions) >>> assert tce.enter_state(EcuState(session=1), EcuState(session=2)) >>> assert transition_done >>> assert len(tce.cleanup_functions) >>> tce.cleanup_state() Cleanup function failed >>> assert not len(tce.cleanup_functions) >>> assert cleanup_done ###(034)=[passed] TestCase execute StateGenerator with cleanupfunc and path >>> transition_done1 = False >>> cleanup_done1 = False >>> transition_done2 = False >>> cleanup_done2 = False >>> >>> transition_error = False >>> >>> >>> def transition_func1(sock, conf, kwargs): ... global transition_done1 ... transition_done1 = True ... return True ... >>> def cleanup_func1(sock, conf): ... global cleanup_done1 ... cleanup_done1 = True ... return True ... >>> def transition_func2(sock, conf, kwargs): ... global transition_done2 ... transition_done2 = True ... return not transition_error ... >>> def cleanup_func2(sock, conf): ... global cleanup_done2 ... cleanup_done2 = True ... return True ... >>> class TestCase43(MyTestCase, StateGenerator): ... def get_new_edge(self, socket, config): ... return EcuState(session=1), EcuState(session=2) ... def get_transition_function(self, socket, edge): ... return transition_func1, {"arg42": "hello"}, cleanup_func1 ... def execute(self, socket, state, **kwargs): ... return True ... >>> class TestCase44(MyTestCase, StateGenerator): ... def get_new_edge(self, socket, config): ... return EcuState(session=2), EcuState(session=3) ... def get_transition_function(self, socket, edge): ... return transition_func2, None, cleanup_func2 ... def execute(self, socket, state, **kwargs): ... return True ... >>> reset_done = False >>> >>> def reset_func(): ... global reset_done ... reset_done = True ... >>> reconnect_done = False >>> >>> def reconnect_func(): ... global reconnect_done ... reconnect_done = True ... return MockSock() ... >>> tce = Scanner(MockSock(), test_cases=[TestCase43, TestCase44], ... reset_handler=reset_func, reconnect_handler=reconnect_func) >>> >>> assert len(tce.final_states) == 1 >>> >>> tce.execute_test_case(TestCase43()) >>> >>> assert len(tce.final_states) == 2 >>> assert EcuState(session=1) in tce.final_states and EcuState(session=2) in tce.final_states >>> tce.execute_test_case(TestCase44()) >>> assert len(tce.final_states) == 3 >>> assert EcuState(session=3) in tce.final_states and EcuState(session=2) in tce.final_states >>> >>> assert not len(tce.cleanup_functions) >>> assert tce.enter_state_path([EcuState(session=1), EcuState(session=2), EcuState(session=3)]) Target reset Exception ''MockSock' object has no attribute 'close'' during socket.close Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/contrib/automotive/scanner/executor.py", line 162, in reconnect self.socket.close() ^^^^^^^^^^^^^^^^^ File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/utils.py", line 4016, in __getattr__ return getattr(self._inner, name) AttributeError: 'MockSock' object has no attribute 'close'. Did you mean: 'closed'? Target reconnect >>> assert transition_done1 >>> assert transition_done2 >>> assert len(tce.cleanup_functions) == 2 >>> assert reconnect_done >>> assert reset_done >>> tce.cleanup_state() >>> assert cleanup_done1 >>> assert cleanup_done2 >>> >>> try: ... tce.enter_state_path([EcuState(session=3)]) ... assert False ... except Scapy_Exception: ... assert True ... ###(035)=[passed] Test downrate edge >>> transition_done1 = False >>> cleanup_done1 = False >>> >>> tce = Scanner(MockSock(), test_cases=[TestCase43, TestCase44], ... reset_handler=reset_func, reconnect_handler=reconnect_func) >>> >>> assert len(tce.final_states) == 1 >>> tce.execute_test_case(TestCase43()) >>> assert len(tce.final_states) == 2 >>> assert EcuState(session=1) in tce.final_states and EcuState(session=2) in tce.final_states >>> tce.execute_test_case(TestCase44()) >>> assert len(tce.final_states) == 3 >>> assert EcuState(session=3) in tce.final_states and EcuState(session=2) in tce.final_states >>> >>> assert not len(tce.cleanup_functions) >>> transition_error = True >>> assert not tce.enter_state_path([EcuState(session=1), EcuState(session=2), EcuState(session=3)]) Target reset Exception ''MockSock' object has no attribute 'close'' during socket.close Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/contrib/automotive/scanner/executor.py", line 162, in reconnect self.socket.close() ^^^^^^^^^^^^^^^^^ File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/utils.py", line 4016, in __getattr__ return getattr(self._inner, name) AttributeError: 'MockSock' object has no attribute 'close'. Did you mean: 'closed'? Target reconnect Transition for edge (session2, session3) failed >>> assert transition_done1 >>> assert cleanup_done1 >>> assert len(tce.cleanup_functions) == 0 >>> assert tce.state_graph.weights[(EcuState(session=1), EcuState(session=2))] == 1 >>> assert tce.state_graph.weights[(EcuState(session=2), EcuState(session=3))] == 2 ###(036)=[passed] TestCase execute TestCaseGenerator >>> tc_executed = False >>> >>> class GeneratedTestCase(MyTestCase): ... def execute(self, socket, state, **kwargs): ... assert kwargs["local_kwarg"] == "world" ... global tc_executed ... tc_executed = True ... return True ... >>> >>> class TestCase43(MyTestCase, TestCaseGenerator): ... def execute(self, socket, state, **kwargs): ... return True ... def get_generated_test_case(self): ... return GeneratedTestCase() ... >>> >>> tce = Scanner(MockSock(), test_cases=[TestCase43], ... GeneratedTestCase_kwargs={"local_kwarg": "world"}) >>> >>> assert len(tce.final_states) == 1 >>> assert len(tce.configuration.test_cases) == 1 >>> >>> tce.execute_test_case(tce.configuration.test_cases[0]) >>> >>> assert len(tce.configuration.test_cases) == 2 >>> >>> tce.execute_test_case(tce.configuration.test_cases[1]) >>> >>> assert tc_executed ###(037)=[passed] TestCase scan timeout >>> tc_executed = False >>> >>> class GeneratedTestCase(MyTestCase): ... def execute(self, socket, state, **kwargs): ... assert kwargs["local_kwarg"] == "world" ... global tc_executed ... tc_executed = True ... return True ... >>> >>> tce = Scanner(MockSock(), test_cases=[GeneratedTestCase], ... GeneratedTestCase_kwargs={"local_kwarg": "world"}) >>> >>> assert len(tce.final_states) == 1 >>> assert len(tce.configuration.test_cases) == 1 >>> >>> tce.scan(-1) Target reset >>> >>> assert not tc_executed ###(038)=[passed] TestCase scan >>> tc_executed = False >>> >>> class GeneratedTestCase(MyTestCase): ... def execute(self, socket, state, **kwargs): ... assert kwargs["local_kwarg"] == "world" ... global tc_executed ... tc_executed = True ... self._state_completed[state] = True ... return True ... >>> >>> class TestCase43(MyTestCase, TestCaseGenerator): ... def execute(self, socket, state, **kwargs): ... self._state_completed[state] = True ... return True ... def get_generated_test_case(self): ... return GeneratedTestCase() ... >>> >>> tce = Scanner(MockSock(), test_cases=[TestCase43], ... GeneratedTestCase_kwargs={"local_kwarg": "world"}) >>> >>> assert len(tce.final_states) == 1 >>> assert len(tce.configuration.test_cases) == 1 >>> >>> tce.scan() [i] Scan progress 0.00 Scan path [session1] Target reset Execute for path [session1] [i] Scan progress 0.00 Scan path [session1] Scan path [session1] Target reset Execute for path [session1] [i] Scan progress 0.00 Scan path [session1] Scan path [session1] Execute failure or scan completed. Exit scan! Target reset >>> >>> assert len(tce.configuration.test_cases) == 2 >>> assert tc_executed >>> assert tce.scan_completed ###(039)=[passed] Test supported responses >>> class MyTestCase1(AutomotiveTestCase): ... _description = "MyTestCase1" ... _supported_kwargs = copy.copy(AutomotiveTestCase._supported_kwargs) ... _supported_kwargs.update({ ... 'stop_event': (threading.Event, None), # type: ignore ... }) ... @property ... def supported_responses(self): ... return [EcuResponse(EcuState(session=2), responses=UDS() / UDS_RDBIPR(dataIdentifier=2) / Raw(b"de")), ... EcuResponse([EcuState(session=2), EcuState(security_level=6)], responses=UDS() / UDS_RDBIPR(dataIdentifier=3) / Raw(b"dea2")), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x7f, requestServiceId=0x13))] ... >>> >>> class MyTestCase2(AutomotiveTestCase): ... _description = "MyTestCase2" ... _supported_kwargs = copy.copy(AutomotiveTestCase._supported_kwargs) ... _supported_kwargs.update({ ... 'stop_event': (threading.Event, None), # type: ignore ... }) ... @property ... def supported_responses(self): ... return [EcuResponse(EcuState(session=2), responses=UDS() / UDS_RDBIPR(dataIdentifier=5) / Raw(b"deadbeef1")), ... EcuResponse(EcuState(session=2), responses=UDS() / UDS_RDBIPR(dataIdentifier=6) / Raw(b"deadbeef2")), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x10, requestServiceId=0x11))] ... >>> >>> tce = Scanner(MockSock(), test_cases=[MyTestCase1(), MyTestCase2()]) >>> >>> resps = tce.supported_responses >>> >>> assert len(resps) == 6 >>> assert resps[0].responses[0].service != 0x7f >>> assert resps[1].responses[0].service != 0x7f >>> assert resps[2].responses[0].service != 0x7f >>> assert resps[3].responses[0].service != 0x7f >>> >>> assert resps[4].responses[0].service == 0x7f >>> assert resps[5].responses[0].service == 0x7f >>> >>> assert resps[0].responses[0].load == b"dea2" >>> assert resps[1].responses[0].load == b"deadbeef1" >>> assert resps[2].responses[0].load == b"deadbeef2" >>> assert resps[3].responses[0].load == b"de" >>> assert resps[4].responses[0].requestServiceId == 0x13 >>> assert resps[5].responses[0].requestServiceId == 0x11 ###(040)=[passed] Test show testcases >>> try: ... tce.show_testcases() ... assert True ... except Exception: ... assert False ... ===================== MyTestCase1 --------------------- ===================== MyTestCase2 --------------------- >>> >>> try: ... tce.show_testcases_status() ... assert True ... except Exception: ... assert False ... -+ | -+ -+ ###(041)=[passed] Test StateGeneratingServiceEnumerator >>> class TestCase43(MyTestCase, StateGeneratingServiceEnumerator): ... def execute(self, socket, state, **kwargs): ... return True ... @property ... def results(self): # type: () -> List[_AutomotiveTestCaseScanResult] ... return [_AutomotiveTestCaseScanResult(EcuState(session=1), UDS()/UDS_DSC(b"\x03"), UDS()/UDS_DSCPR(b"\x03"), 1.1, 1.2)] ... >>> tce = Scanner(MockSock(), test_cases=[TestCase43]) >>> >>> assert len(tce.final_states) == 1 >>> >>> tce.execute_test_case(TestCase43()) >>> >>> assert len(tce.final_states) == 2 >>> assert EcuState(session=1) in tce.final_states and EcuState(session=3) in tce.final_states >>> >>> tf, args, cf = tce.state_graph.get_transition_tuple_for_edge((EcuState(session=1), EcuState(session=3))) >>> >>> assert cf is None >>> assert tf is not None >>> assert len(args) == 2 >>> assert args["req"] == UDS()/UDS_DSC(b"\x03") >>> assert "diagnosticSessionType" in args["desc"] and "extendedDiagnosticSession" in args["desc"] >>> >>> assert not tce.enter_state(EcuState(session=1), EcuState(session=3)) Exception in transition function: Traceback (most recent call last): File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/contrib/automotive/scanner/enumerator.py", line 826, in transition_function res = sock.sr1(req, timeout=20, verbose=False, chainEX=True) File "/builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/scapy/utils.py", line 4021, in sr1 return self._inner.sr1(*args, **kargs) ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^ File "", line 5, in sr1 OSError Transition for edge (session1, session3) failed Regression tests for graph ━ Run at 01:43:19 from [test/contrib/automotive/scanner/graph.uts] by UTscapy in 0.016387939453125 └ Passed=5 └ Failed=0 ###### ## Load general modules ###### ###(000)=[passed] Load contribution layer >>> from scapy.contrib.automotive.scanner.graph import * >>> import pickle >>> import io ###### ## Graph tests ###### ###(001)=[passed] Basic test >>> g = Graph() >>> g.add_edge(("1", "1")) >>> g.add_edge(("1", "2")) >>> g.add_edge(("2", "3")) >>> g.add_edge(("3", "4")) >>> g.add_edge(("4", "4")) >>> >>> assert "1" in g.nodes >>> assert "2" in g.nodes >>> assert "3" in g.nodes >>> assert "4" in g.nodes >>> assert len(g.nodes) == 4 >>> assert g.dijkstra(g, "1", "4") == ["1", "2", "3", "4"] ###(002)=[passed] Shortest path test >>> g = Graph() >>> g.add_edge(("1", "1")) >>> g.add_edge(("1", "2")) >>> g.add_edge(("2", "3")) >>> g.add_edge(("3", "4")) >>> g.add_edge(("4", "4")) >>> >>> assert g.dijkstra(g, "1", "4") == ["1", "2", "3", "4"] >>> >>> g.add_edge(("1", "4")) >>> >>> assert g.dijkstra(g, "1", "4") == ["1", "4"] >>> >>> g.add_edge(("3", "5")) >>> g.add_edge(("5", "6")) >>> >>> print(g.dijkstra(g, "1", "6")) ['1', '2', '3', '5', '6'] >>> >>> assert g.dijkstra(g, "1", "6") == ["1", "2", "3", "5", "6"] or \ ... g.dijkstra(g, "1", "6") == ['1', '4', '3', '5', '6'] >>> >>> g.add_edge(("2", "5")) >>> >>> print(g.dijkstra(g, "1", "6")) ['1', '2', '5', '6'] >>> >>> assert g.dijkstra(g, "1", "6") == ["1", "2", "5", "6"] ###(003)=[passed] graph add transition function >>> g.add_edge(("4", "6"), transition_function=(str, str)) >>> >>> assert g.dijkstra(g, "1", "6") == ["1", "4", "6"] ###(004)=[passed] graph pickle >>> f = io.BytesIO() >>> >>> pickle.dump(g, f) >>> unp = pickle.loads(f.getvalue()) >>> >>> assert unp.dijkstra(g, "1", "6") == ["1", "4", "6"] >>> >>> f1, f2 = unp.get_transition_tuple_for_edge(("4", "6")) >>> assert f1==f2 >>> assert "1" == f1(1) Regression tests for automotive scanner staged test_case ━ Run at 01:43:19 from [test/contrib/automotive/scanner/staged_test_case.uts] by UTscapy in 0.05239534378051758 └ Passed=10 └ Failed=0 ###### ## Load general modules ###### ###(000)=[passed] Load contribution layer >>> from scapy.contrib.automotive.scanner.test_case import AutomotiveTestCase >>> from scapy.contrib.automotive.ecu import EcuState, EcuResponse >>> from scapy.contrib.automotive.scanner.staged_test_case import StagedAutomotiveTestCase >>> from scapy.contrib.automotive.uds import UDS, UDS_RDBIPR, UDS_NR >>> from scapy.packet import Raw ###### ## Basic checks ###### ###(001)=[passed] Definition of Test classes >>> class MyTestCase1(AutomotiveTestCase): ... _description = "MyTestCase1" ... @property ... def supported_responses(self): ... return [EcuResponse(EcuState(session=2), responses=UDS() / UDS_RDBIPR(dataIdentifier=2) / Raw(b"de")), ... EcuResponse([EcuState(session=2), EcuState(security_level=6)], responses=UDS() / UDS_RDBIPR(dataIdentifier=3) / Raw(b"dea2")), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x7f, requestServiceId=0x13))] ... >>> >>> class MyTestCase2(AutomotiveTestCase): ... _description = "MyTestCase2" ... @property ... def supported_responses(self): ... return [EcuResponse(EcuState(session=2), responses=UDS() / UDS_RDBIPR(dataIdentifier=5) / Raw(b"deadbeef1")), ... EcuResponse(EcuState(session=2), responses=UDS() / UDS_RDBIPR(dataIdentifier=6) / Raw(b"deadbeef2")), ... EcuResponse(EcuState(session=range(0,255)), responses=UDS() / UDS_NR(negativeResponseCode=0x10, requestServiceId=0x11))] ... ###(002)=[passed] Create instance of stage test >>> tc1 = MyTestCase1() >>> tc2 = MyTestCase2() >>> >>> mt = StagedAutomotiveTestCase([tc1, tc2]) >>> >>> assert len(mt.test_cases) == 2 >>> assert mt.current_test_case == tc1 >>> assert mt.current_connector == None >>> assert mt.previous_test_case == None >>> assert mt[0] == tc1 >>> assert mt[1] == tc2 ###(003)=[passed] Check completion >>> tc1 = MyTestCase1() >>> tc2 = MyTestCase2() >>> >>> mt = StagedAutomotiveTestCase([tc1, tc2]) >>> >>> tc1._state_completed[EcuState(session=1)] = False >>> tc2._state_completed[EcuState(session=1)] = False >>> >>> assert not mt.completed >>> assert not mt.has_completed(EcuState(session=1)) >>> >>> tc1._state_completed[EcuState(session=1)] = True >>> assert mt.current_test_case == tc1 >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) Staged AutomotiveTestCase MyTestCase1 completed >>> assert mt.current_test_case == tc2 >>> assert not mt.completed >>> >>> tc2._state_completed[EcuState(session=1)] = True >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert mt.completed >>> assert mt.has_completed(EcuState(session=1)) ###(004)=[passed] Check completion 2 >>> tc1 = MyTestCase1() >>> tc2 = MyTestCase2() >>> >>> mt = StagedAutomotiveTestCase([tc1, tc2]) >>> >>> tc1._state_completed[EcuState(session=1)] = False >>> tc2._state_completed[EcuState(session=1)] = False >>> >>> assert not mt.completed >>> assert not mt.has_completed(EcuState(session=1)) >>> >>> tc1._state_completed[EcuState(session=1)] = True >>> assert mt.current_test_case == tc1 >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> tc1._state_completed[EcuState(session=1)] = False >>> assert not mt.has_completed(EcuState(session=1)) >>> tc1._state_completed[EcuState(session=1)] = True >>> assert mt.current_test_case == tc1 >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) Staged AutomotiveTestCase MyTestCase1 completed >>> >>> assert mt.current_test_case == tc2 >>> assert not mt.completed >>> >>> tc2._state_completed[EcuState(session=1)] = True >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert mt.completed >>> assert mt.has_completed(EcuState(session=1)) ###(005)=[passed] Check supported responses >>> tc1 = MyTestCase1() >>> tc2 = MyTestCase2() >>> tx = StagedAutomotiveTestCase([tc1, tc2]) >>> resps = tx.supported_responses >>> >>> assert len(resps) == 6 >>> assert resps[0].responses[0].service != 0x7f >>> assert resps[1].responses[0].service != 0x7f >>> assert resps[2].responses[0].service != 0x7f >>> assert resps[3].responses[0].service != 0x7f >>> >>> assert resps[4].responses[0].service == 0x7f >>> assert resps[5].responses[0].service == 0x7f >>> >>> assert resps[0].responses[0].load == b"dea2" >>> assert resps[1].responses[0].load == b"deadbeef1" >>> assert resps[2].responses[0].load == b"deadbeef2" >>> assert resps[3].responses[0].load == b"de" >>> assert resps[4].responses[0].requestServiceId == 0x13 >>> assert resps[5].responses[0].requestServiceId == 0x11 ###(006)=[passed] Check connector >>> test_storage_tc2 = None >>> >>> class MyTestCase2(AutomotiveTestCase): ... _description = "MyTestCase2" ... def pre_execute(self, socket, state, global_configuration): ... global test_storage_tc2 ... print(global_configuration) ... test_storage_tc2 = global_configuration ... def supported_responses(self): ... return [] ... >>> test_storage_tc3 = None >>> >>> class MyTestCase3(AutomotiveTestCase): ... _description = "MyTestCase3" ... def pre_execute(self, socket, state, global_configuration): ... global test_storage_tc3 ... print(global_configuration) ... test_storage_tc3 = global_configuration ... def supported_responses(self): ... return [] ... >>> def con1(tc1, tc2): ... assert isinstance(tc1, MyTestCase1) ... assert isinstance(tc2, MyTestCase2) ... return {"tc2_con_config": 42} ... >>> def con2(tc2, tc3): ... assert isinstance(tc2, MyTestCase2) ... assert isinstance(tc3, MyTestCase3) ... return {"tc3_con_config": "deadbeef"} ... >>> tc1 = MyTestCase1() >>> tc2 = MyTestCase2() >>> tc3 = MyTestCase3() >>> >>> assert test_storage_tc2 is None >>> assert test_storage_tc3 is None >>> >>> mt = StagedAutomotiveTestCase([tc1, tc2, tc3], [None, con1, con2]) >>> >>> assert mt.current_test_case == tc1 >>> assert mt.current_connector == None >>> >>> tc1._state_completed[EcuState(session=1)] = True >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) Staged AutomotiveTestCase MyTestCase1 completed >>> >>> assert mt.current_test_case == tc2 >>> assert mt.current_connector == con1 >>> >>> mt.pre_execute(None, None, {"MyTestCase2": {"verbose": True, "config": "whatever"}}) {'MyTestCase2': {'verbose': True, 'config': 'whatever', 'tc2_con_config': 42}} >>> >>> assert test_storage_tc2["MyTestCase2"]["verbose"] >>> assert test_storage_tc2["MyTestCase2"]["tc2_con_config"] == 42 >>> assert test_storage_tc2["MyTestCase2"]["config"] == "whatever" >>> >>> tc2._state_completed[EcuState(session=1)] = True >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) >>> assert not mt.has_completed(EcuState(session=1)) Staged AutomotiveTestCase MyTestCase2 completed >>> >>> assert mt.current_test_case == tc3 >>> assert mt.current_connector == con2 >>> >>> mt.pre_execute(None, None, {}) {'MyTestCase3': {'tc3_con_config': 'deadbeef'}} >>> >>> assert test_storage_tc3["MyTestCase3"]["tc3_con_config"] == "deadbeef" ###(007)=[passed] Check show >>> dump = mt.show(dump=True) >>> >>> assert "MyTestCase1" in dump >>> assert "MyTestCase2" in dump >>> assert "MyTestCase3" in dump ###(008)=[passed] Check len >>> assert len(mt) == 3 ###(009)=[passed] Check generator functions >>> assert mt.get_generated_test_case() == None >>> assert mt.get_new_edge(None, None) == None >>> assert mt.get_transition_function(None, None) == None Regression tests for automotive scanner test_case ━ Run at 01:43:19 from [test/contrib/automotive/scanner/test_case.uts] by UTscapy in 0.011235952377319336 └ Passed=8 └ Failed=0 ###### ## Load general modules ###### ###(000)=[passed] Load contribution layer >>> from scapy.contrib.automotive.scanner.test_case import AutomotiveTestCase >>> from scapy.contrib.automotive.ecu import EcuState ###### ## Basic checks ###### ###(001)=[passed] Definition of Test class >>> class MyTestCase(AutomotiveTestCase): ... _description = "MyTestCase" ... _supported_kwargs = {"testarg": (int, None)} ... def supported_responses(self): ... return [] ... ###(002)=[passed] Check supported kwargs >>> try: ... MyTestCase.check_kwargs({"testarg": 5}) ... except Scapy_Exception as e: ... assert False ... >>> try: ... MyTestCase.check_kwargs({"test": 5}) ... assert False ... except Scapy_Exception as e: ... assert "Keyword-Argument test not supported" in str(e) ... >>> try: ... MyTestCase.check_kwargs({"testarg": 5.5}) ... assert False ... except Scapy_Exception as e: ... assert "Keyword-Value" in str(e) ... assert "is not instance of type " in str(e) or \ ... "is not instance of type " in str(e) ... ###(003)=[passed] Create instance of test class >>> mt = MyTestCase() >>> >>> mt._state_completed[EcuState(session=1)] = True >>> mt._state_completed[EcuState(session=2)] = True >>> mt._state_completed[EcuState(session=3)] = False ###(004)=[passed] Tests of has_completed >>> assert mt.completed is False >>> assert mt.has_completed(EcuState(session=1)) >>> assert mt.has_completed(EcuState(session=3)) is False >>> >>> assert len(mt.scanned_states) == 3 ###(005)=[passed] Tests of has_completed with new state >>> assert mt.completed is False >>> assert mt.has_completed(EcuState(session=4)) is False >>> assert mt.has_completed(EcuState(session=3)) is False >>> >>> assert len(mt.scanned_states) == 4 ###(006)=[passed] Tests of completed >>> mt._state_completed[EcuState(session=3)] = True >>> mt._state_completed[EcuState(session=4)] = True >>> >>> assert mt.completed ###(007)=[passed] Test of show >>> header = mt._show_header(dump=True) >>> >>> assert "MyTestCase" in header >>> >>> state_info = mt._show_state_information(dump=True) >>> >>> assert "session" in state_info >>> assert "False" not in state_info >>> assert "True" in state_info >>> >>> mt._state_completed[EcuState(session=3)] = False >>> state_info = mt._show_state_information(dump=True) >>> >>> assert "session" in state_info >>> assert "False" in state_info >>> assert "True" in state_info >>> >>> dump = mt.show(dump=True, verbose=True) >>> >>> assert "session" in dump >>> assert "MyTestCase" in dump Regression tests for Simulated ECUs and UDS Scanners ━ Run at 01:43:19 from [test/contrib/automotive/scanner/uds_scanner.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 gmlan unit tests ━ Run at 01:43:19 from [test/contrib/automotive/gm/gmlan.uts] by UTscapy in 0.17463135719299316 └ Passed=67 └ Failed=0 ###### ## Configuration of scapy ###### ###(000)=[passed] Load gmlan layer >>> load_contrib("automotive.ecu", globals_dict=globals()) >>> load_contrib("automotive.gm.gmlan", globals_dict=globals()) >>> >>> from scapy.contrib.automotive.gm.gmlan_ecu_states import * >>> from scapy.contrib.automotive.gm.gmlan_logging import * ###### ## Basic Packet Tests() ###### ###(001)=[passed] Set GMLAN ECU AddressingScheme >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 2 >>> assert conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] == 2 ###(002)=[passed] Craft Packet >>> x = GMLAN(b'\x52\x02\x01\x16\x71\x00\x00\x0c\xaa\xbb') >>> x.load == b'\x00\x0c\xaa\xbb' True >>> x.service == 0x52 True ###(003)=[passed] Craft VIN Packet >>> x = GMLAN(b'\x5a\x90'+ raw(b"WOOOJBF35W1042000")) >>> x.load == b'WOOOJBF35W1042000' True >>> x.dataIdentifier == 0x90 True ###(004)=[passed] Test Packet with ECU AddressingScheme2 >>> x = GMLAN()/GMLAN_RMBA(b'\x11\x22\x44\x22') >>> x.memoryAddress == 0x1122 True >>> x.memorySize == 0x4422 True ###(005)=[passed] Test Packet GMLAN_RMBAPR with ECU AddressingScheme2 >>> y = GMLAN()/GMLAN_RMBAPR(b'\x11\x22\x44\x22') >>> y.memoryAddress == 0x1122 True >>> y.dataRecord == b'\x44\x22' True >>> y.answers(x) == True True ###(006)=[passed] Craft Packet with ECU AddressingScheme2 >>> x = GMLAN() / GMLAN_RMBA(b'\x11\x22\x44\x22') >>> y = GMLAN()/GMLAN_RMBA(memoryAddress=0x1122, memorySize=0x4422) >>> bytes(x) == bytes(y) True ###(007)=[passed] Test Packet with ECU AddressingScheme3 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 3 >>> x = GMLAN()/GMLAN_RMBA(b'\x11\x22\x44\x22\x11') >>> x.memoryAddress == 0x112244 True >>> x.memorySize == 0x2211 True ###(008)=[passed] Test Packet GMLAN_RMBAPR with ECU AddressingScheme3 >>> y = GMLAN()/GMLAN_RMBAPR(b'\x11\x22\x44\x22\x11') >>> y.memoryAddress == 0x112244 True >>> y.dataRecord == b'\x22\x11' True >>> y.answers(x) == True True ###(009)=[passed] Craft Packet with ECU AddressingScheme3 >>> x = GMLAN() / GMLAN_RMBA(b'\x11\x22\x44\x22\x11') >>> y = GMLAN()/GMLAN_RMBA(memoryAddress=0x112244, memorySize=0x2211) >>> bytes(x) == bytes(y) True ###(010)=[passed] Test Packet with ECU AddressingScheme4 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 4 >>> x = GMLAN()/GMLAN_RMBA(b'\x11\x22\x44\x22\x11\x00') >>> x.memoryAddress == 0x11224422 True >>> x.memorySize == 0x1100 True ###(011)=[passed] Test Packet GMLAN_RMBAPR with ECU AddressingScheme4 >>> y = GMLAN()/GMLAN_RMBAPR(b'\x11\x22\x44\x22\x11\x00') >>> y.memoryAddress == 0x11224422 True >>> y.dataRecord == b'\x11\x00' True >>> y.answers(x) == True True ###(012)=[passed] Craft Packet with ECU AddressingScheme4 >>> x = GMLAN() / GMLAN_RMBA(b'\x11\x22\x44\x22\x11\x00') >>> y = GMLAN()/GMLAN_RMBA(memoryAddress=0x11224422, memorySize=0x1100) >>> bytes(x) == bytes(y) True ###(013)=[passed] Craft Packet for RequestDownload2 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 2 >>> x = GMLAN(b'\x34\x12\x08\x15') >>> x.service == 0x34 True >>> x.dataFormatIdentifier == 0x12 True >>> x.memorySize == 0x815 True >>> >>> y = GMLAN()/GMLAN_RD(dataFormatIdentifier=0x12, memorySize=0x815) >>> bytes(y) == bytes(x) True ###(014)=[passed] Craft Packet for RequestDownload3 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 3 >>> x = GMLAN(b'\x34\x12\x08\x15\x00') >>> x.service == 0x34 True >>> x.dataFormatIdentifier == 0x12 True >>> x.memorySize == 0x81500 True >>> >>> y = GMLAN()/GMLAN_RD(dataFormatIdentifier=0x12, memorySize=0x81500) >>> bytes(y) == bytes(x) True ###(015)=[passed] Craft Packet for RequestDownload4 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 4 >>> x = GMLAN(b'\x34\x12\x08\x15\x00\x11') >>> x.service == 0x34 True >>> x.dataFormatIdentifier == 0x12 True >>> x.memorySize == 0x8150011 True ###(016)=[passed] Craft Packet for RFRD1 >>> a = GMLAN(b'\x12\x01') >>> a.service == 0x12 True >>> a.subfunction == 1 True ###(017)=[passed] Craft Packet for RFRD2 >>> b = GMLAN(b'\x12\x02\x01\x02\x03\x04') >>> b.service == 0x12 True >>> b.subfunction == 2 True >>> b.dtc.failureRecordNumber == 1 True >>> b.dtc.DTCHighByte == 2 True >>> b.dtc.DTCLowByte == 3 True >>> b.dtc.DTCFailureType == 4 True ###(018)=[passed] Craft Packet for RFRDPR_RFRI >>> x = GMLAN(b'\x52\x01\x00\x01\x02\x03\x04') >>> x.service == 0x52 True >>> x.subfunction == 1 True >>> x.failureRecordDataStructureIdentifier == 0 True >>> x.dtcs[0].failureRecordNumber == 1 True >>> x.dtcs[0].DTCHighByte == 2 True >>> x.dtcs[0].DTCLowByte == 3 True >>> x.dtcs[0].DTCFailureType == 4 True >>> x.answers(a) == True True ###(019)=[passed] Craft Packet for RFRDPR_RFRI >>> x = GMLAN(b'\x52\x01\x00\x01\x02\x03\x04\x01\x02\x03\x04\x01\x02\x03\x04\x01\x02\x03\x04') >>> x.service == 0x52 True >>> x.subfunction == 1 True >>> x.failureRecordDataStructureIdentifier == 0 True >>> x.dtcs[0].failureRecordNumber == 1 True >>> x.dtcs[0].DTCHighByte == 2 True >>> x.dtcs[0].DTCLowByte == 3 True >>> x.dtcs[0].DTCFailureType == 4 True >>> x.dtcs[1].failureRecordNumber == 1 True >>> x.dtcs[1].DTCHighByte == 2 True >>> x.dtcs[1].DTCLowByte == 3 True >>> x.dtcs[1].DTCFailureType == 4 True >>> x.dtcs[2].failureRecordNumber == 1 True >>> x.dtcs[2].DTCHighByte == 2 True >>> x.dtcs[2].DTCLowByte == 3 True >>> x.dtcs[2].DTCFailureType == 4 True >>> x.dtcs[3].failureRecordNumber == 1 True >>> x.dtcs[3].DTCHighByte == 2 True >>> x.dtcs[3].DTCLowByte == 3 True >>> x.dtcs[3].DTCFailureType == 4 True >>> x.answers(a) == True True ###(020)=[passed] Craft Packet for RFRDPR_RFRP >>> x = GMLAN(b'\x52\x02\x01\x02\x03\x04deadbeef') >>> x.service == 0x52 True >>> x.subfunction == 2 True >>> x.dtc.failureRecordNumber == 1 True >>> x.dtc.DTCHighByte == 2 True >>> x.dtc.DTCLowByte == 3 True >>> x.dtc.DTCFailureType == 4 True >>> x.show() ###[ General Motors Local Area Network ]### service = ReadFailureRecordDataPositiveResponse ###[ ReadFailureRecordDataPositiveResponse ]### subfunction= readFailureRecordParameters ###[ ReadFailureRecordDataPositiveResponse_readFailureRecordParameters ]### \dtc \ |###[ GMLAN DTC information ]### | failureRecordNumber= 0x1 | DTCHighByte= 0x2 | DTCLowByte= 0x3 | DTCFailureType= 0x4 ###[ Raw ]### load = b'deadbeef' >>> x.load == b'deadbeef' True >>> x.answers(b) == True True ###(021)=[passed] Craft Packet for RDBI >>> x = GMLAN(b'\x1A\x11') >>> x.service == 0x1A True >>> x.dataIdentifier == 0x11 True ###(022)=[passed] Craft Packet for RDBIPR >>> y = GMLAN(b'\x5A\x11deadbeef') >>> y.service == 0x5A True >>> y.dataIdentifier == 0x11 True >>> y.load == b'deadbeef' True >>> y.answers(x) == True True ###(023)=[passed] Craft Packet for RDBPI >>> x = GMLAN(b'\x22\x11\x11\x22\x22\x33\x33\x44\x44\x55\x55\x66\x66\x77\x77\x88\x88\x99\x99') >>> x.service == 0x22 True >>> x.identifiers[0] == 0x1111 True >>> x.identifiers[1] == 0x2222 True >>> x.identifiers[2] == 0x3333 True >>> x.identifiers[3] == 0x4444 True >>> x.identifiers[4] == 0x5555 True >>> x.identifiers[5] == 0x6666 True >>> x.identifiers[6] == 0x7777 True >>> x.identifiers[7] == 0x8888 True >>> x.identifiers[8] == 0x9999 True ###(024)=[passed] Craft Packet for RDBPIPR >>> y = GMLAN(b'\x62\x11\x11deadbeef') >>> y.service == 0x62 True >>> y.parameterIdentifier == 0x1111 True >>> y.load == b'deadbeef' True >>> y.answers(x) == True True ###(025)=[passed] Craft Packet for GMLAN_RDBPKTI1 >>> x = GMLAN(b'\xAA\x01deadbeef') >>> x.service == 0xAA True >>> x.subfunction == 0x01 True >>> x.request_DPIDs == [0x64, 0x65, 0x61, 0x64, 0x62, 0x65, 0x65, 0x66] True ###(026)=[passed] Craft Packet for GMLAN_RDBPKTI3 >>> x = GMLAN(b'\xAA\x02deadbeef') >>> x.service == 0xAA True >>> x.subfunction == 0x02 True >>> x.request_DPIDs == [0x64, 0x65, 0x61, 0x64, 0x62, 0x65, 0x65, 0x66] True ###(027)=[passed] Craft Packet for GMLAN_RDBPKTI4 >>> x = GMLAN(b'\xAA\x03deadbeef') >>> x.service == 0xAA True >>> x.subfunction == 0x03 True >>> x.request_DPIDs == [0x64, 0x65, 0x61, 0x64, 0x62, 0x65, 0x65, 0x66] True ###(028)=[passed] Craft Packet for GMLAN_RDBPKTI2 >>> x = GMLAN(b'\xAA\x00') >>> x.service == 0xAA True >>> x.subfunction == 0 True ###(029)=[passed] Build GMLAN_RDBPKTI1 >>> x = GMLAN()/GMLAN_RDBPKTI(subfunction=1, request_DPIDs=[0x64, 0x65]) >>> assert b"\xaa\x01de" == bytes(x) ###(030)=[passed] Craft Packet for GMLAN_SA1 >>> a = GMLAN(b'\x27\x01') >>> a.service == 0x27 True >>> a.subfunction == 1 True ###(031)=[passed] Craft Packet for GMLAN_SA2 >>> b = GMLAN(b'\x27\x02\xde\xad') >>> b.service == 0x27 True >>> b.subfunction == 2 True >>> b.securityKey == 0xdead True ###(032)=[passed] Craft Packet for GMLAN_SAPR1 >>> x = GMLAN(b'\x67\x02') >>> x.service == 0x67 True >>> x.subfunction == 2 True >>> x.answers(b) True >>> >>> ecu = Ecu() >>> ecu.update(b) > >>> ecu.update(x) > [+] [], responses=['GMLAN / GMLAN_SAPR'] >>> assert ecu.state.security_level == 2 ###(033)=[passed] Craft Packet for GMLAN_SAPR2 >>> x = GMLAN(b'\x67\x01\xde\xad') >>> x.service == 0x67 True >>> x.subfunction == 1 True >>> x.securitySeed == 0xdead True >>> x.answers(a) True ###(034)=[passed] Craft Packet for GMLAN_DDM >>> x = GMLAN(b'\x2c\x02dead') >>> x.service == 0x2c True >>> x.DPIDIdentifier == 2 True >>> x.PIDData == b'dead' True ###(035)=[passed] Craft Packet for GMLAN_DDMPR >>> y = GMLAN(b'\x6c\x02dead') >>> y.service == 0x6c True >>> y.DPIDIdentifier == 2 True >>> y.answers(x) True ###(036)=[passed] Craft Packet for GMLAN_DPBA1 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 2 >>> x = GMLAN(b'\x2D\x02\x02\x11\x11\x33') >>> x.service == 0x2d True >>> x.parameterIdentifier == 0x202 True >>> x.memoryAddress == 0x1111 True >>> x.memorySize == 0x33 True ###(037)=[passed] Craft Packet for GMLAN_DPBA2 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 3 >>> x = GMLAN(b'\x2D\x02\x02\x11\x11\x11\x33') >>> x.service == 0x2d True >>> x.parameterIdentifier == 0x202 True >>> x.memoryAddress == 0x111111 True >>> x.memorySize == 0x33 True ###(038)=[passed] Craft Packet for GMLAN_DPBA3 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 4 >>> x = GMLAN(b'\x2D\x02\x02\x11\x11\x11\x11\x33') >>> x.service == 0x2d True >>> x.parameterIdentifier == 0x202 True >>> x.memoryAddress == 0x11111111 True >>> x.memorySize == 0x33 True ###(039)=[passed] Craft Packet for GMLAN_DPBAPR >>> y = GMLAN(b'\x6D\x02\x02') >>> y.service == 0x6d True >>> y.parameterIdentifier == 0x202 True >>> y.answers(x) True ###(040)=[passed] Craft Packet for GMLAN_RD1 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 2 >>> x = GMLAN(b'\x34\x02\x11\x11') >>> x.service == 0x34 True >>> x.dataFormatIdentifier == 0x2 True >>> x.memorySize == 0x1111 True ###(041)=[passed] Craft Packet for GMLAN_RD2 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 3 >>> x = GMLAN(b'\x34\x02\x11\x11\x11') >>> x.service == 0x34 True >>> x.dataFormatIdentifier == 0x2 True >>> x.memorySize == 0x111111 True ###(042)=[passed] Craft Packet for GMLAN_RD3 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 4 >>> x = GMLAN(b'\x34\x02\x11\x11\x11\x11') >>> x.service == 0x34 True >>> x.dataFormatIdentifier == 0x2 True >>> x.memorySize == 0x11111111 True ###(043)=[passed] Craft Packet for GMLAN_TD1 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 2 >>> x = GMLAN(b'\x36\x02\x11\x11dead') >>> x.service == 0x36 True >>> x.subfunction == 0x2 True >>> x.startingAddress == 0x1111 True >>> x.dataRecord == b'dead' True ###(044)=[passed] Craft Packet for GMLAN_TD2 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 3 >>> x = GMLAN(b'\x36\x02\x11\x11\x11dead') >>> x.service == 0x36 True >>> x.subfunction == 0x2 True >>> x.startingAddress == 0x111111 True >>> x.dataRecord == b'dead' True ###(045)=[passed] Craft Packet for GMLAN_TD3 >>> conf.contribs['GMLAN']['GMLAN_ECU_AddressingScheme'] = 4 >>> x = GMLAN(b'\x36\x02\x11\x11\x11\x11dead') >>> x.service == 0x36 True >>> x.subfunction == 0x2 True >>> x.startingAddress == 0x11111111 True >>> x.dataRecord == b'dead' True ###(046)=[passed] Craft Packet for WDBI >>> x = GMLAN(b'\x3b\x11deadbeef') >>> x.service == 0x3b True >>> x.dataIdentifier == 0x11 True >>> x.dataRecord == b'deadbeef' True ###(047)=[passed] Craft Packet for WDBIPR >>> y = GMLAN(b'\x7b\x11') >>> y.service == 0x7b True >>> y.dataIdentifier == 0x11 True >>> y.answers(x) True ###(048)=[passed] Craft Packet for RPSPR >>> x = GMLAN(b'\xe2\x11') >>> x.service == 0xe2 True >>> x.programmedState == 0x11 True ###(049)=[passed] Craft Packet for PM >>> x = GMLAN(b'\xA5\x11') >>> x.service == 0xA5 True >>> x.subfunction == 0x11 True ###(050)=[passed] Craft Packet for RDI >>> x = GMLAN(b'\xA9\x11') >>> x.service == 0xA9 True >>> x.subfunction == 0x11 True ###(051)=[passed] Craft Packet for RDI_BN >>> x = GMLAN(b'\xA9\x80\x11\x22\x33') >>> x.service == 0xA9 True >>> x.subfunction == 0x80 True >>> x.DTCHighByte == 0x11 True >>> x.DTCLowByte == 0x22 True >>> x.DTCFailureType == 0x33 True ###(052)=[passed] Craft Packet for RDI_BM1 >>> x = GMLAN(b'\xA9\x81\x11') >>> x.service == 0xA9 True >>> x.subfunction == 0x81 True >>> x.DTCStatusMask == 0x11 True ###(053)=[passed] Craft Packet for RDI_BM2 >>> x = GMLAN(b'\xA9\x82\x11') >>> x.service == 0xA9 True >>> x.subfunction == 0x82 True >>> x.DTCStatusMask == 0x11 True ###(054)=[passed] Craft Packet for NR >>> x = GMLAN(b'\x7f\x11\x00\x11\x22') >>> x.service == 0x7f True >>> x.requestServiceId == 0x11 True >>> x.returnCode == 0 True >>> x.deviceControlLimitExceeded == 0x1122 True ###(055)=[passed] Check not answers >>> y = GMLAN(b'\x11deadbeef') >>> x = GMLAN(b'\x7f\x10\x00\x11\x22') >>> assert not x.answers(y) ###(056)=[passed] Check answers 1 >>> y = GMLAN(b'\x10deadbeef') >>> x = GMLAN(b'\x7f\x10\x00\x11\x22') >>> assert x.answers(y) ###(057)=[passed] Set treat-response-pending-as-answer >>> conf.contribs['GMLAN']['treat-response-pending-as-answer'] = False >>> assert conf.contribs['GMLAN']['treat-response-pending-as-answer'] == False ###(058)=[passed] Check response-pending is not considered as answer >>> y = GMLAN(b'\x10deadbeef') >>> x = GMLAN(b'\x7f\x10\x78\x11\x22') >>> assert not x.answers(y) ###(059)=[passed] Check response-pending is considered as answer >>> conf.contribs['GMLAN']['treat-response-pending-as-answer'] = True >>> assert conf.contribs['GMLAN']['treat-response-pending-as-answer'] == True >>> y = GMLAN(b'\x10deadbeef') >>> x = GMLAN(b'\x7f\x10\x78\x11\x22') >>> assert x.answers(y) ###(060)=[passed] Check hashret 1 >>> print(y.hashret()) b'\x10' >>> print(x.hashret()) b'\x10' >>> >>> y.hashret() == x.hashret() True ###(061)=[passed] Check answers 2 >>> y = GMLAN()/GMLAN_SA(subfunction=1) >>> x = GMLAN()/GMLAN_SAPR(subfunction=1) >>> assert x.answers(y) ###(062)=[passed] Check hashret 2 >>> y.hashret() == x.hashret() True ###(063)=[passed] Check modifies ecu state >>> ecu = Ecu() >>> ecu.update(GMLAN(service="InitiateDiagnosticOperation")) >>> ecu.update(GMLAN(service="InitiateDiagnosticOperationPositiveResponse")) [+] [], responses=['GMLAN'] >>> assert ecu.state.session == 3 >>> ecu.update(GMLAN(service="ReturnToNormalOperation")) session3 >>> ecu.update(GMLAN(service="ReturnToNormalOperationPositiveResponse")) session3 [+] [session3], responses=['GMLAN'] >>> assert ecu.state.session == 1 >>> ecu.update(GMLAN(service="ProgrammingMode")) session1 >>> ecu.update(GMLAN(service="ProgrammingModePositiveResponse")) session1 [+] [session1], responses=['GMLAN'] >>> assert ecu.state.session == 2 >>> ecu.update(GMLAN(service="DisableNormalCommunication")) session2 >>> ecu.update(GMLAN(service="DisableNormalCommunicationPositiveResponse")) session2 [+] [session2], responses=['GMLAN'] >>> assert ecu.state.communication_control == 1 >>> ecu.update(GMLAN(service="ReturnToNormalOperation")) communication_control1session2 >>> ecu.update(GMLAN(service="ReturnToNormalOperationPositiveResponse")) communication_control1session2 >>> assert ecu.state.session == 1 ###(064)=[passed] Craft GMLAN_DC >>> req = GMLAN()/GMLAN_DC(CPIDNumber=0x11, CPIDControlBytes=b"\xbe\xefabc") >>> assert bytes(req) == b"\xAE\x11\xbe\xefabc" >>> >>> req2 = GMLAN()/GMLAN_DC(CPIDNumber=0x12) >>> assert bytes(req2) == b"\xAE\x12\x00\x00\x00\x00\x00" >>> >>> resp = GMLAN()/GMLAN_DCPR(CPIDNumber=0x11) >>> assert bytes(resp) == b"\xEE\x11" >>> >>> >>> assert resp.answers(req) >>> assert not resp.answers(req2) ###(065)=[passed] Dissect test GMLAN_DC >>> req = GMLAN(b"\xAE\x14caffe") >>> assert req.service == 0xAE >>> assert req.CPIDNumber == 20 >>> assert req.CPIDControlBytes == b"caffe" >>> >>> resp = GMLAN(b"\xEE\x14") >>> assert resp.service == 0xEE >>> assert resp.CPIDNumber == 20 >>> assert resp.answers(req) >>> assert resp.hashret() == req.hashret() ###(066)=[passed] Logging tests >>> def get_log(pkt): ... for layer in pkt.layers(): ... if not hasattr(layer, "get_log"): ... continue ... try: ... return layer.get_log(pkt) ... except TypeError: ... return layer.get_log.im_func(pkt) ... >>> pkt = GMLAN()/GMLAN_RFRD(subfunction=1) >>> log = get_log(pkt) >>> assert len(log) == 2 >>> assert log[1] == "readFailureRecordIdentifiers" >>> assert log[0] == "ReadFailureRecordData" >>> >>> pkt = GMLAN()/GMLAN_RFRDPR(subfunction=1) >>> log = get_log(pkt) >>> assert len(log) == 2 >>> assert log[1] == "readFailureRecordIdentifiers" >>> assert log[0] == "ReadFailureRecordDataPositiveResponse" >>> >>> pkt = GMLAN()/GMLAN_RDBPI(identifiers=[5]) >>> log = get_log(pkt) >>> print(log) ('ReadDataByParameterIdentifier', '[OBD_EngineCoolantTemperature]') >>> assert len(log) == 2 >>> assert log[1] == '[OBD_EngineCoolantTemperature]' >>> assert log[0] == "ReadDataByParameterIdentifier" >>> >>> pkt = GMLAN()/GMLAN_RDBPIPR(parameterIdentifier=5) >>> log = get_log(pkt) >>> print(log) ('ReadDataByParameterIdentifierPositiveResponse', 'OBD_EngineCoolantTemperature') >>> assert len(log) == 2 >>> assert log[1] == 'OBD_EngineCoolantTemperature' >>> assert log[0] == "ReadDataByParameterIdentifierPositiveResponse" >>> >>> >>> pkt = GMLAN()/GMLAN_RDBPKTI(subfunction=0) >>> log = get_log(pkt) >>> print(log) ('ReadDataByPacketIdentifier', 'stopSending') >>> assert len(log) == 2 >>> assert log[1] == 'stopSending' >>> assert log[0] == "ReadDataByPacketIdentifier" >>> >>> pkt = GMLAN()/GMLAN_RMBA(memoryAddress=0) >>> log = get_log(pkt) >>> print(log) ('ReadMemoryByAddress', '0x0') >>> assert len(log) == 2 >>> assert log[1] == '0x0' >>> assert log[0] == "ReadMemoryByAddress" >>> >>> pkt = GMLAN()/GMLAN_RMBAPR(memoryAddress=0, dataRecord=b"deadbeef") >>> log = get_log(pkt) >>> print(log) ('ReadMemoryByAddressPositiveResponse', ('0x0', b'deadbeef')) >>> assert len(log) == 2 >>> assert log[1][0] == '0x0' >>> assert log[1][1] == b'deadbeef' >>> assert log[0] == "ReadMemoryByAddressPositiveResponse" >>> >>> pkt = GMLAN()/GMLAN_DDM(DPIDIdentifier=0, PIDData=b"deadbeef") >>> log = get_log(pkt) >>> print(log) ('DynamicallyDefineMessage', ('0x0', b'deadbeef')) >>> assert len(log) == 2 >>> assert log[1][0] == '0x0' >>> assert log[1][1] == b'deadbeef' >>> assert log[0] == "DynamicallyDefineMessage" >>> >>> pkt = GMLAN()/GMLAN_DDMPR(DPIDIdentifier=0) >>> log = get_log(pkt) >>> print(log) ('DynamicallyDefineMessagePositiveResponse', '0x0') >>> assert len(log) == 2 >>> assert log[1] == '0x0' >>> assert log[0] == "DynamicallyDefineMessagePositiveResponse" >>> >>> pkt = GMLAN()/GMLAN_DPBA(parameterIdentifier=0, memoryAddress=1, memorySize=3) >>> log = get_log(pkt) >>> print(log) ('DefinePIDByAddress', (0, 1, 3)) >>> assert len(log) == 2 >>> assert log[1][0] == 0 >>> assert log[1][1] == 1 >>> assert log[1][2] == 3 >>> assert log[0] == "DefinePIDByAddress" >>> >>> pkt = GMLAN()/GMLAN_DPBAPR(parameterIdentifier=0) >>> log = get_log(pkt) >>> print(log) ('DefinePIDByAddressPositiveResponse', 0) >>> assert len(log) == 2 >>> assert log[1] == 0 >>> assert log[0] == "DefinePIDByAddressPositiveResponse" >>> >>> pkt = GMLAN()/GMLAN_WDBI(dataIdentifier=0, dataRecord=b"deadbeef") >>> log = get_log(pkt) >>> print(log) ('WriteDataByIdentifier', ('0x0', b'deadbeef')) >>> assert len(log) == 2 >>> assert log[1][0] == "0x0" >>> assert log[1][1] == b"deadbeef" >>> assert log[0] == "WriteDataByIdentifier" >>> >>> pkt = GMLAN()/GMLAN_WDBIPR(dataIdentifier=0) >>> log = get_log(pkt) >>> print(log) ('WriteDataByIdentifierPositiveResponse', '0x0') >>> assert len(log) == 2 >>> assert log[1] == "0x0" >>> assert log[0] == "WriteDataByIdentifierPositiveResponse" >>> >>> pkt = GMLAN()/GMLAN_RDI(subfunction=0x80) >>> log = get_log(pkt) >>> print(log) ('ReadDiagnosticInformation', 'readStatusOfDTCByDTCNumber') >>> assert len(log) == 2 >>> assert log[1] == "readStatusOfDTCByDTCNumber" >>> assert log[0] == "ReadDiagnosticInformation" >>> >>> pkt = GMLAN()/GMLAN_DC(CPIDNumber=0x80) >>> log = get_log(pkt) >>> print(log) ('DeviceControl', '0x80') >>> assert len(log) == 2 >>> assert log[1] == "0x80" >>> assert log[0] == "DeviceControl" >>> >>> pkt = GMLAN()/GMLAN_DCPR(CPIDNumber=0x80) >>> log = get_log(pkt) >>> print(log) ('DeviceControlPositiveResponse', '0x80') >>> assert len(log) == 2 >>> assert log[1] == "0x80" >>> assert log[0] == "DeviceControlPositiveResponse" Regression tests for gmlanutil ━ Run at 01:43:19 from [test/contrib/automotive/gm/gmlanutils.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for GMLAN Scanners ━ Run at 01:43:19 from [test/contrib/automotive/gm/scanner.uts] by UTscapy in 0.0 └ Passed=0 └ Failed=0 Regression tests for the HSFZ layer ━ Run at 01:43:19 from [test/contrib/automotive/bmw/hsfz.uts] by UTscapy in 0.1461961269378662 └ Passed=11 └ Failed=0 ###### ## HSFZ Contrib tests ###### ###(000)=[passed] Load Contrib Layer >>> load_contrib("automotive.bmw.hsfz", globals_dict=globals()) ###(001)=[passed] Basic Test 1 >>> pkt = HSFZ(control=1, source=0xf4, target=0x10)/Raw(b'\x11\x22\x33') >>> assert bytes(pkt) == b'\x00\x00\x00\x05\x00\x01\xf4\x10\x11"3' ###(002)=[passed] Basic Test 2 >>> pkt = HSFZ(control=1, source=0xf4, target=0x10)/Raw(b'\x11\x22\x33\x11\x11\x11\x11\x11') >>> assert bytes(pkt) == b'\x00\x00\x00\x0a\x00\x01\xf4\x10\x11"3\x11\x11\x11\x11\x11' ###(003)=[passed] Basic Dissect Test >>> pkt = HSFZ(b'\x00\x00\x00\x0a\x00\x01\xf4\x10\x11"3\x11\x11\x11\x11\x11') >>> assert pkt.length == 10 >>> assert pkt.source == 0xf4 >>> assert pkt.target == 0x10 >>> assert pkt.control == 1 >>> assert pkt[1].service == 17 >>> assert pkt[2].resetType == 34 ###(004)=[passed] Build Test >>> pkt = HSFZ(source=0xf4, target=0x10)/Raw(b"0" * 20) >>> assert bytes(pkt) == b'\x00\x00\x00\x16\x00\x01\xf4\x10' + b"0" * 20 ###(005)=[passed] Dissect Test >>> pkt = HSFZ(b'\x00\x00\x00\x18\x00\x01\xf4\x10\x67\x01' + b"0" * 20) >>> assert pkt.length == 24 >>> assert pkt.source == 0xf4 >>> assert pkt.target == 0x10 >>> assert pkt.control == 1 >>> assert pkt.securitySeed == b"0" * 20 >>> assert len(pkt[1]) == pkt.length - 2 ###(006)=[passed] Dissect Test with padding >>> pkt = HSFZ(b'\x00\x00\x00\x18\x00\x01\xf4\x10\x67\x01' + b"0" * 20 + b"p" * 100) >>> assert pkt.length == 24 >>> assert pkt.source == 0xf4 >>> assert pkt.target == 0x10 >>> assert pkt.control == 1 >>> assert pkt.securitySeed == b"0" * 20 >>> assert pkt.load == b'p' * 100 ###(007)=[passed] Dissect Test to short packet >>> pkt = HSFZ(b'\x00\x00\x00\x18\x00\x01\xf4\x10\x67\x01' + b"0" * 19) >>> assert pkt.length == 24 >>> assert pkt.source == 0xf4 >>> assert pkt.target == 0x10 >>> assert pkt.control == 1 >>> assert pkt.securitySeed == b"0" * 19 ###(008)=[passed] Dissect Test very long packet >>> pkt = HSFZ(b'\x00\x0f\xff\x04\x00\x01\xf4\x10\x67\x01' + b"0" * 0xfff00) >>> assert pkt.length == 0xfff04 >>> assert pkt.source == 0xf4 >>> assert pkt.target == 0x10 >>> assert pkt.control == 1 >>> assert pkt.securitySeed == b"0" * 0xfff00 ###(009)=[passed] Dissect identification >>> pkt = HSFZ(bytes.fromhex("000000320011444941474144523130424d574d4143374346436343463837393343424d5756494e5742413558373333333246483735373334")) >>> assert pkt.length == 50 >>> assert pkt.control == 0x11 >>> assert b"BMW" in pkt.identification_string >>> >>> pkt = UDP(bytes.fromhex("1a9be2d90040d67d000000320011444941474144523130424d574d4143374346436343463837393343424d5756494e5742413558373333333246483735373334")) >>> assert pkt.length == 50 >>> assert pkt.control == 0x11 >>> assert b"BMW" in pkt.identification_string ###(010)=[passed] Test HSFZSocket >>> server_up = threading.Event() >>> def server(): ... buffer = bytes(HSFZ(control=1, source=0xf4, target=0x10) / Raw(b'\x11\x22\x33' * 1024)) ... sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ... try: ... sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) ... sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ... sock.bind(('127.0.0.1', 6801)) ... sock.listen(1) ... server_up.set() ... connection, address = sock.accept() ... connection.send(buffer[:1024]) ... time.sleep(0.1) ... connection.send(buffer[1024:]) ... connection.close() ... finally: ... sock.close() ... >>> server_thread = threading.Thread(target=server) >>> server_thread.start() >>> server_up.wait(timeout=1) True >>> sock = HSFZSocket() >>> >>> pkts = sock.sniff(timeout=1, count=1) >>> assert len(pkts) == 1 >>> assert len(pkts[0]) > 2048 Regression tests for the XCP ━ Run at 01:43:20 from [test/contrib/automotive/xcp/xcp.uts] by UTscapy in 0.20724964141845703 └ Passed=37 └ Failed=0 ###### ## Basic operations ###### ###(000)=[passed] Load module >>> load_layer("can", globals_dict=globals()) >>> conf.contribs['CAN']['swap-bytes'] = False >>> load_contrib("automotive.xcp.xcp", globals_dict=globals()) ###(001)=[passed] Test padding >>> conf.contribs["XCP"]["add_padding_for_can"] = True >>> >>> pkt = XCPOnCAN(identifier=0x700) / CTORequest() / Connect() >>> build_pkt = bytes(pkt) >>> hexdump(build_pkt) 0000 00 00 07 00 08 00 00 00 FF 00 CC CC CC CC CC CC ................ >>> assert build_pkt == b'\x00\x00\x07\x00\x08\x00\x00\x00\xff\x00\xcc\xcc\xcc\xcc\xcc\xcc' >>> conf.contribs["XCP"]["add_padding_for_can"] = False ###(002)=[passed] test_get_com_mode_info >>> conf.contribs["XCP"]["add_padding_for_can"] = False >>> >>> cto_request = CTORequest() / GetCommModeInfo() >>> assert cto_request.pid == 0xfb >>> assert bytes(cto_request) == b'\xfb' >>> >>> cto_response = CTOResponse(b'\xff\x00\x01\x00\x02\x00\x00\x64') >>> assert cto_response.packet_code == 0xFF >>> >>> assert cto_response.answers(cto_request) >>> >>> get_comm_mode_info_response = cto_response["CommonModeInfoPositiveResponse"] >>> assert "master_block_mode" in get_comm_mode_info_response.comm_mode_optional >>> assert get_comm_mode_info_response.max_bs == 0x02 >>> assert get_comm_mode_info_response.min_st == 0x00 >>> assert get_comm_mode_info_response.xcp_driver_version_number == 0x64 ###(003)=[passed] test_get_status >>> cto_request = CTORequest() / GetStatus() >>> assert cto_request.pid == 0xfd >>> assert bytes(cto_request) == b'\xfd' >>> >>> cto_response = CTOResponse(b'\xff\x00\x15\x00\x00\x00') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> get_comm_mode_info_response = cto_response["StatusPositiveResponse"] >>> assert get_comm_mode_info_response.current_session_status == 0x00 >>> assert "cal_pag" in get_comm_mode_info_response.current_resource_protection_status >>> assert "x1" not in get_comm_mode_info_response.current_resource_protection_status >>> assert "daq" in get_comm_mode_info_response.current_resource_protection_status >>> assert "stim" not in get_comm_mode_info_response.current_resource_protection_status >>> assert "pgm" in get_comm_mode_info_response.current_resource_protection_status >>> assert "x5" not in get_comm_mode_info_response.current_resource_protection_status >>> assert "x6" not in get_comm_mode_info_response.current_resource_protection_status >>> assert "x7" not in get_comm_mode_info_response.current_resource_protection_status >>> >>> assert get_comm_mode_info_response.session_configuration_id == 0x0000 ###(004)=[passed] test_get_seed >>> conf.contribs['XCP']['MAX_CTO'] = 8 >>> cto_request = CTORequest() / GetSeed(b'\x00\x01') >>> assert cto_request.pid == 0xf8 >>> assert bytes(cto_request) == b'\xf8\x00\x01' >>> >>> cto_response = CTOResponse(b'\xff\x06\x00\x01\x02\x03\x04\x05') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> get_seed_response = cto_response["SeedPositiveResponse"] >>> assert get_seed_response.seed_length == 0x06 >>> assert get_seed_response.seed == b'\x00\x01\x02\x03\x04\x05' ###(005)=[passed] test_unlock >>> conf.contribs['XCP']['MAX_CTO'] = 8 >>> cto_request = CTORequest() / Unlock(b'\x06\x69\xAB\xA6\x00\x00\x00') >>> assert cto_request.pid == 0xf7 >>> assert cto_request['Unlock'].len == 0x06 >>> assert cto_request['Unlock'].seed == b'\x69\xAB\xA6\x00\x00\x00' >>> assert bytes(cto_request) == b'\xf7\x06\x69\xAB\xA6\x00\x00\x00' >>> >>> cto_response = CTOResponse(b'\xff\x14') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> unlock_response = cto_response["UnlockPositiveResponse"] >>> assert unlock_response.current_resource_protection_status == 0x14 >>> assert "cal_pag" not in unlock_response.current_resource_protection_status >>> assert "x1" not in unlock_response.current_resource_protection_status >>> assert "daq" in unlock_response.current_resource_protection_status >>> assert "stim" not in unlock_response.current_resource_protection_status >>> assert "pgm" in unlock_response.current_resource_protection_status >>> assert "x5" not in unlock_response.current_resource_protection_status >>> assert "x6" not in unlock_response.current_resource_protection_status >>> assert "x7" not in unlock_response.current_resource_protection_status ###(006)=[passed] test_get_id >>> conf.contribs['XCP']['byte_order'] = 0 >>> cto_request = CTORequest() / GetId(b'\x01') >>> assert cto_request.pid == 0xfa >>> assert bytes(cto_request) == b'\xfa\x01' >>> assert cto_request['GetId'].identification_type == 0x01 >>> >>> cto_response = CTOResponse(b'\xff\x00\x00\x00\x06\x00\x00\x00') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> get_id_response = cto_response["IdPositiveResponse"] >>> assert get_id_response.mode == 0x00 >>> assert get_id_response.length == 6 ###(007)=[passed] test_upload >>> conf.contribs['XCP']['MAX_CTO'] = 8 >>> conf.contribs['XCP']['Address_Granularity_Byte'] = 1 >>> >>> cto_request = CTORequest() / Upload(b'\x06') >>> assert cto_request.pid == 0xf5 >>> assert bytes(cto_request) == b'\xf5\x06' >>> assert cto_request['Upload'].nr_of_data_elements == 0x06 >>> >>> cto_response = CTOResponse(b'\xff\x58\x43\x50\x53\x49\x4D') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> upload_response = cto_response["UploadPositiveResponse"] >>> assert upload_response.element == b'\x58\x43\x50\x53\x49\x4D' ###(008)=[passed] test_cal_page >>> cto_request = CTORequest() / GetCalPage(b'\x01\x00') >>> assert cto_request.pid == 0xea >>> assert bytes(cto_request) == b'\xea\x01\x00' >>> >>> cto_response = CTOResponse(b'\xff\x00\x00\x01') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> get_cal_page_response = cto_response["CalPagePositiveResponse"] >>> assert get_cal_page_response.logical_data_page_number == 0x01 ###(009)=[passed] test_set_mta >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / SetMta(b'\xff\xff\x00\x3c\x00\x00\x00') >>> assert cto_request.pid == 0xf6 >>> assert bytes(cto_request) == b'\xf6\xff\xff\x00\x3c\x00\x00\x00' >>> assert cto_request['SetMta'].address_extension == 0x00 >>> assert cto_request['SetMta'].address == 0x3C >>> >>> cto_response = CTOResponse(b'\xff') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(010)=[passed] test_build_checksum >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / BuildChecksum(b'\xff\xff\xff\xad\x0d\x00\x00') >>> assert cto_request.pid == 0xf3 >>> assert bytes(cto_request) == b'\xf3\xff\xff\xff\xad\x0d\x00\x00' >>> assert hex(cto_request['BuildChecksum'].block_size) == '0xdad' >>> >>> cto_response = CTOResponse(b'\xff\x02\xff\xff\x2C\x87\x00\x00') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> build_checksum_response = cto_response["ChecksumPositiveResponse"] >>> assert build_checksum_response.checksum_type == 0x02 >>> assert hex(build_checksum_response.checksum) == '0x872c' ###(011)=[passed] test_download >>> conf.contribs['XCP']['byte_order'] = 0 >>> conf.contribs['XCP']['MAX_CTO'] = 8 >>> conf.contribs['XCP']['Address_Granularity_Byte'] = 1 >>> >>> cto_request = CTORequest() / Download(b'\x04\x00\x00\x80\x3f') >>> assert cto_request.pid == 0xf0 >>> assert bytes(cto_request) == b'\xf0\x04\x00\x00\x80\x3f' >>> assert cto_request['Download'].nr_of_data_elements == 0x04 >>> assert cto_request['Download'].data_elements == b'\x00\x00\x80\x3f' >>> >>> cto_response = CTOResponse(b'\xff') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(012)=[passed] test_short_upload >>> conf.contribs['XCP']['byte_order'] = 0 >>> conf.contribs['XCP']['MAX_CTO'] = 8 >>> conf.contribs['XCP']['Address_Granularity_Byte'] = 1 >>> >>> cto_request = CTORequest() / ShortUpload(b'\04\xff\x00\x60\x00\x00\x00') >>> assert cto_request.pid == 0xf4 >>> assert bytes(cto_request) == b'\xf4\x04\xff\x00\x60\x00\x00\x00' >>> assert cto_request['ShortUpload'].nr_of_data_elements == 0x04 >>> assert cto_request['ShortUpload'].address_extension == 0x00 >>> assert hex(cto_request['ShortUpload'].address) == '0x60' >>> >>> cto_response = CTOResponse(b'\xff\x00\x00\x80\x3F') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> upload_response = cto_response["ShortUploadPositiveResponse"] >>> assert upload_response.element == b'\x00\x00\x80\x3F' ###(013)=[passed] test_copy_cal_page >>> cto_request = CTORequest() / CopyCalPage(b'\00\x01\x02\x03') >>> assert cto_request.pid == 0xe4 >>> assert bytes(cto_request) == b'\xe4\00\x01\x02\x03' >>> assert cto_request['CopyCalPage'].segment_num_src == 0x00 >>> assert cto_request['CopyCalPage'].page_num_src == 0x01 >>> assert cto_request['CopyCalPage'].segment_num_dst == 0x02 >>> assert cto_request['CopyCalPage'].page_num_dst == 0x03 >>> >>> cto_response = CTOResponse(b'\xff') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(014)=[passed] test_get_daq_processor_info >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / GetDaqProcessorInfo() >>> assert cto_request.pid == 0xda >>> assert bytes(cto_request) == b'\xda' >>> cto_response = CTOResponse(b'\xff\x11\x00\x00\x01\x00\x00\x40') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> processor_info_response = cto_response["DAQProcessorInfoPositiveResponse"] >>> assert processor_info_response.daq_properties == 0x11 >>> assert "daq_config_type" in processor_info_response.daq_properties >>> assert "timestamp_supported" in processor_info_response.daq_properties >>> >>> assert "prescaler_supported" not in processor_info_response.daq_properties >>> assert "resume_supported" not in processor_info_response.daq_properties >>> assert "bit_stim_supported" not in processor_info_response.daq_properties >>> assert "pid_off_supported" not in processor_info_response.daq_properties >>> assert "overload_msb" not in processor_info_response.daq_properties >>> assert "overload_event" not in processor_info_response.daq_properties >>> >>> assert processor_info_response.max_daq == 0x0000 >>> assert processor_info_response.max_event_channel == 0x0001 >>> assert processor_info_response.min_daq == 0x00 >>> assert processor_info_response.daq_key_byte == 0x40 >>> assert "optimisation_type_0" not in processor_info_response.daq_key_byte >>> assert "optimisation_type_1" not in processor_info_response.daq_key_byte >>> assert "optimisation_type_2" not in processor_info_response.daq_key_byte >>> assert "optimisation_type_3" not in processor_info_response.daq_key_byte >>> assert "identification_field_type_0" in processor_info_response.daq_key_byte >>> assert "identification_field_type_1" not in processor_info_response.daq_key_byte >>> >>> assert "address_extension_odt" not in processor_info_response.daq_key_byte >>> assert "address_extension_daq" not in processor_info_response.daq_key_byte >>> assert "address_extension_daq" not in processor_info_response.daq_key_byte ###(015)=[passed] test_daq_resolution_info >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / GetDaqResolutionInfo() >>> assert cto_request.pid == 0xd9 >>> assert bytes(cto_request) == b'\xd9' >>> >>> cto_response = CTOResponse(b'\xff\x02\xfd\xff\xff\x62\x0a\x00') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> resolution_info_response = cto_response["DAQResolutionInfoPositiveResponse"] >>> assert resolution_info_response.granularity_odt_entry_size_daq == 0x02 >>> assert resolution_info_response.max_odt_entry_size_daq == 0xfd >>> assert resolution_info_response.granularity_odt_entry_size_stim == 0xff >>> assert resolution_info_response.max_odt_entry_size_stim == 0xff >>> assert resolution_info_response.timestamp_mode == 0x62 >>> assert "size_0" not in resolution_info_response.timestamp_mode >>> assert "size_1" in resolution_info_response.timestamp_mode >>> assert "size_2" not in resolution_info_response.timestamp_mode >>> assert "timestamp_fixed" not in resolution_info_response.timestamp_mode >>> assert "unit_0" not in resolution_info_response.timestamp_mode >>> assert "unit_1" in resolution_info_response.timestamp_mode >>> assert "unit_2" in resolution_info_response.timestamp_mode >>> assert "unit_3" not in resolution_info_response.timestamp_mode >>> >>> assert resolution_info_response.timestamp_ticks == 0x000A ###(016)=[passed] test_daq_event_info >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / GetDaqEventInfo(b'\xff\x00\x00') >>> assert cto_request.pid == 0xd7 >>> assert bytes(cto_request) == b'\xd7\xff\x00\x00' >>> assert cto_request['GetDaqEventInfo'].event_channel_num == 0x0000 >>> >>> cto_response = CTOResponse(b'\xFF\x04\x01\x05\x0A\x60\x00') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> event_info_response = cto_response["DAQEventInfoPositiveResponse"] >>> assert event_info_response.daq_event_properties == 0x04 >>> assert "x_0" not in event_info_response.daq_event_properties >>> assert "x_1" not in event_info_response.daq_event_properties >>> assert "daq" in event_info_response.daq_event_properties >>> assert "stim" not in event_info_response.daq_event_properties >>> assert "x_4" not in event_info_response.daq_event_properties >>> assert "x_5" not in event_info_response.daq_event_properties >>> assert "x_6" not in event_info_response.daq_event_properties >>> assert "x_7" not in event_info_response.daq_event_properties >>> >>> assert event_info_response.max_daq_list == 0x01 >>> assert event_info_response.event_channel_name_length == 0x05 >>> assert event_info_response.event_channel_time_cycle == 0x0a >>> assert event_info_response.event_channel_time_unit == 0x60 >>> assert event_info_response.event_channel_priority == 0x00 ###(017)=[passed] test_daq_list_info >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / GetDaqListInfo(b'\xff\x00\x00') >>> assert cto_request.pid == 0xd8 >>> assert bytes(cto_request) == b'\xd8\xff\x00\x00' >>> assert cto_request['GetDaqListInfo'].daq_list_num == 0x0000 >>> >>> cto_response = CTOResponse(b'\xFF\x04\x03\x0a\x00\x00') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> list_info_response = cto_response["DAQListInfoPositiveResponse"] >>> assert list_info_response.daq_list_properties == 0x04 >>> assert "predefined" not in list_info_response.daq_list_properties >>> assert "event_fixed" not in list_info_response.daq_list_properties >>> assert "daq" in list_info_response.daq_list_properties >>> assert "stim" not in list_info_response.daq_list_properties >>> assert "x_4" not in list_info_response.daq_list_properties >>> assert "x_5" not in list_info_response.daq_list_properties >>> assert "x_6" not in list_info_response.daq_list_properties >>> assert "x_7" not in list_info_response.daq_list_properties >>> >>> assert list_info_response.max_odt == 0x03 >>> assert list_info_response.max_odt_entries == 0x0a >>> assert list_info_response.fixed_event == 0x00 ###(018)=[passed] test_clear_daq_list >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / ClearDaqList(b'\xff\x00\x00') >>> assert cto_request.pid == 0xe3 >>> assert bytes(cto_request) == b'\xe3\xff\x00\x00' >>> assert cto_request['ClearDaqList'].daq_list_num == 0x0000 >>> >>> cto_response = CTOResponse(b'\xFF') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(019)=[passed] test_alloc_daq >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / AllocDaq(b'\xff\x01\x00') >>> assert cto_request.pid == 0xd5 >>> assert bytes(cto_request) == b'\xd5\xff\x01\x00' >>> assert cto_request['AllocDaq'].daq_count == 0x0001 >>> >>> cto_response = CTOResponse(b'\xFF') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(020)=[passed] test_alloc_odt >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / AllocOdt(b'\xff\x00\x00\x01') >>> assert cto_request.pid == 0xd4 >>> assert bytes(cto_request) == b'\xd4\xff\x00\x00\x01' >>> assert cto_request['AllocOdt'].daq_list_num == 0x0000 >>> assert cto_request['AllocOdt'].odt_count == 0x01 >>> >>> cto_response = CTOResponse(b'\xFF') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(021)=[passed] test_alloc_odt_entry >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / AllocOdtEntry(b'\xff\x00\x00\x00\x02') >>> assert cto_request.pid == 0xd3 >>> assert bytes(cto_request) == b'\xd3\xff\x00\x00\x00\x02' >>> assert cto_request['AllocOdtEntry'].daq_list_num == 0x0000 >>> assert cto_request['AllocOdtEntry'].odt_num == 0x00 >>> assert cto_request['AllocOdtEntry'].odt_entries_count == 0x02 >>> >>> cto_response = CTOResponse(b'\xFF') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(022)=[passed] test_set_daq_ptr >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / SetDaqPtr(b'\xff\x00\x00\x00\x00') >>> assert cto_request.pid == 0xe2 >>> assert bytes(cto_request) == b'\xe2\xff\x00\x00\x00\x00' >>> assert cto_request['SetDaqPtr'].daq_list_num == 0x0000 >>> assert cto_request['SetDaqPtr'].odt_num == 0x00 >>> assert cto_request['SetDaqPtr'].odt_entry_num == 0x00 >>> >>> cto_response = CTOResponse(b'\xFF') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(023)=[passed] test_write_daq >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / WriteDaq(b'\xFF\x04\x00\x08\x55\x0C\x00') >>> assert cto_request.pid == 0xe1 >>> assert bytes(cto_request) == b'\xe1\xFF\x04\x00\x08\x55\x0C\x00' >>> assert cto_request['WriteDaq'].bit_offset == 0xff >>> assert cto_request['WriteDaq'].size_of_daq_element == 0x04 >>> assert cto_request['WriteDaq'].address_extension == 0x00 >>> assert cto_request['WriteDaq'].address == 0x000C5508 >>> >>> cto_response = CTOResponse(b'\xFF') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(024)=[passed] test_set_daq_list_mode(self): >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / SetDaqListMode(b'\x10\x00\x00\x00\x00\x01\x00') >>> assert cto_request.pid == 0xe0 >>> assert bytes(cto_request) == b'\xe0\x10\x00\x00\x00\x00\x01\x00' >>> set_daq_list_mode_request = cto_request['SetDaqListMode'] >>> assert set_daq_list_mode_request.mode == 0x10 >>> assert "x0" not in set_daq_list_mode_request.mode >>> assert "direction" not in set_daq_list_mode_request.mode >>> assert "x2" not in set_daq_list_mode_request.mode >>> assert "x3" not in set_daq_list_mode_request.mode >>> assert "timestamp" in set_daq_list_mode_request.mode >>> assert "pid_off" not in set_daq_list_mode_request.mode >>> assert "x6" not in set_daq_list_mode_request.mode >>> assert "x7" not in set_daq_list_mode_request.mode >>> >>> assert set_daq_list_mode_request.daq_list_num == 0x0000 >>> assert set_daq_list_mode_request.event_channel_num == 0x0000 >>> assert set_daq_list_mode_request.transmission_rate_prescaler == 0x01 >>> assert set_daq_list_mode_request.daq_list_prio == 0x00 >>> >>> cto_response = CTOResponse(b'\xFF') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(025)=[passed] test_start_stop_daq_list >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / StartStopDaqList(b'\x02\x00\x00') >>> assert cto_request.pid == 0xde >>> assert bytes(cto_request) == b'\xde\x02\x00\x00' >>> assert cto_request['StartStopDaqList'].mode == 0x02 >>> assert cto_request['StartStopDaqList'].daq_list_number == 0x0000 >>> >>> cto_response = CTOResponse(b'\xFF\xbb') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> assert cto_response['StartStopDAQListPositiveResponse'].first_pid == 0xbb ###(026)=[passed] test_get_daq_clock >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / GetDaqClock() >>> assert cto_request.pid == 0xdc >>> assert bytes(cto_request) == b'\xdc' >>> >>> cto_response = CTOResponse(b'\xFF\xFF\xFF\xFF\xAA\xC5\x00\x00') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> get_daq_clock_response = cto_response["DAQClockListPositiveResponse"] >>> >>> assert get_daq_clock_response.receive_timestamp == 0x0000C5AA ###(027)=[passed] Test negative response >>> cto_request = CTORequest() / GetCommModeInfo() >>> cto_response = CTOResponse() / NegativeResponse() >>> assert cto_response.packet_code == 0xFE >>> assert cto_response.answers(cto_request) ###(028)=[passed] test_start_stop_synch >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / StartStopSynch(b'\x01') >>> assert cto_request.pid == 0xdd >>> assert bytes(cto_request) == b'\xdd\x01' >>> assert cto_request['StartStopSynch'].mode == 0x01 >>> >>> cto_response = CTOResponse(b'\xFF') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(029)=[passed] test_program_start >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / ProgramStart() >>> assert cto_request.pid == 0xd2 >>> assert bytes(cto_request) == b'\xd2' >>> >>> cto_response = CTOResponse(b'\xFF\xff\x01\x08\x2A\xFF\xdd') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) >>> >>> program_start_response = cto_response['ProgramStartPositiveResponse'] >>> >>> assert program_start_response.comm_mode_pgm == 0x01 >>> assert "master_block_mode" in program_start_response.comm_mode_pgm >>> assert "interleaved_mode" not in program_start_response.comm_mode_pgm >>> assert "x2" not in program_start_response.comm_mode_pgm >>> assert "x3" not in program_start_response.comm_mode_pgm >>> assert "x4" not in program_start_response.comm_mode_pgm >>> assert "x5" not in program_start_response.comm_mode_pgm >>> assert "slave_block_mode" not in program_start_response.comm_mode_pgm >>> assert "x7" not in program_start_response.comm_mode_pgm >>> >>> assert program_start_response.max_cto_pgm == 0x08 >>> assert program_start_response.max_bs_pgm == 0x2a >>> assert program_start_response.min_bs_pgm == 0xff >>> assert program_start_response.queue_size_pgm == 0xdd ###(030)=[passed] test_program_clear(self): >>> conf.contribs['XCP']['byte_order'] = 0 >>> >>> cto_request = CTORequest() / ProgramClear(b'\x00\xff\xff\x00\x01\x00\x00') >>> assert cto_request.pid == 0xd1 >>> assert bytes(cto_request) == b'\xd1\x00\xff\xff\x00\x01\x00\x00' >>> >>> assert cto_request['ProgramClear'].mode == 0x00 >>> assert cto_request['ProgramClear'].clear_range == 0x00000100 >>> >>> cto_response = CTOResponse(b'\xff') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###(031)=[passed] test_program >>> conf.contribs['XCP']['byte_order'] = 0 >>> conf.contribs['XCP']['MAX_CTO'] = 8 >>> conf.contribs['XCP']['Address_Granularity_Byte'] = 1 >>> >>> cto_request = CTORequest() / Program(b'\x06\x00\x01\x02\x03\x04\x05') >>> assert cto_request.pid == 0xd0 >>> assert bytes(cto_request) == b'\xd0\x06\x00\x01\x02\x03\x04\x05' >>> >>> assert cto_request['Program'].nr_of_data_elements == 0x06 >>> assert cto_request['Program'].data_elements == b"\x00\x01\x02\x03\x04\x05" >>> >>> cto_response = CTOResponse(b'\xff') >>> assert cto_response.packet_code == 0xFF >>> assert cto_response.answers(cto_request) ###### ## Tests for XCPonUDP ###### ###(032)=[passed] CONNECT >>> cto_request = XCPOnUDP(ctr=0, sport=1, dport=1) / CTORequest() / Connect() >>> >>> assert cto_request.length is None >>> assert cto_request.ctr == 0 >>> >>> assert cto_request.pid == 0xFF >>> assert cto_request.connection_mode == 0 >>> assert bytes(cto_request).endswith(b'\x00\x02\x00\x00\xff\x00') No IP underlayer to compute checksum. Leaving null. >>> xcp_on_udp = XCPOnUDP(b'\x00\x01\x00\x01\x00\x0c\x00\x00\x00\x08\x00\x01\xff\x15\xC0\x08\x08\x00\x10\x10') >>> assert xcp_on_udp.length == 8 >>> assert xcp_on_udp.ctr == 1 >>> >>> assert xcp_on_udp.answers(cto_request) >>> cto_response = xcp_on_udp["CTOResponse"] >>> assert cto_response.packet_code == 0xFF >>> >>> connect_response = cto_response["ConnectPositiveResponse"] >>> assert connect_response.resource == 0x15 >>> assert connect_response.comm_mode_basic == 0xC0 >>> assert connect_response.max_cto == 8 >>> assert connect_response.max_cto == 8 >>> >>> assert connect_response.xcp_protocol_layer_version_number_msb == 0x10 >>> assert connect_response.xcp_transport_layer_version_number_msb == 0x10 >>> >>> assert conf.contribs['XCP']['byte_order'] == 0 >>> assert conf.contribs['XCP']['MAX_CTO'] == 8 >>> assert conf.contribs['XCP']['MAX_DTO'] == 8 >>> assert conf.contribs['XCP']['Address_Granularity_Byte'] == 1 ###(033)=[passed] CONNECT 2 >>> prt1, prt2 = 12345, 54321 >>> xcp_on_udp_request = XCPOnUDP(sport=prt1, dport=prt2, ctr=0) / CTORequest() / Connect() >>> >>> assert xcp_on_udp_request.length is None >>> assert xcp_on_udp_request.ctr == 0 >>> assert xcp_on_udp_request.pid == 0xFF >>> assert xcp_on_udp_request.connection_mode == 0 >>> assert bytes(xcp_on_udp_request).endswith(b'\x00\x02\x00\x00\xff\x00') No IP underlayer to compute checksum. Leaving null. >>> >>> xcp_on_udp_response = XCPOnUDP(b'\xd4109\x00\x0c\x00\x00\x00\x08\x00\x01\xff\x15\xC0\x08\x08\x00\x10\x10') >>> assert xcp_on_udp_response.length == 8 >>> assert xcp_on_udp_response.ctr == 1 >>> assert xcp_on_udp_response.answers(xcp_on_udp_request) >>> >>> cto_response = xcp_on_udp_response["CTOResponse"] >>> assert cto_response.packet_code == 0xFF >>> >>> connect_response = cto_response["ConnectPositiveResponse"] >>> assert connect_response.resource == 0x15 >>> assert connect_response.comm_mode_basic == 0xC0 >>> assert connect_response.max_cto == 8 >>> assert connect_response.max_cto == 8 >>> assert connect_response.xcp_protocol_layer_version_number_msb == 0x10 >>> assert connect_response.xcp_transport_layer_version_number_msb == 0x10 >>> assert conf.contribs['XCP']['byte_order'] == 0 >>> assert conf.contribs['XCP']['MAX_CTO'] == 8 >>> assert conf.contribs['XCP']['MAX_DTO'] == 8 >>> assert conf.contribs['XCP']['Address_Granularity_Byte'] == 1 ###(034)=[passed] XCPOnUDP post build length >>> xcp_on_udp_request = XCPOnUDP(sport=1, dport=2, ctr=0) / CTORequest() / Connect() >>> assert bytes(xcp_on_udp_request)[8:10] == b'\x00\x02' No IP underlayer to compute checksum. Leaving null. ###### ## Tests XCPonTCP ###### ###(035)=[passed] CONNECT >>> prt1, prt2 = 12345, 54321 >>> >>> xcp_on_tcp_request = XCPOnTCP(sport=prt1, dport=prt2, ctr=0) / CTORequest() / Connect() >>> assert xcp_on_tcp_request.length is None >>> assert xcp_on_tcp_request.ctr == 0 >>> assert xcp_on_tcp_request.pid == 0xFF >>> assert xcp_on_tcp_request.connection_mode == 0 >>> assert bytes(xcp_on_tcp_request).endswith(b'\x00\x02\x00\x00\xff\x00') No IP underlayer to compute checksum. Leaving null. >>> >>> xcp_on_tcp_response = XCPOnTCP(b'\xd4109\x00\x00\x00\x00\x00\x00\x00\x00P\x12 \x00\x00\x00\x00\x00\x00\x08\x00\x01\xff\x15\xC0\x08\x08\x00\x10\x10') >>> assert xcp_on_tcp_response.length == 8 >>> assert xcp_on_tcp_response.ctr == 1 >>> assert xcp_on_tcp_response.answers(xcp_on_tcp_request) >>> >>> cto_response = xcp_on_tcp_response["CTOResponse"] >>> assert cto_response.packet_code == 0xFF >>> >>> connect_response = cto_response["ConnectPositiveResponse"] >>> assert connect_response.resource == 0x15 >>> assert connect_response.comm_mode_basic == 0xC0 >>> assert connect_response.max_cto == 8 >>> assert connect_response.max_cto == 8 >>> assert connect_response.xcp_protocol_layer_version_number_msb == 0x10 >>> assert connect_response.xcp_transport_layer_version_number_msb == 0x10 >>> assert conf.contribs['XCP']['byte_order'] == 0 >>> assert conf.contribs['XCP']['MAX_CTO'] == 8 >>> assert conf.contribs['XCP']['MAX_DTO'] == 8 >>> assert conf.contribs['XCP']['Address_Granularity_Byte'] == 1 ###(036)=[passed] XCPOnTCP post build length >>> xcp_on_tcp_request = XCPOnTCP(sport=prt1, dport=prt2, ctr=0) / CTORequest() / Connect() >>> assert bytes(xcp_on_tcp_request)[20:22] == b'\x00\x02' No IP underlayer to compute checksum. Leaving null. Regression tests for the XCP using CANSockets ━ Run at 01:43:20 from [test/contrib/automotive/xcp/xcp_comm.uts] by UTscapy in 0.030084848403930664 └ Passed=6 └ Failed=0 ###### ## Configuration ###### ###(000)=[passed] Imports >>> from test.testsocket import TestSocket, cleanup_testsockets ###(001)=[passed] Load module >>> load_contrib("automotive.xcp.xcp", globals_dict=globals()) ###(002)=[passed] Connect >>> sock1 = TestSocket(XCPOnCAN) >>> sock2 = TestSocket(XCPOnCAN) >>> sock1.pair(sock2) >>> >>> response = XCPOnCAN(identifier=0x700) / CTOResponse() / ConnectPositiveResponse(b'\x15\xC0\x08\x08\x00\x10\x10') >>> sniffer = AsyncSniffer(opened_socket=sock2, count=1, timeout=5, prn=lambda x: sock2.send(response)) >>> sniffer.start() >>> pkt = XCPOnCAN(identifier=0x700) / CTORequest() / Connect() >>> ans = sock1.sr1(pkt, timeout=0.5, verbose=False) 16 >>> sniffer.join(timeout=1) >>> >>> assert ans.identifier == 0x700 >>> cto_response = ans["CTOResponse"] >>> assert cto_response.packet_code == 0xff >>> >>> connect_response = cto_response["ConnectPositiveResponse"] >>> >>> assert connect_response.resource == 0x15 >>> assert connect_response.comm_mode_basic == 0xC0 >>> assert connect_response.max_cto == 8 >>> assert connect_response.max_dto is None >>> assert connect_response.max_dto_le == 8 >>> >>> assert connect_response.xcp_protocol_layer_version_number_msb == 0x10 >>> assert connect_response.xcp_transport_layer_version_number_msb == 0x10 >>> >>> >>> cto_request = XCPOnCAN(identifier=0x700) / CTORequest() / Connect() >>> >>> assert cto_request.identifier == 0x700 >>> assert cto_request.pid == 0xFF >>> assert cto_request.connection_mode == 0 >>> assert bytes(cto_request) == b'\x00\x00\x07\x00\x02\x00\x00\x00\xff\x00' >>> >>> xcp_on_can = XCPOnCAN(b'\x00\x00\x05\x00\x08\x00\x00\x00\xff\x15\xC0\x08\x08\x00\x10\x10') >>> assert xcp_on_can.identifier == 0x500 >>> assert xcp_on_can.answers(cto_request) >>> >>> cto_response = xcp_on_can["CTOResponse"] >>> assert cto_response.packet_code == 0xFF >>> >>> connect_response = cto_response["ConnectPositiveResponse"] >>> assert connect_response.resource == 0x15 >>> assert connect_response.comm_mode_basic == 0xC0 >>> assert connect_response.max_cto == 8 >>> assert connect_response.max_cto == 8 >>> >>> assert connect_response.xcp_protocol_layer_version_number_msb == 0x10 >>> assert connect_response.xcp_transport_layer_version_number_msb == 0x10 >>> >>> assert conf.contribs['XCP']['byte_order'] == 0 >>> assert conf.contribs['XCP']['MAX_CTO'] == 8 >>> assert conf.contribs['XCP']['MAX_DTO'] == 8 >>> assert conf.contribs['XCP']['Address_Granularity_Byte'] == 1 ###(003)=[passed] Endianness test for ConnectPositiveResponse >>> p = ConnectPositiveResponse(b"\x00\xFF\x01\x00\xFF\x05\x05") Byte order changed to Big Endian because of received positive connect packet Getting address granularity from packet failed:both flags are 1 >>> assert p.max_dto_le is None >>> assert p.max_dto == 0xff >>> >>> p = ConnectPositiveResponse(b"\x00\x00\x01\xFF\x00\x05\x05") Byte order changed to Little Endian because of received positive connect packet >>> assert p.max_dto_le == 0xff >>> assert p.max_dto is None ###(004)=[passed] Wrong answer >>> request = XCPOnCAN(identifier=0x700) / CTORequest() / Connect() >>> >>> response = XCPOnCAN(identifier=0x90) / CTOResponse() / Raw(b'\x01\x02\x03\x04') >>> >>> assert not response.answers(request) ###### ## Cleanup ###### ###(005)=[passed] Delete TestSockets >>> cleanup_testsockets() Regression tests for the PDUTransport / PDU layer ━ Run at 01:43:20 from [test/contrib/automotive/autosar/pdu.uts] by UTscapy in 0.019869565963745117 └ Passed=7 └ Failed=0 ###### ## PDUTransport contrib tests ###### ###(000)=[passed] Load Contrib Layer >>> load_contrib("automotive.autosar.pdu", globals_dict=globals()) ###(001)=[passed] Defaults test >>> p = PDUTransport() >>> assert p.pdus == [PDU()] >>> >>> p = PDU() >>> assert p.pdu_id == 0 >>> assert p.pdu_payload_len == None ###(002)=[passed] Build test pdu_id >>> p = PDU(bytes(PDU(pdu_id=0x11))) >>> assert len(bytes(p)) == 8 >>> assert p.pdu_id == 0x11 >>> assert p.pdu_payload_len == 0 ###(003)=[passed] Build test pdu_payload_len >>> p = PDU(bytes(PDU(pdu_payload_len=12))) >>> assert len(p) == 8 >>> assert p.pdu_id == 0 >>> assert p.pdu_payload_len == 12 ###(004)=[passed] Build test id and payload len with data >>> p = PDU(bytes(PDU(pdu_id=0x12, pdu_payload_len=2) / Raw(b'\x22\x33'))) >>> assert len(p) == 10 >>> assert p.pdu_id == 0x12 >>> assert p.pdu_payload_len == 2 >>> assert len(p['Raw']) == 2 >>> assert bytes(p['Raw']) == b'\x22\x33' ###(005)=[passed] Build PDUTransport with multiple PDU packets >>> p1 = PDUTransport(b'\x00\x00\x00\x01\x00\x00\x00\x01\x11' ... b'\x00\x00\x00\x02\x00\x00\x00\x02\x11\x44' ... b'\x00\x00\x00\x03\x00\x00\x00\x03\x11\x33\x91') >>> p2 = PDUTransport(bytes(PDUTransport(pdus=[PDU(pdu_id=0x1,pdu_payload_len=1)/Raw(b'\x11'), # noqa: E501 ... PDU(pdu_id=0x2, pdu_payload_len=2) / Raw(b'\x11\x44'), ... PDU(pdu_id=0x3, pdu_payload_len=3) / Raw(b'\x11\x33\x91')]))) >>> assert p1 == p2 >>> assert p1.pdus[0].pdu_id == 0x1 >>> assert p1.pdus[0].pdu_payload_len == 1 >>> assert p1.pdus[1].pdu_id == 0x2 >>> assert p1.pdus[1].pdu_payload_len == 2 >>> assert p1.pdus[2].pdu_id == 0x3 >>> assert p1.pdus[2].pdu_payload_len == 3 ###(006)=[passed] Build PDUTransport with one PDU packet >>> p1 = PDUTransport(b'\x00\x00\x00\x01\x00\x00\x00\x03\x11\x22\x33') >>> p2 = PDUTransport(bytes(PDUTransport(pdus=[ ... PDU(pdu_id=0x1, pdu_payload_len=0x3) / Raw(b'\x11\x22\x33')]))) >>> >>> assert p1 == p2 >>> assert p1.pdus[0].pdu_id == 0x1 >>> assert p1.pdus[0].pdu_payload_len == 3 Regression tests for the SecOC_PDUTransport / SecOC_PDU layer ━ Run at 01:43:20 from [test/contrib/automotive/autosar/secoc.uts] by UTscapy in 0.05986595153808594 └ Passed=11 └ Failed=0 ###### ## SecOC_PDUTransport contrib tests ###### ###(000)=[passed] Load Contrib Layer >>> load_contrib("automotive.autosar.secoc_pdu") ###(001)=[passed] Prepare SecOC keys >>> SecOC_PDU.secoc_protected_pdus_by_identifier = {0, 1, 2, 3, 17, 18} >>> SecOC_PDU.register_secoc_protected_pdu(0xdeadbeef) >>> >>> class PDU_Payload(Packet): ... fields_desc = [ ... ByteField("a", 0), ... ByteField("b", 0), ... ByteField("c", 0) ... ] ... >>> >>> class PDU_Payload2(Packet): ... fields_desc = [ ... ByteField("x", 0), ... ByteField("y", 0), ... ByteField("z", 0) ... ] ... >>> >>> SecOC_PDUTransport.register_secoc_protected_pdu(32, PDU_Payload) >>> SecOC_PDUTransport.register_secoc_protected_pdu(64, PDU_Payload2) ###(002)=[passed] Defaults test >>> p = SecOC_PDUTransport() >>> p.show() ###[ SecOC_PDUTransport ]### \pdus \ |###[ SecOC_PDU ]### | pdu_id = 0x0 | pdu_payload_len= None | \pdu_payload\ | |###[ Raw ]### | | load = b'' | tfv = 0x0 | tmac = None >>> assert p.pdus == [SecOC_PDU()] >>> >>> p = SecOC_PDU() >>> assert p.pdu_id == 0 >>> assert p.pdu_payload_len == None ###(003)=[passed] Build test pdu_id >>> p = SecOC_PDU(bytes(SecOC_PDU(pdu_id=0x11))) >>> assert len(bytes(p)) == 12 >>> assert p.pdu_id == 0x11 >>> assert p.pdu_payload_len == 4 ###(004)=[passed] Build test pdu_payload_len >>> p1 = bytes(SecOC_PDU(pdu_payload_len=12, pdu_payload=bytes.fromhex("1122334455667788"))) >>> print(p1.hex()) 000000000000000c112233445566778800000000 >>> p = SecOC_PDU(p1) >>> p.show() ###[ SecOC_PDU ]### pdu_id = 0x0 pdu_payload_len= 12 \pdu_payload\ |###[ Raw ]### | load = b'\x11"3DUfw\x88' tfv = 0x0 tmac = 000000 >>> assert len(p) == 20 >>> assert p.pdu_id == 0 >>> assert p.pdu_payload_len == 12 >>> assert bytes(p.pdu_payload) == bytes.fromhex("1122334455667788") >>> assert p.tfv == 0 >>> assert p.tmac == b"\x00\x00\x00" ###(005)=[passed] Build test pdu_payload_len2 >>> p1 = bytes(SecOC_PDU(pdu_id=0xdeadbeef, pdu_payload_len=12, pdu_payload=bytes.fromhex("1122334455667788"), tfv=42)) >>> print(p1.hex()) deadbeef0000000c11223344556677882a000000 >>> p = SecOC_PDU(p1) >>> p.show() ###[ SecOC_PDU ]### pdu_id = 0xdeadbeef pdu_payload_len= 12 \pdu_payload\ |###[ Raw ]### | load = b'\x11"3DUfw\x88' tfv = 0x2a tmac = 000000 >>> assert len(p) == 20 >>> assert p.pdu_id == 0xdeadbeef >>> assert p.pdu_payload_len == 12 >>> assert bytes(p.pdu_payload) == bytes.fromhex("1122334455667788") >>> assert p.tfv == 42 >>> assert p.tmac == b"\x00\x00\x00" ###(006)=[passed] Build test id and payload len with data >>> p = SecOC_PDU(bytes(SecOC_PDU(pdu_id=0x12, pdu_payload=b'\x22\x33\x22\x33'))) >>> assert len(p) == 16 >>> assert p.pdu_id == 0x12 >>> print(p.pdu_payload) Raw >>> p.show() ###[ SecOC_PDU ]### pdu_id = 0x12 pdu_payload_len= 8 \pdu_payload\ |###[ Raw ]### | load = b'"3"3' tfv = 0x0 tmac = 000000 >>> assert p.pdu_payload_len == 8 >>> assert len(p.pdu_payload) == 4 >>> assert bytes(p.pdu_payload) == b'\x22\x33\x22\x33' ###(007)=[passed] Build SecOC_PDUTransport with multiple SecOC_PDU packets >>> p1 = SecOC_PDUTransport( ... b'\x00\x00\x00\x01\x00\x00\x00\x05\x11\x00\x00\x00\x00' ... b'\x00\x00\x00\x02\x00\x00\x00\x06\x11\x44\x00\x00\x00\x00' ... b'\x00\x00\x00\x03\x00\x00\x00\x07\x11\x33\x91\x00\x00\x00\x00') >>> >>> assert p1.pdus[0].pdu_id == 0x1 >>> assert p1.pdus[0].pdu_payload_len == 5 >>> assert p1.pdus[1].pdu_id == 0x2 >>> assert p1.pdus[1].pdu_payload_len == 6 >>> assert p1.pdus[2].pdu_id == 0x3 >>> assert p1.pdus[2].pdu_payload_len == 7 >>> >>> p2 = SecOC_PDUTransport(bytes(SecOC_PDUTransport( ... pdus=[ ... SecOC_PDU(pdu_id=0x1,pdu_payload_len=5, pdu_payload=Raw(b'\x11')), ... SecOC_PDU(pdu_id=0x2, pdu_payload_len=6, pdu_payload=Raw(b'\x11\x44')), ... SecOC_PDU(pdu_id=0x3, pdu_payload_len=7, pdu_payload=Raw(b'\x11\x33\x91')) ... ]))) >>> assert p1 == p2 ###(008)=[passed] Build SecOC_PDUTransport with one SecOC_PDU packet >>> p1 = SecOC_PDUTransport(b'\x00\x00\x00\x01\x00\x00\x00\x08\xaa\xaa\xaa\xaa\x11\x22\x33\x44') >>> p2 = SecOC_PDUTransport(bytes(SecOC_PDUTransport(pdus=[SecOC_PDU(pdu_id=0x1, pdu_payload=Raw(b'\xaa\xaa\xaa\xaa'), tfv=0x11, tmac=b"\x22\x33\x44")]))) >>> >>> assert p1 == p2 >>> assert p1.pdus[0].pdu_id == 0x1 >>> assert p1.pdus[0].pdu_payload_len == 8 ###(009)=[passed] Build SecOC_PDUTransport with one SecOC_PDU packet and custom class >>> p1 = SecOC_PDUTransport(b'\x00\x00\x00\x20\x00\x00\x00\x07\xaa\xbb\xcc\x11\x22\x33\x44') >>> >>> assert p1 >>> assert p1.pdus[0].pdu_id == 0x20 >>> assert p1.pdus[0].pdu_payload_len == 7 >>> assert p1.pdus[0].tmac == b"\x22\x33\x44" >>> pdu = p1.pdus[0] >>> pdu.show() ###[ SecOC_PDU ]### pdu_id = 0x20 pdu_payload_len= 7 \pdu_payload\ |###[ PDU_Payload ]### | a = 170 | b = 187 | c = 204 tfv = 0x11 tmac = 223344 >>> assert pdu.pdu_payload.a == 0xaa >>> assert pdu.pdu_payload.b == 0xbb >>> assert pdu.pdu_payload.c == 0xcc ###(010)=[passed] Build SecOC_PDUTransport with multiple SecOC_PDU packets >>> p1 = SecOC_PDUTransport(bytes.fromhex("00000020 00000007 aabbcc 11223344 00000040 00000007 ddeeff 55667788 000000ff 00000008 01234567 11223344 000000ff 00000008 01234567 11223344")) >>> p1.show() ###[ SecOC_PDUTransport ]### \pdus \ |###[ SecOC_PDU ]### | pdu_id = 0x20 | pdu_payload_len= 7 | \pdu_payload\ | |###[ PDU_Payload ]### | | a = 170 | | b = 187 | | c = 204 | tfv = 0x11 | tmac = 223344 |###[ SecOC_PDU ]### | pdu_id = 0x40 | pdu_payload_len= 7 | \pdu_payload\ | |###[ PDU_Payload2 ]### | | x = 221 | | y = 238 | | z = 255 | tfv = 0x55 | tmac = 667788 |###[ PDU ]### | pdu_id = 0xff | pdu_payload_len= 8 |###[ Raw ]### | load = b'\x01#Eg\x11"3D' |###[ PDU ]### | pdu_id = 0xff | pdu_payload_len= 8 |###[ Raw ]### | load = b'\x01#Eg\x11"3D' >>> assert p1 >>> assert p1.pdus[0].pdu_id == 0x20 >>> assert p1.pdus[1].pdu_id == 0x40 >>> assert p1.pdus[2].pdu_id == 0xff >>> assert p1.pdus[3].pdu_id == 0xff >>> assert p1.pdus[0].pdu_payload_len == 7 >>> assert p1.pdus[1].pdu_payload_len == 7 >>> assert p1.pdus[2].pdu_payload_len == 8 >>> assert p1.pdus[3].pdu_payload_len == 8 >>> assert p1.pdus[0].tmac == b"\x22\x33\x44" >>> >>> try: ... assert p1.pdus[2].tmac == b"\x22\x33\x44" ... assert False ... except AttributeError: ... pass ... >>> assert p1.pdus[1].tmac == b"\x66\x77\x88" >>> >>> pdu = p1.pdus[0] >>> pdu.show() ###[ SecOC_PDU ]### pdu_id = 0x20 pdu_payload_len= 7 \pdu_payload\ |###[ PDU_Payload ]### | a = 170 | b = 187 | c = 204 tfv = 0x11 tmac = 223344 >>> assert pdu.pdu_payload.a == 0xaa >>> assert pdu.pdu_payload.b == 0xbb >>> assert pdu.pdu_payload.c == 0xcc >>> >>> pdu = p1.pdus[1] >>> pdu.show() ###[ SecOC_PDU ]### pdu_id = 0x40 pdu_payload_len= 7 \pdu_payload\ |###[ PDU_Payload2 ]### | x = 221 | y = 238 | z = 255 tfv = 0x55 tmac = 667788 >>> assert pdu.pdu_payload.x == 0xdd >>> assert pdu.pdu_payload.y == 0xee >>> assert pdu.pdu_payload.z == 0xff >>> >>> pdu = p1.pdus[2] >>> assert "PDU" in pdu.__class__.__name__ >>> assert pdu.payload.__class__.__name__ == "Raw" >>> assert pdu.load == bytes.fromhex("0123456711223344") >>> >>> >>> pdu = p1.pdus[3] >>> assert "PDU" in pdu.__class__.__name__ >>> assert pdu.payload.__class__.__name__ == "Raw" >>> assert pdu.load == bytes.fromhex("0123456711223344") UTscapy ended successfully Processing files: python3-scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.noarch Executing(%license): /bin/sh -e /var/tmp/rpm-tmp.5e8nHS + RPM_EC=0 ++ jobs -p + exit 0 warning: Directory not found: /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/test + umask 022 + cd /builddir/build/BUILD/scapy-2.5.0-build + cd scapy-2.5.0 + LICENSEDIR=/builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/share/licenses/python3-scapy + export LC_ALL=C.UTF-8 + LC_ALL=C.UTF-8 + export LICENSEDIR + /usr/bin/mkdir -p /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/share/licenses/python3-scapy + cp -pr /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/LICENSE /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/share/licenses/python3-scapy + RPM_EC=0 ++ jobs -p + exit 0 warning: absolute symlink: /usr/bin/scapy -> /usr/bin/scapy3 + umask 022 + cd /builddir/build/BUILD/scapy-2.5.0-build + cd scapy-2.5.0 + DOCDIR=/builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/share/doc/scapy-doc + export LC_ALL=C.UTF-8 + LC_ALL=C.UTF-8 + export DOCDIR + /usr/bin/mkdir -p /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/share/doc/scapy-doc + cp -pr /builddir/build/BUILD/scapy-2.5.0-build/scapy-2.5.0/doc/scapy/_build_doc/html /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/share/doc/scapy-doc + RPM_EC=0 ++ jobs -p + exit 0 Provides: python-scapy = 2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42 python3-scapy = 2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42 python3.13-scapy = 2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42 python3.13dist(scapy) = 2.5~~dev467 python3dist(scapy) = 2.5~~dev467 scapy = 2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PartialHardlinkSets) <= 4.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Requires: /usr/bin/python3 python(abi) = 3.13 Obsoletes: python-scapy < 2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42 Recommends: PyX ipython3 python3-matplotlib Processing files: scapy-doc-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.noarch Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.rVbk05 Provides: scapy-doc = 2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Checking for unpackaged file(s): /usr/lib/rpm/check-files /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT Wrote: /builddir/build/RPMS/python3-scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.noarch.rpm Wrote: /builddir/build/RPMS/scapy-doc-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.noarch.rpm Executing(rmbuild): /bin/sh -e /var/tmp/rpm-tmp.axJ7IB + umask 022 + cd /builddir/build/BUILD/scapy-2.5.0-build + test -d /builddir/build/BUILD/scapy-2.5.0-build + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w /builddir/build/BUILD/scapy-2.5.0-build + rm -rf /builddir/build/BUILD/scapy-2.5.0-build + RPM_EC=0 ++ jobs -p + exit 0 RPM build warnings: Directory not found: /builddir/build/BUILD/scapy-2.5.0-build/BUILDROOT/usr/lib/python3.13/site-packages/test absolute symlink: /usr/bin/scapy -> /usr/bin/scapy3 Finish: rpmbuild scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.src.rpm Finish: build phase for scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.src.rpm INFO: chroot_scan: 1 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-ppc64le-1733621700.483719/root/var/log/dnf5.log INFO: chroot_scan: creating tarball /var/lib/copr-rpmbuild/results/chroot_scan.tar.gz /bin/tar: Removing leading `/' from member names INFO: Done(/var/lib/copr-rpmbuild/results/scapy-2.5.0-1.20241208013417555520.pr2.467.gdc4d7f93.fc42.src.rpm) Config(child) 8 minutes 11 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_success=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot Finish: run Running RPMResults tool Package info: { "packages": [ { "name": "scapy", "epoch": null, "version": "2.5.0", "release": "1.20241208013417555520.pr2.467.gdc4d7f93.fc42", "arch": "src" }, { "name": "scapy-doc", "epoch": null, "version": "2.5.0", "release": "1.20241208013417555520.pr2.467.gdc4d7f93.fc42", "arch": "noarch" }, { "name": "python3-scapy", "epoch": null, "version": "2.5.0", "release": "1.20241208013417555520.pr2.467.gdc4d7f93.fc42", "arch": "noarch" } ] } RPMResults finished