Nathaniel D. Bastian

153 papers A* 4A 3B 3C 2Misc 6Journal 84Unranked 51
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Yu Li, Sizhe Tang, Rongqian Chen, Fei Xu Yu, Guangyu Jiang, Mahdi Imani, Nathaniel D. Bastian, Tian Lan
2026 A* conf
AAAI
Mario A. Leiva, Noel Ngu, Joshua Shay Kricheli, Aditya Taparia, Ransalu Senanayake, Paulo Shakarian, Nathaniel D. Bastian, John Corcoran, Gerardo I. Simari
2026 J jnl
Frontiers Artif. Intell.
Prathyush Poduval, Hamza Errahmouni Barkam, Xiangjian Liu, Sanggeon Yun, Yang Ni, Zhuowen Zou, Nathaniel D. Bastian, Mohsen Imani
2026 J jnl
CoRR
Chung-En Johnny Yu, Brian Jalaian, Nathaniel D. Bastian
2026 A* conf
AAAI
Toan D. Gian, Mohammad Abdi, Nathaniel D. Bastian, Francesco Restuccia
2025 J jnl
CoRR
Sanggeon Yun, Ryozo Masukawa, Hyunwoo Oh, Nathaniel D. Bastian, Mohsen Imani
2025 conf
DySPAN
Jin Feng Lin, Charles Montes, Nathaniel D. Bastian, Ruolin Zhou
2025 conf
MILCOM
Priscila Silva, Gaspard Baye, Nicola Costagliola, Nathaniel D. Bastian, Gökhan Kul, Lance Fiondella
2025 C conf
SECRYPT
Emilia Rivas, Sabrina Saika, Ahtesham Bakht, Aritran Piplai, Nathaniel D. Bastian, Ankit Shah
2025 J jnl
CoRR
Emilia Rivas, Sabrina Saika, Ahtesham Bakht, Aritran Piplai, Nathaniel D. Bastian, Ankit Shah
2025 J jnl
CoRR
Alexandre Broggi, Nathaniel D. Bastian, Lance Fiondella, Gökhan Kul
2025 conf
CDC
Armita Kazeminajafabadi, Michael Everett, Tian Lan, Nathaniel D. Bastian, Mahdi Imani
2025 conf
MILCOM
Guangyu Jiang, Mahdi Imani, Nathaniel D. Bastian, Tian Lan
2025 J jnl
CoRR
Chung-En Yu, Brian Jalaian, Nathaniel D. Bastian
2025 conf
MILCOM
Tyler Shumaker, Jessica Carpenter, David D. Saranchak, Nathaniel D. Bastian
2025 J jnl
CoRR
Tyler Shumaker, Jessica Carpenter, David D. Saranchak, Nathaniel D. Bastian
2025 conf
MILCOM
Eric Noah Savage, Nathaniel D. Bastian, Ruolin Zhou
2025 J jnl
CoRR
Trilok Padhi, Ramneet Kaur, Adam D. Cobb, Manoj Acharya, Anirban Roy, Colin Samplawski, Brian Matejek, Alexander M. Berenbeim, Nathaniel D. Bastian, Susmit Jha
2025 conf
MILCOM
Md Abrar Ibtesham, Lei Zhang, Joseph Riem, Tian Lan, Nathaniel D. Bastian, Gina C. Adam
2025 J jnl
Intell. Syst. Appl.
Calvin Yeung, Zhuowen Zou, Nathaniel D. Bastian, Mohsen Imani
2025 J jnl
CoRR
Mario A. Leiva, Noel Ngu, Joshua Shay Kricheli, Aditya Taparia, Ransalu Senanayake, Paulo Shakarian, Nathaniel D. Bastian, Jack Corcoran, Gerardo I. Simari
2025 A conf
DATE
Sanggeon Yun, Ryozo Masukawa, William Youngwoo Chung, Minhyoung Na, Nathaniel D. Bastian, Mohsen Imani
2025 J jnl
Eng. Appl. Artif. Intell.
David A. Bierbrauer, Sean M. Coffey, Mikal R. Willeke, John D. Beggs, Nathaniel D. Bastian
2025 J jnl
CoRR
Yerin Kim, Alexander Benvenuti, Bo Chen, Mustafa O. Karabag, Abhishek Ninad Kulkarni, Nathaniel D. Bastian, Ufuk Topcu, Matthew Hale
2025 conf
MILCOM
Syed Sameer Nadeem, Osama Yousuf, Joseph Riem, Tian Lan, Nathaniel D. Bastian, Gina C. Adam
2025 J jnl
ACM Trans. Priv. Secur.
Soumyadeep Hore, Jalal Ghadermazi, Diwas Paudel, Ankit Shah, Tapas K. Das, Nathaniel D. Bastian
2025 J jnl
IEEE Access
David Farr, Lynnette Hui Xian Ng, Iain J. Cruickshank, Nico Manzonelli, Nicholas Clark, Kate Starbird, Nathaniel D. Bastian, Jevin West
2025 J jnl
IEEE Access
Pahavalan Rajkumardheivanayahi, Ryan Berry, Nicola Costagliola, Lance Fiondella, Nathaniel D. Bastian, Gökhan Kul
2025 J jnl
Digit. Threat. Res. Pract.
Quoc H. Nguyen, Soumyadeep Hore, Ankit Shah, Trung Q. Le, Nathaniel D. Bastian
2025 J jnl
IEEE Trans. Inf. Forensics Secur.
Jalal Ghadermazi, Soumyadeep Hore, Ankit Shah, Nathaniel D. Bastian
2025 conf
L4DC
Amirhossein Ravari, Seyede Fatemeh Ghoreishi, Tian Lan, Nathaniel D. Bastian, Mahdi Imani
2025 J jnl
CoRR
Chung-En Yu, Hsuan-Chih Chen, Brian Jalaian, Nathaniel D. Bastian
2025 conf
INFOCOM WKSHPS
Egemen Erbayat, Yongsheng Mei, Gina C. Adam, Suresh Subramaniam, Sean M. Coffey, Nathaniel D. Bastian, Tian Lan
2025 J jnl
Frontiers Artif. Intell.
Calvin Yeung, Hamza Errahmouni Barkam, Zhuowen Zou, Sanggeon Yun, Nathaniel D. Bastian, Mohsen Imani
2025 J jnl
CoRR
Sanggeon Yun, Hyunwoo Oh, Ryozo Masukawa, Pietro Mercati, Nathaniel D. Bastian, Mohsen Imani
2025 conf
MILCOM
Jin Feng Lin, Charles Montes, Nathaniel D. Bastian, Ruolin Zhou
2025 conf
MILCOM
Mahdi Imani, Tian Lan, Nathaniel D. Bastian
2025 conf
MILCOM
Matthew L. Corbett, Jared M. Murphy, Nathaniel D. Bastian
2025 conf
AAAI Spring Symposia
Noel Ngu, Aditya Taparia, Gerardo I. Simari, Mario A. Leiva, Ransalu Senanayake, Paulo Shakarian, Nathaniel D. Bastian, John Corcoran
2025 J jnl
CoRR
Noel Ngu, Aditya Taparia, Gerardo I. Simari, Mario A. Leiva, Jack Corcoran, Ransalu Senanayake, Paulo Shakarian, Nathaniel D. Bastian
2025 conf
MILCOM
Milin Zhang, Michael J. De Lucia, Ananthram Swami, Jonathan D. Ashdown, Nathaniel D. Bastian, Francesco Restuccia
2025 conf
MILCOM
Huynh T. T. Tran, Jacob Sander, Achraf Cohen, Brian Jalaian, Nathaniel D. Bastian
2025 J jnl
CoRR
Huynh T. T. Tran, Jacob Sander, Achraf Cohen, Brian Jalaian, Nathaniel D. Bastian
2025 J jnl
J. Inf. Secur. Appl.
Alice Bizzarri, Chung-En Johnny Yu, Brian Jalaian, Fabrizio Riguzzi, Nathaniel D. Bastian
2025 J jnl
CoRR
Huynh T. T. Tran, Jacob Sander, Achraf Cohen, Brian Jalaian, Nathaniel D. Bastian
2025 J jnl
CoRR
Chung-En Johnny Yu, Hsuan-Chih Chen, Brian Jalaian, Nathaniel D. Bastian
2025 J jnl
CoRR
Fei Xu Yu, Gina C. Adam, Nathaniel D. Bastian, Tian Lan
2025 J jnl
Frontiers Artif. Intell.
Ryozo Masukawa, Sanggeon Yun, SungHeon Evan Jeong, Wenjun Huang, Yang Ni, Ian Bryant, Nathaniel D. Bastian, Mohsen Imani
2025 J jnl
CoRR
Ryozo Masukawa, Sanggeon Yun, Sungheon Jeong, Wenjun Huang, Yang Ni, Ian Bryant, Nathaniel D. Bastian, Mohsen Imani
2025 J jnl
CoRR
Yasir Ali Farrukh, Syed Wali, Irfan Khan, Nathaniel D. Bastian
2025 conf
AAAI Spring Symposia
Paulo Shakarian, Gerardo I. Simari, Nathaniel D. Bastian
2025 J jnl
CoRR
Paulo Shakarian, Gerardo I. Simari, Nathaniel D. Bastian
2025 J jnl
IEEE Trans. Reliab.
Priscila Silva, Gaspard Baye, Mindy Hotchkiss, Gökhan Kul, Nathaniel D. Bastian, Lance Fiondella
2025 conf
MILCOM
Nicola Costagliola, Goktug Ekinci, Nathaniel D. Bastian, Lance Fiondella, Gökhan Kul
2025 conf
MILCOM
A. Q. M. Sazzad Sayyed, Jonathan D. Ashdown, Michael De Lucia, Ananthram Swami, Nathaniel D. Bastian, Francesco Restuccia
2025 J jnl
Trans. Mach. Learn. Res.
Brian Matejek, Ashish Gehani, Nathaniel D. Bastian, Daniel J. Clouse, Bradford J. Kline, Susmit Jha
2025 conf
MILCOM
Alexandre Broggi, Nathaniel D. Bastian, Lance Fiondella, Gökhan Kul
2025 conf
MILCOM
Galamo F. Monkam, Jie Yan, Nathaniel D. Bastian
2025 J jnl
CoRR
Ayush Gupta, Anirban Roy, Rama Chellappa, Nathaniel D. Bastian, Alvaro Velasquez, Susmit Jha
2025 conf
HICSS
Ahtesham Bakht, Ankit Shah, Nathaniel D. Bastian
2025 J jnl
IEEE Trans. Big Data
Jalal Ghadermazi, Ankit Shah, Nathaniel D. Bastian
2025 J jnl
IEEE Access
Ryozo Masukawa, Sanggeon Yun, Sungheon Jeong, Nathaniel D. Bastian, Mohsen Imani
2025 conf
IEEECONF
Peng Wu, Amidu Kamara, Mohsen Imani, Nathaniel D. Bastian, Mahdi Imani
2025 J jnl
CoRR
Aditya Taparia, Noel Ngu, Mario A. Leiva, Joshua Shay Kricheli, John Corcoran, Nathaniel D. Bastian, Gerardo I. Simari, Paulo Shakarian, Ransalu Senanayake
2025 A conf
WACV
Hanning Chen, Yang Ni, Wenjun Huang, Yezi Liu, Sungheon Jeong, Fei Wen, Nathaniel D. Bastian, Hugo Latapie, Mohsen Imani
2025 J jnl
Expert Syst. Appl.
Yasir Ali Farrukh, Syed Wali, Irfan Khan, Nathaniel D. Bastian
2025 A conf
WACV
Anirban Roy, Adam D. Cobb, Ramneet Kaur, Sumit Jha, Nathaniel D. Bastian, Alexander M. Berenbeim, Robert H. Thomson, Iain Cruickshank, Alvaro Velasquez, Susmit Jha
2024 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Zong-Zhi Lin, Thomas D. Pike, Mark M. Bailey, Nathaniel D. Bastian
2024 B conf
ICCCN
Alice Bizzarri, Brian Jalaian, Fabrizio Riguzzi, Nathaniel D. Bastian
2024 J jnl
CoRR
Alice Bizzarri, Chung-En Yu, Brian Jalaian, Fabrizio Riguzzi, Nathaniel D. Bastian
2024 J jnl
Comput. Secur.
Soumyadeep Hore, Jalal Ghadermazi, Ankit Shah, Nathaniel D. Bastian
2024 J jnl
Comput. Secur.
Galamo Monkam, Michael J. De Lucia, Nathaniel D. Bastian
2024 conf
MILCOM
Emily A. Nack, Morgan C. McKenzie, Nathaniel D. Bastian
2024 J jnl
Comput. Secur.
Yasir Ali Farrukh, Syed Wali, Irfan Khan, Nathaniel D. Bastian
2024 J jnl
CoRR
Ramneet Kaur, Colin Samplawski, Adam D. Cobb, Anirban Roy, Brian Matejek, Manoj Acharya, Daniel Elenius, Alexander M. Berenbeim, John A. Pavlik, Nathaniel D. Bastian, Susmit Jha
2024 conf
IEEECONF
Amirhossein Ravari, Guangyu Jiang, Zuyuan Zhang, Mahdi Imani, Robert H. Thomson, Aryn A. Pyke, Nathaniel D. Bastian, Tian Lan
2024 conf
MILCOM
Joseph Riem, Lei Zhang, Jingdi Chen, Henry Mackay, Tian Lan, Nathaniel D. Bastian, Gina C. Adam
2024 J jnl
Optim. Lett.
Marc Chalé, Bruce Cox, Jeffery Weir, Nathaniel D. Bastian
2024 J jnl
CoRR
Sanggeon Yun, Ryozo Masukawa, William Youngwoo Chung, Minhyoung Na, Nathaniel D. Bastian, Mohsen Imani
2024 conf
MILCOM
Yerin Kim, Alexander Benvenuti, Bo Chen, Mustafa O. Karabag, Abhishek Ninad Kulkarni, Nathaniel D. Bastian, Ufuk Topcu, Matthew Hale
2024 J jnl
Commun. ACM
Andrew Strelzoff, Benjamin D. Trump, Christopher L. Cummings, Madison Smith, Stephanie Elisabeth Galaitsi, Kelsey Stoddard, Jeffrey M. Keisler, Moshe Y. Vardi, Nathaniel D. Bastian, Alexander Kott, Igor Linkov
2024 conf
MILCOM
Galamo F. Monkam, Nathaniel D. Bastian
2024 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Lei Zhang, Joseph Riem, Jingdi Chen, Henry Mackay, Tian Lan, Nathaniel D. Bastian, Gina C. Adam
2024 conf
AI*IA
Alice Bizzarri, Chung-En Yu, Brian Jalaian, Fabrizio Riguzzi, Nathaniel D. Bastian
2024 Misc conf
WSC
Alexander Wei, David A. Bierbrauer, Emily A. Nack, John A. Pavlik, Nathaniel D. Bastian
2024 conf
MILCOM
Alexander M. Berenbeim, Ramneet Kaur, Adam D. Cobb, Anirban Roy, Susmit Jha, Nathaniel D. Bastian
2024 B conf
ICCCN
Priscila Silva, Gaspard Baye, Alexandre Broggi, Nathaniel D. Bastian, Gökhan Kul, Lance Fiondella
2024 A* conf
NeurIPS
Jingdi Chen, Hanhan Zhou, Yongsheng Mei, Carlee Joe-Wong, Gina C. Adam, Nathaniel D. Bastian, Tian Lan
2024 J jnl
CoRR
Jingdi Chen, Hanhan Zhou, Yongsheng Mei, Carlee Joe-Wong, Gina C. Adam, Nathaniel D. Bastian, Tian Lan
2024 conf
SIGCSE (1)
Iain J. Cruickshank, Nathaniel D. Bastian, Jean R. S. Blair, Christa M. Chewar, Edward Sobiesk
2024 J jnl
CoRR
Yuzhou Nie, Yanting Wang, Jinyuan Jia, Michael J. De Lucia, Nathaniel D. Bastian, Wenbo Guo, Dawn Song
2024 conf
MILCOM
Jacob Sander, Chung-En Johnny Yu, Brian Jalaian, Nathaniel D. Bastian
2024 J jnl
CoRR
Hanning Chen, Yang Ni, Wenjun Huang, Yezi Liu, Sungheon Jeong, Fei Wen, Nathaniel D. Bastian, Hugo Latapie, Mohsen Imani
2024 J jnl
CoRR
Yasir Ali Farrukh, Syed Wali, Irfan Khan, Nathaniel D. Bastian
2024 conf
MILCOM
Gaspard Baye, Priscila Silva, Alexandre Broggi, Nathaniel D. Bastian, Lance Fiondella, Gökhan Kul
2023 J jnl
CoRR
Iain J. Cruickshank, Jessica Zhu, Nathaniel D. Bastian
2023 conf
MILCOM
Susmit Jha, Anirban Roy, Adam D. Cobb, Alexander M. Berenbeim, Nathaniel D. Bastian
2023 conf
MILCOM
Sumit Kumar Jha, Susmit Jha, Patrick Lincoln, Nathaniel D. Bastian, Alvaro Velasquez, Rickard Ewetz, Sandeep Neema
2023 J jnl
CoRR
Soumyadeep Hore, Jalal Ghadermazi, Diwas Paudel, Ankit Shah, Tapas K. Das, Nathaniel D. Bastian
2023 J jnl
Expert Syst. Appl.
Soumyadeep Hore, Ankit Shah, Nathaniel D. Bastian
2023 conf
ICAA
Susmit Jha, Sumit Kumar Jha, Patrick Lincoln, Nathaniel D. Bastian, Alvaro Velasquez, Sandeep Neema
2023 conf
MILCOM
Yasir Ali Farrukh, Syed Wali, Irfan Khan, Nathaniel D. Bastian
2023 J jnl
CoRR
Yasir Ali Farrukh, Syed Wali, Irfan Khan, Nathaniel D. Bastian
2023 conf
DSC
Soumyadeep Hore, Quoc H. Nguyen, Yulun Xu, Ankit Shah, Nathaniel D. Bastian, Trung Q. Le
2023 conf
CAI
Jingdi Chen, Lei Zhang, Joseph Riem, Gina C. Adam, Nathaniel D. Bastian, Tian Lan
2023 J jnl
CoRR
Alexander M. Berenbeim, Iain J. Cruickshank, Susmit Jha, Robert H. Thomson, Nathaniel D. Bastian
2023 J jnl
CoRR
Sumit Kumar Jha, Susmit Jha, Patrick Lincoln, Nathaniel D. Bastian, Alvaro Velasquez, Rickard Ewetz, Sandeep Neema
2023 conf
MILCOM
Brian Jalaian, Nathaniel D. Bastian
2023 conf
ICAA
Taylor Bradley, Elie Alhajjar, Nathaniel D. Bastian
2023 J jnl
CoRR
Taylor Bradley, Elie Alhajjar, Nathaniel D. Bastian
2023 J jnl
CoRR
Yash Chandak, Shiv Shankar, Nathaniel D. Bastian, Bruno Castro da Silva, Emma Brunskill, Philip S. Thomas
2023 B conf
NOMS
Gaspard Baye, Priscila Silva, Alexandre Broggi, Lance Fiondella, Nathaniel D. Bastian, Gökhan Kul
2023 conf
DSC
Galamo Monkam, Michael J. De Lucia, Nathaniel D. Bastian
2023 conf
DSC
Jingdi Chen, Lei Zhang, Joseph Riem, Gina C. Adam, Nathaniel D. Bastian, Tian Lan
2023 J jnl
CoRR
Jingdi Chen, Lei Zhang, Joseph Riem, Gina C. Adam, Nathaniel D. Bastian, Tian Lan
2023 J jnl
CoRR
Jingdi Chen, Hanhan Zhou, Yongsheng Mei, Gina C. Adam, Nathaniel D. Bastian, Tian Lan
2023 J jnl
Eng. Appl. Artif. Intell.
Yasir Ali Farrukh, Syed Wali, Irfan Khan, Nathaniel D. Bastian
2023 conf
DSC
Kelson J. McCollum, Nathaniel D. Bastian, Johannes O. Royset
2023 J jnl
Expert Syst. Appl.
David A. Bierbrauer, Michael J. De Lucia, Krishna Reddy, Paul Maxwell, Nathaniel D. Bastian
2023 Misc conf
WSC
Joshua A. Wong, Alexander M. Berenbeim, David A. Bierbrauer, Nathaniel D. Bastian
2022 J jnl
CoRR
Zong-Zhi Lin, Thomas D. Pike, Mark M. Bailey, Nathaniel D. Bastian
2022 J jnl
Inf. Sci.
John H. Smith, Nathaniel D. Bastian
2022 conf
MILCOM
Tarek F. Abdelzaher, Nathaniel D. Bastian, Susmit Jha, Lance M. Kaplan, Mani B. Srivastava, Venugopal V. Veeravalli
2022 J jnl
CoRR
Soumyadeep Hore, Ankit Shah, Nathaniel D. Bastian
2022 J jnl
Expert Syst. Appl.
Marc Chalé, Nathaniel D. Bastian
2022 A* conf
NeurIPS
Yash Chandak, Shiv Shankar, Nathaniel D. Bastian, Bruno C. da Silva, Emma Brunskill, Philip S. Thomas
2022 C conf
BDCAT
Yasir Ali Farrukh, Irfan Khan, Syed Wali, David A. Bierbrauer, John A. Pavlik, Nathaniel D. Bastian
2021 conf
MILCOM
Kevin Talty, John Stockdale, Nathaniel D. Bastian
2021 J jnl
Expert Syst. Appl.
Elie Alhajjar, Paul Maxwell, Nathaniel D. Bastian
2021 conf
HICSS
Sean M. Devine, Nathaniel D. Bastian
2021 J jnl
CoRR
David A. Bierbrauer, Alexander Chang, Will Kritzer, Nathaniel D. Bastian
2021 Misc conf
WSC
Marc Chalé, Nathaniel D. Bastian
2021 conf
IEEE BigData
Madeleine Schneider, David Aspinall, Nathaniel D. Bastian
2021 Misc conf
WSC
Adam D. Cobb, Brian Jalaian, Nathaniel D. Bastian, Stephen Russell
2020 J jnl
CoRR
Tyler J. Shipp, Daniel J. Clouse, Michael J. De Lucia, Metin B. Ahiskali, Kai Steverson, Jonathan M. Mullin, Nathaniel D. Bastian
2020 J jnl
CoRR
Elie Alhajjar, Paul Maxwell, Nathaniel D. Bastian
2020 J jnl
CoRR
Marc Chalé, Nathaniel D. Bastian, Jeffery Weir
2020 conf
WiseML@WiSec
Marc Chalé, Nathaniel D. Bastian, Jeffery Weir
2020 J jnl
CoRR
Kathleen Kerwin, Nathaniel D. Bastian
2020 J jnl
Stat. Anal. Data Min.
Timothy J. Kiely, Nathaniel D. Bastian
2019 conf
IEEE BigData
Paul Maxwell, Elie Alhajjar, Nathaniel D. Bastian
2019 J jnl
CoRR
Sean M. Devine, Nathaniel D. Bastian
2019 Misc conf
WSC
Sachin Shetty, Indrajit Ray, Nurcin Celik, Michael Mesham, Nathaniel D. Bastian, Quanyan Zhu
2019 Misc conf
WSC
Nathaniel D. Bastian, Christopher B. Fisher, Andrew O. Hall, Brian J. Lunday
2019 J jnl
CoRR
Timothy J. Kiely, Nathaniel D. Bastian
2017 J jnl
Expert Syst. Appl.
Tulasi K. Paradarami, Nathaniel D. Bastian, Jennifer L. Wightman
2017 conf
CRI
Joseph Klobusický, Alexander Murph, Alexander C. Robinson, Nathaniel D. Bastian, Paul M. Griffin, Shravan Kethireddy, Nathan Ryan
2017 J jnl
Interfaces
Sharan Srinivas, Mohammadmahdi Alizadeh, Nathaniel D. Bastian
2016 J jnl
Expert Syst. Appl.
Eric R. Swenson, Nathaniel D. Bastian, Harriet Black Nembhard
2016 J jnl
Optim. Lett.
Nathaniel D. Bastian, Paul M. Griffin, Eric Spero, Lawrence V. Fulton
2015 J jnl
Optim. Lett.
Benjamin C. Grannan, Nathaniel D. Bastian, Laura A. McLay
2015 J jnl
Interfaces
Nathaniel D. Bastian, Pat McMurry, Lawrence V. Fulton, Paul M. Griffin, Shisheng Cui, Thor Hanson, Sharan Srinivas
2013 J jnl
Simul.
Lawrence V. Fulton, Nathaniel D. Bastian, Francis A. Méndez Mediavilla, Rasim Muzaffer Musal
tests/unit/test_apk_dataclasses.py
← Index tests/unit/test_apk_dataclasses.py python
"""
Unit tests for APK dataclasses in redb/models/dataclasses.py.
"""
import pytest
from dataclasses import asdict, fields

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


