Camilla Hollanti

210 papers B 45C 5Misc 2Journal 141Unranked 17
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Eimear Byrne, Johan Vester Dinesen, Ragnar Freij-Hollanti, Camilla Hollanti
2026 J jnl
CoRR
Ángela I. Barbero, Ragnar Freij-Hollanti, Camilla Hollanti, Håvard Raddum, Øyvind Ytrehus, Morten Øygarden
2026 J jnl
CoRR
Charul Rajput, B. Sundar Rajan, Ragnar Freij-Hollanti, Camilla Hollanti
2026 J jnl
CoRR
Charul Rajput, B. Sundar Rajan, Ragnar Freij-Hollanti, Camilla Hollanti
2025 J jnl
IEEE Trans. Inf. Theory
Okko Makkonen, Elif Saçikara, Camilla Hollanti
2025 J jnl
CoRR
Okko Makkonen, Camilla Hollanti
2025 J jnl
CoRR
Camilla Hollanti, Neehar Verma
2025 J jnl
SIAM J. Appl. Algebra Geom.
Camilla Hollanti, Guillermo Mantilla-Soler, Niklas Miller
2025 J jnl
Des. Codes Cryptogr.
Joonas Ahola, Iván Blanco-Chacón, Wilmar Bolaños, Antti Haavikko, Camilla Hollanti, Rodrigo Martín Sánchez-Ledesma
2025 J jnl
CoRR
Charul Rajput, B. Sundar Rajan, Ragnar Freij-Hollanti, Camilla Hollanti
2025 B conf
ITW
Charul Rajput, B. Sundar Rajan, Ragnar Freij-Hollanti, Camilla Hollanti
2025 J jnl
CoRR
Charul Rajput, B. Sundar Rajan, Ragnar Freij-Hollanti, Camilla Hollanti
2025 J jnl
IEEE Trans. Inf. Theory
Matteo Allaix, Yuxiang Lu, Yuhang Yao, Tefjol Pllaha, Camilla Hollanti, Syed Ali Jafar
2025 B conf
ITW
Delio Jaramillo-Velez, Charul Rajput, Ragnar Freij-Hollanti, Camilla Hollanti, Alexandre Graell i Amat
2025 J jnl
CoRR
Delio Jaramillo-Velez, Charul Rajput, Ragnar Freij-Hollanti, Camilla Hollanti, Alexandre Graell i Amat
2025 B conf
ISIT
Johan Vester Dinesen, Eimear Byrne, Ragnar Freij-Hollanti, Camilla Hollanti
2025 J jnl
CoRR
Johan V. Dinesen, Eimear Byrne, Ragnar Freij-Hollanti, Camilla Hollanti
2025 J jnl
CoRR
Johan V. Dinesen, Ragnar Freij-Hollanti, Camilla Hollanti, Benjamin Jany, Alberto Ravagnani
2024 B conf
ISIT
Okko Makkonen, David A. Karpuk, Camilla Hollanti
2024 J jnl
CoRR
Okko Makkonen, David A. Karpuk, Camilla Hollanti
2024 conf
EUSIPCO
Okko Makkonen, Sampo Niemelä, Camilla Hollanti, Serge Kas Hanna
2024 J jnl
CoRR
Okko Makkonen, Sampo Niemelä, Camilla Hollanti, Serge Kas Hanna
2024 B conf
ISIT
Neehar Verma, Camilla Hollanti
2024 J jnl
CoRR
Neehar Verma, Camilla Hollanti
2024 J jnl
CoRR
Joonas Ahola, Iván Blanco-Chacón, Wilmar Bolaños, Antti Haavikko, Camilla Hollanti, Rodrigo Martín Sánchez-Ledesma
2024 J jnl
IACR Cryptol. ePrint Arch.
Joonas Ahola, Iván Blanco-Chacón, Wilmar Bolaños, Antti Haavikko, Camilla Hollanti, Rodrigo Martín Sánchez-Ledesma
2024 J jnl
IEEE Trans. Inf. Theory
Okko Makkonen, Camilla Hollanti
2024 J jnl
CoRR
Okko Makkonen, David A. Karpuk, Camilla Hollanti
2023 J jnl
CoRR
Camilla Hollanti, Okko Makkonen, Elif Saçikara
2023 J jnl
CoRR
Lenny Fukshansky, Camilla Hollanti
2023 B conf
GLOBECOM
Matteo Allaix, Yuxiang Lu, Yuhang Yao, Tefjol Pllaha, Camilla Hollanti, Syed Ali Jafar
2023 J jnl
CoRR
Matteo Allaix, Yuxiang Lu, Yuhang Yao, Tefjol Pllaha, Camilla Hollanti, Syed Ali Jafar
2023 B conf
ITW
Okko Makkonen, Camilla Hollanti
2022 J jnl
IEEE Trans. Commun.
Jie Li, Xiaohu Tang, Camilla Hollanti
2022 B conf
ISIT
Okko Makkonen, Camilla Hollanti
2022 J jnl
CoRR
Okko Makkonen, Camilla Hollanti
2022 J jnl
IEEE J. Sel. Areas Commun.
Jie Li, Okko Makkonen, Camilla Hollanti, Oliver W. Gnilke
2022 B conf
ITW
Okko Makkonen, Camilla Hollanti
2022 J jnl
CoRR
Okko Makkonen, Camilla Hollanti
2022 J jnl
IEEE J. Sel. Areas Commun.
Matteo Allaix, Seunghoan Song, Lukas Holzbaur, Tefjol Pllaha, Masahito Hayashi, Camilla Hollanti
2022 B conf
ISIT
Perttu Saarela, Matteo Allaix, Ragnar Freij-Hollanti, Camilla Hollanti
2022 J jnl
CoRR
Perttu Saarela, Matteo Allaix, Ragnar Freij-Hollanti, Camilla Hollanti
2022 J jnl
IEEE Trans. Inf. Forensics Secur.
Jie Li, Camilla Hollanti
2022 J jnl
CoRR
Okko Makkonen, Camilla Hollanti
2022 J jnl
IEEE Trans. Inf. Theory
Lukas Holzbaur, Ragnar Freij-Hollanti, Jie Li, Camilla Hollanti
2021 J jnl
Adv. Appl. Math.
Ragnar Freij-Hollanti, Matthias Grezet, Camilla Hollanti, Thomas Westerbäck
2021 J jnl
CoRR
Jie Li, Camilla Hollanti, Oliver W. Gnilke
2021 B conf
ISIT
Matteo Allaix, Lukas Holzbaur, Tefjol Pllaha, Camilla Hollanti
2021 J jnl
CoRR
Matteo Allaix, Lukas Holzbaur, Tefjol Pllaha, Camilla Hollanti
2021 J jnl
CoRR
Jie Li, Camilla Hollanti
2021 B conf
ISIT
Jie Li, Camilla Hollanti
2021 J jnl
CoRR
Matteo Allaix, Seunghoan Song, Lukas Holzbaur, Tefjol Pllaha, Masahito Hayashi, Camilla Hollanti
2021 J jnl
IEEE Trans. Inf. Forensics Secur.
Julien Lavauzelle, Razane Tajeddine, Ragnar Freij-Hollanti, Camilla Hollanti
2021 J jnl
Des. Codes Cryptogr.
Matthias Grezet, Camilla Hollanti
2021 J jnl
IEEE Trans. Inf. Theory
Mohamed Taoufiq Damir, Alex Karrila, Laia Amorós, Oliver W. Gnilke, David A. Karpuk, Camilla Hollanti
2020 J jnl
SIAM J. Appl. Algebra Geom.
Amaro Barreal, Mohamed Taoufiq Damir, Ragnar Freij-Hollanti, Camilla Hollanti
2020 B conf
ISIT
Lukas Holzbaur, Camilla Hollanti, Antonia Wachter-Zeh
2020 J jnl
CoRR
Lukas Holzbaur, Camilla Hollanti, Antonia Wachter-Zeh
2020 B conf
ISIT
Julian Renner, Sven Puchinger, Antonia Wachter-Zeh, Camilla Hollanti, Ragnar Freij-Hollanti
2020 J jnl
CoRR
Julian Renner, Sven Puchinger, Antonia Wachter-Zeh, Camilla Hollanti, Ragnar Freij-Hollanti
2020 J jnl
IEEE Trans. Inf. Forensics Secur.
Razane Tajeddine, Antonia Wachter-Zeh, Camilla Hollanti
2020 J jnl
IEEE Trans. Inf. Theory
Lukas Holzbaur, Ragnar Freij-Hollanti, Antonia Wachter-Zeh, Camilla Hollanti
2020 J jnl
IEEE J. Sel. Areas Inf. Theory
Matteo Allaix, Lukas Holzbaur, Tefjol Pllaha, Camilla Hollanti
2020 B conf
ISIT
Matteo Allaix, Lukas Holzbaur, Tefjol Pllaha, Camilla Hollanti
2020 J jnl
CoRR
Matteo Allaix, Lukas Holzbaur, Tefjol Pllaha, Camilla Hollanti
2020 J jnl
IEEE Trans. Commun.
Jie Li, David A. Karpuk, Camilla Hollanti
2019 J jnl
IEEE Trans. Inf. Theory
Ragnar Freij-Hollanti, Oliver W. Gnilke, Camilla Hollanti, Anna-Lena Horlemann-Trautmann, David A. Karpuk, Ivo Kubjas
2019 J jnl
IEEE Trans. Inf. Theory
Matthias Grezet, Ragnar Freij-Hollanti, Thomas Westerbäck, Camilla Hollanti
2019 J jnl
IEEE Trans. Mob. Comput.
Joonas Pääkkönen, Amaro Barreal, Camilla Hollanti, Olav Tirkkonen
2019 conf
SPAWC
Joonas Pääkkönen, Prathapasinghe Dharmawansa, Ragnar Freij-Hollanti, Camilla Hollanti, Olav Tirkkonen
2019 J jnl
Des. Codes Cryptogr.
Oliver W. Gnilke, Marcus Greferath, Camilla Hollanti, Guillermo Nuñez Ponasso, Padraig Ó Catháin, Eric Swartz
2019 B conf
ITW
Lukas Holzbaur, Ragnar Freij-Hollanti, Camilla Hollanti
2019 J jnl
CoRR
Lukas Holzbaur, Ragnar Freij-Hollanti, Camilla Hollanti
2019 J jnl
IEEE Trans. Inf. Theory
Razane Tajeddine, Oliver W. Gnilke, David A. Karpuk, Ragnar Freij-Hollanti, Camilla Hollanti
2019 J jnl
CoRR
Jie Li, David A. Karpuk, Camilla Hollanti
2019 B conf
ISIT
Matthias Grezet, Camilla Hollanti
2019 J jnl
CoRR
Matthias Grezet, Camilla Hollanti
2019 J jnl
CoRR
Matthias Grezet, Thomas Westerbäck, Ragnar Freij-Hollanti, Camilla Hollanti
2019 J jnl
IEEE Commun. Lett.
Matthias Grezet, Thomas Westerbäck, Ragnar Freij-Hollanti, Camilla Hollanti
2018 J jnl
CoRR
Matthias Grezet, Ragnar Freij-Hollanti, Thomas Westerbäck, Camilla Hollanti
2018 conf
SPAWC
Mohamed Taoufiq Damir, Oliver W. Gnilke, Laia Amorós, Camilla Hollanti
2018 J jnl
IEEE Trans. Inf. Theory
Renaud-Alexandre Pitaval, Lu Wei, Olav Tirkkonen, Camilla Hollanti
2018 J jnl
Appl. Algebra Eng. Commun. Comput.
Amaro Barreal, Capi Corrales Rodrigáñez, Camilla Hollanti
2018 J jnl
Des. Codes Cryptogr.
Simon R. Blackburn, Marcus Greferath, Camilla Hollanti, Mario-Osvin Pavcevic, Joachim Rosenthal, Leo Storme, Ángeles Vázquez-Castro, Alfred Wassermann
2018 J jnl
CoRR
Julien Lavauzelle, Razane Tajeddine, Ragnar Freij-Hollanti, Camilla Hollanti
2018 J jnl
CoRR
Razan Tajeddine, Oliver W. Gnilke, David A. Karpuk, Ragnar Freij-Hollanti, Camilla Hollanti
2018 J jnl
CoRR
Razan Tajeddine, Antonia Wachter-Zeh, Camilla Hollanti
2018 B conf
ITW
Lukas Holzbaur, Ragnar Freij-Hollanti, Antonia Wachter-Zeh, Camilla Hollanti
2018 J jnl
CoRR
Lukas Holzbaur, Ragnar Freij-Hollanti, Antonia Wachter-Zeh, Camilla Hollanti
2018 B conf
ISIT
Razan Tajeddine, Oliver W. Gnilke, David A. Karpuk, Ragnar Freij-Hollanti, Camilla Hollanti
2018 J jnl
CoRR
Razan Tajeddine, Oliver W. Gnilke, David A. Karpuk, Ragnar Freij-Hollanti, Camilla Hollanti
2017 J jnl
CoRR
Matthias Grezet, Ragnar Freij-Hollanti, Thomas Westerbäck, Oktay Olmez, Camilla Hollanti
2017 J jnl
CoRR
Oliver W. Gnilke, Marcus Greferath, Camilla Hollanti, Guillermo Nuñez Ponasso, Padraig Ó Catháin, Eric Swartz
2017 B conf
ISIT
Alex Karrila, Niko R. Väisänen, David A. Karpuk, Camilla Hollanti
2017 J jnl
CoRR
Alex Karrila, Niko R. Väisänen, David A. Karpuk, Camilla Hollanti
2017 J jnl
CoRR
Ragnar Freij-Hollanti, Camilla Hollanti, Thomas Westerbäck
2017 conf
ICMCTA
Matthias Grezet, Ragnar Freij-Hollanti, Thomas Westerbäck, Camilla Hollanti
2017 J jnl
CoRR
Matthias Grezet, Ragnar Freij-Hollanti, Thomas Westerbäck, Camilla Hollanti
2017 J jnl
CoRR
Amaro Barreal, Camilla Hollanti
2017 J jnl
CoRR
Razan Tajeddine, Oliver W. Gnilke, David A. Karpuk, Ragnar Freij-Hollanti, Camilla Hollanti, Salim El Rouayheb
2017 J jnl
SIAM J. Appl. Algebra Geom.
Ragnar Freij-Hollanti, Oliver W. Gnilke, Camilla Hollanti, David A. Karpuk
2017 B conf
ISIT
Razan Tajeddine, Oliver W. Gnilke, David A. Karpuk, Ragnar Freij-Hollanti, Camilla Hollanti, Salim El Rouayheb
2017 J jnl
EURASIP J. Adv. Signal Process.
Francisco A. Monteiro, Alister G. Burr, Ioannis Chatzigeorgiou, Camilla Hollanti, Ioannis Krikidis, Hulya Seferoglu, Vitaly Skachek
2017 J jnl
CoRR
Joonas Pääkkönen, K. D. Prathapasinghe Dharmawansa, Ragnar Freij-Hollanti, Camilla Hollanti, Olav Tirkkonen
2017 J jnl
CoRR
Ragnar Freij-Hollanti, Oliver W. Gnilke, Camilla Hollanti, Anna-Lena Horlemann-Trautmann, David A. Karpuk, Ivo Kubjas
2016 J jnl
CoRR
Toni Ernvall, Thomas Westerbäck, Ragnar Freij-Hollanti, Camilla Hollanti
2016 B conf
ISIT
Toni Ernvall, Thomas Westerbäck, Ragnar Freij-Hollanti, Camilla Hollanti
2016 B conf
ISIT
Antti Pöllänen, Thomas Westerbäck, Ragnar Freij-Hollanti, Camilla Hollanti
2016 J jnl
IEEE Access
Dejan Vukobratovic, Dusan Jakovetic, Vitaly Skachek, Dragana Bajovic, Dino Sejdinovic, Günes Karabulut-Kurt, Camilla Hollanti, Ingo Fischer
2016 J jnl
CoRR
Dejan Vukobratovic, Dusan Jakovetic, Vitaly Skachek, Dragana Bajovic, Dino Sejdinovic, Gunes Karabulut-Kurt, Camilla Hollanti, Ingo Fischer
2016 J jnl
CoRR
Joonas Pääkkönen, Amaro Barreal, Camilla Hollanti, Olav Tirkkonen
2016 J jnl
IEEE Trans. Inf. Theory
Toni Ernvall, Thomas Westerbäck, Ragnar Freij-Hollanti, Camilla Hollanti
2016 J jnl
CoRR
Amaro Barreal, David A. Karpuk, Camilla Hollanti
2016 J jnl
CoRR
Renaud-Alexandre Pitaval, Lu Wei, Olav Tirkkonen, Camilla Hollanti
2016 J jnl
EURASIP J. Adv. Signal Process.
Hsiao-feng Francis Lu, Amaro Barreal, David A. Karpuk, Camilla Hollanti
2016 J jnl
IEEE Trans. Wirel. Commun.
Amaro Barreal, Camilla Hollanti, Nadya Markin
2016 J jnl
CoRR
Antti Pöllänen, Thomas Westerbäck, Ragnar Freij-Hollanti, Camilla Hollanti
2016 J jnl
CoRR
Alex Karrila, Amaro Barreal, David A. Karpuk, Camilla Hollanti
2016 Misc conf
ITNAC
Amaro Barreal, Alex Karrila, David A. Karpuk, Camilla Hollanti
2016 J jnl
IEEE Trans. Wirel. Commun.
David A. Karpuk, Camilla Hollanti
2016 J jnl
CoRR
David A. Karpuk, Amaro Barreal, Oliver W. Gnilke, Camilla Hollanti
2016 J jnl
CoRR
Alex Karrila, David A. Karpuk, Camilla Hollanti
2016 J jnl
IEEE Trans. Inf. Theory
Thomas Westerbäck, Ragnar Freij-Hollanti, Toni Ernvall, Camilla Hollanti
2016 J jnl
CoRR
Ragnar Freij-Hollanti, Oliver W. Gnilke, Camilla Hollanti, David A. Karpuk
2016 J jnl
CoRR
Oliver W. Gnilke, Amaro Barreal, Alex Karrila, Ha Thanh Nguyen Tran, David A. Karpuk, Camilla Hollanti
2016 J jnl
CoRR
Oliver Wilhelm Gnilke, Ha Thanh Nguyen Tran, Alex Karrila, Camilla Hollanti
2016 Misc conf
ITNAC
Oliver W. Gnilke, Amaro Barreal, Alex Karrila, Ha Thanh Nguyen Tran, David A. Karpuk, Camilla Hollanti
2016 B conf
ITW
Oliver Wilhelm Gnilke, Ha Thanh Nguyen Tran, Alex Karrila, Camilla Hollanti
2015 J jnl
CoRR
Amaro Barreal, Joonas Pääkkönen, David A. Karpuk, Camilla Hollanti, Olav Tirkkonen
2015 B conf
ITW
Alex Karrila, Camilla Hollanti
2015 conf
ITW Fall
Amaro Barreal, Joonas Pääkkönen, David A. Karpuk, Camilla Hollanti, Olav Tirkkonen
2015 J jnl
CoRR
Thomas Westerbäck, Ragnar Freij-Hollanti, Camilla Hollanti
2015 conf
Allerton
Thomas Westerbäck, Ragnar Freij-Hollanti, Camilla Hollanti
2015 J jnl
CoRR
Amaro Barreal, Camilla Hollanti, Nadya Markin
2015 conf
MACOM
Joonas Pääkkönen, Camilla Hollanti, Olav Tirkkonen
2015 J jnl
CoRR
David A. Karpuk, Camilla Hollanti
2015 J jnl
CoRR
Thomas Westerbäck, Ragnar Freij, Toni Ernvall, Camilla Hollanti
2015 J jnl
Adv. Math. Commun.
David A. Karpuk, Anne-Maria Ernvall-Hytönen, Camilla Hollanti, Emanuele Viterbo
2015 J jnl
CoRR
Amaro Barreal, Camilla Hollanti, David A. Karpuk
2014 J jnl
CoRR
Alex Karrila, Camilla Hollanti
2014 J jnl
CoRR
Amaro Barreal, Camilla Hollanti, David A. Karpuk, Hsiao-feng Lu
2014 B conf
ITW
Thomas Westerbäck, Toni Ernvall, Camilla Hollanti
2014 J jnl
CoRR
Toni Ernvall, Thomas Westerbäck, Camilla Hollanti, Ragnar Freij
2014 conf
ICMCTA
Amaro Barreal, Camilla Hollanti, Nadya Markin
2014 J jnl
CoRR
Toni Ernvall, Thomas Westerbäck, Camilla Hollanti
2014 conf
VITAE
Toni Ernvall, Thomas Westerbäck, Camilla Hollanti
2014 J jnl
CoRR
Joonas Pääkkönen, Camilla Hollanti, Olav Tirkkonen
2014 J jnl
CoRR
Amaro Barreal, Camilla Hollanti, Nadya Markin
2014 J jnl
CoRR
Iván Blanco-Chacón, Camilla Hollanti, Montserrat Alsina, Dionís Remón
2014 J jnl
CoRR
Toni Ernvall, Thomas Westerbäck, Camilla Hollanti
2014 J jnl
CoRR
David A. Karpuk, Camilla Hollanti
2014 B conf
ITW
David A. Karpuk, Camilla Hollanti
2014 C conf
ISITA
Camilla Hollanti, Hsiao-feng Lu, David A. Karpuk, Amaro Barreal
2014 J jnl
CoRR
David A. Karpuk, Camilla Hollanti, Amaro Barreal
2014 C conf
ISITA
David A. Karpuk, Camilla Hollanti, Amaro Barreal
2014 J jnl
CoRR
Iván Blanco-Chacón, Dionís Remón, Camilla Hollanti, Montserrat Alsina
2014 J jnl
J. Frankl. Inst.
Iván Blanco-Chacón, Dionís Remón, Camilla Hollanti, Montserrat Alsina
2014 J jnl
CoRR
David A. Karpuk, Anne-Maria Ernvall-Hytönen, Camilla Hollanti, Emanuele Viterbo
2014 conf
ICC
David A. Karpuk, Camilla Hollanti
2014 conf
ISCCSP
Toni Ernvall, Salim El Rouayheb, Camilla Hollanti, H. Vincent Poor
2014 J jnl
CoRR
Camilla Hollanti, David A. Karpuk, Amaro Barreal, Hsiao-feng Francis Lu
2014 conf
VITAE
Camilla Hollanti, David A. Karpuk, Amaro Barreal, Hsiao-feng Francis Lu
2014 J jnl
CoRR
Arsenia Chorti, Mehdi M. Molu, David A. Karpuk, Camilla Hollanti, Alister G. Burr
2014 C conf
ICCC
Arsenia Chorti, Mehdi M. Molu, David A. Karpuk, Camilla Hollanti, Alister G. Burr
2013 J jnl
IEEE J. Sel. Areas Commun.
Toni Ernvall, Salim El Rouayheb, Camilla Hollanti, H. Vincent Poor
2013 B conf
ISIT
Toni Ernvall, Salim El Rouayheb, Camilla Hollanti, H. Vincent Poor
2013 J jnl
CoRR
Joonas Pääkkönen, Camilla Hollanti, Olav Tirkkonen
2013 conf
GLOBECOM Workshops
Joonas Pääkkönen, Camilla Hollanti, Olav Tirkkonen
2013 J jnl
CoRR
Iván Blanco-Chacón, Dionís Remón, Camilla Hollanti, Montserrat Alsina
2013 J jnl
CoRR
Camilla Hollanti, Emanuele Viterbo, David A. Karpuk
2013 B conf
ISIT
David A. Karpuk, Iván Blanco-Chacón, Camilla Hollanti
2013 J jnl
CoRR
David A. Karpuk, Camilla Hollanti
2012 J jnl
CoRR
Camilla Hollanti, Nadya Markin
2012 B conf
ISIT
Camilla Hollanti, Nadya Markin
2012 J jnl
CoRR
Toni Ernvall, Salim El Rouayheb, Camilla Hollanti, H. Vincent Poor
2012 conf
Swe-CTW
Joonas Pääkkönen, K. D. Prathapasinghe Dharmawansa, Camilla Hollanti, Olav Tirkkonen
2012 J jnl
IEEE Trans. Inf. Theory
Roope Vehkalahti, Camilla Hollanti, Frédérique E. Oggier
2011 B conf
ISIT
Roope Vehkalahti, Camilla Hollanti
2011 J jnl
CoRR
Camilla Hollanti, Roope Vehkalahti, Youssef Nasser
2011 conf
SiPS
Camilla Hollanti, Roope Vehkalahti, Youssef Nasser
2011 conf
ICUMT
Camilla Hollanti, Emanuele Viterbo
2011 J jnl
IEEE Trans. Inf. Theory
Hsiao-feng Lu, Camilla Hollanti, Roope Vehkalahti, Jyrki T. Lahtonen
2011 J jnl
CoRR
Anne-Maria Ernvall-Hytönen, Camilla Hollanti
2011 B conf
ITW
Anne-Maria Ernvall-Hytönen, Camilla Hollanti
2011 B conf
ITW
Roope Vehkalahti, Camilla Hollanti
2010 C conf
ISITA
Roope Vehkalahti, Camilla Hollanti, Jyrki T. Lahtonen
2010 J jnl
CoRR
Roope Vehkalahti, Camilla Hollanti, Frédérique E. Oggier
2010 B conf
ISIT
Frédérique E. Oggier, Roope Vehkalahti, Camilla Hollanti
2010 J jnl
IEEE Trans. Inf. Theory
Hsiao-feng Lu, Camilla Hollanti
2010 C conf
ISITA
Roope Vehkalahti, Camilla Hollanti, Jyrki T. Lahtonen, Hsiao-feng Lu
2009 B conf
ISIT
Camilla Hollanti, Roope Vehkalahti, Hsiao-feng Lu
2009 J jnl
IEEE Trans. Inf. Theory
Camilla Hollanti, Hsiao-feng Lu
2009 B conf
ISIT
Hsiao-feng Lu, Camilla Hollanti
2009 J jnl
IEEE J. Sel. Top. Signal Process.
Hsiao-feng Lu, Roope Vehkalahti, Camilla Hollanti, Jyrki T. Lahtonen, Yi Hong, Emanuele Viterbo
2009 J jnl
CoRR
Jyrki T. Lahtonen, Roope Vehkalahti, Hsiao-feng Lu, Camilla Hollanti, Emanuele Viterbo
2009 J jnl
IEEE Trans. Inf. Theory
Roope Vehkalahti, Camilla Hollanti, Jyrki T. Lahtonen, Kalle Ranto
2009 J jnl
CoRR
Hsiao-feng Lu, Jyrki T. Lahtonen, Roope Vehkalahti, Camilla Hollanti
2008 B conf
ISIT
Camilla Hollanti, Hsiao-feng Lu
2008 J jnl
CoRR
Camilla Hollanti, Jyrki T. Lahtonen, Hsiao-feng Lu
2008 J jnl
IEEE Trans. Inf. Theory
Camilla Hollanti, Jyrki T. Lahtonen, Hsiao-feng Lu
2008 B conf
ITW
Camilla Hollanti, Jyrki T. Lahtonen, Kalle Ranto, Roope Vehkalahti, Emanuele Viterbo
2008 B conf
ISIT
Hsiao-feng Lu, Camilla Hollanti
2007 B conf
ITW
Camilla Hollanti, Kalle Ranto
2007 conf
AAECC
Camilla Hollanti, Hsiao-feng Lu
2007 B conf
ISIT
Camilla Hollanti, Kalle Ranto
2007 J jnl
CoRR
Camilla Hollanti, Jyrki T. Lahtonen, Kalle Ranto, Roope Vehkalahti
2006 B conf
ITW
Camilla Hollanti, Jyrki T. Lahtonen
2006 B conf
ISIT
Camilla Hollanti, Jyrki T. Lahtonen, Kalle Ranto, Roope Vehkalahti
2005 B conf
ISIT
Jarkko Hiltunen, Camilla Hollanti, Jyrki T. Lahtonen
2004 B conf
ISIT
Jarkko Hiltunen, Camilla Hollanti, Jyrki T. Lahtonen
redb/extractors/decompiler/bninja/analysis/cfg-old.py
← Index redb/extractors/decompiler/bninja/analysis/cfg-old.py python
from collections import deque
from enum import Enum

