Haihan Duan

54 papers A* 6A 2B 4C 7Misc 1Journal 25Unranked 9
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Yuyang Qin, Haihan Duan
2026 J jnl
Future Internet
Daren Wang, Tengfei Ma, Juntao Zhu, Haihan Duan
2026 B conf
NOSSDAV
Tao Lyu, Cong Zhang, Haihan Duan, Xiaoyi Fan, Xiping Hu, Laizhong Cui
2026 J jnl
IEEE Internet Things J.
Jingrui Zhang, Yimeng Xu, Shujie Li, Feng Liang, Haihan Duan, Yanjie Dong, Victor C. M. Leung, Xiping Hu
2026 B conf
NOSSDAV
Sirui Zhang, Yuying Li, Cong Zhang, Xiaoyi Fan, Xiping Hu, Haihan Duan
2026 J jnl
ACM Trans. Web
Kun Yang, Haihan Duan, Yubo Zhao, Jiale Cheng, Runhao Zeng, Xiping Hu
2026 A* conf
AAAI
Qiwei Liang, Boyang Cai, Rongyi He, Hui Li, Tao Teng, Haihan Duan, Changxin Huang, Runhao Zeng
2025 C conf
CloudCom
Qilu Wu, Xiaoyi Fan, Zhen Zhang, Yang Zhou, Yike Li, Haihan Duan
2025 A conf
ICME
Lehao Lin, Hong Kang, Yuqi Shi, Haihan Duan, Abdulmotaleb El Saddik, Wei Cai
2025 C conf
CloudCom
Jiajie Shi, Yuyang Qin, Hengming Dai, Xiaoyi Fan, Haihan Duan
2025 J jnl
IEEE Netw.
Haihan Duan, Abdulmotaleb El Saddik, Xiping Hu
2025 B conf
IEEE Big Data
Zhen Ren, Haihan Duan, Hengming Dai, Xiaoyi Fan, Cong Zhang, Xiping Hu
2025 C conf
CloudCom
Zhen Ren, Xiaoyi Fan, Cong Zhang, Hengming Dai, Haihan Duan
2025 J jnl
IEEE Trans. Mob. Comput.
Haihan Duan, Tengfei Ma, Yuyang Qin, Runhao Zeng, Wei Cai, Victor C. M. Leung, Xiping Hu
2025 J jnl
CoRR
Jingrui Zhang, Yimeng Xu, Shujie Li, Feng Liang, Haihan Duan, Yanjie Dong, Victor C. M. Leung, Xiping Hu
2025 J jnl
Int. J. Comput. Vis.
Junhua Liao, Haihan Duan, Kanghui Feng, Wanbing Zhao, Yanbing Yang, Liangyin Chen, Yanru Chen
2025 J jnl
IEEE J. Sel. Top. Appl. Earth Obs. Remote. Sens.
Hengming Dai, Zhifang Zhao, Huiwei Jiang, Jiabo Xu, Haihan Duan, Xiangyun Hu
2025 A* conf
WWW
Yanxuan Wu, Haihan Duan, Xitong Li, Xiping Hu
2025 J jnl
BMC Medical Imaging
Hang Qu, Qiqi Ban, LiangXue Zhou, Haihan Duan, Wei Wang, AiJun Peng
2025 C conf
CloudCom
Hengming Dai, Haihan Duan, Cong Zhang, Yang Zhou, Xiaoyi Fan, Zhifang Zhao
2025 J jnl
CoRR
Qiwei Liang, Boyang Cai, Rongyi He, Hui Li, Tao Teng, Haihan Duan, Changxin Huang, Runhao Zeng
2024 J jnl
IEEE Trans. Circuits Syst. Video Technol.
Junhua Liao, Haihan Duan, Wanbing Zhao, Kanghui Feng, Yanbing Yang, Liangyin Chen
2024 conf
SmartIoT
Yumeng Peng, Haihan Duan
2024 conf
SmartIoT
Xinyi Shi, Haihan Duan
2024 J jnl
IEEE Trans. Comput. Soc. Syst.
Haihan Duan, Abdulmotaleb El Saddik, Wei Cai
2024 J jnl
IEEE Trans. Netw. Sci. Eng.
Yuanfang Chi, Haihan Duan, Wei Cai, Z. Jane Wang, Victor C. M. Leung
2024 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Haihan Duan, Junhua Liao, Lehao Lin, Abdulmotaleb El Saddik, Wei Cai
2024 J jnl
CoRR
Yuyue Liu, Haihan Duan, Wei Cai
2024 J jnl
ACM Trans. Multim. Comput. Commun. Appl.
Hongzhou Chen, Haihan Duan, Maha Abdallah, Yufeng Zhu, Yonggang Wen, Abdulmotaleb El Saddik, Wei Cai
2023 A* conf
CVPR
Junhua Liao, Haihan Duan, Kanghui Feng, Wanbing Zhao, Yanbing Yang, Liangyin Chen
2023 J jnl
CoRR
Junhua Liao, Haihan Duan, Kanghui Feng, Wanbing Zhao, Yanbing Yang, Liangyin Chen
2023 A* conf
ACM Multimedia
Zhonghao Lin, Haihan Duan, Jiaye Li, Xinyao Sun, Wei Cai
2023 J jnl
CoRR
Zhonghao Lin, Haihan Duan, Jiaye Li, Xinyao Sun, Wei Cai
2023 J jnl
IEEE Commun. Mag.
Haihan Duan, Zhonghao Lin, Xiao Wu, Wei Cai
2023 J jnl
IEEE Netw.
Yuanfang Chi, Haihan Duan, Wei Cai, Z. Jane Wang, Victor C. M. Leung
2023 C conf
ICCE
Hao Wu, Jinghan Sun, Haihan Duan, Wei Cai
2023 A conf
MMSys
Lehao Lin, Haihan Duan, Wei Cai
2022 Misc conf
ICASSP
Junhua Liao, Haihan Duan, Wanbin Zhao, Yanbing Yang, Liangyin Chen
2022 J jnl
ACM Trans. Sens. Networks
Yimin Shi, Haihan Duan, Lei Yang, Wei Cai
2022 C conf
MMSP
Haihan Duan, Xiao Wu, Wei Cai
2022 B conf
NOSSDAV
Haihan Duan, Junhua Liao, Lehao Lin, Wei Cai
2022 C conf
CoG
Haihan Duan, Yiwei Huang, Yifan Zhao, Zhen Huang, Wei Cai
2022 conf
GEM
Zhonghao Lin, Haihan Duan, Zikai Alex Wen, Wei Cai
2022 J jnl
CoRR
Zhonghao Lin, Haihan Duan, Zikai Wen, Wei Cai
2021 A* conf
ACM Multimedia
Haihan Duan, Jiaye Li, Sizheng Fan, Zhonghao Lin, Xiao Wu, Wei Cai
2021 J jnl
CoRR
Haihan Duan, Jiaye Li, Sizheng Fan, Zhonghao Lin, Xiao Wu, Wei Cai
2021 conf
GameSys@MMSys
Yu Chen, Haihan Duan, Wei Cai
2020 conf
ICA3PP (2)
Zhengjia Cao, Bowen Xiao, Haihan Duan, Lei Yang, Wei Cai
2020 J jnl
IEEE Access
Haihan Duan, Miao Huang, Yanbing Yang, Jie Hao, Liangyin Chen
2020 conf
INFOCOM Workshops
Miao Huang, Haihan Duan, Yanru Chen, Yanbing Yang, Jie Hao, Liangyin Chen
2020 conf
ICA3PP (2)
Yimin Shi, Haihan Duan, Yuanfang Chi, Keke Gai, Wei Cai
2020 conf
INFOCOM Workshops
Zequn Chen, Runji Lin, Haihan Duan, Yanru Chen, Yanbing Yang, Rengmao Wu, Liangyin Chen
2020 A* conf
ACM Multimedia
Junhua Liao, Haihan Duan, Xin Li, Haoran Xu, Yanbing Yang, Wei Cai, Yanru Chen, Liangyin Chen
2019 conf
AIPR
Junhua Liao, Haihan Duan, Huming Dai, Yunzhi Huang, Lunxin Liu, Liangyin Chen, LiangXue Zhou
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 == []