# ============================================================================
# APKFeatures
# ============================================================================

class TestAPKFeaturesDataclass:
    """Tests for APKFeatures dataclass."""

    def test_named_fields(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.example.app",
            app_name="Example App",
            version_code=1,
            version_name="1.0.0",
        )
        assert f.package_name == "com.example.app"
        assert f.app_name == "Example App"
        assert f.version_code == 1
        assert f.version_name == "1.0.0"

    def test_all_fields_default_none_or_safe(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures()
        # Nullable fields default to None
        assert f.package_name is None
        assert f.app_name is None
        assert f.version_code is None
        assert f.version_name is None
        assert f.min_sdk_version is None
        assert f.target_sdk_version is None
        assert f.compile_sdk_version is None
        assert f.main_activity is None
        # Non-nullable fields have safe defaults
        assert f.is_debuggable is False
        assert f.allow_backup is True
        assert f.uses_cleartext_traffic is False
        assert f.supported_abis == []
        assert f.dex_count == 0
        assert f.total_dex_size == 0
        assert f.total_file_count == 0
        assert f.has_native_code is False
        assert f.has_assets is False
        assert f.uses_libraries == []
        assert f.earliest_content_modification is None
        assert f.latest_content_modification is None
        assert f.contains_embedded_apk is False

    def test_all_fields_populated(self):
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.malware.test",
            app_name="Malware",
            version_code=42,
            version_name="6.6.6",
            min_sdk_version=21,
            target_sdk_version=33,
            compile_sdk_version=33,
            main_activity="com.malware.test.MainActivity",
            is_debuggable=True,
            allow_backup=False,
            uses_cleartext_traffic=True,
            supported_abis=["armeabi-v7a", "arm64-v8a", "x86"],
            dex_count=3,
            total_dex_size=5000000,
            total_file_count=200,
            has_native_code=True,
            has_assets=True,
            uses_libraries=["com.google.android.maps"],
            earliest_content_modification="2024-01-01T00:00:00Z",
            latest_content_modification="2024-06-15T12:00:00Z",
            contains_embedded_apk=True,
        )
        assert f.is_debuggable is True
        assert f.dex_count == 3
        assert len(f.supported_abis) == 3
        assert f.contains_embedded_apk is True

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

        f = APKFeatures(
            package_name="com.test",
            app_name="Test",
            version_code=1,
            version_name="1.0",
        )
        d = asdict(f)
        assert d["package_name"] == "com.test"
        assert d["is_debuggable"] is False
        assert d["supported_abis"] == []

    def test_partial_extraction(self):
        """Verify that APKFeatures can be created with only some fields populated,
        simulating a partial extraction where some fields failed."""
        from redb.models.dataclasses import APKFeatures

        f = APKFeatures(
            package_name="com.example.app",
            # app_name failed to extract — left as None
            version_code=10,
            # version_name failed to extract — left as None
            is_debuggable=True,
            dex_count=2,
        )
        assert f.package_name == "com.example.app"
        assert f.app_name is None
        assert f.version_code == 10
        assert f.version_name is None
        assert f.is_debuggable is True
        assert f.dex_count == 2


