Vadim Lyubashevsky

120 papers A* 13A 3B 3C 1Misc 2Journal 62Unranked 35
YearRankTypeTitle / Venue / Authors
2026 J jnl
IACR Cryptol. ePrint Arch.
Graeme Connell, Sebastian H. Faller, Felix Günther, Julia Hesse, Vadim Lyubashevsky, Rolfe Schmidt
2026 J jnl
IACR Cryptol. ePrint Arch.
Felix Gunther, Vadim Lyubashevsky, Rolfe Schmidt
2026 J jnl
IACR Cryptol. ePrint Arch.
Madalina Bolboceanu, Jonathan Bootle, Vadim Lyubashevsky, Antonio Merino-Gallardo, Gregor Seiler
2025 conf
PKC (2)
Jonathan Bootle, Vadim Lyubashevsky, Antonio Merino-Gallardo
2025 J jnl
IACR Cryptol. ePrint Arch.
Jonathan Bootle, Vadim Lyubashevsky, Antonio Merino-Gallardo
2024 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky
2024 A* conf
CCS
Vadim Lyubashevsky, Gregor Seiler, Patrick Steuer
2024 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Gregor Seiler, Patrick Steuer
2023 conf
CRYPTO (2)
Jonathan Bootle, Vadim Lyubashevsky, Ngoc Khanh Nguyen, Alessandro Sorniotti
2023 J jnl
IACR Cryptol. ePrint Arch.
Jonathan Bootle, Vadim Lyubashevsky, Ngoc Khanh Nguyen, Alessandro Sorniotti
2023 conf
Public Key Cryptography (1)
Julien Duman, Kathrin Hövelmanns, Eike Kiltz, Vadim Lyubashevsky, Gregor Seiler, Dominique Unruh
2023 A* conf
CCS
Ward Beullens, Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2023 J jnl
IACR Cryptol. ePrint Arch.
Ward Beullens, Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2022 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Ngoc Khanh Nguyen
2022 conf
ASIACRYPT (4)
Vadim Lyubashevsky, Ngoc Khanh Nguyen
2022 conf
Public Key Cryptography (2)
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Maxime Plançon
2022 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Maxime Plançon
2022 conf
CRYPTO (2)
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Maxime Plançon
2022 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Maxime Plançon
2022 conf
EUROCRYPT (1)
Craig Gentry, Shai Halevi, Vadim Lyubashevsky
2021 J jnl
IACR Cryptol. ePrint Arch.
Julien Duman, Kathrin Hövelmanns, Eike Kiltz, Vadim Lyubashevsky, Gregor Seiler, Dominique Unruh
2021 A* conf
CCS
Julien Duman, Kathrin Hövelmanns, Eike Kiltz, Vadim Lyubashevsky, Gregor Seiler
2021 J jnl
IACR Cryptol. ePrint Arch.
Julien Duman, Eike Kiltz, Kathrin Hövelmanns, Vadim Lyubashevsky, Gregor Seiler
2021 conf
ESORICS (2)
Jonathan Bootle, Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2021 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Damien Stehlé
2021 J jnl
IACR Cryptol. ePrint Arch.
Craig Gentry, Shai Halevi, Vadim Lyubashevsky
2021 conf
CRYPTO (2)
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2021 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2021 conf
ASIACRYPT (4)
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Maxime Plançon, Gregor Seiler
2021 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Maxime Plançon, Gregor Seiler
2021 conf
Public Key Cryptography (1)
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2020 conf
CRYPTO (2)
Jonathan Bootle, Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2020 J jnl
IACR Cryptol. ePrint Arch.
Jonathan Bootle, Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2020 C conf
PQCrypto
Jonathan Bootle, Anja Lehmann, Vadim Lyubashevsky, Gregor Seiler
2020 J jnl
IACR Cryptol. ePrint Arch.
Jonathan Bootle, Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2020 A* conf
CCS
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2020 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2020 conf
CRYPTO (2)
Thomas Attema, Vadim Lyubashevsky, Gregor Seiler
2020 J jnl
IACR Cryptol. ePrint Arch.
Thomas Attema, Vadim Lyubashevsky, Gregor Seiler
2020 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Ngoc Khanh Nguyen, Gregor Seiler
2019 conf
CYSARM@CCS
Liqun Chen, Nada El Kassem, Anja Lehmann, Vadim Lyubashevsky
2019 conf
CRYPTO (1)
Jonathan Bootle, Vadim Lyubashevsky, Gregor Seiler
2019 J jnl
IACR Cryptol. ePrint Arch.
Jonathan Bootle, Vadim Lyubashevsky, Gregor Seiler
2019 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Gregor Seiler
2019 J jnl
IACR Trans. Cryptogr. Hardw. Embed. Syst.
Vadim Lyubashevsky, Gregor Seiler
2019 conf
Public Key Cryptography (1)
Rafaël del Pino, Vadim Lyubashevsky, Gregor Seiler
2019 J jnl
IACR Cryptol. ePrint Arch.
Rafaël del Pino, Vadim Lyubashevsky, Gregor Seiler
2019 conf
EUROCRYPT (3)
Zvika Brakerski, Vadim Lyubashevsky, Vinod Vaikuntanathan, Daniel Wichs
2018 conf
EUROCRYPT (3)
Eike Kiltz, Vadim Lyubashevsky, Christian Schaffner
2018 J jnl
J. Cryptol.
Vadim Lyubashevsky, Daniele Micciancio
2018 A conf
EuroS&P
Joppe W. Bos, Léo Ducas, Eike Kiltz, Tancrède Lepoint, Vadim Lyubashevsky, John M. Schanck, Peter Schwabe, Gregor Seiler, Damien Stehlé
2018 J jnl
IACR Trans. Cryptogr. Hardw. Embed. Syst.
Léo Ducas, Eike Kiltz, Tancrède Lepoint, Vadim Lyubashevsky, Peter Schwabe, Gregor Seiler, Damien Stehlé
2018 A* conf
CCS
Rafaël del Pino, Vadim Lyubashevsky, Gregor Seiler
2018 J jnl
IACR Cryptol. ePrint Arch.
Rafaël del Pino, Vadim Lyubashevsky, Gregor Seiler
2018 Misc conf
SCN
Carsten Baum, Ivan Damgård, Vadim Lyubashevsky, Sabine Oechsner, Chris Peikert
2018 conf
EUROCRYPT (1)
Vadim Lyubashevsky, Gregor Seiler
2018 J jnl
IACR Cryptol. ePrint Arch.
Carsten Baum, Jonathan Bootle, Andrea Cerulli, Rafaël del Pino, Jens Groth, Vadim Lyubashevsky
2018 conf
CRYPTO (2)
Carsten Baum, Jonathan Bootle, Andrea Cerulli, Rafaël del Pino, Jens Groth, Vadim Lyubashevsky
2018 J jnl
Electron. Colloquium Comput. Complex.
Zvika Brakerski, Vadim Lyubashevsky, Vinod Vaikuntanathan, Daniel Wichs
2018 J jnl
IACR Cryptol. ePrint Arch.
Zvika Brakerski, Vadim Lyubashevsky, Vinod Vaikuntanathan, Daniel Wichs
2017 J jnl
IACR Cryptol. ePrint Arch.
Eike Kiltz, Vadim Lyubashevsky, Christian Schaffner
2017 conf
CRYPTO (3)
Rafaël del Pino, Vadim Lyubashevsky
2017 J jnl
IACR Cryptol. ePrint Arch.
Rafaël del Pino, Vadim Lyubashevsky
2017 J jnl
IACR Cryptol. ePrint Arch.
Léo Ducas, Tancrède Lepoint, Vadim Lyubashevsky, Peter Schwabe, Gregor Seiler, Damien Stehlé
2017 J jnl
IACR Cryptol. ePrint Arch.
Joppe W. Bos, Léo Ducas, Eike Kiltz, Tancrède Lepoint, Vadim Lyubashevsky, John M. Schanck, Peter Schwabe, Damien Stehlé
2017 conf
EUROCRYPT (1)
Vadim Lyubashevsky, Gregory Neven
2017 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Gregory Neven
2017 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Gregor Seiler
2017 A* conf
CCS
Rafaël del Pino, Vadim Lyubashevsky, Gregory Neven, Gregor Seiler
2017 J jnl
IACR Cryptol. ePrint Arch.
Rafaël del Pino, Vadim Lyubashevsky, Gregory Neven, Gregor Seiler
2017 J jnl
IACR Cryptol. ePrint Arch.
Carsten Baum, Vadim Lyubashevsky
2016 conf
ASIACRYPT (2)
Vadim Lyubashevsky
2016 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky
2016 Misc conf
SCN
Rafaël del Pino, Vadim Lyubashevsky, David Pointcheval
2016 J jnl
IACR Cryptol. ePrint Arch.
Rafaël del Pino, Vadim Lyubashevsky, David Pointcheval
2016 J jnl
J. Cryptol.
Michel Abdalla, Pierre-Alain Fouque, Vadim Lyubashevsky, Mehdi Tibouchi
2015 conf
ESORICS (1)
Fabrice Benhamouda, Stephan Krenn, Vadim Lyubashevsky, Krzysztof Pietrzak
2015 J jnl
IEEE Trans. Computers
Tim Güneysu, Vadim Lyubashevsky, Thomas Pöppelmann
2015 conf
EUROCRYPT (1)
Vadim Lyubashevsky, Thomas Prest
2015 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Thomas Prest
2015 conf
Public Key Cryptography
Vadim Lyubashevsky, Daniel Wichs
2014 conf
ASIACRYPT (1)
Fabrice Benhamouda, Jan Camenisch, Stephan Krenn, Vadim Lyubashevsky, Gregory Neven
2014 J jnl
IACR Cryptol. ePrint Arch.
Léo Ducas, Vadim Lyubashevsky, Thomas Prest
2014 conf
ASIACRYPT (2)
Léo Ducas, Vadim Lyubashevsky, Thomas Prest
2014 J jnl
IACR Cryptol. ePrint Arch.
Fabrice Benhamouda, Stephan Krenn, Vadim Lyubashevsky, Krzysztof Pietrzak
2014 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Daniel Wichs
2013 A* conf
EUROCRYPT
Vadim Lyubashevsky, Chris Peikert, Oded Regev
2013 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Chris Peikert, Oded Regev
2013 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Daniele Micciancio
2013 conf
CRYPTO (1)
Léo Ducas, Alain Durmus, Tancrède Lepoint, Vadim Lyubashevsky
2013 J jnl
IACR Cryptol. ePrint Arch.
Léo Ducas, Alain Durmus, Tancrède Lepoint, Vadim Lyubashevsky
2013 conf
CRYPTO (2)
Vadim Lyubashevsky, Daniel Masny
2013 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Daniel Masny
2013 J jnl
J. ACM
Vadim Lyubashevsky, Chris Peikert, Oded Regev
2013 J jnl
IACR Cryptol. ePrint Arch.
Michel Abdalla, Pierre-Alain Fouque, Vadim Lyubashevsky, Mehdi Tibouchi
2012 J jnl
IACR Cryptol. ePrint Arch.
Michel Abdalla, Dario Fiore, Vadim Lyubashevsky
2012 conf
Public Key Cryptography
Michel Abdalla, Dario Fiore, Vadim Lyubashevsky
2012 A* conf
FSE
Stefan Heyse, Eike Kiltz, Vadim Lyubashevsky, Christof Paar, Krzysztof Pietrzak
2012 A* conf
EUROCRYPT
Vadim Lyubashevsky
2012 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Chris Peikert, Oded Regev
2012 A conf
CHES
Tim Güneysu, Vadim Lyubashevsky, Thomas Pöppelmann
2012 A* conf
EUROCRYPT
Michel Abdalla, Pierre-Alain Fouque, Vadim Lyubashevsky, Mehdi Tibouchi
2011 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky
2011 B conf
ITW
Vadim Lyubashevsky
2010 A* conf
EUROCRYPT
Vadim Lyubashevsky, Chris Peikert, Oded Regev
2010 B conf
TCC
Vadim Lyubashevsky, Adriana Palacio, Gil Segev
2009 J jnl
Discret. Comput. Geom.
Ishay Haviv, Vadim Lyubashevsky, Oded Regev
2009 A conf
ASIACRYPT
Vadim Lyubashevsky
2009 A* conf
CRYPTO
Vadim Lyubashevsky, Daniele Micciancio
2009 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky, Adriana Palacio, Gil Segev
2008 B conf
TCC
Vadim Lyubashevsky, Daniele Micciancio
2008 conf
Public Key Cryptography
Vadim Lyubashevsky
2008 A* conf
FSE
Vadim Lyubashevsky, Daniele Micciancio, Chris Peikert, Alon Rosen
2008 J jnl
IACR Cryptol. ePrint Arch.
Vadim Lyubashevsky
2008
Vadim Lyubashevsky
2006 conf
ICALP (2)
Vadim Lyubashevsky, Daniele Micciancio
2006 conf
APPROX-RANDOM
Yi-Kai Liu, Vadim Lyubashevsky, Daniele Micciancio
2005 J jnl
Electron. Colloquium Comput. Complex.
Vadim Lyubashevsky, Daniele Micciancio
2005 J jnl
Electron. Colloquium Comput. Complex.
Vadim Lyubashevsky
2005 conf
APPROX-RANDOM
Vadim Lyubashevsky
tests/unit/test_dataclasses.py
← Index tests/unit/test_dataclasses.py python
"""
Unit tests for redb.models.dataclasses.

These tests verify construction, field defaults, and type expectations for
every dataclass in the module (excluding Mach-O dataclasses, which are
covered by test_macho_dataclasses.py).
"""
import pytest
from dataclasses import asdict, fields

