Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

4.5: pytest is failing in few units (ESPTOOL-616) #838

Closed
kloczek opened this issue Feb 13, 2023 · 7 comments
Closed

4.5: pytest is failing in few units (ESPTOOL-616) #838

kloczek opened this issue Feb 13, 2023 · 7 comments

Comments

@kloczek
Copy link

kloczek commented Feb 13, 2023

Operating System

Linux/x86_64

Esptool Version

4.5

Python Version

3.8.16

Full Esptool Command Line that Was Run

N/A

Esptool Output

N/A

What is the Expected Behaviour?

I'm packaging your module as an rpm package so I'm using the typical PEP517 based build, install and test cycle used on building packages from non-root account.

  • python3 -sBm build -w --no-isolation
  • because I'm calling build with --no-isolation I'm using during all processes only locally installed modules
  • install .whl file in </install/prefix>
  • run pytest with $PYTHONPATH pointing to sitearch and sitelib inside </install/prefix>
  • build is performed in env which is cut off from access to the public network (pytest is executed with -m "not network")

Looks like few unit wich are not using /dev/ttyUSB0 are failing.

More Information

Here is pytest output:

+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra -m 'not network' --deselect test/test_esptool.py::TestAutoDetect::test_auto_detect --deselect test/test_esptool.py::TestBootloaderHeaderRewriteCases::test_flash_header_no_magic_no_rewrite --deselect test/test_esptool.py::TestBootloaderHeaderRewriteCases::test_flash_header_rewrite --deselect test/test_esptool.py::TestErase::test_chip_erase --deselect test/test_esptool.py::TestErase::test_large_region_erase --deselect test/test_esptool.py::TestErase::test_region_erase --deselect test/test_esptool.py::TestFlashDetection::test_flash_id --deselect test/test_esptool.py::TestFlashDetection::test_flash_id_expand_args --deselect test/test_esptool.py::TestFlashDetection::test_flash_id_trace --deselect test/test_esptool.py::TestFlashEncryption::test_blank_efuse_encrypt_write_abort --deselect test/test_esptool.py::TestFlashEncryption::test_blank_efuse_encrypt_write_continue1 --deselect test/test_esptool.py::TestFlashEncryption::test_blank_efuse_encrypt_write_continue2 --deselect test/test_esptool.py::TestFlashSizes::test_flash_size_keep --deselect test/test_esptool.py::TestFlashSizes::test_high_offset --deselect test/test_esptool.py::TestFlashSizes::test_high_offset_no_compression --deselect test/test_esptool.py::TestFlashSizes::test_large_image --deselect test/test_esptool.py::TestFlashSizes::test_large_no_compression --deselect test/test_esptool.py::TestFlashSizes::test_write_no_compression_past_end_fails --deselect test/test_esptool.py::TestFlashSizes::test_write_past_end_fails --deselect test/test_esptool.py::TestFlashing::test_adjacent_flash --deselect test/test_esptool.py::TestFlashing::test_adjacent_independent_flash --deselect test/test_esptool.py::TestFlashing::test_compressed_nostub_flash --deselect test/test_esptool.py::TestFlashing::test_compressible_file --deselect test/test_esptool.py::TestFlashing::test_compressible_non_trivial_file --deselect test/test_esptool.py::TestFlashing::test_correct_offset --deselect test/test_esptool.py::TestFlashing::test_erase_before_write --deselect test/test_esptool.py::TestFlashing::test_erase_range_messages --deselect test/test_esptool.py::TestFlashing::test_highspeed_flash --deselect test/test_esptool.py::TestFlashing::test_length_not_aligned_4bytes --deselect test/test_esptool.py::TestFlashing::test_length_not_aligned_4bytes_no_compression --deselect test/test_esptool.py::TestFlashing::test_no_compression_flash --deselect test/test_esptool.py::TestFlashing::test_partition_table_then_bootloader --deselect test/test_esptool.py::TestFlashing::test_partition_table_then_bootloader_no_compression --deselect test/test_esptool.py::TestFlashing::test_partition_table_then_bootloader_nostub --deselect test/test_esptool.py::TestFlashing::test_short_flash --deselect test/test_esptool.py::TestFlashing::test_single_byte --deselect test/test_esptool.py::TestFlashing::test_write_image_for_another_target --deselect test/test_esptool.py::TestFlashing::test_write_no_overlap --deselect test/test_esptool.py::TestFlashing::test_zero_length --deselect test/test_esptool.py::TestKeepImageSettings::test_detect_size_changes_size --deselect test/test_esptool.py::TestKeepImageSettings::test_explicit_set_size_freq_mode --deselect test/test_esptool.py::TestKeepImageSettings::test_keep_does_not_change_settings --deselect test/test_esptool.py::TestLoadRAM::test_load_ram --deselect test/test_esptool.py::TestMemoryOperations::test_memory_dump --deselect test/test_esptool.py::TestMemoryOperations::test_memory_read --deselect test/test_esptool.py::TestMemoryOperations::test_memory_write --deselect test/test_esptool.py::TestReadIdentityValues::test_read_mac --deselect test/test_esptool.py::TestReadWriteMemory::test_read_chip_description --deselect test/test_esptool.py::TestReadWriteMemory::test_read_write_flash_status --deselect test/test_esptool.py::TestReadWriteMemory::test_read_write_memory_rom --deselect test/test_esptool.py::TestReadWriteMemory::test_read_write_memory_stub --deselect test/test_esptool.py::TestSectorBoundaries::test_end_sector --deselect test/test_esptool.py::TestSectorBoundaries::test_end_sector_uncompressed --deselect test/test_esptool.py::TestSectorBoundaries::test_overlap --deselect test/test_esptool.py::TestStubReuse::test_stub_reuse_with_synchronization --deselect test/test_esptool.py::TestVerifyCommand::test_verify_failure --deselect test/test_esptool.py::TestVerifyCommand::test_verify_success --deselect test/test_esptool.py::TestVerifyCommand::test_verify_unaligned_length --deselect test/test_esptool.py::TestVirtualPort::test_auto_detect --deselect test/test_esptool.py::TestVirtualPort::test_auto_detect_virtual_port --deselect test/test_esptool.py::TestVirtualPort::test_highspeed_flash_virtual_port
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.8.16, pytest-7.2.1, pluggy-1.0.0
rootdir: /home/tkloczko/rpmbuild/BUILD/esptool-4.5
collected 217 items / 61 deselected / 156 selected

test/test_espefuse.py .......................ssssssssssss......sss.sss..ss..ss.....ssssss.ss........ss..                                                                              [ 52%]
test/test_espsecure.py .......F...F.FF.F.........                                                                                                                                     [ 69%]
test/test_espsecure_hsm.py FF                                                                                                                                                         [ 70%]
test/test_esptool.py ss...sss.ssss..F                                                                                                                                                 [ 80%]
test/test_image_info.py .......                                                                                                                                                       [ 85%]
test/test_imagegen.py ..............                                                                                                                                                  [ 94%]
test/test_merge_bin.py ........                                                                                                                                                       [ 99%]
test/test_modules.py .                                                                                                                                                                [100%]

========================================================================================= FAILURES ==========================================================================================
_______________________________________________________________________________ TestSigning.test_sign_v2_data _______________________________________________________________________________

self = <test_espsecure.TestSigning object at 0x7fcebe46ce50>

    def test_sign_v2_data(self):
        signing_keys = [
            "rsa_secure_boot_signing_key.pem",
            "ecdsa192_secure_boot_signing_key.pem",
            "ecdsa_secure_boot_signing_key.pem",
        ]
        for key in signing_keys:
            with tempfile.NamedTemporaryFile() as output_file:
                args = self.SignArgs(
                    "2",
                    [self._open(key)],
                    output_file.name,
                    False,
                    False,
                    None,
                    None,
                    None,
                    self._open("bootloader_unsigned_v2.bin"),
                )
>               espsecure.sign_data(args)

test/test_espsecure.py:222:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:331: in sign_data
    return sign_secure_boot_v2(args)
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:490: in sign_secure_boot_v2
    signature_block = generate_signature_block_using_private_key(
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:604: in generate_signature_block_using_private_key
    private_key = _load_sbv2_signing_key(keyfile.read())
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:231: in _load_sbv2_signing_key
    sk = serialization.load_pem_private_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py:22: in load_pem_private_key
    return ossl.load_pem_private_key(data, password)
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:921: in load_pem_private_key
    return self._load_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1189: in _load_key
    self._handle_key_loading_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <OpenSSLBackend(version: OpenSSL 3.0.5 5 Jul 2022, FIPS: False)>

    def _handle_key_loading_error(self) -> typing.NoReturn:
        errors = self._consume_errors()

        if not errors:
            raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format or it may be encrypted with an unsupported "
                "algorithm."
            )

        elif (
            errors[0]._lib_reason_match(
                self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT
            )
            or errors[0]._lib_reason_match(
                self._lib.ERR_LIB_PKCS12,
                self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR,
            )
            or (
                self._lib.Cryptography_HAS_PROVIDERS
                and errors[0]._lib_reason_match(
                    self._lib.ERR_LIB_PROV,
                    self._lib.PROV_R_BAD_DECRYPT,
                )
            )
        ):
            raise ValueError("Bad decrypt. Incorrect password?")

        elif any(
            error._lib_reason_match(
                self._lib.ERR_LIB_EVP,
                self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM,
            )
            for error in errors
        ):
            raise ValueError("Unsupported public key algorithm.")

        else:
            errors_with_text = binding._errors_with_text(errors)
>           raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format, it may be encrypted with an unsupported "
                "algorithm, or it may be an unsupported key type (e.g. EC "
                "curves with explicit parameters).",
                errors_with_text,
            )
E           ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=503841036, lib=60, reason=524556, reason_text=b'error:1E08010C:DECODER routines::unsupported'), _OpenSSLErrorWithText(code=134217857, lib=16, reason=129, reason_text=b'error:08000081:elliptic curve routines::unknown group'), _OpenSSLErrorWithText(code=134217847, lib=16, reason=119, reason_text=b'error:08000077:elliptic curve routines::ec group new by name failure'), _OpenSSLErrorWithText(code=134742032, lib=16, reason=524304, reason_text=b'error:08080010:elliptic curve routines::EC lib'), _OpenSSLErrorWithText(code=109052072, lib=13, reason=168, reason_text=b'error:068000A8:asn1 encoding routines::wrong tag'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error')])

/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1248: ValueError
----------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------
1 signing key(s) found.
Signed 32768 bytes of data from /home/tkloczko/rpmbuild/BUILD/esptool-4.5/test/secure_images/bootloader_unsigned_v2.bin. Signature sector now has 1 signature blocks.
Signature block 0 is valid (RSA).
Signature block 0 verification successful using the supplied key (RSA).
Signature block 1 invalid. Skipping.
Signature block 2 invalid. Skipping.
1 signing key(s) found.
__________________________________________________________________ TestSigning.test_sign_v2_with_pre_calculated_signature ___________________________________________________________________

self = <test_espsecure.TestSigning object at 0x7fcebe46cd90>

    def test_sign_v2_with_pre_calculated_signature(self):
        # Sign using pre-calculated signature + Verify
        signing_keys = [
            "rsa_secure_boot_signing_pubkey.pem",
            "ecdsa192_secure_boot_signing_pubkey.pem",
            "ecdsa_secure_boot_signing_pubkey.pem",
        ]
        pre_calculated_signatures = [
            "pre_calculated_bootloader_signature_rsa.bin",
            "pre_calculated_bootloader_signature_ecdsa192.bin",
            "pre_calculated_bootloader_signature_ecdsa256.bin",
        ]
        for pub_key, signature in zip(signing_keys, pre_calculated_signatures):
            with tempfile.NamedTemporaryFile() as output_file:
                args = self.SignArgs(
                    "2",
                    None,
                    output_file.name,
                    False,
                    False,
                    None,
                    [self._open(pub_key)],
                    [self._open(signature)],
                    self._open("bootloader_unsigned_v2.bin"),
                )
>               espsecure.sign_data(args)

test/test_espsecure.py:408:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:331: in sign_data
    return sign_secure_boot_v2(args)
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:485: in sign_secure_boot_v2
    signature_block = generate_signature_block_using_pre_calculated_signature(
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:546: in generate_signature_block_using_pre_calculated_signature
    public_key = _get_sbv2_pub_key(pk)
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:288: in _get_sbv2_pub_key
    vk = _load_sbv2_pub_key(key_data)
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:258: in _load_sbv2_pub_key
    vk = serialization.load_pem_public_key(keydata, backend=default_backend())
/usr/lib64/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py:30: in load_pem_public_key
    return ossl.load_pem_public_key(data)
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:968: in load_pem_public_key
    self._handle_key_loading_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <OpenSSLBackend(version: OpenSSL 3.0.5 5 Jul 2022, FIPS: False)>

    def _handle_key_loading_error(self) -> typing.NoReturn:
        errors = self._consume_errors()

        if not errors:
            raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format or it may be encrypted with an unsupported "
                "algorithm."
            )

        elif (
            errors[0]._lib_reason_match(
                self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT
            )
            or errors[0]._lib_reason_match(
                self._lib.ERR_LIB_PKCS12,
                self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR,
            )
            or (
                self._lib.Cryptography_HAS_PROVIDERS
                and errors[0]._lib_reason_match(
                    self._lib.ERR_LIB_PROV,
                    self._lib.PROV_R_BAD_DECRYPT,
                )
            )
        ):
            raise ValueError("Bad decrypt. Incorrect password?")

        elif any(
            error._lib_reason_match(
                self._lib.ERR_LIB_EVP,
                self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM,
            )
            for error in errors
        ):
            raise ValueError("Unsupported public key algorithm.")

        else:
            errors_with_text = binding._errors_with_text(errors)
>           raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format, it may be encrypted with an unsupported "
                "algorithm, or it may be an unsupported key type (e.g. EC "
                "curves with explicit parameters).",
                errors_with_text,
            )