# ============================================================================
# APKManifestComponent
# ============================================================================

class TestAPKManifestComponentDataclass:

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

        c = APKManifestComponent(
            component_type="activity",
            class_name="com.example.MainActivity",
            is_exported=True,
            intent_actions=["android.intent.action.MAIN"],
            intent_categories=["android.intent.category.LAUNCHER"],
        )
        assert c.component_type == "activity"
        assert c.class_name == "com.example.MainActivity"
        assert c.is_exported is True
        assert len(c.intent_actions) == 1
        assert len(c.intent_categories) == 1

    def test_defaults(self):
        from redb.models.dataclasses import APKManifestComponent

        c = APKManifestComponent(
            component_type="service",
            class_name="com.example.MyService",
            is_exported=False,
        )
        assert c.intent_actions == []
        assert c.intent_categories == []


# ============================================================================
# APKManifest
# ============================================================================

class TestAPKManifestDataclass:

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

        m = APKManifest(
            activity_count=5,
            service_count=2,
            receiver_count=3,
            provider_count=1,
        )
        assert m.activity_count == 5
        assert m.service_count == 2
        assert m.receiver_count == 3
        assert m.provider_count == 1

    def test_optional_list_defaults(self):
        from redb.models.dataclasses import APKManifest

        m = APKManifest(
            activity_count=0,
            service_count=0,
            receiver_count=0,
            provider_count=0,
        )
        assert m.activities == []
        assert m.services == []
        assert m.receivers == []
        assert m.providers == []
        assert m.exported_components == []
        assert m.intent_filters_by_action == []
        assert m.intent_filters_by_category == []
        assert m.uses_features == []
        assert m.meta_data is None
        assert m.manifest_xml is None

    def test_fully_populated(self):
        from redb.models.dataclasses import APKManifest

        m = APKManifest(
            activity_count=2,
            service_count=1,
            receiver_count=1,
            provider_count=0,
            activities=["MainActivity", "SettingsActivity"],
            services=["SyncService"],
            receivers=["BootReceiver"],
            providers=[],
            exported_components=["MainActivity", "BootReceiver"],
            intent_filters_by_action=["android.intent.action.MAIN"],
            uses_features=["android.hardware.camera"],
            manifest_xml="<manifest>...</manifest>",
        )
        assert len(m.activities) == 2
        assert len(m.exported_components) == 2
        assert m.manifest_xml is not None


