Nathan Fox

25 papers C 2Journal 21Unranked 2
YearRankTypeTitle / Venue / Authors
2025 J jnl
Ecol. Informatics
Nathan Fox, Enrico Di Minin, Neil Carter, Sabina Tomkins, Derek B. van Berkel
2025 J jnl
CoRR
Alyson East, Elizabeth G. Campolongo, Luke Meyers, S. M. Rayeed, Samuel Stevens, Iuliia Zarubiieva, Isadora E. Fluck, Jennifer C. Girón, Maximiliane Jousse, Scott C. Lowe, Kayla I Perry, Isabelle Betancourt, Noah Charney, Evan Donoso, Nathan Fox, Kim J. Landsbergen, Ekaterina Nepovinnykh, Michelle Ramirez, Parkash Singh, Khum Thapa-Magar, Matthew J. Thompson, Evan Waite, Tanya Y. Berger-Wolf, Hilmar Lapp, Paula M. Mabee, Graham Taylor, Sydne Record
2025 J jnl
Theor. Comput. Sci.
Lora Bailey, Heather C. Smith Blake, Garner Cochran, Nathan Fox, Michael Levet, Reem Mahmoud, Inne Singgih, Grace Stadnyk, Alexander Wiedemann
2024 J jnl
Theor. Comput. Sci.
Lora Bailey, Heather C. Smith Blake, Garner Cochran, Nathan Fox, Michael Levet, Reem Mahmoud, Elizabeth Bailey Matson, Inne Singgih, Grace Stadnyk, Xinyi Wang, Alexander Wiedemann
2024 conf
SWAT
Lora Bailey, Heather C. Smith Blake, Garner Cochran, Nathan Fox, Michael Levet, Reem Mahmoud, Inne Singgih, Grace Stadnyk, Alexander Wiedemann
2024 J jnl
CoRR
Lora Bailey, Heather C. Smith Blake, Garner Cochran, Nathan Fox, Michael Levet, Reem Mahmoud, Inne Singgih, Grace Stadnyk, Alexander Wiedemann
2024 J jnl
SoftwareX
Xiaohao Yang, Nathan Fox, Derek B. van Berkel, Mark Lindquist
2023 J jnl
CoRR
James Boyko, Joseph Cohen, Nathan Fox, Maria Han Veiga, Jennifer I-Hsiu Li, Jing Liu, Bernardo Modenesi, Andreas H. Rauch, Kenneth N. Reid, Soumi Tribedi, Anastasia Visheratina, Xin Xie
2023 conf
COCOON (1)
Lora Bailey, Heather C. Smith Blake, Garner Cochran, Nathan Fox, Michael Levet, Reem Mahmoud, Elizabeth Bailey Matson, Inne Singgih, Grace Stadnyk, Xinyi Wang, Alexander Wiedemann
2023 J jnl
CoRR
Lora Bailey, Heather C. Smith Blake, Garner Cochran, Nathan Fox, Michael Levet, Reem Mahmoud, Elizabeth Bailey Matson, Inne Singgih, Grace Stadnyk, Xinyi Wang, Alexander Wiedemann
2023 J jnl
Ecol. Informatics
Abdesslam Chai-Allah, Nathan Fox, Fritz Günther, Fadila Bentayeb, Gilles Brunschwig, Sandro Bimonte, Frederic Joly
2023 J jnl
SoftwareX
Derek B. van Berkel, Thomas Estabrook, Nathan Fox, Rahul Agrawal Bejarano, Lisa Maillard, Devin Gill, Erica Akemi Goto, María Carmen Lemos
2022 J jnl
Discret. Appl. Math.
Nathan Fox, Carson Geissler
2021 J jnl
CoRR
Nathan Fox, Carson Geissler
2020 J jnl
SoftwareX
Nathan Fox, Tom August, Francesca Mancini, Katherine E. Parks, Felix Eigenbrod, James M. Bullock, Louis Sutter, Laura J. Graham
2018 J jnl
J. Symb. Comput.
Nathan Fox
2017 J jnl
J. Integer Seq.
Nathan Fox
2017 J jnl
Complex.
Altug Alkan, Nathan Fox, O. Ozgur Aybar
2016 J jnl
Integers
Nathan Fox
2015 J jnl
J. Integer Seq.
Urban Larsson, Nathan Fox
2014 J jnl
Integers
Francine Blanchet-Sadri, James D. Currie, Narad Rampersad, Nathan Fox
2014 J jnl
Adv. Appl. Math.
Francine Blanchet-Sadri, Nathan Fox, Narad Rampersad
2013 C conf
LATA
Francine Blanchet-Sadri, Michelle Bodnar, Nathan Fox, Joe Hidakatsu
2013 J jnl
Theor. Comput. Sci.
Francine Blanchet-Sadri, Nathan Fox
2013 C conf
Developments in Language Theory
Francine Blanchet-Sadri, Nathan Fox
tests/unit/test_decompile_utils.py
← Index tests/unit/test_decompile_utils.py python
"""Unit tests for decompiler utility modules:
- bninja/utils/hashes.py
- bninja/utils/json_encoder.py
- bninja/analysis/low_level_normalization.py
"""
import hashlib
import json
import pytest