E           ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=75497580, lib=9, reason=108, reason_text=b'error:0480006C:PEM routines::no start line')])

/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1248: ValueError
----------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------
Pre-calculated signatures found
1 signing key(s) found.
Signed 32768 bytes of data from /home/tkloczko/rpmbuild/BUILD/esptool-4.5/test/secure_images/bootloader_unsigned_v2.bin. Signature sector now has 1 signature blocks.
Signature block 0 is valid (RSA).
Signature block 0 verification successful using the supplied key (RSA).
Signature block 1 invalid. Skipping.
Signature block 2 invalid. Skipping.
Pre-calculated signatures found
1 signing key(s) found.
_______________________________________________________________________ TestSigning.test_verify_signature_signing_key _______________________________________________________________________

self = <test_espsecure.TestSigning object at 0x7fcebe468a60>

    def test_verify_signature_signing_key(self):
        # correct key v1
        args = self.VerifyArgs(
            "1",
            False,
            None,
            self._open("ecdsa_secure_boot_signing_key.pem"),
            self._open("bootloader_signed.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("rsa_secure_boot_signing_key.pem"),
            self._open("bootloader_signed_v2.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2 (ecdsa256)
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("ecdsa_secure_boot_signing_key.pem"),
            self._open("bootloader_signed_v2_ecdsa256.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2 (ecdsa192)
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("ecdsa192_secure_boot_signing_key.pem"),
            self._open("bootloader_signed_v2_ecdsa192.bin"),
        )
>       espsecure.verify_signature(args)

test/test_espsecure.py:485:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:701: in verify_signature
    return verify_signature_v2(args)
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:787: in verify_signature_v2
    vk = _get_sbv2_pub_key(keyfile)
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:286: in _get_sbv2_pub_key
    return _load_sbv2_signing_key(key_data).public_key()
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:231: in _load_sbv2_signing_key
    sk = serialization.load_pem_private_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py:22: in load_pem_private_key
    return ossl.load_pem_private_key(data, password)
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:921: in load_pem_private_key
    return self._load_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1189: in _load_key
    self._handle_key_loading_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <OpenSSLBackend(version: OpenSSL 3.0.5 5 Jul 2022, FIPS: False)>

    def _handle_key_loading_error(self) -> typing.NoReturn:
        errors = self._consume_errors()

        if not errors:
            raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format or it may be encrypted with an unsupported "
                "algorithm."
            )

        elif (
            errors[0]._lib_reason_match(
                self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT
            )
            or errors[0]._lib_reason_match(
                self._lib.ERR_LIB_PKCS12,
                self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR,
            )
            or (
                self._lib.Cryptography_HAS_PROVIDERS
                and errors[0]._lib_reason_match(
                    self._lib.ERR_LIB_PROV,
                    self._lib.PROV_R_BAD_DECRYPT,
                )
            )
        ):
            raise ValueError("Bad decrypt. Incorrect password?")

        elif any(
            error._lib_reason_match(
                self._lib.ERR_LIB_EVP,
                self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM,
            )
            for error in errors
        ):
            raise ValueError("Unsupported public key algorithm.")

        else:
            errors_with_text = binding._errors_with_text(errors)
>           raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format, it may be encrypted with an unsupported "
                "algorithm, or it may be an unsupported key type (e.g. EC "
                "curves with explicit parameters).",
                errors_with_text,
            )
E           ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=503841036, lib=60, reason=524556, reason_text=b'error:1E08010C:DECODER routines::unsupported'), _OpenSSLErrorWithText(code=134217857, lib=16, reason=129, reason_text=b'error:08000081:elliptic curve routines::unknown group'), _OpenSSLErrorWithText(code=134217847, lib=16, reason=119, reason_text=b'error:08000077:elliptic curve routines::ec group new by name failure'), _OpenSSLErrorWithText(code=134742032, lib=16, reason=524304, reason_text=b'error:08080010:elliptic curve routines::EC lib'), _OpenSSLErrorWithText(code=109052072, lib=13, reason=168, reason_text=b'error:068000A8:asn1 encoding routines::wrong tag'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error')])

/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1248: ValueError
----------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------
Verifying 21696 bytes of data
Signature is valid
Signature block 0 is valid (RSA).
Signature block 0 verification successful using the supplied key (RSA).
Signature block 1 invalid. Skipping.
Signature block 2 invalid. Skipping.
Signature block 0 is valid (ECDSA).
Signature block 0 verification successful using the supplied key (ECDSA).
_______________________________________________________________________ TestSigning.test_verify_signature_public_key ________________________________________________________________________

self = <test_espsecure.TestSigning object at 0x7fcebe478310>

    def test_verify_signature_public_key(self):
        # correct key v1
        args = self.VerifyArgs(
            "1",
            False,
            None,
            self._open("ecdsa_secure_boot_signing_pubkey.pem"),
            self._open("bootloader_signed.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("rsa_secure_boot_signing_pubkey.pem"),
            self._open("bootloader_signed_v2.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2 (ecdsa256)
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("ecdsa_secure_boot_signing_pubkey.pem"),
            self._open("bootloader_signed_v2_ecdsa256.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2 (ecdsa192)
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("ecdsa192_secure_boot_signing_pubkey.pem"),
            self._open("bootloader_signed_v2_ecdsa192.bin"),
        )
>       espsecure.verify_signature(args)

test/test_espsecure.py:598:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:701: in verify_signature
    return verify_signature_v2(args)
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:787: in verify_signature_v2
    vk = _get_sbv2_pub_key(keyfile)
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:288: in _get_sbv2_pub_key
    vk = _load_sbv2_pub_key(key_data)
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:258: in _load_sbv2_pub_key
    vk = serialization.load_pem_public_key(keydata, backend=default_backend())
/usr/lib64/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py:30: in load_pem_public_key
    return ossl.load_pem_public_key(data)
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:968: in load_pem_public_key
    self._handle_key_loading_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <OpenSSLBackend(version: OpenSSL 3.0.5 5 Jul 2022, FIPS: False)>

    def _handle_key_loading_error(self) -> typing.NoReturn:
        errors = self._consume_errors()

        if not errors:
            raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format or it may be encrypted with an unsupported "
                "algorithm."
            )

        elif (
            errors[0]._lib_reason_match(
                self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT
            )
            or errors[0]._lib_reason_match(
                self._lib.ERR_LIB_PKCS12,
                self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR,
            )
            or (
                self._lib.Cryptography_HAS_PROVIDERS
                and errors[0]._lib_reason_match(
                    self._lib.ERR_LIB_PROV,
                    self._lib.PROV_R_BAD_DECRYPT,
                )
            )
        ):
            raise ValueError("Bad decrypt. Incorrect password?")

        elif any(
            error._lib_reason_match(
                self._lib.ERR_LIB_EVP,
                self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM,
            )
            for error in errors
        ):
            raise ValueError("Unsupported public key algorithm.")

        else:
            errors_with_text = binding._errors_with_text(errors)
>           raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format, it may be encrypted with an unsupported "
                "algorithm, or it may be an unsupported key type (e.g. EC "
                "curves with explicit parameters).",
                errors_with_text,
            )
E           ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=75497580, lib=9, reason=108, reason_text=b'error:0480006C:PEM routines::no start line')])

/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1248: ValueError
----------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------
Verifying 21696 bytes of data
Signature is valid
Signature block 0 is valid (RSA).
Signature block 0 verification successful using the supplied key (RSA).
Signature block 1 invalid. Skipping.
Signature block 2 invalid. Skipping.
Signature block 0 is valid (ECDSA).
Signature block 0 verification successful using the supplied key (ECDSA).
_______________________________________________________________________ TestSigning.test_generate_and_extract_key_v2 ________________________________________________________________________

self = <test_espsecure.TestSigning object at 0x7fcebe4784c0>

    def test_generate_and_extract_key_v2(self):
        with tempfile.TemporaryDirectory() as keydir:
            # keyfile cannot exist before generation -> tempfile.NamedTemporaryFile()
            # cannot be used for keyfile
            keyfile_name = os.path.join(keydir, "key.pem")

            # We need to manually delete the keyfile as we are iterating over
            # different schemes with the same keyfile so instead of using addCleanup,
            # we remove it using os.remove at the end of each pass
            for scheme in ["rsa3072", "ecdsa192", "ecdsa256"]:
                args = self.GenerateKeyArgs("2", scheme, keyfile_name)
                espsecure.generate_signing_key(args)

                with tempfile.NamedTemporaryFile() as pub_keyfile, open(
                    keyfile_name, "rb"
                ) as keyfile:
                    args = self.ExtractKeyArgs("2", keyfile, pub_keyfile)
>                   espsecure.extract_public_key(args)

test/test_espsecure.py:706:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:884: in extract_public_key
    sk = _load_sbv2_signing_key(args.keyfile.read())
../../BUILDROOT/esptool-4.5-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:231: in _load_sbv2_signing_key
    sk = serialization.load_pem_private_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py:22: in load_pem_private_key
    return ossl.load_pem_private_key(data, password)
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:921: in load_pem_private_key
    return self._load_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1189: in _load_key
    self._handle_key_loading_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <OpenSSLBackend(version: OpenSSL 3.0.5 5 Jul 2022, FIPS: False)>

    def _handle_key_loading_error(self) -> typing.NoReturn:
        errors = self._consume_errors()

        if not errors:
            raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format or it may be encrypted with an unsupported "
                "algorithm."
            )

        elif (
            errors[0]._lib_reason_match(
                self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT
            )
            or errors[0]._lib_reason_match(
                self._lib.ERR_LIB_PKCS12,
                self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR,
            )
            or (
                self._lib.Cryptography_HAS_PROVIDERS
                and errors[0]._lib_reason_match(
                    self._lib.ERR_LIB_PROV,
                    self._lib.PROV_R_BAD_DECRYPT,
                )
            )
        ):
            raise ValueError("Bad decrypt. Incorrect password?")

        elif any(
            error._lib_reason_match(
                self._lib.ERR_LIB_EVP,
                self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM,
            )
            for error in errors
        ):
            raise ValueError("Unsupported public key algorithm.")

        else:
            errors_with_text = binding._errors_with_text(errors)
>           raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format, it may be encrypted with an unsupported "
                "algorithm, or it may be an unsupported key type (e.g. EC "
                "curves with explicit parameters).",
                errors_with_text,
            )