# ============================================================================
# APKPermission / APKPermissions
# ============================================================================

class TestAPKPermissionDataclass:

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

        p = APKPermission(
            permission_name="android.permission.CAMERA",
            protection_level="dangerous",
        )
        assert p.permission_name == "android.permission.CAMERA"
        assert p.protection_level == "dangerous"
        assert p.is_custom is False

    def test_custom_permission(self):
        from redb.models.dataclasses import APKPermission

        p = APKPermission(
            permission_name="com.example.CUSTOM_PERM",
            protection_level="signature",
            is_custom=True,
        )
        assert p.is_custom is True


class TestAPKPermissionsDataclass:

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

        p = APKPermissions(
            total_permission_count=10,
            dangerous_permission_count=3,
        )
        assert p.total_permission_count == 10
        assert p.dangerous_permission_count == 3

    def test_defaults(self):
        from redb.models.dataclasses import APKPermissions

        p = APKPermissions(
            total_permission_count=0,
            dangerous_permission_count=0,
        )
        assert p.permissions == []
        assert p.dangerous_permissions == []
        assert p.custom_permissions == []
        assert p.permission_details == []
        assert p.permhash is None

    def test_with_permission_details(self):
        from redb.models.dataclasses import APKPermission, APKPermissions

        details = [
            APKPermission("android.permission.INTERNET", "normal"),
            APKPermission("android.permission.CAMERA", "dangerous"),
        ]
        p = APKPermissions(
            total_permission_count=2,
            dangerous_permission_count=1,
            permissions=["android.permission.INTERNET", "android.permission.CAMERA"],
            dangerous_permissions=["android.permission.CAMERA"],
            permission_details=details,
            permhash="abc123def456",
        )
        assert len(p.permission_details) == 2
        assert p.permhash == "abc123def456"