# ============================================================================
# 1a. hashes.py
# ============================================================================

from redb.extractors.decompiler.bninja.utils.hashes import (
    calculate_md5,
    calculate_sha256,
    calculate_tlsh,
)


class TestCalculateMD5:
    def test_calculate_md5_known_value(self):
        expected = hashlib.md5(b"test").hexdigest()
        assert calculate_md5("test") == expected

    def test_calculate_md5_empty(self):
        expected = hashlib.md5(b"").hexdigest()
        assert calculate_md5("") == expected


class TestCalculateSHA256:
    def test_calculate_sha256_known_value(self):
        expected = hashlib.sha256(b"hello world").hexdigest()
        assert calculate_sha256("hello world") == expected

    def test_calculate_sha256_empty_string(self):
        result = calculate_sha256("")
        assert len(result) == 64
        assert all(c in "0123456789abcdef" for c in result)


class TestCalculateTLSH:
    def test_calculate_tlsh_long_data(self):
        # TLSH requires >= 50 bytes
        data = "A" * 100
        result = calculate_tlsh(data)
        assert result is not None
        assert isinstance(result, str)

    def test_calculate_tlsh_short_data(self):
        data = "A" * 10
        result = calculate_tlsh(data)
        assert result is None

    def test_calculate_tlsh_deterministic(self):
        data = "x" * 200
        assert calculate_tlsh(data) == calculate_tlsh(data)



# ============================================================================
# 1b. json_encoder.py
# ============================================================================

from redb.extractors.decompiler.bninja.utils.json_encoder import BinaryNinjaEncoder


class TestBinaryNinjaEncoder:
    def test_encode_value_confidence_object(self):
        obj = type("VC", (), {"value": 42, "confidence": 255})()
        result = json.dumps(obj, cls=BinaryNinjaEncoder)
        assert json.loads(result) == 42

    def test_encode_str_fallback(self):
        obj = type("Obj", (), {"__str__": lambda self: "custom_repr"})()
        result = json.dumps(obj, cls=BinaryNinjaEncoder)
        assert json.loads(result) == "custom_repr"

    def test_encode_normal_types(self):
        data = {"a": 1, "b": [2, 3], "c": "hello"}
        result = json.dumps(data, cls=BinaryNinjaEncoder)
        assert json.loads(result) == data

    def test_encode_set_via_str(self):
        # Python sets have __str__, so BinaryNinjaEncoder converts them
        # to their string repr instead of raising TypeError.
        result = json.dumps(set([1, 2, 3]), cls=BinaryNinjaEncoder)
        parsed = json.loads(result)
        assert isinstance(parsed, str)
        assert "1" in parsed


# ============================================================================
# 1c. low_level_normalization.py
# ============================================================================

from redb.extractors.decompiler.bninja.analysis.low_level_normalization import (
    LowLevelNormalization,
)


class MockIL:
    """Mock IL node for normalization tests."""
    def __init__(self, operation, operands=None):
        self.operation = operation
        self.operands = operands or []


class TestLowLevelNormalization:
    def setup_method(self):
        self.normalizer = LowLevelNormalization()

    def test_normalize_single_instruction(self):
        node = MockIL(operation=5)
        result = self.normalizer.normalize_instruction_all_levels(node)
        assert result == [5]

    def test_normalize_nested_operands(self):
        child1 = MockIL(operation=10)
        child2 = MockIL(operation=20)
        root = MockIL(operation=1, operands=[child1, child2])
        result = self.normalizer.normalize_instruction_all_levels(root)
        assert result == [1, 10, 20]

    def test_normalize_empty_operands(self):
        node = MockIL(operation=42, operands=[])
        result = self.normalizer.normalize_instruction_all_levels(node)
        assert result == [42]

    def test_normalize_list_operands(self):
        # Simulates phi-node style list operands
        inner = MockIL(operation=99)
        node = MockIL(operation=7, operands=[[inner]])
        result = self.normalizer.normalize_instruction_all_levels(node)
        assert result == [7, 99]

    def test_normalize_none_input(self):
        result = self.normalizer.normalize_instruction_all_levels(None)
        assert result == []