Carles Ferrer

39 papers A 1B 1C 5Journal 15Unranked 17
YearRankTypeTitle / Venue / Authors
2024 J jnl
Inf.
Raul Aragonés, Roger Malet, Joan Oliver, Alex Prim, Denis Mascarell, Marc Salleras, Luis Fonseca, Alex Rodríguez-Iglesias, Albert Tarancòn, Alex Morata, Federico Baiutti, Carles Ferrer
2024 J jnl
Inf.
Raul Aragonés, Joan Oliver, Roger Malet, Maria Oliver-Parera, Carles Ferrer
2024 J jnl
Future Internet
Raul Aragonés, Joan Oliver, Carles Ferrer
2021 J jnl
Comput. Electron. Agric.
Lu Wang, Marta Prim, Maria Angeles Vázquez-Castro, Gerardo Caja, Joan Oliver, Ali Elhadi, Carles Ferrer
2021 J jnl
Inf.
Sadiel de la Fe, Han-Byeol Park, Bo-Yeon Sim, Dong-Guk Han, Carles Ferrer
2020 C conf
IECON
Roger Malet, Joan Oliver, Raul Aragonés, Ramon Voces, Carles Ferrer
2020 conf
ISIE
Joan Oliver, Roger Malet, Raul Aragonés, Ramon Voces, Carles Ferrer
2019 conf
CPS Summer School, PhD Workshop
Roger N. Alegret, Raul Aragonés, Carles Ferrer
2019 C conf
IECON
Roger N. Alegret, Raul Aragonés, Joan Oliver, Carles Ferrer
2018 J jnl
Cryptogr.
Sadiel de la Fe, Carles Ferrer
2017 J jnl
J. Syst. Archit.
Luis Andrés Cardona, Anees Ullah, Luca Sterpone, Carles Ferrer
2017 J jnl
Microelectron. Reliab.
Anees Ullah, Ernesto Sánchez, Luca Sterpone, Luis Andrés Cardona, Carles Ferrer
2016 conf
ISVLSI
B. G. Sileshi, Joan Oliver, Carles Ferrer
2015 J jnl
Int. J. Reconfigurable Comput.
Luis Andrés Cardona, Carles Ferrer
2014 conf
ICCST
Luis Andrés Cardona, B. Lorente, Carles Ferrer
2013 J jnl
Sensors
Alex G. Quinchia, Gianluca Falco, Emanuela Falletti, Fabio Dovis, Carles Ferrer
2013 conf
LASCAS
Raul Aragonés, Joan Oliver, Carles Ferrer
2013 conf
DASIP
Alex G. Quinchia, Carles Ferrer, Gianluca Falco, Fabio Dovis
2013 conf
DASIP
B. G. Sileshi, Carles Ferrer, Joan Oliver
2012 conf
ICL-GNSS
Alex G. Quinchia, Carles Ferrer, Gianluca Falco, Emanuela Falletti, Fabio Dovis
2012 J jnl
Microprocess. Microsystems
Stepan Sutula, Carles Ferrer, Francisco Serra-Graells
2012 C conf
IECON
Raul Aragonés, Joan Oliver, Carles Ferrer
2011 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Stepan Sutula, Carles Ferrer, Francisco Serra-Graells
2011 conf
ReConFig
Luis Andrés Cardona, Jharna Agrawal, Yi Guo, Joan Oliver, Carles Ferrer
2010 C conf
ISCAS
Stepan Sutula, Carles Ferrer, Francisco Serra-Graells
2010 conf
AHS
Guo Yi, David Atienza, Antonio Rius, Serni Ribo, Carles Ferrer
2007 conf
SCSC
B. Lorente, Raul Aragonés, Joan Oliver, Carles Ferrer
2007 J jnl
Microelectron. Reliab.
Miquel Vellvehí, Xavier Jordà, Philippe Godignon, Carles Ferrer, José Millán
2004 C conf
FDL
Elena Martín, Laura Barrachina, Carles Ferrer
2003 conf
MTV
Joan Oliver, Octavian-Dumitru Mocanu, Carles Ferrer
1998 B conf
PIMRC
Carles Ferrer, Miquel Oliver
1996 conf
ED&TC
M. Rullán, Carles Ferrer, Joan Oliver, Diego Mateo, Antonio Rubio
1996 A conf
ITC
Thomas Olbrich, Jordi Pérez, Ian Andrew Grout, Andrew Mark David Richardson, Carles Ferrer
1994 conf
DFT
Carles Ferrer, D. Dateo, Joan Oliver, Antonio Rubio, M. Rullán
1993 conf
DFT
M. Rullán, F. C. Blom, Joan Oliver, Carles Ferrer
1993 conf
EURO-DAC
M. Rullán, F. C. Blom, Joan Oliver, Carles Ferrer
1993 J jnl
Microprocess. Microprogramming
Juan Carlos Calderón, JoséRamón Salvador, Rafael Valle, Luis París, Carles Ferrer
1993 J jnl
Microprocess. Microprogramming
F. C. Blom, Joan Oliver, M. Rullán, Carles Ferrer
1990 conf
EURO-DAC
Carles Ferrer, Joan Oliver, Elena Valderrama
tests/unit/test_apk_method_extractor.py
← Index tests/unit/test_apk_method_extractor.py python
"""
Unit tests for APK method-level content extraction, hashing, and similarity.

Tests SHA-256 normalization, ssdeep/TLSH computation, obfuscation detection,
and Dalvik-to-Java type conversion.
"""
import pytest

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