# ============================================================================
# APKCertificate / APKCodeSigningInfo
# ============================================================================

class TestAPKCertificateDataclass:

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

        c = APKCertificate(
            subject="CN=Android Debug",
            issuer="CN=Android Debug",
            serial_number="1234567890",
            valid_from="2024-01-01",
            valid_to="2054-01-01",
            thumbprint_sha1="aabbccdd" * 5,
            thumbprint_sha256="aabbccdd" * 8,
        )
        assert c.subject == "CN=Android Debug"
        assert c.issuer == "CN=Android Debug"
        assert c.is_self_signed is False

    def test_optional_fields(self):
        from redb.models.dataclasses import APKCertificate

        c = APKCertificate(
            subject="CN=Test",
            issuer="CN=CA",
            serial_number="1",
            valid_from="2024-01-01",
            valid_to="2025-01-01",
            thumbprint_sha1="aa" * 20,
            thumbprint_sha256="bb" * 32,
            algorithm="SHA256withRSA",
            key_size=2048,
            is_self_signed=True,
        )
        assert c.algorithm == "SHA256withRSA"
        assert c.key_size == 2048
        assert c.is_self_signed is True


class TestAPKCodeSigningInfoDataclass:

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

        info = APKCodeSigningInfo(
            _id="abcdef1234567890" * 4,
            is_signed=True,
        )
        assert info.is_signed is True
        assert info.signature_scheme_versions == []
        assert info.number_of_certificates == 0
        assert info.x509_certificates is None
        assert info.apk_signer_subject is None
        assert info.apk_signer_issuer is None

    def test_fully_populated(self):
        from redb.models.dataclasses import APKCertificate, APKCodeSigningInfo

        cert = APKCertificate(
            subject="CN=Test",
            issuer="CN=Test",
            serial_number="1",
            valid_from="2024-01-01",
            valid_to="2025-01-01",
            thumbprint_sha1="aa" * 20,
            thumbprint_sha256="bb" * 32,
        )
        info = APKCodeSigningInfo(
            _id="cc" * 32,
            is_signed=True,
            signature_scheme_versions=[1, 2, 3],
            number_of_certificates=1,
            x509_certificates=[cert],
            apk_signer_subject="CN=Test",
            apk_signer_issuer="CN=Test",
        )
        assert len(info.signature_scheme_versions) == 3
        assert info.number_of_certificates == 1
        assert len(info.x509_certificates) == 1


