Vimbi Viswan

13 papers B 1Journal 7Unranked 5
YearRankTypeTitle / Venue / Authors
2026 J jnl
Brain Informatics
Vimbi Viswan, Noushath Shaffi, Malathy Emperuman, Chemmalar Selvi G., B. R. Kavitha, Abdelhamid Abdesselam, Shuqiang Wang, Ponnuthurai N. Suganthan, Ibrahim Al Shezawi, Mufti Mahmud
2025 J jnl
Cogn. Comput.
Vimbi Viswan, Noushath Shaffi, Mohamed A. K. Sadiq, Srinivasa Rao Sirasanagandla, V. N. Manjunath Aradhya, M. Shamim Kaiser, Shuqiang Wang, Mufti Mahmud
2025 conf
HCI (77)
Mufti Mahmud, David J. Brown, Yuan Shen, Muhammad Arifur Rahman, Jun He, M. Shamim Kaiser, Hamzah Luqman, Sajib Mistry, Noushath Shaffi, Vimbi Viswan, M. Mostafizur Rahman, Shamim Al Mamun, Tamanna Sharmeen, Rasha Alahmad, V. N. Manjunath Aradhya, Mohammad Farukh Hashmi, Shuqiang Wang, Cosimo Ieracitano, Nadia Mammone, Maryam Doborjeh, Kanad Ray
2024 J jnl
Brain Informatics
Noushath Shaffi, Vimbi Viswan, Mufti Mahmud
2024 J jnl
Cogn. Comput.
Vimbi Viswan, Noushath Shaffi, Mufti Mahmud, Karthikeyan Subramanian, Faizal Hajamohideen
2024 J jnl
Brain Informatics
Vimbi Viswan, Noushath Shaffi, Mufti Mahmud
2024 J jnl
Int. J. Neural Syst.
Noushath Shaffi, Karthikeyan Subramanian, Vimbi Viswan, Faizal Hajamohideen, Abdelhamid Abdesselam, Mufti Mahmud
2024 B conf
IJCNN
Noushath Shaffi, Vimbi Viswan, Mufti Mahmud
2023 conf
SSCI
Vimbi Viswan, Noushath Shaffi, Mufti Mahmud, Karthikeyan Subramanian, Faizal Hajamohideen
2023 conf
BI
Noushath Shaffi, Vimbi Viswan, Mufti Mahmud, Karthikeyan Subramanian, Faizal Hajamohideen
2023 J jnl
Brain Informatics
Faizal Hajamohideen, Noushath Shaffi, Mufti Mahmud, Karthikeyan Subramanian, Arwa Al Sariri, Vimbi Viswan, Abdelhamid Abdesselam
2023 conf
WI/IAT
Noushath Shaffi, Vimbi Viswan, Mufti Mahmud, Faizal Hajamohideen, Karthikeyan Subramanian
2023 conf
SSCI
Noushath Shaffi, Vimbi Viswan, Mufti Mahmud, Faizal Hajamohideen, Karthikeyan Subramanian
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 == []