class TestHashingFunctions:
    """Tests for hashing utility functions."""

    def test_sha256_deterministic(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        h1 = compute_sha256("invoke-virtual {p0}, Lcom/Foo;->bar()V")
        h2 = compute_sha256("invoke-virtual {p0}, Lcom/Foo;->bar()V")
        assert h1 == h2

    def test_sha256_hex_length(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        assert len(compute_sha256("test")) == 64

    def test_sha256_different_inputs(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_sha256
        assert compute_sha256("aaa") != compute_sha256("bbb")

    def test_ssdeep_none_for_short(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_ssdeep
        assert compute_ssdeep("short") is None

    def test_tlsh_none_for_short(self):
        from redb.extractors.decompiler.apk.method_extractor import compute_tlsh
        assert compute_tlsh("x") is None


class TestObfuscationDetection:
    """Tests for obfuscation indicator detection."""

    def test_short_method_name_single_char(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("a", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is True

    def test_short_method_name_two_chars(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("ab", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is True

    def test_normal_method_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("onCreate", "Lcom/Foo;", "", 10)
        assert r["short_method_name"] is False

    def test_short_class_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("foo", "Lcom/a;", "", 10)
        assert r["short_class_name"] is True

    def test_normal_class_name(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        r = detect_obfuscation_indicators("foo", "Lcom/example/MainActivity;", "", 10)
        assert r["short_class_name"] is False

    def test_string_encryption_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = (
            'const-string v0, "xyz"\n'
            'invoke-static {v0}, Lcom/Enc;->decrypt(Ljava/lang/String;)Ljava/lang/String;\n'
        )
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_string_encryption"] is True

    def test_no_string_encryption(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'const-string v0, "hello"\ninvoke-virtual {v0}, Ljava/lang/String;->length()I'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_string_encryption"] is False

    def test_reflection_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'invoke-virtual {v0, v1}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_reflection_calls"] is True

    def test_no_reflection(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = 'invoke-virtual {p0}, Lcom/Foo;->bar()V'
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 10)
        assert r["has_reflection_calls"] is False

    def test_excessive_goto_detected(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "\n".join(["goto :label"] * 10)
        # threshold = max(5, 20*0.15=3) = 5, 10 > 5
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 20)
        assert r["excessive_goto_count"] is True

    def test_no_excessive_goto(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "goto :label\nreturn-void"
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 100)
        assert r["excessive_goto_count"] is False

    def test_goto_16_counted(self):
        from redb.extractors.decompiler.apk.method_extractor import detect_obfuscation_indicators
        smali = "\n".join(["goto/16 :label"] * 10)
        r = detect_obfuscation_indicators("m", "Lcom/Foo;", smali, 20)
        assert r["excessive_goto_count"] is True


class TestDalvikTypeConversion:
    """Tests for Dalvik-to-Java type conversion."""

    def test_void(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("V") == "void"

    def test_primitives(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("I") == "int"
        assert dalvik_type_to_java("Z") == "boolean"
        assert dalvik_type_to_java("J") == "long"
        assert dalvik_type_to_java("F") == "float"
        assert dalvik_type_to_java("D") == "double"
        assert dalvik_type_to_java("B") == "byte"
        assert dalvik_type_to_java("S") == "short"
        assert dalvik_type_to_java("C") == "char"

    def test_object_type(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("Ljava/lang/String;") == "String"
        assert dalvik_type_to_java("Lcom/example/Foo;") == "Foo"

    def test_array_type(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("[I") == "int[]"
        assert dalvik_type_to_java("[Ljava/lang/String;") == "String[]"

    def test_empty_returns_void(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_type_to_java
        assert dalvik_type_to_java("") == "void"


class TestJavaPrototypeConversion:
    """Tests for method signature to Java prototype conversion."""

    def test_simple_method(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        assert dalvik_to_java_prototype("foo", "()V") == "void foo()"

    def test_method_with_params(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("bar", "(ILjava/lang/String;)Z")
        assert result == "boolean bar(int, String)"

    def test_method_returning_object(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("create", "()Lcom/example/Foo;")
        assert result == "Foo create()"

    def test_empty_signature(self):
        from redb.extractors.decompiler.apk.method_extractor import dalvik_to_java_prototype
        result = dalvik_to_java_prototype("m", "")
        assert "m()" in result


class TestDalvikParamParsing:
    """Tests for parsing Dalvik parameter descriptors."""

    def test_empty(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("") == []

    def test_single_primitive(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("I") == ["I"]

    def test_multiple_primitives(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("IZJ") == ["I", "Z", "J"]

    def test_single_object(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        assert _parse_dalvik_params("Ljava/lang/String;") == ["Ljava/lang/String;"]

    def test_mixed(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("ILjava/lang/String;Z")
        assert result == ["I", "Ljava/lang/String;", "Z"]

    def test_arrays(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("[I[Ljava/lang/String;")
        assert result == ["[I", "[Ljava/lang/String;"]

    def test_two_objects(self):
        from redb.extractors.decompiler.apk.method_extractor import _parse_dalvik_params
        result = _parse_dalvik_params("Landroid/os/Bundle;Ljava/lang/String;")
        assert len(result) == 2