# ============================================================================
# APKDexFile
# ============================================================================

class TestAPKDexFileDataclass:

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

        d = APKDexFile(
            filename="classes.dex",
            sha256="aa" * 32,
            class_count=100,
            method_count=500,
            string_count=1000,
        )
        assert d.filename == "classes.dex"
        assert d.class_count == 100
        assert d.method_count == 500
        assert d.string_count == 1000

    def test_optional_fields_defaults(self):
        from redb.models.dataclasses import APKDexFile

        d = APKDexFile(
            filename="classes2.dex",
            sha256="bb" * 32,
            class_count=0,
            method_count=0,
            string_count=0,
        )
        assert d.tlsh is None
        assert d.top_packages is None
        assert d.api_usage is None
        assert d.obfuscation_indicators is None

    def test_tlsh_populated(self):
        from redb.models.dataclasses import APKDexFile

        tlsh_value = "T1" + "A" * 68
        d = APKDexFile(
            filename="classes.dex",
            sha256="aa" * 32,
            class_count=100,
            method_count=500,
            string_count=1000,
            tlsh=tlsh_value,
        )
        assert d.tlsh == tlsh_value

    def test_with_api_usage(self):
        from redb.models.dataclasses import APKDexFile

        d = APKDexFile(
            filename="classes.dex",
            sha256="cc" * 32,
            class_count=50,
            method_count=200,
            string_count=300,
            top_packages=[{"name": "com.example", "class_count": 30}],
            api_usage={
                "crypto": ["Ljavax/crypto/Cipher;->getInstance"],
                "reflection": ["Ljava/lang/Class;->forName"],
            },
            obfuscation_indicators={"short_class_names_ratio": 0.8, "single_char_methods_ratio": 0.5},
        )
        assert len(d.api_usage) == 2
        assert d.obfuscation_indicators["short_class_names_ratio"] == 0.8


# ============================================================================
# APKResource
# ============================================================================

class TestAPKResourceDataclass:

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

        r = APKResource(
            path="res/drawable/icon.png",
            size=1024,
            sha256="dd" * 32,
            filetype_magika="png",
        )
        assert r.path == "res/drawable/icon.png"
        assert r.size == 1024
        assert r.is_suspicious is False

    def test_suspicious_resource(self):
        from redb.models.dataclasses import APKResource

        r = APKResource(
            path="assets/payload.dex",
            size=50000,
            sha256="ee" * 32,
            filetype_magika="dex",
            is_suspicious=True,
        )
        assert r.is_suspicious is True


# ============================================================================
# APKNativeLib
# ============================================================================

class TestAPKNativeLibDataclass:

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

        lib = APKNativeLib(
            abi="arm64-v8a",
            filename="libnative.so",
            size=200000,
            sha256="ff" * 32,
        )
        assert lib.abi == "arm64-v8a"
        assert lib.filename == "libnative.so"
        assert lib.is_known_packer is False

    def test_known_packer(self):
        from redb.models.dataclasses import APKNativeLib

        lib = APKNativeLib(
            abi="armeabi-v7a",
            filename="libjiagu.so",
            size=100000,
            sha256="aa" * 32,
            is_known_packer=True,
        )
        assert lib.is_known_packer is True


# ============================================================================
# APKInconsistencyTests
# ============================================================================

class TestAPKInconsistencyTestsDataclass:

    def test_all_defaults_none(self):
        from redb.models.dataclasses import APKInconsistencyTests

        t = APKInconsistencyTests()
        assert t.test_zip_bomb is None
        assert t.test_zip_duplicate_entries is None
        assert t.test_zip_path_traversal is None
        assert t.test_zip_suspicious_timestamps is None
        assert t.test_hidden_dex_files is None
        assert t.test_manifest_component_mismatch is None
        assert t.test_debuggable_release is None
        assert t.test_emulator_detection_strings is None
        assert t.test_debugger_detection is None
        assert t.test_root_detection is None

    def test_all_fields_populated(self):
        from redb.models.dataclasses import APKInconsistencyTests

        t = APKInconsistencyTests(
            test_zip_bomb=True,
            test_zip_duplicate_entries=False,
            test_zip_path_traversal=True,
            test_zip_suspicious_timestamps=False,
            test_hidden_dex_files=True,
            test_manifest_component_mismatch=False,
            test_debuggable_release=True,
            test_emulator_detection_strings=True,
            test_debugger_detection=False,
            test_root_detection=True,
        )
        assert t.test_zip_bomb is True
        assert t.test_debuggable_release is True
        # Count true values
        d = asdict(t)
        true_count = sum(1 for v in d.values() if v is True)
        assert true_count == 6

    def test_field_count(self):
        from redb.models.dataclasses import APKInconsistencyTests

        # Exactly 10 inconsistency tests per PDD specification
        assert len(fields(APKInconsistencyTests)) == 10


# ============================================================================
# Hashes dataclass — APK permhash field
# ============================================================================

class TestHashesAPKField:

    def test_permhash_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.permhash is None

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

        h = Hashes(
            md5="a", sha1="b", sha256="c", ssdeep_hash="d", tlsh_hash="e",
            permhash="abc123" * 10 + "abcd",
        )
        assert h.permhash is not None
        assert len(h.permhash) == 64


# ============================================================================
# Tag enum — APK entries
# ============================================================================

class TestAPKTagEnum:

    def test_all_apk_tags_exist(self):
        from redb.extractors.enum import Tag

        expected_tags = [
            "APK_FEATURES", "APK_MANIFEST", "APK_PERMISSIONS", "APK_SIGNATURE",
            "APK_DEX", "APK_RESOURCES", "APK_NATIVE_LIBS", "APK_INCONSISTENCY_TESTS",
        ]
        for name in expected_tags:
            assert hasattr(Tag, name), f"Tag.{name} missing"

    def test_apk_tag_values(self):
        from redb.extractors.enum import Tag

        assert Tag.APK_FEATURES.value == "apk_features"
        assert Tag.APK_MANIFEST.value == "apk_manifest"
        assert Tag.APK_PERMISSIONS.value == "apk_permissions"
        assert Tag.APK_SIGNATURE.value == "apk_signature"
        assert Tag.APK_DEX.value == "apk_dex"
        assert Tag.APK_RESOURCES.value == "apk_resources"
        assert Tag.APK_NATIVE_LIBS.value == "apk_native_libs"
        assert Tag.APK_INCONSISTENCY_TESTS.value == "apk_inconsistency_tests"