pytestmark = [pytest.mark.unit, pytest.mark.dataclass]


# ============================================================================
# Hash / Hashes
# ============================================================================

class TestHashDataclass:
    """Tests for the Hash dataclass."""

    def test_creation(self):
        from redb.models.dataclasses import Hash

        h = Hash(
            md5="d41d8cd98f00b204e9800998ecf8427e",
            sha1="da39a3ee5e6b4b0d3255bfef95601890afd80709",
            sha256="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        )
        assert h.md5 == "d41d8cd98f00b204e9800998ecf8427e"
        assert h.sha1 == "da39a3ee5e6b4b0d3255bfef95601890afd80709"
        assert h.sha256 == "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

    def test_asdict(self):
        from redb.models.dataclasses import Hash

        h = Hash(md5="a", sha1="b", sha256="c")
        d = asdict(h)
        assert d == {"md5": "a", "sha1": "b", "sha256": "c"}


class TestHashesDataclass:
    """Tests for the Hashes dataclass."""

    def test_required_fields(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(
            md5="md5val",
            sha1="sha1val",
            sha256="sha256val",
            ssdeep_hash="ssdeep",
            tlsh_hash="tlsh",
        )
        assert h.md5 == "md5val"
        assert h.ssdeep_hash == "ssdeep"

    def test_optional_pe_fields_default_none(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e")
        assert h.authentihash is None
        assert h.imphash is None
        assert h.richhash is None
        assert h.richpe_hash is None
        assert h.richpv_hash is None
        assert h.richpv_hash_sorted is None
        assert h.typerefhash is None
        assert h.impfuzzy is None

    def test_optional_elf_fields_default_none(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e")
        assert h.import_hash is None
        assert h.export_hash is None
        assert h.section_hash is None
        assert h.symbol_hash is None
        assert h.dynamic_hash is None

    def test_optional_macho_fields_default_none(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e")
        assert h.macho_dylib_hash is None
        assert h.macho_import_hash is None
        assert h.macho_export_hash is None
        assert h.macho_entitlement_hash is None
        assert h.macho_symhash is None

    def test_macho_fields_settable(self):
        from redb.models.dataclasses import Hashes

        h = Hashes(
            md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e",
            macho_dylib_hash="dylib_h",
            macho_import_hash="import_h",
            macho_export_hash="export_h",
            macho_entitlement_hash="ent_h",
            macho_symhash="sym_h",
        )
        assert h.macho_dylib_hash == "dylib_h"
        assert h.macho_import_hash == "import_h"
        assert h.macho_export_hash == "export_h"
        assert h.macho_entitlement_hash == "ent_h"
        assert h.macho_symhash == "sym_h"


# ============================================================================
# BasicProperties
# ============================================================================

class TestBasicPropertiesDataclass:
    """Tests for the BasicProperties dataclass."""

    def test_required_fields(self):
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="test.exe",
            sample_name="test.exe",
            filesize=1024,
            filetype="PE32",
            filetype_mime="application/x-dosexec",
            filetype_magika="pebin",
            file_entropy=6.5,
        )
        assert bp.filename == "test.exe"
        assert bp.filesize == 1024
        assert bp.file_entropy == 6.5

    def test_optional_fields_default_none(self):
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="x", sample_name="x", filesize=0,
            filetype="t", filetype_mime="m", filetype_magika="k", file_entropy=0.0,
        )
        assert bp.is_packed is None
        assert bp.is_fat is None
        assert bp.child_sha256 is None
        assert bp.child_architecture is None
        assert bp.child_filetype is None

    def test_fat_fields(self):
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="universal.app",
            sample_name="universal.app",
            filesize=2048,
            filetype="Mach-O universal",
            filetype_mime="application/x-mach-binary",
            filetype_magika="macho",
            file_entropy=7.2,
            is_fat=True,
            child_sha256=["hash1", "hash2"],
            child_architecture=["x86_64", "arm64"],
            child_filetype=["macho", "macho"],
        )
        assert bp.is_fat is True
        assert len(bp.child_sha256) == 2
        assert bp.child_architecture == ["x86_64", "arm64"]

    def test_asdict_roundtrip(self):
        from redb.models.dataclasses import BasicProperties

        bp = BasicProperties(
            filename="f", sample_name="s", filesize=10,
            filetype="t", filetype_mime="m", filetype_magika="k", file_entropy=1.0,
        )
        d = asdict(bp)
        assert d["filename"] == "f"
        assert d["is_fat"] is None


# ============================================================================
# DIEinfo / CAPA
# ============================================================================

class TestDIEinfoDataclass:
    def test_creation(self):
        from redb.models.dataclasses import DIEinfo

        d = DIEinfo(die_full_dump="dump_text")
        assert d.die_full_dump == "dump_text"
        assert d.die_info == {}

    def test_with_info(self):
        from redb.models.dataclasses import DIEinfo

        d = DIEinfo(die_full_dump="x", die_info={"packer": "UPX"})
        assert d.die_info["packer"] == "UPX"


class TestCAPADataclass:
    def test_creation(self):
        from redb.models.dataclasses import CAPA

        c = CAPA(
            capa_dump="dump",
            capabilities=["cap1"],
            namespaces=["ns1"],
            attack_dump="attack",
            tactics=["TA0001"],
            techniques=["T1059"],
            techniques_id=["T1059.001"],
            mbc_dump="mbc",
            mbc_objectives=["obj1"],
            mbc_behaviors=["beh1"],
            mbc_behaviors_id=["B0001"],
        )
        assert c.capa_dump == "dump"
        assert "cap1" in c.capabilities
        assert "TA0001" in c.tactics


# ============================================================================
# Malcontent
# ============================================================================

class TestMalcontentDataclass:
    def test_creation(self):
        from redb.models.dataclasses import Malcontent

        m = Malcontent(
            malcontent_dump='{"RiskScore": 2}',
            version="malcontent v1.0.0",
            risk_score=2,
            risk_level="MEDIUM"
        )
        assert m.malcontent_dump == '{"RiskScore": 2}'
        assert m.version == "malcontent v1.0.0"
        assert m.risk_score == 2
        assert m.risk_level == "MEDIUM"

    def test_with_json_content(self):
        from redb.models.dataclasses import Malcontent
        import json

        # Now stores unwrapped content (without Files/<path> wrapper)
        file_content = {
            "RiskScore": 3,
            "RiskLevel": "HIGH",
            "IsMalcontent": True,
            "Behaviors": [
                {"RuleName": "exec/shell", "RiskLevel": "HIGH", "Description": "executes shell commands"}
            ]
        }
        m = Malcontent(
            malcontent_dump=json.dumps(file_content),
            version="v0.5.0",
            risk_score=3,
            risk_level="HIGH"
        )
        parsed = json.loads(m.malcontent_dump)
        assert parsed["RiskLevel"] == "HIGH"
        assert parsed["Behaviors"][0]["RuleName"] == "exec/shell"

    def test_asdict(self):
        from redb.models.dataclasses import Malcontent
        from dataclasses import asdict

        m = Malcontent(malcontent_dump="{}", version="v1", risk_score=0, risk_level="")
        d = asdict(m)
        assert d == {"malcontent_dump": "{}", "version": "v1", "risk_score": 0, "risk_level": ""}


# ============================================================================
# String
# ============================================================================

class TestStringDataclass:
    def test_creation(self):
        from redb.models.dataclasses import String

        s = String(string="hello", string_length=5, string_entropy=2.3, string_frequency=10)
        assert s.string == "hello"
        assert s.md5 == []
        assert s.sha1 == []
        assert s.sha256 == []

    def test_with_hashes(self):
        from redb.models.dataclasses import String

        s = String(
            string="test", string_length=4, string_entropy=2.0, string_frequency=1,
            md5=["abc"], sha256=["def"],
        )
        assert s.md5 == ["abc"]
        assert s.sha256 == ["def"]


# ============================================================================
# PE Dataclasses
# ============================================================================

class TestPEDataclass:
    def test_required_fields(self):
        from redb.models.dataclasses import PE

        pe = PE(
            dos_header="dos", nt_header="nt", optional_header="opt",
            file_header="fh", magic="0x10b", entry_point="0x1000",
            major_linker_version=14, minor_linker_version=0,
            target_machine="I386", architecture="x86",
            compilation_time=1609459200, compilation_time_utc="2021-01-01T00:00:00",
            is_dotnet=False, is_signed=False, has_overlay=False,
            number_of_sections=4, number_of_imports=10,
            number_of_exports=0, number_of_resources=2,
            type="EXE",
        )
        assert pe.architecture == "x86"
        assert pe.type == "EXE"

    def test_optional_fields_default_none(self):
        from redb.models.dataclasses import PE

        pe = PE(
            dos_header="d", nt_header="n", optional_header="o",
            file_header="f", magic="m", entry_point="e",
            major_linker_version=0, minor_linker_version=0,
            target_machine="t", architecture="a",
            compilation_time=0, compilation_time_utc="",
            is_dotnet=False, is_signed=False, has_overlay=False,
            number_of_sections=0, number_of_imports=0,
            number_of_exports=0, number_of_resources=0,
            type="DLL",
        )
        assert pe.dbg_struct is None
        assert pe.tls_struct is None
        assert pe.rich_header_dump is None
        assert pe.version_info is None


class TestPEImportDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEImport

        pi = PEImport(pe_imports_total=5)
        assert pi.pe_imports_total == 5
        assert pi.pe_import_libraryName is None
        assert pi.pe_import_functions is None


class TestPESectionDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PESection

        ps = PESection(
            _id="sec_id", section_entropy=6.5, section_sha256="sha",
            section_md5="md5", section_name=".text", section_name_b64=".text",
            section_pointer_to_raw_data="0x400",
            section_size=4096, section_v_addr="0x1000",
            section_v_addr_hex="0x1000", section_v_size=8192,
        )
        assert ps.section_name == ".text"
        assert ps.section_entropy == 6.5


class TestPEResourceDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEResource

        pr = PEResource(
            _id="res_id", resource_type="RT_ICON", resource_entropy=3.5,
            resource_sha256="sha", resource_filetype="image/png",
            resource_magika="png", resource_language="LANG_ENGLISH",
            resource_sub_lang="SUBLANG_DEFAULT",
            resource_rva="0x2000", resource_size=1024,
        )
        assert pr.resource_type == "RT_ICON"


class TestPEOverlayDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEOverlay

        po = PEOverlay(
            _id="ovl_id", overlay_size=512, overlay_entropy=7.9,
            overlay_offset="0x5000", overlay_mimetype="application/octet-stream",
            overlay_type="data", overlay_magika="unknown",
            overlay_sha256="sha", overlay_sha1="sha1", overlay_md5="md5",
        )
        assert po.overlay_size == 512


class TestPESignerDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PESigner

        ps = PESigner(
            signer_serial_number="01", signer_subject="CN=Test",
            signer_issuer="CN=CA", signer_valid_from="2021-01-01",
            signer_valid_to="2025-01-01", signer_thumbprint="aabb",
            signer_algorithm="sha256WithRSAEncryption",
        )
        assert ps.signer_subject == "CN=Test"


class TestPECertificateDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PECertificate

        pc = PECertificate(
            certificate_serial_number="02", certificate_subject="CN=Cert",
            certificate_issuer="CN=CA", certificate_valid_from="2021-01-01",
            certificate_valid_to="2025-01-01", certificate_thumbprint="ccdd",
            certificate_algorithm="sha256",
        )
        assert pc.certificate_serial_number == "02"


class TestPECodeSigningInfoDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PECodeSigningInfo

        cs = PECodeSigningInfo(
            _id="cs_id", signature_verified=True, number_of_certificates=2,
        )
        assert cs.signature_verified is True
        assert cs.x509_certificates is None

    def test_with_certificates(self):
        from redb.models.dataclasses import PECodeSigningInfo

        cs = PECodeSigningInfo(
            _id="cs_id", signature_verified=False, number_of_certificates=0,
            x509_certificates=[{"cn": "test"}],
        )
        assert len(cs.x509_certificates) == 1


class TestPEExtraFindingDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEExtraFinding

        ef = PEExtraFinding(context="anomaly_detection")
        assert ef.context == "anomaly_detection"
        assert ef.finding is None


class TestPEDotNetDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEDotNet

        dn = PEDotNet()
        assert dn.dotnet == {}

    def test_with_data(self):
        from redb.models.dataclasses import PEDotNet

        dn = PEDotNet(dotnet={"runtime": "v4.0.30319"})
        assert dn.dotnet["runtime"] == "v4.0.30319"


class TestDotNetInconsistencyTestsDataclass:
    def test_creation(self):
        from redb.models.dataclasses import DotNetInconsistencyTests

        it = DotNetInconsistencyTests(
            test_dotnet_data_dir_hidden=False,
            test_dotnet_fake_types=True,
            test_dotnet_extra_data=None,
            test_dotnet_invalid_type_ref=False,
            test_dotnet_fake_datastreams=False,
            test_dotnet_extra_module_table=None,
            test_dotnet_extra_assembly_table=False,
            test_dotnet_invalid_strings_stream=False,
            test_dotnet_streams_mixed_case=True,
            test_dotnet_method_def_invalid_table=False,
            test_dotnet_max_len_exceeding_strings=False,
        )
        assert it.test_dotnet_fake_types is True
        assert it.test_dotnet_extra_data is None


class TestPEInconsistencyTestsDataclass:
    def test_creation(self):
        from redb.models.dataclasses import PEInconsistencyTests

        it = PEInconsistencyTests(
            test_rich_header_checksum=True,
            test_rich_header_duplicate=False,
            test_rich_header_linker=None,
            test_rich_header_import_count=True,
        )
        assert it.test_rich_header_checksum is True
        assert it.test_rich_header_linker is None


# ============================================================================
# YARA Dataclasses
# ============================================================================

class TestYaraRuleDataclass:
    def test_creation(self):
        from redb.models.dataclasses import YaraRule

        yr = YaraRule(
            rule_name="test_rule",
            rule_tags=["malware", "trojan"],
            rule_meta={"author": "test", "description": "A test rule"},
        )
        assert yr.rule_name == "test_rule"
        assert "malware" in yr.rule_tags


class TestYaraMatchDataclass:
    def test_creation(self):
        from redb.models.dataclasses import YaraMatch

        ym = YaraMatch(rule_name="test_rule", match_strings=["$s1", "$s2"])
        assert ym.rule_name == "test_rule"
        assert len(ym.match_strings) == 2


# ============================================================================
# ELF Dataclasses
# ============================================================================

class TestELFFeaturesDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFFeatures

        ef = ELFFeatures(
            ei_class=2, ei_data=1, ei_version=1, ei_osabi=0, ei_abiversion=0,
            e_type=2, e_machine=62, e_version=1, e_entry=0x400000, e_flags=0,
            ei_class_str="ELFCLASS64", ei_data_str="ELFDATA2LSB",
            ei_osabi_str="ELFOSABI_SYSV", e_type_str="ET_EXEC",
            e_machine_str="EM_X86_64",
            is_64bit=1, is_stripped=0, is_pie=0, has_canary=1, has_nx=1,
            has_relro=1, has_fortify=0,
            number_of_segments=9, number_of_sections=31,
            number_of_symbols=100, number_of_dynamic_symbols=50,
            number_of_relocations=25, number_of_dependencies=5,
            gnu_hash_present=1, has_debug_info=0,
        )
        assert ef.ei_class == 2
        assert ef.e_machine_str == "EM_X86_64"
        assert ef.build_id is None

    def test_with_build_id(self):
        from redb.models.dataclasses import ELFFeatures

        ef = ELFFeatures(
            ei_class=2, ei_data=1, ei_version=1, ei_osabi=0, ei_abiversion=0,
            e_type=3, e_machine=62, e_version=1, e_entry=0, e_flags=0,
            ei_class_str="64", ei_data_str="LE", ei_osabi_str="SYSV",
            e_type_str="DYN", e_machine_str="X86_64",
            is_64bit=1, is_stripped=1, is_pie=1, has_canary=0, has_nx=1,
            has_relro=1, has_fortify=0,
            number_of_segments=8, number_of_sections=28,
            number_of_symbols=0, number_of_dynamic_symbols=30,
            number_of_relocations=10, number_of_dependencies=3,
            gnu_hash_present=1, has_debug_info=0,
            build_id="abc123def456",
        )
        assert ef.build_id == "abc123def456"


class TestELFDependencyDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFDependency

        dep = ELFDependency(
            dependency_name="libc.so.6",
            dependency_type=1,
            dependency_type_str="NEEDED",
        )
        assert dep.dependency_name == "libc.so.6"


class TestELFImportDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFImport

        ei = ELFImport(elf_imports_total=3)
        assert ei.elf_imports_total == 3
        assert ei.elf_import_libraries == []
        assert ei.elf_import_functions == []


class TestELFExportDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFExport

        ee = ELFExport(elf_exports_total=5)
        assert ee.elf_exports_total == 5
        assert ee.elf_export_functions == []


class TestELFSectionDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFSection

        es = ELFSection(
            section_name=".text", section_type=1, section_type_str="SHT_PROGBITS",
            section_flags=6, section_flags_str=["SHF_ALLOC", "SHF_EXECINSTR"],
            section_addr=0x400000, section_offset=0x1000, section_size=4096,
            section_link=0, section_info=0, section_addralign=16, section_entsize=0,
            section_entropy=6.8, section_sha256="sha", section_md5="md5",
        )
        assert es.section_name == ".text"
        assert "SHF_ALLOC" in es.section_flags_str


class TestELFSegmentDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFSegment

        seg = ELFSegment(
            segment_type=1, segment_type_str="PT_LOAD",
            segment_flags=5, segment_flags_str=["PF_R", "PF_X"],
            segment_offset=0, segment_vaddr=0x400000, segment_paddr=0x400000,
            segment_filesz=0x1000, segment_memsz=0x1000, segment_align=0x200000,
            segment_entropy=5.5, segment_sha256="sha", segment_md5="md5",
        )
        assert seg.segment_type_str == "PT_LOAD"


class TestELFSymbolDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFSymbol

        sym = ELFSymbol(
            symbol_name="main", symbol_value=0x401000, symbol_size=100,
            symbol_type=2, symbol_type_str="STT_FUNC",
            symbol_bind=1, symbol_bind_str="STB_GLOBAL",
            symbol_visibility=0, symbol_visibility_str="STV_DEFAULT",
            symbol_section_index=14, symbol_section_index_str="14",
            is_dynamic=0,
        )
        assert sym.symbol_name == "main"
        assert sym.symbol_type_str == "STT_FUNC"


class TestELFRelocationDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFRelocation

        rel = ELFRelocation(
            relocation_offset=0x601000, relocation_type=7,
            relocation_type_str="R_X86_64_JUMP_SLOT",
            relocation_symbol_index=1, relocation_symbol_name="printf",
            relocation_section=".rela.plt",
        )
        assert rel.relocation_addend is None

    def test_with_addend(self):
        from redb.models.dataclasses import ELFRelocation

        rel = ELFRelocation(
            relocation_offset=0x601000, relocation_type=7,
            relocation_type_str="R_X86_64_JUMP_SLOT",
            relocation_symbol_index=1, relocation_symbol_name="printf",
            relocation_section=".rela.plt",
            relocation_addend=-4,
        )
        assert rel.relocation_addend == -4


class TestELFNoteDataclass:
    def test_creation(self):
        from redb.models.dataclasses import ELFNote

        note = ELFNote(
            note_name="GNU", note_type=3,
            note_type_str="NT_GNU_BUILD_ID",
            note_desc="abc123", note_section=".note.gnu.build-id",
        )
        assert note.note_name == "GNU"
        assert note.note_type_str == "NT_GNU_BUILD_ID"


# ============================================================================
# Decompiled
# ============================================================================

class TestDecompiledDataclass:
    def test_creation(self):
        from redb.models.dataclasses import Decompiled

        d = Decompiled(
            _id="func_hash",
            decompiled_function_name="main",
            decompiled_function_address="0x401000",
            decompiled_function="int main() { return 0; }",
        )
        assert d.decompiled_function_name == "main"