from binaryninja.enums import (
    BranchType,
    InstructionTextTokenType,
)

# Support both package and standalone imports
try:
    from ..utils.hashes import calculate_md5, calculate_sha256
except ImportError:
    # Fallback to absolute imports (for multiprocessing spawned processes)
    from redb.extractors.decompiler.bninja.utils.hashes import calculate_md5, calculate_sha256


class CFGAnalysis:
    def __init__(self, function):
        self.function = function

    def determine_block_type(self, block) -> str:
        """Determine the type of a basic block."""
        # Check if it's a thunk function (usually just a jump or call)
        if len(block.disassembly_text) <= 2 and any(
            "jmp" in line.tokens[0].text.lower() for line in block.disassembly_text
        ):
            return "THUNK"

        # Check if it contains only data (no valid instructions)
        if all(not line.tokens for line in block.disassembly_text):
            return "DATA"

        # Default to code
        return "CODE"

    def extract_cyclomatic_complexity(self):
        """
        Cyclomatic complexity (McCabe’s metric) measures the number of linearly independent paths
        through a function’s control flow graph (CFG).
        The standard formula is:

            M = E - N + 2

        where:
            - E = number of edges in the CFG
            - N = number of nodes (basic blocks)
            - 2 accounts for the entry and exit nodes of a single connected graph
        """
        if self.function is None:
            return 0

        # number of basic blocks
        num_blocks = len(self.function.basic_blocks)
        # number of edges in the graph
        num_edges = sum(
            len(basic_block.outgoing_edges)
            for basic_block in self.function.basic_blocks
        )
        return num_edges - num_blocks + 2

    def extract_function_cfg(self):
        """Extract information about a function CFG and return it as a dictionary."""

        function = self.function
        function_data = {
            "function_address": self.function.start,
            "blocks": [],
            "measures": {
                "cyclomatic_complexity": self.extract_cyclomatic_complexity(),
            },
        }

        if self.function is None:
            return function_data

        # Get the map of the depth associated to every block
        depths = self.get_map_depth()

        # Get the map of the positions associated to every block
        id_maps = self.get_block_id_map()

        # Extract block data with graph structure information
        for block in function.basic_blocks:
            # dominators per every block translated
            dominators = sorted(self.extract_dominators(block, id_maps))

            # post dominators
            post_dominators = sorted(self.extract_post_dominators(block, id_maps))

            # Build block instructions string
            block_instructions = "\n".join(str(line) for line in block.disassembly_text)

            # Determine block type
            block_type = self.determine_block_type(block)

            # Extract successors directly from basic block
            successor_blocks = [edge.target.start for edge in block.outgoing_edges]
            # We ensure a canonical order and we sort the edges
            successor_blocks.sort()

            # Extract predecessors directly from basic block
            predecessor_blocks = [edge.source.start for edge in block.incoming_edges]
            # We ensure a canonical order and we sort the edges
            predecessor_blocks.sort()

            # Determine branch type from outgoing edges
            branch_type = self.determine_branch_type(block)

            instructions_count = len(block.disassembly_text)

            # Create block record
            block_json = {
                "function_address": self.function.start,
                "block_start_address": block.start,
                "block_end_address": block.end,
                "block_size": block.end - block.start,
                "instructions_count": instructions_count,
                "block_instructions_hash": calculate_sha256(block_instructions),
                "predecessor_blocks": predecessor_blocks,
                "successor_blocks": successor_blocks,
                "depth": depths[block.start],
                "position": id_maps[block.start],
                "branch_type": branch_type,
                "block_type": block_type,
                "flags": self.extract_block_flags(block),
                "dominators": dominators,
                "post_dominators": post_dominators,
            }
            function_data["blocks"].append(block_json)

        return function_data

    def extract_dominators(self, bb, id_maps):
        """Extract the dominators normalized"""
        dom_idx = [id_maps[d.start] for d in bb.dominators]
        return dom_idx

    def extract_post_dominators(self, bb, id_maps):
        """Extract the post-dominators normalized"""
        post_dom_idx = [id_maps[d.start] for d in bb.post_dominators]
        return post_dom_idx

    def determine_branch_type(self, block):
        """
        Determine the type of branch at the end of a basic block.
        This combines edge type information with instruction analysis.
        """
        # If no outgoing edges, it might be a return or terminal block
        if not block.outgoing_edges:
            # Check if the last instruction is a return
            for line in reversed(list(block.disassembly_text)):
                if line.tokens and any(
                    token.text.lower() in ["ret", "retn"] for token in line.tokens
                ):
                    return "RETURN"
            return "UNKNOWN"

        # Collect branch types from all outgoing edges
        branch_types = []
        for edge in block.outgoing_edges:
            edge_type = edge.type
            # Map edge type to our branch type enum
            if isinstance(edge_type, str):
                if edge_type == "IndirectCall":
                    branch_types.append("CALL")
                else:
                    branch_types.append("UNKNOWN")
            else:
                # Use our mapping for integer/enum values
                type_mapping = {
                    BranchType.UnconditionalBranch: "DIRECT",
                    BranchType.FalseBranch: "CONDITIONAL",
                    BranchType.TrueBranch: "CONDITIONAL",
                    BranchType.CallDestination: "CALL",
                    BranchType.FunctionReturn: "RETURN",
                    BranchType.SystemCall: "CALL",
                    BranchType.IndirectBranch: "INDIRECT",
                    BranchType.ExceptionBranch: "UNKNOWN",
                    BranchType.UnresolvedBranch: "UNKNOWN",
                    BranchType.UserDefinedBranch: "UNKNOWN",
                }
                branch_types.append(type_mapping.get(edge_type, "UNKNOWN"))

        # Determine overall branch type (prioritize CALL > RETURN > CONDITIONAL > DIRECT)
        if "CALL" in branch_types:
            return "CALL"
        elif "RETURN" in branch_types:
            return "RETURN"
        elif "CONDITIONAL" in branch_types:
            return "CONDITIONAL"
        elif "DIRECT" in branch_types:
            return "DIRECT"
        elif len(block.outgoing_edges) == 1:
            return "FALLTHROUGH"

        # If edge analysis was inconclusive, fall back to instruction analysis
        last_instr = None
        for line in reversed(list(block.disassembly_text)):
            if line.tokens:
                last_instr = line
                break

        if last_instr:
            mnemonic = None
            for token in last_instr.tokens:
                if token.type == InstructionTextTokenType.InstructionToken:
                    mnemonic = token.text.lower()
                    break

            if mnemonic:
                if mnemonic == "call":
                    return "CALL"
                elif mnemonic == "jmp":
                    return "DIRECT"
                elif mnemonic.startswith("j") and mnemonic != "jmp":
                    return "CONDITIONAL"
                elif mnemonic in ["ret", "retn"]:
                    return "RETURN"

        return "UNKNOWN"

    def get_map_depth(self):
        """
        Run a BFS on the basic blocks of the function to assign a depth to every block
        """

        depths = {}
        entry = self.function.get_basic_block_at(self.function.start)

        ### Simple BFS
        q = deque()
        q.append(entry)
        depths[entry.start] = 0

        while q:
            b = q.popleft()
            b_depth = depths[b.start]
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in depths:
                    depths[tgt.start] = b_depth + 1
                    q.append(tgt)

        return depths

    def get_block_id_map(self):
        """
        Assign a unique, sequential ID to each basic block of the function using a BFS starting from the entry block.
        """

        id_map = {}
        entry = self.function.get_basic_block_at(self.function.start)

        q = deque()
        q.append(entry)

        current_id = 0
        id_map[entry.start] = current_id

        while q:
            b = q.popleft()
            for edge in b.outgoing_edges:
                tgt = edge.target

                if tgt is None:
                    continue

                if tgt.start not in id_map:
                    current_id += 1
                    id_map[tgt.start] = current_id
                    q.append(tgt)

        return id_map

    def extract_block_flags(self, block):
        """
        Get the flags for every basic block. Currently, we implemented these heuristics:
            - if a basic block is the entry node for a function
            - if a basic block is the exit block for a function
            - if a basic block is part of a natural loop
        """
        flags = []

        if block.start == self.function.start:
            flags.append(BlockFlags.EntryBlock.value)

        if any(edge.type == BranchType.FunctionReturn for edge in block.outgoing_edges):
            flags.append(BlockFlags.ExitBlock.value)

        # if this block is in its dominance frontier, then it's part of a natural loop
        if block in block.dominance_frontier:
            flags.append(BlockFlags.LoopBlock.value)

        return flags


class BlockFlags(Enum):
    # generally, the basic block identifying the entry point of the function
    EntryBlock = "EntryBlock"
    # any basic blocks that makes the control flow exiting from the current function
    ExitBlock = "ExitBlock"
    # any block is in a natural loop if it is in its own dominance frontier
    LoopBlock = "LoopBlock"


class BlockType(Enum):
    THUNK = "THUNK"
    DATA = "DATA"
    PADDING = "PADDING"
    CODE = "CODE"