E           ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=503841036, lib=60, reason=524556, reason_text=b'error:1E08010C:DECODER routines::unsupported'), _OpenSSLErrorWithText(code=134217857, lib=16, reason=129, reason_text=b'error:08000081:elliptic curve routines::unknown group'), _OpenSSLErrorWithText(code=134217847, lib=16, reason=119, reason_text=b'error:08000077:elliptic curve routines::ec group new by name failure'), _OpenSSLErrorWithText(code=134742032, lib=16, reason=524304, reason_text=b'error:08080010:elliptic curve routines::EC lib'), _OpenSSLErrorWithText(code=109052072, lib=13, reason=168, reason_text=b'error:068000A8:asn1 encoding routines::wrong tag'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error')])

/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1248: ValueError
----------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------
RSA 3072 private key in PEM format written to /tmp/tmp67fvg1eu/key.pem
/tmp/tmp67fvg1eu/key.pem public key extracted to /tmp/tmpxdwsqlxi
ECDSA NIST192p private key in PEM format written to /tmp/tmp67fvg1eu/key.pem
_______________________________________________________________________________ TestSigning.test_sign_v2_hsm ________________________________________________________________________________

self = <test_espsecure_hsm.TestSigning object at 0x7fcebe534370>

    def test_sign_v2_hsm(self):
        # Sign using SoftHSMv2 + Verify
>       self.softhsm_setup_token("softhsm_v2.ini", "softhsm-test-token")

test/test_espsecure_hsm.py:151:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <test_espsecure_hsm.TestSigning object at 0x7fcebe534370>, filename = 'softhsm_v2.ini', token_label = 'softhsm-test-token'

    def softhsm_setup_token(self, filename, token_label):
        self.pkcs11_lib = self.get_pkcs11lib()
        if self.pkcs11_lib is None:
            print("PKCS11 lib does not exist")
>           sys.exit(-1)
E           SystemExit: -1

test/test_espsecure_hsm.py:68: SystemExit
----------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------
PKCS11 lib does not exist
_______________________________________________________________ TestSigning.test_sign_v2_hsm_append_signatures_multiple_steps _______________________________________________________________

self = <test_espsecure_hsm.TestSigning object at 0x7fcebe5344c0>

    def test_sign_v2_hsm_append_signatures_multiple_steps(self):
        # Append signatures using HSM + Verify with an appended key
>       self.softhsm_setup_token("softhsm_v2_1.ini", "softhsm-test-token-1")

test/test_espsecure_hsm.py:177:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <test_espsecure_hsm.TestSigning object at 0x7fcebe5344c0>, filename = 'softhsm_v2_1.ini', token_label = 'softhsm-test-token-1'

    def softhsm_setup_token(self, filename, token_label):
        self.pkcs11_lib = self.get_pkcs11lib()
        if self.pkcs11_lib is None:
            print("PKCS11 lib does not exist")
>           sys.exit(-1)
E           SystemExit: -1

test/test_espsecure_hsm.py:68: SystemExit
----------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------
PKCS11 lib does not exist
_________________________________________________________________________ TestConfigFile.test_custom_reset_sequence _________________________________________________________________________

self = <test_esptool.TestConfigFile object at 0x7fcebe47b760>

    def test_custom_reset_sequence(self):
        # This reset sequence will fail to reset the chip to bootloader,
        # the flash_id operation should therefore fail.
        # Also tests the number of connection attempts.
        reset_seq_config = (
            "[esptool]\n"
            "custom_reset_sequence = D0|W0.1|R1|R0|W0.1|R1|R0\n"
            "connect_attempts = 1\n"
        )
        config_file_path = os.path.join(os.getcwd(), "esptool.cfg")
        with self.ConfigFile(config_file_path, reset_seq_config):
            output = self.run_esptool_error("flash_id")
            assert f"Loaded custom configuration from {config_file_path}" in output
>           assert "A fatal error occurred: Failed to connect to" in output
E           assert 'A fatal error occurred: Failed to connect to' in "esptool.py v4.5\nLoaded custom configuration from /home/tkloczko/rpmbuild/BUILD/esptool-4.5/test/esptool.cfg\nSerial port /dev/ttyUSB0\n\nA fatal error occurred: Could not open /dev/ttyUSB0, the port doesn't exist\n"

/home/tkloczko/rpmbuild/BUILD/esptool-4.5/test/test_esptool.py:1204: AssertionError
----------------------------------------------------------------------------------- Captured stdout call ------------------------------------------------------------------------------------

Running the "flash_id" command...
Executing /usr/bin/python3 -m esptool --chip esp32 --port /dev/ttyUSB0 --baud 115200 flash_id...
esptool.py v4.5
Loaded custom configuration from /home/tkloczko/rpmbuild/BUILD/esptool-4.5/test/esptool.cfg
Serial port /dev/ttyUSB0

A fatal error occurred: Could not open /dev/ttyUSB0, the port doesn't exist

===================================================================================== warnings summary ======================================================================================
test/test_esptool.py:123
  /home/tkloczko/rpmbuild/BUILD/esptool-4.5/test/test_esptool.py:123: PytestUnknownMarkWarning: Unknown pytest.mark.flaky - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    @pytest.mark.flaky(reruns=1, condition=arg_preload_port is not False)

test/test_esptool.py:982
  /home/tkloczko/rpmbuild/BUILD/esptool-4.5/test/test_esptool.py:982: PytestUnknownMarkWarning: Unknown pytest.mark.flaky - is this a typo?  You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
    @pytest.mark.flaky(reruns=5)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
================================================================================== short test summary info ==================================================================================
SKIPPED [1] test/test_espefuse.py:506: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:509: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:518: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:527: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:532: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:541: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:549: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:552: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:561: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:569: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:578: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:587: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:797: ESP32-C2-only
SKIPPED [1] test/test_espefuse.py:817: ESP32-C2-only
SKIPPED [1] test/test_espefuse.py:845: Only chips with 6 keys
SKIPPED [1] test/test_espefuse.py:930: 512 bit keys are only supported on ESP32-S2 and S3
SKIPPED [1] test/test_espefuse.py:948: 512 bit keys are only supported on ESP32-S2 and S3
SKIPPED [1] test/test_espefuse.py:988: 512 bit keys are only supported on ESP32-S2 and S3
SKIPPED [1] test/test_espefuse.py:1058: ESP32-C2-only
SKIPPED [1] test/test_espefuse.py:1075: Only chip with 6 keys
SKIPPED [1] test/test_espefuse.py:1186: ESP32-C2-only
SKIPPED [1] test/test_espefuse.py:1209: Only chips with 6 keys
SKIPPED [1] test/test_espefuse.py:1346: ESP32-C2-only, supports 1 key block
SKIPPED [1] test/test_espefuse.py:1358: ESP32-C2-only, supports 1 key block
SKIPPED [1] test/test_espefuse.py:1370: ESP32-C2-only, supports 1 key block
SKIPPED [1] test/test_espefuse.py:1382: ESP32-C2-only, supports 1 key block
SKIPPED [1] test/test_espefuse.py:1410: Supports 6 key blocks
SKIPPED [1] test/test_espefuse.py:1442: Supports 6 key blocks
SKIPPED [1] test/test_espefuse.py:1488: ESP32-C2-only
SKIPPED [1] test/test_espefuse.py:1507: Only chip with 6 keys
SKIPPED [1] test/test_espefuse.py:1728: For this chip, FE and SB keys go into one BLOCK
SKIPPED [1] test/test_espefuse.py:1744: For this chip, FE and SB keys go into one BLOCK
SKIPPED [1] test/test_esptool.py:394: needs 32MB flash
SKIPPED [1] test/test_esptool.py:408: needs 32MB flash
SKIPPED [1] test/test_esptool.py:551: This check happens only on a valid image
SKIPPED [1] test/test_esptool.py:565: This check happens only on a valid image
SKIPPED [1] test/test_esptool.py:590: get_security_info command is supported on ESP32S2 and later
SKIPPED [1] test/test_esptool.py:702: ESP8266 only
SKIPPED [1] test/test_esptool.py:787: ESP8266 only
SKIPPED [1] test/test_esptool.py:910: ESP8266 only
SKIPPED [1] test/test_esptool.py:1090: Make image option is supported only on ESP8266
FAILED test/test_espsecure.py::TestSigning::test_sign_v2_data - ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC c...
FAILED test/test_espsecure.py::TestSigning::test_sign_v2_with_pre_calculated_signature - ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC c...
FAILED test/test_espsecure.py::TestSigning::test_verify_signature_signing_key - ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC c...
FAILED test/test_espsecure.py::TestSigning::test_verify_signature_public_key - ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC c...
FAILED test/test_espsecure.py::TestSigning::test_generate_and_extract_key_v2 - ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC c...
FAILED test/test_espsecure_hsm.py::TestSigning::test_sign_v2_hsm - SystemExit: -1
FAILED test/test_espsecure_hsm.py::TestSigning::test_sign_v2_hsm_append_signatures_multiple_steps - SystemExit: -1
FAILED test/test_esptool.py::TestConfigFile::test_custom_reset_sequence - assert 'A fatal error occurred: Failed to connect to' in "esptool.py v4.5\nLoaded custom configuration from /home/tkloczko/rpmbuild/BUILD/esptool-4.5/test/esptool.cfg\nSerial port /dev...
====================================================== 8 failed, 107 passed, 41 skipped, 61 deselected, 2 warnings in 95.33s (0:01:35) ======================================================```
</details>

Here is list of installed modules in build env
<details>

```console
Package            Version
------------------ --------------
appdirs            1.4.4
asn1crypto         1.5.1
attrs              22.2.0
bitstring          4.0.1
build              0.9.0
cached-property    1.5.2
cffi               1.15.1
cryptography       38.0.4
cssselect          1.1.0
distro             1.8.0
ecdsa              0.18.0
exceptiongroup     1.0.0
extras             1.0.0
fixtures           4.0.0
gpg                1.18.0-unknown
importlib-metadata 6.0.0
iniconfig          2.0.0
Jinja2             3.1.2
libcomps           0.1.19
lxml               4.9.2
Markdown           3.4.1
MarkupSafe         2.1.2
numpy              1.24.2
olefile            0.46
packaging          23.0
pbr                5.9.0
pep517             0.13.0
Pillow             9.4.0
pip                22.3.1
pluggy             1.0.0
ply                3.11
pycparser          2.21
pyelftools         0.28
Pygments           2.14.0
PyGObject          3.43.1.dev0
pyserial           3.5
pytest             7.2.1
python-dateutil    2.8.2
python-pkcs11      0.7.0
reedsolo           1.6.1
rpm                4.17.0
scour              0.38.2
setuptools         65.6.3
six                1.16.0
smartypants        2.0.1
testtools          2.5.0
toml               0.10.2
tomli              2.0.1
typogrify          2.0.7
wheel              0.38.4
zipp               3.13.0

Other Steps to Reproduce

N/A

@kloczek kloczek added the bug label Feb 13, 2023
@github-actions github-actions bot changed the title 4.5: pytest is failing in few units 4.5: pytest is failing in few units (ESPTOOL-616) Feb 13, 2023
@radimkarnis
Copy link
Collaborator

radimkarnis commented Feb 13, 2023

Hello @kloczek,
with every release of esptool you open the same issue ticket and I tell you the same thing - test_esptool.py is meant to run on real hardware. You need to add it to the ignore list. Possibly you can just deselect the TestConfigFile::test_custom_reset_sequence test.

The new test_espsecure_hsm.py needs some additional initialization steps to run. See here. Either you can do these or also add it to the ignore list.

test_espsecure.py should work. Please make sure you have the right dependencies installed (e.g. cryptography) according to these instructions.

@kloczek
Copy link
Author

kloczek commented Feb 13, 2023

Please have look one more time on what I'm reporing.
As I wtote I've --deselected all units which requires actual hardware to test and not all test/test_espsecure.py units are failing.The same is with test/test_esptool.py

Other thing that in case all units which requires hardware it would be good to add pytest mark like @pytest.mark.ttyUSB0 mark to allow easily ommit those units which requires actual hardware by executing `pytest -m "not ttyUSB0"'
https://docs.pytest.org/en/7.1.x/how-to/mark.html

The new test_espsecure_hsm.py needs some additional initialization steps to run. See here. Either you can do these or also add it to the ignore list.

OK. Thx 👍
Will try to adapt that to my build&testing procedure 😄

@tom-borcin tom-borcin added Type: Bug and removed bug labels Feb 13, 2023
@radimkarnis
Copy link
Collaborator

As I said:

  • TestConfigFile::test_custom_reset_sequence needs to be deselected too, it depends on real HW
  • test/test_espsecure.py should work. Here is an example of a successful run - this doesn't require hardware. Please check your installation, it seems like the errors originate from the cryptography package.

it would be good to add pytest mark like @pytest.mark.ttyUSB0 mark to allow easily ommit those units which requires actual hardware

This is a good idea. Thanks for the suggestion!

@radimkarnis
Copy link
Collaborator

Hi @kloczek,
you should now be able to run the whole test suite simply as pytest -m host_test, as described here.
This runs all of the tests without the need for real hardware or installation of additional prerequisites.

This will be included in the next release.

@kloczek
Copy link
Author

kloczek commented Mar 1, 2023

Just tested 4.5.1 and on first lok looks like it is something wrong around use flaky
Here is pytest output:

+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra -m 'not network' -m 'not host_test'
============================= test session starts ==============================
platform linux -- Python 3.8.16, pytest-7.2.1, pluggy-1.0.0
rootdir: /home/tkloczko/rpmbuild/BUILD/esptool-4.5.1
plugins: flaky-3.7.0
collected 217 items / 144 deselected / 73 selected

test/test_espsecure_hsm.py FF                                            [  2%]
test/test_esptool.py EEEEEEEssEEEEEEEEEEEEEEEssEsEEEEEEEEEEEsEEEEEEEEEEs [ 72%]
EEEEEEEsEEEEEEEEEEsE                                                     [100%]

==================================== ERRORS ====================================
__ ERROR at setup of TestFlashEncryption.test_blank_efuse_encrypt_write_abort __

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_blank_efuse_encrypt_write_abort>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_ ERROR at setup of TestFlashEncryption.test_blank_efuse_encrypt_write_continue1 _

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_blank_efuse_encrypt_write_continue1>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_ ERROR at setup of TestFlashEncryption.test_blank_efuse_encrypt_write_continue2 _

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_blank_efuse_encrypt_write_continue2>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_______________ ERROR at setup of TestFlashing.test_short_flash ________________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_short_flash>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_____________ ERROR at setup of TestFlashing.test_highspeed_flash ______________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_highspeed_flash>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______________ ERROR at setup of TestFlashing.test_adjacent_flash ______________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_adjacent_flash>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
________ ERROR at setup of TestFlashing.test_adjacent_independent_flash ________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_adjacent_independent_flash>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______________ ERROR at setup of TestFlashing.test_correct_offset ______________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_correct_offset>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
___________ ERROR at setup of TestFlashing.test_no_compression_flash ___________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_no_compression_flash>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_________ ERROR at setup of TestFlashing.test_compressed_nostub_flash __________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_compressed_nostub_flash>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_____ ERROR at setup of TestFlashing.test_partition_table_then_bootloader ______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_partition_table_then_bootloader>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_ ERROR at setup of TestFlashing.test_partition_table_then_bootloader_no_compression _

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_partition_table_then_bootloader_no_compression>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
__ ERROR at setup of TestFlashing.test_partition_table_then_bootloader_nostub __

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_partition_table_then_bootloader_nostub>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
________ ERROR at setup of TestFlashing.test_length_not_aligned_4bytes _________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_length_not_aligned_4bytes>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_ ERROR at setup of TestFlashing.test_length_not_aligned_4bytes_no_compression _

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_length_not_aligned_4bytes_no_compression>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_____________ ERROR at setup of TestFlashing.test_write_no_overlap _____________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_write_no_overlap>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
____________ ERROR at setup of TestFlashing.test_compressible_file _____________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_compressible_file>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______ ERROR at setup of TestFlashing.test_compressible_non_trivial_file _______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_compressible_non_trivial_file>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_______________ ERROR at setup of TestFlashing.test_zero_length ________________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_zero_length>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_______________ ERROR at setup of TestFlashing.test_single_byte ________________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_single_byte>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
___________ ERROR at setup of TestFlashing.test_erase_range_messages ___________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_erase_range_messages>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______ ERROR at setup of TestFlashing.test_write_image_for_another_target ______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_write_image_for_another_target>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
____________ ERROR at setup of TestFlashing.test_erase_before_write ____________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_erase_before_write>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______________ ERROR at setup of TestFlashSizes.test_high_offset _______________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_high_offset>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_______ ERROR at setup of TestFlashSizes.test_high_offset_no_compression _______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_high_offset_no_compression>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______________ ERROR at setup of TestFlashSizes.test_large_image _______________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_large_image>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
__________ ERROR at setup of TestFlashSizes.test_large_no_compression __________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_large_no_compression>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
__________ ERROR at setup of TestFlashSizes.test_write_past_end_fails __________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_write_past_end_fails>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
__ ERROR at setup of TestFlashSizes.test_write_no_compression_past_end_fails ___

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_write_no_compression_past_end_fails>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
____________ ERROR at setup of TestFlashSizes.test_flash_size_keep _____________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_flash_size_keep>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______________ ERROR at setup of TestFlashDetection.test_flash_id ______________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_flash_id>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
________ ERROR at setup of TestFlashDetection.test_flash_id_expand_args ________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_flash_id_expand_args>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
___________ ERROR at setup of TestFlashDetection.test_flash_id_trace ___________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_flash_id_trace>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_____ ERROR at setup of TestStubReuse.test_stub_reuse_with_synchronization _____

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_stub_reuse_with_synchronization>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_________________ ERROR at setup of TestErase.test_chip_erase __________________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_chip_erase>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
________________ ERROR at setup of TestErase.test_region_erase _________________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_region_erase>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_____________ ERROR at setup of TestErase.test_large_region_erase ______________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_large_region_erase>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
____________ ERROR at setup of TestSectorBoundaries.test_end_sector ____________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_end_sector>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_____ ERROR at setup of TestSectorBoundaries.test_end_sector_uncompressed ______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_end_sector_uncompressed>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_____________ ERROR at setup of TestSectorBoundaries.test_overlap ______________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_overlap>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
___________ ERROR at setup of TestVerifyCommand.test_verify_success ____________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_verify_success>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
___________ ERROR at setup of TestVerifyCommand.test_verify_failure ____________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_verify_failure>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_______ ERROR at setup of TestVerifyCommand.test_verify_unaligned_length _______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_verify_unaligned_length>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
____________ ERROR at setup of TestReadIdentityValues.test_read_mac ____________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_read_mac>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
___________ ERROR at setup of TestMemoryOperations.test_memory_dump ____________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_memory_dump>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
___________ ERROR at setup of TestMemoryOperations.test_memory_write ___________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_memory_write>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
___________ ERROR at setup of TestMemoryOperations.test_memory_read ____________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_memory_read>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
__ ERROR at setup of TestKeepImageSettings.test_keep_does_not_change_settings __

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_keep_does_not_change_settings>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
____ ERROR at setup of TestKeepImageSettings.test_detect_size_changes_size _____

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_detect_size_changes_size>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
___ ERROR at setup of TestKeepImageSettings.test_explicit_set_size_freq_mode ___

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_explicit_set_size_freq_mode>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_________________ ERROR at setup of TestLoadRAM.test_load_ram __________________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_load_ram>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_ ERROR at setup of TestBootloaderHeaderRewriteCases.test_flash_header_rewrite _

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_flash_header_rewrite>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_ ERROR at setup of TestBootloaderHeaderRewriteCases.test_flash_header_no_magic_no_rewrite _

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_flash_header_no_magic_no_rewrite>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______________ ERROR at setup of TestAutoDetect.test_auto_detect _______________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_auto_detect>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______________ ERROR at setup of TestVirtualPort.test_auto_detect ______________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_auto_detect>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_______ ERROR at setup of TestVirtualPort.test_auto_detect_virtual_port ________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_auto_detect_virtual_port>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_____ ERROR at setup of TestVirtualPort.test_highspeed_flash_virtual_port ______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_highspeed_flash_virtual_port>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_______ ERROR at setup of TestReadWriteMemory.test_read_write_memory_rom _______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_read_write_memory_rom>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______ ERROR at setup of TestReadWriteMemory.test_read_write_memory_stub _______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_read_write_memory_stub>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
______ ERROR at setup of TestReadWriteMemory.test_read_write_flash_status ______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_read_write_flash_status>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_______ ERROR at setup of TestReadWriteMemory.test_read_chip_description _______

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_read_chip_description>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
_________ ERROR at setup of TestConfigFile.test_custom_reset_sequence __________

self = <flaky.flaky_pytest_plugin.FlakyPlugin object at 0x7f4585639130>
item = <Function test_custom_reset_sequence>

    def pytest_runtest_setup(self, item):
        """
        Pytest hook to modify the test before it's run.

        :param item:
            The test item.
        """
        if not self._has_flaky_attributes(item):
            if hasattr(item, 'iter_markers'):
                for marker in item.iter_markers(name='flaky'):
>                   self._make_test_flaky(item, *marker.args, **marker.kwargs)
E                   TypeError: _make_test_flaky() got an unexpected keyword argument 'reruns'

/usr/lib/python3.8/site-packages/flaky/flaky_pytest_plugin.py:239: TypeError
=================================== FAILURES ===================================
_________________________ TestSigning.test_sign_v2_hsm _________________________

self = <test_espsecure_hsm.TestSigning object at 0x7f4584d665e0>

    def test_sign_v2_hsm(self):
        # Sign using SoftHSMv2 + Verify
>       self.softhsm_setup_token("softhsm_v2.ini", "softhsm-test-token")

test/test_espsecure_hsm.py:151:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <test_espsecure_hsm.TestSigning object at 0x7f4584d665e0>
filename = 'softhsm_v2.ini', token_label = 'softhsm-test-token'

    def softhsm_setup_token(self, filename, token_label):
        self.pkcs11_lib = self.get_pkcs11lib()
        if self.pkcs11_lib is None:
            print("PKCS11 lib does not exist")
>           sys.exit(-1)
E           SystemExit: -1

test/test_espsecure_hsm.py:68: SystemExit
----------------------------- Captured stdout call -----------------------------
PKCS11 lib does not exist
________ TestSigning.test_sign_v2_hsm_append_signatures_multiple_steps _________

self = <test_espsecure_hsm.TestSigning object at 0x7f4584d66730>

    def test_sign_v2_hsm_append_signatures_multiple_steps(self):
        # Append signatures using HSM + Verify with an appended key
>       self.softhsm_setup_token("softhsm_v2_1.ini", "softhsm-test-token-1")

test/test_espsecure_hsm.py:177:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <test_espsecure_hsm.TestSigning object at 0x7f4584d66730>
filename = 'softhsm_v2_1.ini', token_label = 'softhsm-test-token-1'

    def softhsm_setup_token(self, filename, token_label):
        self.pkcs11_lib = self.get_pkcs11lib()
        if self.pkcs11_lib is None:
            print("PKCS11 lib does not exist")
>           sys.exit(-1)
E           SystemExit: -1

test/test_espsecure_hsm.py:68: SystemExit
----------------------------- Captured stdout call -----------------------------
PKCS11 lib does not exist
=========================== short test summary info ============================
SKIPPED [1] test/test_esptool.py:390: needs 32MB flash
SKIPPED [1] test/test_esptool.py:404: needs 32MB flash
SKIPPED [1] test/test_esptool.py:550: This check happens only on a valid image
SKIPPED [1] test/test_esptool.py:564: This check happens only on a valid image
SKIPPED [1] test/test_esptool.py:589: get_security_info command is supported on ESP32S2 and later
SKIPPED [1] test/test_esptool.py:706: ESP8266 only
SKIPPED [1] test/test_esptool.py:791: ESP8266 only
SKIPPED [1] test/test_esptool.py:922: ESP8266 only
SKIPPED [1] test/test_esptool.py:1097: Make image option is supported only on ESP8266
ERROR test/test_esptool.py::TestFlashEncryption::test_blank_efuse_encrypt_write_abort
ERROR test/test_esptool.py::TestFlashEncryption::test_blank_efuse_encrypt_write_continue1
ERROR test/test_esptool.py::TestFlashEncryption::test_blank_efuse_encrypt_write_continue2
ERROR test/test_esptool.py::TestFlashing::test_short_flash - TypeError: _make...
ERROR test/test_esptool.py::TestFlashing::test_highspeed_flash - TypeError: _...
ERROR test/test_esptool.py::TestFlashing::test_adjacent_flash - TypeError: _m...
ERROR test/test_esptool.py::TestFlashing::test_adjacent_independent_flash - T...
ERROR test/test_esptool.py::TestFlashing::test_correct_offset - TypeError: _m...
ERROR test/test_esptool.py::TestFlashing::test_no_compression_flash - TypeErr...
ERROR test/test_esptool.py::TestFlashing::test_compressed_nostub_flash - Type...
ERROR test/test_esptool.py::TestFlashing::test_partition_table_then_bootloader
ERROR test/test_esptool.py::TestFlashing::test_partition_table_then_bootloader_no_compression
ERROR test/test_esptool.py::TestFlashing::test_partition_table_then_bootloader_nostub
ERROR test/test_esptool.py::TestFlashing::test_length_not_aligned_4bytes - Ty...
ERROR test/test_esptool.py::TestFlashing::test_length_not_aligned_4bytes_no_compression
ERROR test/test_esptool.py::TestFlashing::test_write_no_overlap - TypeError: ...
ERROR test/test_esptool.py::TestFlashing::test_compressible_file - TypeError:...
ERROR test/test_esptool.py::TestFlashing::test_compressible_non_trivial_file
ERROR test/test_esptool.py::TestFlashing::test_zero_length - TypeError: _make...
ERROR test/test_esptool.py::TestFlashing::test_single_byte - TypeError: _make...
ERROR test/test_esptool.py::TestFlashing::test_erase_range_messages - TypeErr...
ERROR test/test_esptool.py::TestFlashing::test_write_image_for_another_target
ERROR test/test_esptool.py::TestFlashing::test_erase_before_write - TypeError...
ERROR test/test_esptool.py::TestFlashSizes::test_high_offset - TypeError: _ma...
ERROR test/test_esptool.py::TestFlashSizes::test_high_offset_no_compression
ERROR test/test_esptool.py::TestFlashSizes::test_large_image - TypeError: _ma...
ERROR test/test_esptool.py::TestFlashSizes::test_large_no_compression - TypeE...
ERROR test/test_esptool.py::TestFlashSizes::test_write_past_end_fails - TypeE...
ERROR test/test_esptool.py::TestFlashSizes::test_write_no_compression_past_end_fails
ERROR test/test_esptool.py::TestFlashSizes::test_flash_size_keep - TypeError:...
ERROR test/test_esptool.py::TestFlashDetection::test_flash_id - TypeError: _m...
ERROR test/test_esptool.py::TestFlashDetection::test_flash_id_expand_args - T...
ERROR test/test_esptool.py::TestFlashDetection::test_flash_id_trace - TypeErr...
ERROR test/test_esptool.py::TestStubReuse::test_stub_reuse_with_synchronization
ERROR test/test_esptool.py::TestErase::test_chip_erase - TypeError: _make_tes...
ERROR test/test_esptool.py::TestErase::test_region_erase - TypeError: _make_t...
ERROR test/test_esptool.py::TestErase::test_large_region_erase - TypeError: _...
ERROR test/test_esptool.py::TestSectorBoundaries::test_end_sector - TypeError...
ERROR test/test_esptool.py::TestSectorBoundaries::test_end_sector_uncompressed
ERROR test/test_esptool.py::TestSectorBoundaries::test_overlap - TypeError: _...
ERROR test/test_esptool.py::TestVerifyCommand::test_verify_success - TypeErro...
ERROR test/test_esptool.py::TestVerifyCommand::test_verify_failure - TypeErro...
ERROR test/test_esptool.py::TestVerifyCommand::test_verify_unaligned_length
ERROR test/test_esptool.py::TestReadIdentityValues::test_read_mac - TypeError...
ERROR test/test_esptool.py::TestMemoryOperations::test_memory_dump - TypeErro...
ERROR test/test_esptool.py::TestMemoryOperations::test_memory_write - TypeErr...
ERROR test/test_esptool.py::TestMemoryOperations::test_memory_read - TypeErro...
ERROR test/test_esptool.py::TestKeepImageSettings::test_keep_does_not_change_settings
ERROR test/test_esptool.py::TestKeepImageSettings::test_detect_size_changes_size
ERROR test/test_esptool.py::TestKeepImageSettings::test_explicit_set_size_freq_mode
ERROR test/test_esptool.py::TestLoadRAM::test_load_ram - TypeError: _make_tes...
ERROR test/test_esptool.py::TestBootloaderHeaderRewriteCases::test_flash_header_rewrite
ERROR test/test_esptool.py::TestBootloaderHeaderRewriteCases::test_flash_header_no_magic_no_rewrite
ERROR test/test_esptool.py::TestAutoDetect::test_auto_detect - TypeError: _ma...
ERROR test/test_esptool.py::TestVirtualPort::test_auto_detect - TypeError: _m...
ERROR test/test_esptool.py::TestVirtualPort::test_auto_detect_virtual_port - ...
ERROR test/test_esptool.py::TestVirtualPort::test_highspeed_flash_virtual_port
ERROR test/test_esptool.py::TestReadWriteMemory::test_read_write_memory_rom
ERROR test/test_esptool.py::TestReadWriteMemory::test_read_write_memory_stub
ERROR test/test_esptool.py::TestReadWriteMemory::test_read_write_flash_status
ERROR test/test_esptool.py::TestReadWriteMemory::test_read_chip_description
ERROR test/test_esptool.py::TestConfigFile::test_custom_reset_sequence - Type...
FAILED test/test_espsecure_hsm.py::TestSigning::test_sign_v2_hsm - SystemExit...
FAILED test/test_espsecure_hsm.py::TestSigning::test_sign_v2_hsm_append_signatures_multiple_steps
=========== 2 failed, 9 skipped, 144 deselected, 62 errors in 0.95s ============

I'm using flaky 3.7.0.

@radimkarnis
Copy link
Collaborator

radimkarnis commented Mar 1, 2023

Hello,

  1. we don't use flaky in the esptool repo at all, but pytest-rerunfailures
  2. I see you run the tests as-m 'not host_test' - while the host_test marker is supposed to be used as -m host_test.

@kloczek
Copy link
Author

kloczek commented Mar 2, 2023

OK I've added pytest-rerunfailures to build and and pytest is executed with -m host_test and still something is wrong ..

+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra -m 'not network' -m host_test
============================= test session starts ==============================
platform linux -- Python 3.8.16, pytest-7.2.1, pluggy-1.0.0
rootdir: /home/tkloczko/rpmbuild/BUILD/esptool-4.5.1
plugins: rerunfailures-11.0
collected 217 items / 73 deselected / 144 selected

test/test_espefuse.py .......................ssssssssssss......sss.sss.. [ 34%]
ss..ss.....ssssss.ss........ss..                                         [ 56%]
test/test_espsecure.py .......F...F.FF.F.........                        [ 75%]
test/test_esptool.py ......                                              [ 79%]
test/test_image_info.py .......                                          [ 84%]
test/test_imagegen.py ..............                                     [ 93%]
test/test_merge_bin.py ........                                          [ 99%]
test/test_modules.py .                                                   [100%]

=================================== FAILURES ===================================
________________________ TestSigning.test_sign_v2_data _________________________

self = <test_espsecure.TestSigning object at 0x7fa44fe3eac0>

    def test_sign_v2_data(self):
        signing_keys = [
            "rsa_secure_boot_signing_key.pem",
            "ecdsa192_secure_boot_signing_key.pem",
            "ecdsa_secure_boot_signing_key.pem",
        ]
        for key in signing_keys:
            with tempfile.NamedTemporaryFile() as output_file:
                args = self.SignArgs(
                    "2",
                    [self._open(key)],
                    output_file.name,
                    False,
                    False,
                    None,
                    None,
                    None,
                    self._open("bootloader_unsigned_v2.bin"),
                )
>               espsecure.sign_data(args)

test/test_espsecure.py:223:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:331: in sign_data
    return sign_secure_boot_v2(args)
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:490: in sign_secure_boot_v2
    signature_block = generate_signature_block_using_private_key(
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:604: in generate_signature_block_using_private_key
    private_key = _load_sbv2_signing_key(keyfile.read())
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:231: in _load_sbv2_signing_key
    sk = serialization.load_pem_private_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py:22: in load_pem_private_key
    return ossl.load_pem_private_key(data, password)
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:921: in load_pem_private_key
    return self._load_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1189: in _load_key
    self._handle_key_loading_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <OpenSSLBackend(version: OpenSSL 3.0.5 5 Jul 2022, FIPS: False)>

    def _handle_key_loading_error(self) -> typing.NoReturn:
        errors = self._consume_errors()

        if not errors:
            raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format or it may be encrypted with an unsupported "
                "algorithm."
            )

        elif (
            errors[0]._lib_reason_match(
                self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT
            )
            or errors[0]._lib_reason_match(
                self._lib.ERR_LIB_PKCS12,
                self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR,
            )
            or (
                self._lib.Cryptography_HAS_PROVIDERS
                and errors[0]._lib_reason_match(
                    self._lib.ERR_LIB_PROV,
                    self._lib.PROV_R_BAD_DECRYPT,
                )
            )
        ):
            raise ValueError("Bad decrypt. Incorrect password?")

        elif any(
            error._lib_reason_match(
                self._lib.ERR_LIB_EVP,
                self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM,
            )
            for error in errors
        ):
            raise ValueError("Unsupported public key algorithm.")

        else:
            errors_with_text = binding._errors_with_text(errors)
>           raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format, it may be encrypted with an unsupported "
                "algorithm, or it may be an unsupported key type (e.g. EC "
                "curves with explicit parameters).",
                errors_with_text,
            )
E           ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=503841036, lib=60, reason=524556, reason_text=b'error:1E08010C:DECODER routines::unsupported'), _OpenSSLErrorWithText(code=134217857, lib=16, reason=129, reason_text=b'error:08000081:elliptic curve routines::unknown group'), _OpenSSLErrorWithText(code=134217847, lib=16, reason=119, reason_text=b'error:08000077:elliptic curve routines::ec group new by name failure'), _OpenSSLErrorWithText(code=134742032, lib=16, reason=524304, reason_text=b'error:08080010:elliptic curve routines::EC lib'), _OpenSSLErrorWithText(code=109052072, lib=13, reason=168, reason_text=b'error:068000A8:asn1 encoding routines::wrong tag'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error')])

/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1248: ValueError
----------------------------- Captured stdout call -----------------------------
1 signing key(s) found.
Signed 32768 bytes of data from /home/tkloczko/rpmbuild/BUILD/esptool-4.5.1/test/secure_images/bootloader_unsigned_v2.bin. Signature sector now has 1 signature blocks.
Signature block 0 is valid (RSA).
Signature block 0 verification successful using the supplied key (RSA).
Signature block 1 invalid. Skipping.
Signature block 2 invalid. Skipping.
1 signing key(s) found.
____________ TestSigning.test_sign_v2_with_pre_calculated_signature ____________

self = <test_espsecure.TestSigning object at 0x7fa44fe42c70>

    def test_sign_v2_with_pre_calculated_signature(self):
        # Sign using pre-calculated signature + Verify
        signing_keys = [
            "rsa_secure_boot_signing_pubkey.pem",
            "ecdsa192_secure_boot_signing_pubkey.pem",
            "ecdsa_secure_boot_signing_pubkey.pem",
        ]
        pre_calculated_signatures = [
            "pre_calculated_bootloader_signature_rsa.bin",
            "pre_calculated_bootloader_signature_ecdsa192.bin",
            "pre_calculated_bootloader_signature_ecdsa256.bin",
        ]
        for pub_key, signature in zip(signing_keys, pre_calculated_signatures):
            with tempfile.NamedTemporaryFile() as output_file:
                args = self.SignArgs(
                    "2",
                    None,
                    output_file.name,
                    False,
                    False,
                    None,
                    [self._open(pub_key)],
                    [self._open(signature)],
                    self._open("bootloader_unsigned_v2.bin"),
                )
>               espsecure.sign_data(args)

test/test_espsecure.py:409:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:331: in sign_data
    return sign_secure_boot_v2(args)
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:485: in sign_secure_boot_v2
    signature_block = generate_signature_block_using_pre_calculated_signature(
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:546: in generate_signature_block_using_pre_calculated_signature
    public_key = _get_sbv2_pub_key(pk)
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:288: in _get_sbv2_pub_key
    vk = _load_sbv2_pub_key(key_data)
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:258: in _load_sbv2_pub_key
    vk = serialization.load_pem_public_key(keydata, backend=default_backend())
/usr/lib64/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py:30: in load_pem_public_key
    return ossl.load_pem_public_key(data)
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:968: in load_pem_public_key
    self._handle_key_loading_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <OpenSSLBackend(version: OpenSSL 3.0.5 5 Jul 2022, FIPS: False)>

    def _handle_key_loading_error(self) -> typing.NoReturn:
        errors = self._consume_errors()

        if not errors:
            raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format or it may be encrypted with an unsupported "
                "algorithm."
            )

        elif (
            errors[0]._lib_reason_match(
                self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT
            )
            or errors[0]._lib_reason_match(
                self._lib.ERR_LIB_PKCS12,
                self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR,
            )
            or (
                self._lib.Cryptography_HAS_PROVIDERS
                and errors[0]._lib_reason_match(
                    self._lib.ERR_LIB_PROV,
                    self._lib.PROV_R_BAD_DECRYPT,
                )
            )
        ):
            raise ValueError("Bad decrypt. Incorrect password?")

        elif any(
            error._lib_reason_match(
                self._lib.ERR_LIB_EVP,
                self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM,
            )
            for error in errors
        ):
            raise ValueError("Unsupported public key algorithm.")

        else:
            errors_with_text = binding._errors_with_text(errors)
>           raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format, it may be encrypted with an unsupported "
                "algorithm, or it may be an unsupported key type (e.g. EC "
                "curves with explicit parameters).",
                errors_with_text,
            )
E           ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=75497580, lib=9, reason=108, reason_text=b'error:0480006C:PEM routines::no start line')])

/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1248: ValueError
----------------------------- Captured stdout call -----------------------------
Pre-calculated signatures found
1 signing key(s) found.
Signed 32768 bytes of data from /home/tkloczko/rpmbuild/BUILD/esptool-4.5.1/test/secure_images/bootloader_unsigned_v2.bin. Signature sector now has 1 signature blocks.
Signature block 0 is valid (RSA).
Signature block 0 verification successful using the supplied key (RSA).
Signature block 1 invalid. Skipping.
Signature block 2 invalid. Skipping.
Pre-calculated signatures found
1 signing key(s) found.
________________ TestSigning.test_verify_signature_signing_key _________________

self = <test_espsecure.TestSigning object at 0x7fa44fe3e850>

    def test_verify_signature_signing_key(self):
        # correct key v1
        args = self.VerifyArgs(
            "1",
            False,
            None,
            self._open("ecdsa_secure_boot_signing_key.pem"),
            self._open("bootloader_signed.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("rsa_secure_boot_signing_key.pem"),
            self._open("bootloader_signed_v2.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2 (ecdsa256)
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("ecdsa_secure_boot_signing_key.pem"),
            self._open("bootloader_signed_v2_ecdsa256.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2 (ecdsa192)
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("ecdsa192_secure_boot_signing_key.pem"),
            self._open("bootloader_signed_v2_ecdsa192.bin"),
        )
>       espsecure.verify_signature(args)

test/test_espsecure.py:486:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:701: in verify_signature
    return verify_signature_v2(args)
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:787: in verify_signature_v2
    vk = _get_sbv2_pub_key(keyfile)
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:286: in _get_sbv2_pub_key
    return _load_sbv2_signing_key(key_data).public_key()
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:231: in _load_sbv2_signing_key
    sk = serialization.load_pem_private_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py:22: in load_pem_private_key
    return ossl.load_pem_private_key(data, password)
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:921: in load_pem_private_key
    return self._load_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1189: in _load_key
    self._handle_key_loading_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <OpenSSLBackend(version: OpenSSL 3.0.5 5 Jul 2022, FIPS: False)>

    def _handle_key_loading_error(self) -> typing.NoReturn:
        errors = self._consume_errors()

        if not errors:
            raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format or it may be encrypted with an unsupported "
                "algorithm."
            )

        elif (
            errors[0]._lib_reason_match(
                self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT
            )
            or errors[0]._lib_reason_match(
                self._lib.ERR_LIB_PKCS12,
                self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR,
            )
            or (
                self._lib.Cryptography_HAS_PROVIDERS
                and errors[0]._lib_reason_match(
                    self._lib.ERR_LIB_PROV,
                    self._lib.PROV_R_BAD_DECRYPT,
                )
            )
        ):
            raise ValueError("Bad decrypt. Incorrect password?")

        elif any(
            error._lib_reason_match(
                self._lib.ERR_LIB_EVP,
                self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM,
            )
            for error in errors
        ):
            raise ValueError("Unsupported public key algorithm.")

        else:
            errors_with_text = binding._errors_with_text(errors)
>           raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format, it may be encrypted with an unsupported "
                "algorithm, or it may be an unsupported key type (e.g. EC "
                "curves with explicit parameters).",
                errors_with_text,
            )
E           ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=503841036, lib=60, reason=524556, reason_text=b'error:1E08010C:DECODER routines::unsupported'), _OpenSSLErrorWithText(code=134217857, lib=16, reason=129, reason_text=b'error:08000081:elliptic curve routines::unknown group'), _OpenSSLErrorWithText(code=134217847, lib=16, reason=119, reason_text=b'error:08000077:elliptic curve routines::ec group new by name failure'), _OpenSSLErrorWithText(code=134742032, lib=16, reason=524304, reason_text=b'error:08080010:elliptic curve routines::EC lib'), _OpenSSLErrorWithText(code=109052072, lib=13, reason=168, reason_text=b'error:068000A8:asn1 encoding routines::wrong tag'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error')])

/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1248: ValueError
----------------------------- Captured stdout call -----------------------------
Verifying 21696 bytes of data
Signature is valid
Signature block 0 is valid (RSA).
Signature block 0 verification successful using the supplied key (RSA).
Signature block 1 invalid. Skipping.
Signature block 2 invalid. Skipping.
Signature block 0 is valid (ECDSA).
Signature block 0 verification successful using the supplied key (ECDSA).
_________________ TestSigning.test_verify_signature_public_key _________________

self = <test_espsecure.TestSigning object at 0x7fa44fe3efd0>

    def test_verify_signature_public_key(self):
        # correct key v1
        args = self.VerifyArgs(
            "1",
            False,
            None,
            self._open("ecdsa_secure_boot_signing_pubkey.pem"),
            self._open("bootloader_signed.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("rsa_secure_boot_signing_pubkey.pem"),
            self._open("bootloader_signed_v2.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2 (ecdsa256)
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("ecdsa_secure_boot_signing_pubkey.pem"),
            self._open("bootloader_signed_v2_ecdsa256.bin"),
        )
        espsecure.verify_signature(args)

        # correct key v2 (ecdsa192)
        args = self.VerifyArgs(
            "2",
            False,
            None,
            self._open("ecdsa192_secure_boot_signing_pubkey.pem"),
            self._open("bootloader_signed_v2_ecdsa192.bin"),
        )
>       espsecure.verify_signature(args)

test/test_espsecure.py:599:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:701: in verify_signature
    return verify_signature_v2(args)
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:787: in verify_signature_v2
    vk = _get_sbv2_pub_key(keyfile)
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:288: in _get_sbv2_pub_key
    vk = _load_sbv2_pub_key(key_data)
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:258: in _load_sbv2_pub_key
    vk = serialization.load_pem_public_key(keydata, backend=default_backend())
/usr/lib64/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py:30: in load_pem_public_key
    return ossl.load_pem_public_key(data)
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:968: in load_pem_public_key
    self._handle_key_loading_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <OpenSSLBackend(version: OpenSSL 3.0.5 5 Jul 2022, FIPS: False)>

    def _handle_key_loading_error(self) -> typing.NoReturn:
        errors = self._consume_errors()

        if not errors:
            raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format or it may be encrypted with an unsupported "
                "algorithm."
            )

        elif (
            errors[0]._lib_reason_match(
                self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT
            )
            or errors[0]._lib_reason_match(
                self._lib.ERR_LIB_PKCS12,
                self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR,
            )
            or (
                self._lib.Cryptography_HAS_PROVIDERS
                and errors[0]._lib_reason_match(
                    self._lib.ERR_LIB_PROV,
                    self._lib.PROV_R_BAD_DECRYPT,
                )
            )
        ):
            raise ValueError("Bad decrypt. Incorrect password?")

        elif any(
            error._lib_reason_match(
                self._lib.ERR_LIB_EVP,
                self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM,
            )
            for error in errors
        ):
            raise ValueError("Unsupported public key algorithm.")

        else:
            errors_with_text = binding._errors_with_text(errors)
>           raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format, it may be encrypted with an unsupported "
                "algorithm, or it may be an unsupported key type (e.g. EC "
                "curves with explicit parameters).",
                errors_with_text,
            )
E           ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=75497580, lib=9, reason=108, reason_text=b'error:0480006C:PEM routines::no start line')])

/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1248: ValueError
----------------------------- Captured stdout call -----------------------------
Verifying 21696 bytes of data
Signature is valid
Signature block 0 is valid (RSA).
Signature block 0 verification successful using the supplied key (RSA).
Signature block 1 invalid. Skipping.
Signature block 2 invalid. Skipping.
Signature block 0 is valid (ECDSA).
Signature block 0 verification successful using the supplied key (ECDSA).
_________________ TestSigning.test_generate_and_extract_key_v2 _________________

self = <test_espsecure.TestSigning object at 0x7fa44fead2b0>

    def test_generate_and_extract_key_v2(self):
        with tempfile.TemporaryDirectory() as keydir:
            # keyfile cannot exist before generation -> tempfile.NamedTemporaryFile()
            # cannot be used for keyfile
            keyfile_name = os.path.join(keydir, "key.pem")

            # We need to manually delete the keyfile as we are iterating over
            # different schemes with the same keyfile so instead of using addCleanup,
            # we remove it using os.remove at the end of each pass
            for scheme in ["rsa3072", "ecdsa192", "ecdsa256"]:
                args = self.GenerateKeyArgs("2", scheme, keyfile_name)
                espsecure.generate_signing_key(args)

                with tempfile.NamedTemporaryFile() as pub_keyfile, open(
                    keyfile_name, "rb"
                ) as keyfile:
                    args = self.ExtractKeyArgs("2", keyfile, pub_keyfile)
>                   espsecure.extract_public_key(args)

test/test_espsecure.py:707:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:884: in extract_public_key
    sk = _load_sbv2_signing_key(args.keyfile.read())
../../BUILDROOT/esptool-4.5.1-2.fc35.x86_64/usr/lib/python3.8/site-packages/espsecure/__init__.py:231: in _load_sbv2_signing_key
    sk = serialization.load_pem_private_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/primitives/serialization/base.py:22: in load_pem_private_key
    return ossl.load_pem_private_key(data, password)
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:921: in load_pem_private_key
    return self._load_key(
/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1189: in _load_key
    self._handle_key_loading_error()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <OpenSSLBackend(version: OpenSSL 3.0.5 5 Jul 2022, FIPS: False)>

    def _handle_key_loading_error(self) -> typing.NoReturn:
        errors = self._consume_errors()

        if not errors:
            raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format or it may be encrypted with an unsupported "
                "algorithm."
            )

        elif (
            errors[0]._lib_reason_match(
                self._lib.ERR_LIB_EVP, self._lib.EVP_R_BAD_DECRYPT
            )
            or errors[0]._lib_reason_match(
                self._lib.ERR_LIB_PKCS12,
                self._lib.PKCS12_R_PKCS12_CIPHERFINAL_ERROR,
            )
            or (
                self._lib.Cryptography_HAS_PROVIDERS
                and errors[0]._lib_reason_match(
                    self._lib.ERR_LIB_PROV,
                    self._lib.PROV_R_BAD_DECRYPT,
                )
            )
        ):
            raise ValueError("Bad decrypt. Incorrect password?")

        elif any(
            error._lib_reason_match(
                self._lib.ERR_LIB_EVP,
                self._lib.EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM,
            )
            for error in errors
        ):
            raise ValueError("Unsupported public key algorithm.")

        else:
            errors_with_text = binding._errors_with_text(errors)
>           raise ValueError(
                "Could not deserialize key data. The data may be in an "
                "incorrect format, it may be encrypted with an unsupported "
                "algorithm, or it may be an unsupported key type (e.g. EC "
                "curves with explicit parameters).",
                errors_with_text,
            )
E           ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=503841036, lib=60, reason=524556, reason_text=b'error:1E08010C:DECODER routines::unsupported'), _OpenSSLErrorWithText(code=134217857, lib=16, reason=129, reason_text=b'error:08000081:elliptic curve routines::unknown group'), _OpenSSLErrorWithText(code=134217847, lib=16, reason=119, reason_text=b'error:08000077:elliptic curve routines::ec group new by name failure'), _OpenSSLErrorWithText(code=134742032, lib=16, reason=524304, reason_text=b'error:08080010:elliptic curve routines::EC lib'), _OpenSSLErrorWithText(code=109052072, lib=13, reason=168, reason_text=b'error:068000A8:asn1 encoding routines::wrong tag'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error'), _OpenSSLErrorWithText(code=109576458, lib=13, reason=524554, reason_text=b'error:0688010A:asn1 encoding routines::nested asn1 error')])

/usr/lib64/python3.8/site-packages/cryptography/hazmat/backends/openssl/backend.py:1248: ValueError
----------------------------- Captured stdout call -----------------------------
RSA 3072 private key in PEM format written to /tmp/tmp3b8a44aq/key.pem
/tmp/tmp3b8a44aq/key.pem public key extracted to /tmp/tmpc7t0n_lw
ECDSA NIST192p private key in PEM format written to /tmp/tmp3b8a44aq/key.pem
=========================== short test summary info ============================
SKIPPED [1] test/test_espefuse.py:507: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:510: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:519: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:528: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:533: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:542: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:550: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:553: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:562: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:570: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:579: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:588: Not necessary fo all chips
SKIPPED [1] test/test_espefuse.py:798: ESP32-C2-only
SKIPPED [1] test/test_espefuse.py:818: ESP32-C2-only
SKIPPED [1] test/test_espefuse.py:846: Only chips with 6 keys
SKIPPED [1] test/test_espefuse.py:931: 512 bit keys are only supported on ESP32-S2 and S3
SKIPPED [1] test/test_espefuse.py:949: 512 bit keys are only supported on ESP32-S2 and S3
SKIPPED [1] test/test_espefuse.py:989: 512 bit keys are only supported on ESP32-S2 and S3
SKIPPED [1] test/test_espefuse.py:1059: ESP32-C2-only
SKIPPED [1] test/test_espefuse.py:1076: Only chip with 6 keys
SKIPPED [1] test/test_espefuse.py:1187: ESP32-C2-only
SKIPPED [1] test/test_espefuse.py:1210: Only chips with 6 keys
SKIPPED [1] test/test_espefuse.py:1347: ESP32-C2-only, supports 1 key block
SKIPPED [1] test/test_espefuse.py:1359: ESP32-C2-only, supports 1 key block
SKIPPED [1] test/test_espefuse.py:1371: ESP32-C2-only, supports 1 key block
SKIPPED [1] test/test_espefuse.py:1383: ESP32-C2-only, supports 1 key block
SKIPPED [1] test/test_espefuse.py:1411: Supports 6 key blocks
SKIPPED [1] test/test_espefuse.py:1443: Supports 6 key blocks
SKIPPED [1] test/test_espefuse.py:1489: ESP32-C2-only
SKIPPED [1] test/test_espefuse.py:1508: Only chip with 6 keys
SKIPPED [1] test/test_espefuse.py:1729: For this chip, FE and SB keys go into one BLOCK
SKIPPED [1] test/test_espefuse.py:1745: For this chip, FE and SB keys go into one BLOCK
FAILED test/test_espsecure.py::TestSigning::test_sign_v2_data - ValueError: (...
FAILED test/test_espsecure.py::TestSigning::test_sign_v2_with_pre_calculated_signature
FAILED test/test_espsecure.py::TestSigning::test_verify_signature_signing_key
FAILED test/test_espsecure.py::TestSigning::test_verify_signature_public_key
FAILED test/test_espsecure.py::TestSigning::test_generate_and_extract_key_v2
===== 5 failed, 107 passed, 32 skipped, 73 deselected in 94.89s (0:01:34) ======

Jason2866 added a commit to Jason2866/esptool that referenced this issue Nov 4, 2023
* docs: espsecure remote signing using a HSM broken link fix

* fix(rfc2217_server): Use new reset sequences

* fix(ESP32-S3): Lower CPU freq to improve flasher stub stability

Closes espressif#832

* fix: Unknown chip (ID or magic number) error

* pyinstaller: fix glibc dependency on gnu/linux

pyinstaller package for linux is built within the ubuntu-latest image in
github workflow. This may cause prbolem with glibc symbol versions on
older distributions, where the new symbol versions are not available.
Fix this by building on the older ubuntu version.

Closes espressif#843

Signed-off-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>

* tests: Create custom `host_test` marker for tests without real chip connected

Closes espressif#838

* fix(ESP32-S3): Temporarily disable increasing CPU freq

Related to espressif#848

Related to espressif#842

* build: add esp_rfc2217_server to published scripts

Closes espressif#846

* Update version to v4.5.1

* Update version to v4.6-dev

* espefuse: Hide sensitive info by default during burning burn_key and burn_key_digest

Adds --show-sensitive-info flag for two commands:
burn_key and burn_key_digest.

* flasher_stub: pass -mabi=ilp32 to the RISC-V compiler

This is a no-op change for the upstream toolchain (compiled stubs are
binary identical), but is required when building with Debian's
riscv64-unknown-elf-gcc compiler.

* flasher_stub: allow passing extra CFLAGS

The flasher_stub Makefile allows for some system-local configuration,
either through local.mk, or through environment variables.

For example, the compiler prefix can be overridden, by defining e.g.
CROSS_ESPRISCV32. However, passing additional flags to the compiler
isn't possible right now. Add EXTRA_CFLAGS and EXTRA_CFLAGS_ESPRISCV32
to allow for that option.

* flasher_stub: collect all targets at the top, DRY

* flasher_stub: make target selection more modular

Rather than a special "make esp32", create WITHOUT_* variables to
selectively disable chip families. Currently, WITHOUT_ESP8266,
WITHOUT_ESP32_XTENSA and WITHOUT_ESP32_RISCV32 are defined, but the code
can be easily adjusted to allow for all kinds of other
sets/combinations.

* flasher_stub: create %.json targets, make all a proper PHONY

* flasher_stub: drop --embed from wrap_stub.py

Since commit 94f29a5 the flasher stub is not embedded in the Python
source, but rather included as simple json files.

As such, wrap_stub.py --embed was converted to basically just vary the
build dir. Rather than keep this indirection and for better clarity,
remove that piece of code and replace it by a simple "cp" in the
Makefile.

While at it, replace the target name from "embed" to "install", as this
more akin to a "make install" step.

* espefuse: Support burning ECDSA_KEY from pem file

- fix some assert check in test_espefuse.py
- add tests to cover the new functionality

* espefuse(c2): Fix BLOCK_KEY0 view for summary cmd when SB + FE keys are burnt

For C2 secure boot + flash enc block, we saw that in summary cmd
"0's" from secure boot digest part (upper 128 bit) were translated
into "?'s" when the block was read protected.
For C2, we should apply this translation for lower 128 bits only.

* fix(ESP32-C6): Fix get_pkg_version and get_{major,minor}_chip_version

* image_info: removed check that reserved bytes in image header are zero

IDF may start using parts of the reserved bytes in the extended header at any time,
which will break chip auto-detect in image_info.

* build: limit max cryptography version to 40

* fix: Set flash parameters even with --flash_size keep

Related to espressif/esp-idf#10788

Related to espressif/esp-idf#10959

* build: add arm and arm64 as build target

Closes espressif#845

* Fix typo in serial protocol docs

Fixes misspelling of `triggered` in serial protocol docs.

Signed-off-by: hasheddan <georgedanielmangum@gmail.com>

* Support more recent reedsolo packages

- https://github.com/tomerfiliba-org/reedsolomon/releases/tag/v1.6.1 - this seems to be related to licenses only.
- https://github.com/tomerfiliba-org/reedsolomon/releases/tag/v1.7.0 - this is related to installation.

Closes espressif#872

* build(arm): add pip extra url for github action build

* ci: Fix libffi symlinks for cryptography>=40

* espefuse: Prevent burning XTS_AES and ECDSA keys into BLOCK9 (BLOCK_KEY5)

eFuse module has a hardware bug.
It is related to ESP32-C3, C6, S3, H2 chips:
    - BLOCK9 (BLOCK_KEY5) can not be used by XTS_AES keys.
For H2 chips, the BLOCK9 (BLOCK_KEY5) can not be used by ECDSA keys.
S2 does not have such a hardware bug.

* image_info: Display disabled WP pin as disabled

The image formats know about the special value 0xee used to disable WP.
Display this with image_info.

E.g.:

ESP32-C3 extended image header
==============================
WP pin: 0xee (disabled)

* image_info: Print chip ID's name if known

Example:

Flash pins drive settings: clk_drv: 0x0, q_drv: 0x0, d_drv: 0x0, cs0_drv: 0x0, hd_drv: 0x0, wp_drv: 0x0
Chip ID: 5 (ESP32-C3)
Minimal chip revision: v0.0, (legacy min_rev = 0)
Maximal chip revision: v655.35

An unknown ID will be printed as:

Chip ID: 42 (Unknown ID)

* tests: Make the testsuite Windows compatible

* espefuse: Adds external esp instance

Closes espressif#873

* espefuse: Improve efuse error viewing

* espefuse: Explicit setting of efuse time settings

EFUSE_PWR_ON_NUM in C3 has default value = 0x2880, now = 0x3000

* docs(Boot log): Add all esp targets to cover boot troubleshooting

Closes espressif#732

* fix: USB-JTAG-Serial PID detection error

* esptool: Move bootdesc on the top of the ram segment

* espefuse: Move some vars under init method to speedup tool after adding yaml support

* espefuse: Adds yaml efuse description files for all chip

- esptool: Updates eFuses wafer major&minor versions
- esptool(esp32c6): Adds package versions
- espefuse(esp32c6): Replace PKG_VERSION BLK_VERSION_MINOR BLK_VERSION_MAJOR
- espefuse(esp32c6): Adds adc calib efuses
- espefuse: Adds yaml files for Build with PyInstaller

* efuse(H2): Adds RF Calibration Information

* espsecure: Improve error message for incorrect PEM format

Closes espressif#881

* bugfix(usb_jtag_serial): Autofeed super watchdog (SWD) to avoid resets during flashing

* esptool: Read 64-bit MAC address on C6 and H2

* bugfix: Adjust wrapper scripts to not import themselves

* bugfix(espsecure): Print a clear error message if incompatible OpenSSL backend is used

Closes espressif#878

* fix: inconsistent usage of dirs separator

* feat(esptool): add option to dump whole flash based on detected size

Closes espressif#461

* Update version to v4.6

* Update version to v4.7-dev

* fix(ESP32-S3): Correct RTC WDT registers to fix resets during flashing

* Update version to v4.6.1

* Update version to v4.7-dev

* docs: add explanation for flash_id example to avoid confusion

* docs(boot-log): fix list formatting

* docs: add c2, c6 and h2 as build targets

* fix(compressed upload): Accept short data blocks with only Adler-32 bytes

* fix(CH9102F): Suggest to install new serial drivers if writing to RAM fails

* esptool & espefuse: Fix byte order in MAC (for C6 and H2)

MAC: 60:55:f9:ff:fe:f7:2c:a2 (EUI64, used for IEEE802154)
BASE MAC: 60:55:f9:f7:2c:a2 (used for BT)
MAC_EXT: ff:fe

* Update version to v4.6.2

* Update version to v4.7

* change: Add conventional precommit linter

* ci(pre-commit): Update version of `conventional-precommit-linter`

* feat(get_security_info): Improved the output format and added more
details

* fix(esp32-c2): Enable flashing in secure download mode

Closes espressif#895

* ci: Add DangerJS checks to GL and GH

* feat(esptool): Add PICO package for ESP32S3 and flash/psram efuses

* feat(esptool): Add tests for get_chip_features

* feat(esptool): Add new packages for ESP32C3 and flash efuses

* fix(expand file args): Correctly print the expanded command

* feat(espsecure): Allow prompting for HSM PIN in read_hsm_config

If hsm_config does not contain "credentials" the user will be
prompted for the HSM PIN.

This avoids the need to have HSM PINs typed in config files
which is not a good security practice.

ADJUNCT: Updated documentation to reflect new usage

Closes espressif#900

* fix(dangerGH): Update token permissions - allow Danger to add comments to PR

* fix(elf2image): fix text/rodata mapping overlap issue on uni-idrom bus chips

* fix: assert in esp32 exclusive workaround

* docs: Add other resources page

* fix(autodetection): Remove the ESP32-S2 ROM class from get_security_info autodetection

* change(pre-commit): Bump version conventional-precommit-linter to 1.2.1

* feat(esptool): added target to esp32p4

* feat(espefuse): Add support for esp32p4 chip

* fix: Fix redirection of STDOUT

Closes espressif#904

* fix(danger-github): Fir Danger GitHub token permission

* ci(danger-github): Fix github-action-bot permissions for posting Danger output

* ci: Shared danger to local stage (remove possible double CI pipelines)

* ci: add 'flake8-import-order' as a dependecy to flake8

* fix(bin_image): Check only ELF sections when searching for .flash.appdesc

Closes espressif#917

* feat(efuse): ESP32P4 adds ecdsa_key support

* feat(efuse): Update key purpose table and tests

* feat(esp32-s3): Support >16MB quad flash chips

Adds support for the W25Q256 and GD25Q256 flash chips.

Closes espressif#883

* ci(dev_release): Upload dev releases to PyPI with GH Actions

* ci: fix pipeline for building docs

* feat(merge_bin): add support for uf2 format

* feat(esp32c3): Support ECO6 and ECO7 magic numbers

* ci(gitlab_ci): Change only/except syntax to rules

* fix(flasher_stub): fix usb-serial-jtag enabled non-related intr source

* fix(loader): Could not open serial port message adjusted

* ci(gitlab): Fix deploying docs to production

* ci(github): Fix pyinstaller builds on ubuntu

* docs(basic-commands): added note for PowerShell users for merge_bin command

Closes espressif#923

* feat: Add support for Python 3.12

* feat(loader): Added hints for some serial port issues when rising port error

Closes espressif/esp-idf#12366

* feat: add support for get_security_info on esp32c3 ECO7

* docs(troubleshooting): Explain issues when flashing with USB-Serial/JTAG or USB-OTG

Closes espressif#924

* feat(espefuse): Update the way to complete the operation

* docs(boot_mode_selection): Correct secondary strapping pin boot mode levels

Closes espressif#928

* feat(espefuse): Adds efuse ADC calibration data for ESP32H2

* feat(rfc2217_server): Add hard reset sequence

* feat(elf2image): add ram-only-header argument

The ram-only-header configuration makes only
the RAM segments visible to the ROM bootloader placing
them at the beginning of the file and altering the
segment count from the image header with the quantity
of these segments, and also writing only their
checksum. This segment placement also may not result
as optimal as the standard way regarding the padding
gap use among the flash segments that could result
in a less fragmented binary.

The image built must then handle the basic hardware
initialization and the flash mapping for code execution
after ROM bootloader boot it.

Signed-off-by: Marek Matej <marek.matej@espressif.com>
Signed-off-by: Almir Okato <almir.okato@espressif.com>

* feat(esp32p4): Stub flasher support

* refactor(stub_flasher): Cleanup, make adding new targets easier

* feat: add support for intel hex format

---------

Signed-off-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>
Signed-off-by: hasheddan <georgedanielmangum@gmail.com>
Signed-off-by: Marek Matej <marek.matej@espressif.com>
Signed-off-by: Almir Okato <almir.okato@espressif.com>
Co-authored-by: harshal.patil <harshal.patil@espressif.com>
Co-authored-by: radim.karnis <radim.karnis@espressif.com>
Co-authored-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>
Co-authored-by: Peter Dragun <peter.dragun@espressif.com>
Co-authored-by: KonstantinKondrashov <konstantin@espressif.com>
Co-authored-by: Faidon Liambotis <paravoid@debian.org>
Co-authored-by: XiNGRZ <hi@xingrz.me>
Co-authored-by: Marius Vikhammer <marius.vikhammer@espressif.com>
Co-authored-by: hasheddan <georgedanielmangum@gmail.com>
Co-authored-by: Roland Dobai <roland@espressif.com>
Co-authored-by: Trent Piepho <tpiepho@gmail.com>
Co-authored-by: Dean Gardiner <me@dgardiner.net>
Co-authored-by: Massimiliano Montagni <massimiliano@solutiontech.tech>
Co-authored-by: Tomas Sebestik <tomas.sebestik@espressif.com>
Co-authored-by: Aditya Patwardhan <aditya.patwardhan@espressif.com>
Co-authored-by: Richard Retanubun <richard.retanubun@mmbnetworks.com>
Co-authored-by: wuzhenghui <wuzhenghui@espressif.com>
Co-authored-by: Armando <douyiwen@espressif.com>
Co-authored-by: Jakub Kocka <jakub.kocka@espressif.com>
Co-authored-by: 20162026 <36726858+20162026@users.noreply.github.com>
Co-authored-by: Almir Okato <almir.okato@espressif.com>
Jason2866 added a commit to Jason2866/esptool that referenced this issue Nov 7, 2023
* docs: espsecure remote signing using a HSM broken link fix

* fix(rfc2217_server): Use new reset sequences

* fix(ESP32-S3): Lower CPU freq to improve flasher stub stability

Closes espressif#832

* fix: Unknown chip (ID or magic number) error

* pyinstaller: fix glibc dependency on gnu/linux

pyinstaller package for linux is built within the ubuntu-latest image in
github workflow. This may cause prbolem with glibc symbol versions on
older distributions, where the new symbol versions are not available.
Fix this by building on the older ubuntu version.

Closes espressif#843

Signed-off-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>

* tests: Create custom `host_test` marker for tests without real chip connected

Closes espressif#838

* fix(ESP32-S3): Temporarily disable increasing CPU freq

Related to espressif#848

Related to espressif#842

* build: add esp_rfc2217_server to published scripts

Closes espressif#846

* Update version to v4.5.1

* Update version to v4.6-dev

* espefuse: Hide sensitive info by default during burning burn_key and burn_key_digest

Adds --show-sensitive-info flag for two commands:
burn_key and burn_key_digest.

* flasher_stub: pass -mabi=ilp32 to the RISC-V compiler

This is a no-op change for the upstream toolchain (compiled stubs are
binary identical), but is required when building with Debian's
riscv64-unknown-elf-gcc compiler.

* flasher_stub: allow passing extra CFLAGS

The flasher_stub Makefile allows for some system-local configuration,
either through local.mk, or through environment variables.

For example, the compiler prefix can be overridden, by defining e.g.
CROSS_ESPRISCV32. However, passing additional flags to the compiler
isn't possible right now. Add EXTRA_CFLAGS and EXTRA_CFLAGS_ESPRISCV32
to allow for that option.

* flasher_stub: collect all targets at the top, DRY

* flasher_stub: make target selection more modular

Rather than a special "make esp32", create WITHOUT_* variables to
selectively disable chip families. Currently, WITHOUT_ESP8266,
WITHOUT_ESP32_XTENSA and WITHOUT_ESP32_RISCV32 are defined, but the code
can be easily adjusted to allow for all kinds of other
sets/combinations.

* flasher_stub: create %.json targets, make all a proper PHONY

* flasher_stub: drop --embed from wrap_stub.py

Since commit 94f29a5 the flasher stub is not embedded in the Python
source, but rather included as simple json files.

As such, wrap_stub.py --embed was converted to basically just vary the
build dir. Rather than keep this indirection and for better clarity,
remove that piece of code and replace it by a simple "cp" in the
Makefile.

While at it, replace the target name from "embed" to "install", as this
more akin to a "make install" step.

* espefuse: Support burning ECDSA_KEY from pem file

- fix some assert check in test_espefuse.py
- add tests to cover the new functionality

* espefuse(c2): Fix BLOCK_KEY0 view for summary cmd when SB + FE keys are burnt

For C2 secure boot + flash enc block, we saw that in summary cmd
"0's" from secure boot digest part (upper 128 bit) were translated
into "?'s" when the block was read protected.
For C2, we should apply this translation for lower 128 bits only.

* fix(ESP32-C6): Fix get_pkg_version and get_{major,minor}_chip_version

* image_info: removed check that reserved bytes in image header are zero

IDF may start using parts of the reserved bytes in the extended header at any time,
which will break chip auto-detect in image_info.

* build: limit max cryptography version to 40

* fix: Set flash parameters even with --flash_size keep

Related to espressif/esp-idf#10788

Related to espressif/esp-idf#10959

* build: add arm and arm64 as build target

Closes espressif#845

* Fix typo in serial protocol docs

Fixes misspelling of `triggered` in serial protocol docs.

Signed-off-by: hasheddan <georgedanielmangum@gmail.com>

* Support more recent reedsolo packages

- https://github.com/tomerfiliba-org/reedsolomon/releases/tag/v1.6.1 - this seems to be related to licenses only.
- https://github.com/tomerfiliba-org/reedsolomon/releases/tag/v1.7.0 - this is related to installation.

Closes espressif#872

* build(arm): add pip extra url for github action build

* ci: Fix libffi symlinks for cryptography>=40

* espefuse: Prevent burning XTS_AES and ECDSA keys into BLOCK9 (BLOCK_KEY5)

eFuse module has a hardware bug.
It is related to ESP32-C3, C6, S3, H2 chips:
    - BLOCK9 (BLOCK_KEY5) can not be used by XTS_AES keys.
For H2 chips, the BLOCK9 (BLOCK_KEY5) can not be used by ECDSA keys.
S2 does not have such a hardware bug.

* image_info: Display disabled WP pin as disabled

The image formats know about the special value 0xee used to disable WP.
Display this with image_info.

E.g.:

ESP32-C3 extended image header
==============================
WP pin: 0xee (disabled)

* image_info: Print chip ID's name if known

Example:

Flash pins drive settings: clk_drv: 0x0, q_drv: 0x0, d_drv: 0x0, cs0_drv: 0x0, hd_drv: 0x0, wp_drv: 0x0
Chip ID: 5 (ESP32-C3)
Minimal chip revision: v0.0, (legacy min_rev = 0)
Maximal chip revision: v655.35

An unknown ID will be printed as:

Chip ID: 42 (Unknown ID)

* tests: Make the testsuite Windows compatible

* espefuse: Adds external esp instance

Closes espressif#873

* espefuse: Improve efuse error viewing

* espefuse: Explicit setting of efuse time settings

EFUSE_PWR_ON_NUM in C3 has default value = 0x2880, now = 0x3000

* docs(Boot log): Add all esp targets to cover boot troubleshooting

Closes espressif#732

* fix: USB-JTAG-Serial PID detection error

* esptool: Move bootdesc on the top of the ram segment

* espefuse: Move some vars under init method to speedup tool after adding yaml support

* espefuse: Adds yaml efuse description files for all chip

- esptool: Updates eFuses wafer major&minor versions
- esptool(esp32c6): Adds package versions
- espefuse(esp32c6): Replace PKG_VERSION BLK_VERSION_MINOR BLK_VERSION_MAJOR
- espefuse(esp32c6): Adds adc calib efuses
- espefuse: Adds yaml files for Build with PyInstaller

* efuse(H2): Adds RF Calibration Information

* espsecure: Improve error message for incorrect PEM format

Closes espressif#881

* bugfix(usb_jtag_serial): Autofeed super watchdog (SWD) to avoid resets during flashing

* esptool: Read 64-bit MAC address on C6 and H2

* bugfix: Adjust wrapper scripts to not import themselves

* bugfix(espsecure): Print a clear error message if incompatible OpenSSL backend is used

Closes espressif#878

* fix: inconsistent usage of dirs separator

* feat(esptool): add option to dump whole flash based on detected size

Closes espressif#461

* Update version to v4.6

* Update version to v4.7-dev

* fix(ESP32-S3): Correct RTC WDT registers to fix resets during flashing

* Update version to v4.6.1

* Update version to v4.7-dev

* docs: add explanation for flash_id example to avoid confusion

* docs(boot-log): fix list formatting

* docs: add c2, c6 and h2 as build targets

* fix(compressed upload): Accept short data blocks with only Adler-32 bytes

* fix(CH9102F): Suggest to install new serial drivers if writing to RAM fails

* esptool & espefuse: Fix byte order in MAC (for C6 and H2)

MAC: 60:55:f9:ff:fe:f7:2c:a2 (EUI64, used for IEEE802154)
BASE MAC: 60:55:f9:f7:2c:a2 (used for BT)
MAC_EXT: ff:fe

* Update version to v4.6.2

* Update version to v4.7

* change: Add conventional precommit linter

* ci(pre-commit): Update version of `conventional-precommit-linter`

* feat(get_security_info): Improved the output format and added more
details

* fix(esp32-c2): Enable flashing in secure download mode

Closes espressif#895

* ci: Add DangerJS checks to GL and GH

* feat(esptool): Add PICO package for ESP32S3 and flash/psram efuses

* feat(esptool): Add tests for get_chip_features

* feat(esptool): Add new packages for ESP32C3 and flash efuses

* fix(expand file args): Correctly print the expanded command

* feat(espsecure): Allow prompting for HSM PIN in read_hsm_config

If hsm_config does not contain "credentials" the user will be
prompted for the HSM PIN.

This avoids the need to have HSM PINs typed in config files
which is not a good security practice.

ADJUNCT: Updated documentation to reflect new usage

Closes espressif#900

* fix(dangerGH): Update token permissions - allow Danger to add comments to PR

* fix(elf2image): fix text/rodata mapping overlap issue on uni-idrom bus chips

* fix: assert in esp32 exclusive workaround

* docs: Add other resources page

* fix(autodetection): Remove the ESP32-S2 ROM class from get_security_info autodetection

* change(pre-commit): Bump version conventional-precommit-linter to 1.2.1

* feat(esptool): added target to esp32p4

* feat(espefuse): Add support for esp32p4 chip

* fix: Fix redirection of STDOUT

Closes espressif#904

* fix(danger-github): Fir Danger GitHub token permission

* ci(danger-github): Fix github-action-bot permissions for posting Danger output

* ci: Shared danger to local stage (remove possible double CI pipelines)

* ci: add 'flake8-import-order' as a dependecy to flake8

* fix(bin_image): Check only ELF sections when searching for .flash.appdesc

Closes espressif#917

* feat(efuse): ESP32P4 adds ecdsa_key support

* feat(efuse): Update key purpose table and tests

* feat(esp32-s3): Support >16MB quad flash chips

Adds support for the W25Q256 and GD25Q256 flash chips.

Closes espressif#883

* ci(dev_release): Upload dev releases to PyPI with GH Actions

* ci: fix pipeline for building docs

* feat(merge_bin): add support for uf2 format

* feat(esp32c3): Support ECO6 and ECO7 magic numbers

* ci(gitlab_ci): Change only/except syntax to rules

* fix(flasher_stub): fix usb-serial-jtag enabled non-related intr source

* fix(loader): Could not open serial port message adjusted

* ci(gitlab): Fix deploying docs to production

* ci(github): Fix pyinstaller builds on ubuntu

* docs(basic-commands): added note for PowerShell users for merge_bin command

Closes espressif#923

* feat: Add support for Python 3.12

* feat(loader): Added hints for some serial port issues when rising port error

Closes espressif/esp-idf#12366

* feat: add support for get_security_info on esp32c3 ECO7

* docs(troubleshooting): Explain issues when flashing with USB-Serial/JTAG or USB-OTG

Closes espressif#924

* feat(espefuse): Update the way to complete the operation

* docs(boot_mode_selection): Correct secondary strapping pin boot mode levels

Closes espressif#928

* feat(espefuse): Adds efuse ADC calibration data for ESP32H2

* feat(rfc2217_server): Add hard reset sequence

* feat(elf2image): add ram-only-header argument

The ram-only-header configuration makes only
the RAM segments visible to the ROM bootloader placing
them at the beginning of the file and altering the
segment count from the image header with the quantity
of these segments, and also writing only their
checksum. This segment placement also may not result
as optimal as the standard way regarding the padding
gap use among the flash segments that could result
in a less fragmented binary.

The image built must then handle the basic hardware
initialization and the flash mapping for code execution
after ROM bootloader boot it.

Signed-off-by: Marek Matej <marek.matej@espressif.com>
Signed-off-by: Almir Okato <almir.okato@espressif.com>

* feat(esp32p4): Stub flasher support

* refactor(stub_flasher): Cleanup, make adding new targets easier

* feat: add support for intel hex format

* feat(xip_psram): support xip psram feature on esp32p4

Expanded IROM / DROM range to include psram space as well

* Delete docs directory

* Delete .gitlab-ci.yml

* Delete .pre-commit-config.yaml

* Delete MANIFEST.in

* Update build_esptool.yml

* Delete .github/workflows/test_esptool.yml

---------

Signed-off-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>
Signed-off-by: hasheddan <georgedanielmangum@gmail.com>
Signed-off-by: Marek Matej <marek.matej@espressif.com>
Signed-off-by: Almir Okato <almir.okato@espressif.com>
Co-authored-by: harshal.patil <harshal.patil@espressif.com>
Co-authored-by: radim.karnis <radim.karnis@espressif.com>
Co-authored-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>
Co-authored-by: Peter Dragun <peter.dragun@espressif.com>
Co-authored-by: KonstantinKondrashov <konstantin@espressif.com>
Co-authored-by: Faidon Liambotis <paravoid@debian.org>
Co-authored-by: XiNGRZ <hi@xingrz.me>
Co-authored-by: Marius Vikhammer <marius.vikhammer@espressif.com>
Co-authored-by: hasheddan <georgedanielmangum@gmail.com>
Co-authored-by: Roland Dobai <roland@espressif.com>
Co-authored-by: Trent Piepho <tpiepho@gmail.com>
Co-authored-by: Dean Gardiner <me@dgardiner.net>
Co-authored-by: Massimiliano Montagni <massimiliano@solutiontech.tech>
Co-authored-by: Tomas Sebestik <tomas.sebestik@espressif.com>
Co-authored-by: Aditya Patwardhan <aditya.patwardhan@espressif.com>
Co-authored-by: Richard Retanubun <richard.retanubun@mmbnetworks.com>
Co-authored-by: wuzhenghui <wuzhenghui@espressif.com>
Co-authored-by: Armando <douyiwen@espressif.com>
Co-authored-by: Jakub Kocka <jakub.kocka@espressif.com>
Co-authored-by: 20162026 <36726858+20162026@users.noreply.github.com>
Co-authored-by: Almir Okato <almir.okato@espressif.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants