Walter Quattrociocchi

128 papers B 3C 1Journal 105Unranked 14
YearRankTypeTitle / Venue / Authors
2026 J jnl
ACM Trans. Knowl. Discov. Data
Edoardo Loru, Niccolò Di Marco, Matteo Cinelli, Walter Quattrociocchi
2026 J jnl
IEEE Trans. Comput. Soc. Syst.
Jacopo Nudo, Matteo Cinelli, Andrea Baronchelli, Walter Quattrociocchi
2026 J jnl
Online Soc. Networks Media
Jacopo Nudo, Mario Edoardo Pandolfo, Edoardo Loru, Mattia Samory, Matteo Cinelli, Walter Quattrociocchi
2026 J jnl
CoRR
Jacopo Nudo, Eugenio Nerio Nemmi, Edoardo Loru, Alessandro Mei, Walter Quattrociocchi, Matteo Cinelli
2026 J jnl
Online Soc. Networks Media
Gabriele Etta, Emanuele Sangiorgio, Simon Zollo, Niccolò Di Marco, Fabiana Zollo, Matteo Cinelli, Walter Quattrociocchi
2026 J jnl
CoRR
Ortal Hadad, Edoardo Loru, Jacopo Nudo, Niccolò Di Marco, Matteo Cinelli, Walter Quattrociocchi
2026 J jnl
CoRR
Ortal Hadad, Edoardo Loru, Jacopo Nudo, Anita Bonetti, Matteo Cinelli, Walter Quattrociocchi
2025 J jnl
CoRR
Matteo Cinelli, Stefano Cresci, Walter Quattrociocchi, Maurizio Tesconi, Paola Zola
2025 J jnl
CoRR
Edoardo Loru, Jacopo Nudo, Niccolò Di Marco, Matteo Cinelli, Walter Quattrociocchi
2025 J jnl
CoRR
Niccolò Di Marco, Edoardo Loru, Alessandro Galeazzi, Matteo Cinelli, Walter Quattrociocchi
2025 J jnl
CoRR
Walter Quattrociocchi, Valerio Capraro, Matjaz Perc
2025 J jnl
CoRR
Jacopo Nudo, Matteo Cinelli, Andrea Baronchelli, Walter Quattrociocchi
2025 J jnl
CoRR
Jacopo Nudo, Mario Edoardo Pandolfo, Edoardo Loru, Mattia Samory, Matteo Cinelli, Walter Quattrociocchi
2025 J jnl
Expert Syst. Appl.
Simon Zollo, Matteo Cinelli, Gabriele Etta, Roy Cerqueti, Walter Quattrociocchi
2025 J jnl
CoRR
Niccolò Di Marco, Anita Bonetti, Edoardo Di Martino, Edoardo Loru, Jacopo Nudo, Mario Edoardo Pandolfo, Giulio Pecile, Emanuele Sangiorgio, Irene Scalco, Simon Zollo, Matteo Cinelli, Fabiana Zollo, Walter Quattrociocchi
2025 J jnl
ACM Trans. Web
Niccolò Di Marco, Sara Brunetti, Matteo Cinelli, Walter Quattrociocchi
2025 J jnl
CoRR
Edoardo Di Martino, Matteo Cinelli, Roy Cerqueti, Walter Quattrociocchi
2025 J jnl
CoRR
Max Falkenberg, Matteo Cinelli, Alessandro Galeazzi, Christopher A. Bail, Rosa M. Benito, Axel Bruns, Anatoliy A. Gruzd, David Lazer, Jae K. Lee, Jennifer McCoy, Kikuko Nagayoshi, David G. Rand, Antonio Scala, Alexandra Siegel, Sander van der Linden, Onur Varol, Ingmar Weber, Magdalena Wojcieszak, Fabiana Zollo, Andrea Baronchelli, Walter Quattrociocchi
2024 J jnl
IEEE Trans. Netw. Sci. Eng.
Gabriele Etta, Matteo Cinelli, Niccolò Di Marco, Michele Avalle, Alessandro Panconesi, Walter Quattrociocchi
2024 J jnl
CoRR
Edoardo Di Martino, Alessandro Galeazzi, Michele Starnini, Walter Quattrociocchi, Matteo Cinelli
2024 J jnl
CoRR
Giulio Pecile, Niccolò Di Marco, Matteo Cinelli, Walter Quattrociocchi
2024 J jnl
CoRR
Emanuele Sangiorgio, Niccolò Di Marco, Gabriele Etta, Matteo Cinelli, Roy Cerqueti, Walter Quattrociocchi
2024 J jnl
CoRR
Giulio Pecile, Niccolò Di Marco, Matteo Cinelli, Walter Quattrociocchi
2024 J jnl
Nat.
Michele Avalle, Niccolò Di Marco, Gabriele Etta, Emanuele Sangiorgio, Shayan Alipour, Anita Bonetti, Lorenzo Alvisi, Antonio Scala, Andrea Baronchelli, Matteo Cinelli, Walter Quattrociocchi
2024 J jnl
CoRR
Niccolò Di Marco, Sara Brunetti, Matteo Cinelli, Walter Quattrociocchi
2024 J jnl
CoRR
Niccolò Di Marco, Edoardo Loru, Anita Bonetti, Alessandra Olga Grazia Serra, Matteo Cinelli, Walter Quattrociocchi
2024 J jnl
Online Soc. Networks Media
Edoardo Loru, Matteo Cinelli, Maurizio Tesconi, Walter Quattrociocchi
2024 J jnl
CoRR
Emanuele Sangiorgio, Matteo Cinelli, Roy Cerqueti, Walter Quattrociocchi
2024 J jnl
IEEE Trans. Comput. Soc. Syst.
Niccolò Di Marco, Matteo Cinelli, Shayan Alipour, Walter Quattrociocchi
2024 J jnl
CoRR
Edoardo Loru, Alessandro Galeazzi, Anita Bonetti, Emanuele Sangiorgio, Niccolò Di Marco, Matteo Cinelli, Andrea Baronchelli, Walter Quattrociocchi
2023 J jnl
Soc. Netw. Anal. Min.
Arnaldo Santoro, Alessandro Galeazzi, Teresa Scantamburlo, Andrea Baronchelli, Walter Quattrociocchi, Fabiana Zollo
2023 J jnl
IEEE Trans. Comput. Soc. Syst.
Gabriele Etta, Matteo Cinelli, Alessandro Galeazzi, Carlo Michele Valensise, Walter Quattrociocchi, Mauro Conti
2023 conf
ACIIW
Maurizio Mancini, Matteo Cinelli, Gabriele Etta, Paul Ciurla, Radoslaw Niewiadomski, Walter Quattrociocchi, Valentina Franzoni
2023 J jnl
CoRR
Shayan Alipour, Alessandro Galeazzi, Emanuele Sangiorgio, Michele Avalle, Ljubisa Bojic, Matteo Cinelli, Walter Quattrociocchi
2023 J jnl
CoRR
Maddalena Torricelli, Max Falkenberg, Alessandro Galeazzi, Fabiana Zollo, Walter Quattrociocchi, Andrea Baronchelli
2023 J jnl
CoRR
Corrado Monti, Matteo Cinelli, Carlo Michele Valensise, Walter Quattrociocchi, Michele Starnini
2023 J jnl
CoRR
Shayan Alipour, Niccolò Di Marco, Michele Avalle, Gabriele Etta, Matteo Cinelli, Walter Quattrociocchi
2023 J jnl
Inf. Sci.
Carlo Michele Valensise, Matteo Cinelli, Walter Quattrociocchi
2023 J jnl
CoRR
Edoardo Loru, Matteo Cinelli, Maurizio Tesconi, Walter Quattrociocchi
2023 J jnl
CoRR
Niccolò Di Marco, Matteo Cinelli, Shayan Alipour, Walter Quattrociocchi
2022 J jnl
CoRR
Gabriele Etta, Emanuele Sangiorgio, Niccolò Di Marco, Michele Avalle, Antonio Scala, Matteo Cinelli, Walter Quattrociocchi
2022 J jnl
Decis. Support Syst.
Matteo Cinelli, Stefano Cresci, Walter Quattrociocchi, Maurizio Tesconi, Paola Zola
2022 conf
ICWSM Workshops
Niccolò Di Marco, Matteo Cinelli, Walter Quattrociocchi
2022 conf
SocInfo
Alessandro Quattrociocchi, Gabriele Etta, Michele Avalle, Matteo Cinelli, Walter Quattrociocchi
2022 J jnl
CoRR
Carlo Michele Valensise, Matteo Cinelli, Walter Quattrociocchi
2021 J jnl
CoRR
Carlo Michele Valensise, Alessandra Serra, Alessandro Galeazzi, Gabriele Etta, Matteo Cinelli, Walter Quattrociocchi
2021 J jnl
CoRR
Niccolò Di Marco, Matteo Cinelli, Walter Quattrociocchi
2021 J jnl
CoRR
Gabriele Etta, Matteo Cinelli, Alessandro Galeazzi, Carlo Michele Valensise, Mauro Conti, Walter Quattrociocchi
2021 J jnl
CoRR
Matteo Cinelli, Andraz Pelicon, Igor Mozetic, Walter Quattrociocchi, Petra Kralj Novak, Fabiana Zollo
2021 J jnl
CoRR
Carlo Michele Valensise, Matteo Cinelli, Matthieu Nadini, Alessandro Galeazzi, Antonio Peruzzi, Gabriele Etta, Fabiana Zollo, Andrea Baronchelli, Walter Quattrociocchi
2021 J jnl
Proc. Natl. Acad. Sci. USA
Matteo Cinelli, Gianmarco De Francisci Morales, Alessandro Galeazzi, Walter Quattrociocchi, Michele Starnini
2020 J jnl
CoRR
Matteo Cinelli, Gianmarco De Francisci Morales, Alessandro Galeazzi, Walter Quattrociocchi, Michele Starnini
2020 J jnl
CoRR
Giovanni Bonaccorsi, Francesco Pierri, Matteo Cinelli, Francesco Porcelli, Alessandro Galeazzi, Andrea Flori, Ana Lucía Schmidt, Carlo Michele Valensise, Antonio Scala, Walter Quattrociocchi, Fabio Pammolli
2020 J jnl
CoRR
Alessandro Galeazzi, Matteo Cinelli, Giovanni Bonaccorsi, Francesco Pierri, Ana Lucía Schmidt, Antonio Scala, Fabio Pammolli, Walter Quattrociocchi
2020 J jnl
CoRR
Matteo Cinelli, Walter Quattrociocchi, Alessandro Galeazzi, Carlo Michele Valensise, Emanuele Brugnoli, Ana Lucía Schmidt, Paola Zola, Fabiana Zollo, Antonio Scala
2019 J jnl
CoRR
Matteo Cinelli, Mauro Conti, Livio Finos, Francesco Grisolia, Petra Kralj Novak, Antonio Peruzzi, Maurizio Tesconi, Fabiana Zollo, Walter Quattrociocchi
2019 J jnl
CoRR
Carlo Michele Valensise, Matteo Cinelli, Alessandro Galeazzi, Walter Quattrociocchi
2019 J jnl
CoRR
Emanuele Brugnoli, Matteo Cinelli, Fabiana Zollo, Walter Quattrociocchi, Antonio Scala
2019 J jnl
ACM Trans. Web
Michela Del Vicario, Walter Quattrociocchi, Antonio Scala, Fabiana Zollo
2019 conf
WebSci
Michele Mazza, Stefano Cresci, Marco Avvenuti, Walter Quattrociocchi, Maurizio Tesconi
2019 J jnl
CoRR
Michele Mazza, Stefano Cresci, Marco Avvenuti, Walter Quattrociocchi, Maurizio Tesconi
2019 J jnl
CoRR
Matteo Cinelli, Emanuele Brugnoli, Ana Lucía Schmidt, Fabiana Zollo, Walter Quattrociocchi, Antonio Scala
2019 J jnl
CoRR
Matteo Cinelli, Stefano Cresci, Alessandro Galeazzi, Walter Quattrociocchi, Maurizio Tesconi
2018 J jnl
Entropy
Antonio Peruzzi, Fabiana Zollo, Walter Quattrociocchi, Antonio Scala
2018 J jnl
CoRR
Ana Lucía Schmidt, Fabiana Zollo, Antonio Scala, Walter Quattrociocchi
2018 J jnl
CoRR
Michela Del Vicario, Walter Quattrociocchi, Antonio Scala, Fabiana Zollo
2018 J jnl
CoRR
Ana Lucía Schmidt, Fabiana Zollo, Antonio Scala, Cornelia Betsch, Walter Quattrociocchi
2018 J jnl
CoRR
Andrea Zaccaria, Michela Del Vicario, Walter Quattrociocchi, Antonio Scala, Luciano Pietronero
2018 ch.
Encyclopedia of Social Network Analysis and Mining. 2nd Ed.
Eugenia Galeota, Susanna Liberti, Frédéric Amblard, Walter Quattrociocchi
2017 ed.
COMPLEX NETWORKS
Hocine Cherifi, Sabrina Gaito, Walter Quattrociocchi, Alessandra Sala
2017 J jnl
CoRR
Mauro Conti, Daniele Lain, Riccardo Lazzeretti, Giulio Lovisotto, Walter Quattrociocchi
2017 conf
WIFS
Mauro Conti, Daniele Lain, Riccardo Lazzeretti, Giulio Lovisotto, Walter Quattrociocchi
2017 J jnl
Soc. Networks
Michela Del Vicario, Fabiana Zollo, Guido Caldarelli, Antonio Scala, Walter Quattrociocchi
2017 J jnl
CoRR
Fabiana Zollo, Walter Quattrociocchi
2017 J jnl
Math. Struct. Comput. Sci.
Sara Brunetti, Gennaro Cordasco, Elena Lodi, Luisa Gargano, Walter Quattrociocchi
2017 B conf
DSAA
Michela Del Vicario, Sabrina Gaito, Walter Quattrociocchi, Matteo Zignani, Fabiana Zollo
2017 J jnl
CoRR
Michela Del Vicario, Sabrina Gaito, Walter Quattrociocchi, Matteo Zignani, Fabiana Zollo
2017 ch.
Simulating Social Complexity
Frédéric Amblard, Walter Quattrociocchi
2017 conf
COMPLEX NETWORKS
Fabiana Zollo, Borut Sluban, Igor Mozetic, Walter Quattrociocchi
2016 J jnl
CoRR
Michela Del Vicario, Gianna Vivaldo, Alessandro Bessi, Fabiana Zollo, Antonio Scala, Guido Caldarelli, Walter Quattrociocchi
2016 J jnl
CoRR
Michela Del Vicario, Antonio Scala, Guido Caldarelli, Harry Eugene Stanley, Walter Quattrociocchi
2016 J jnl
CoRR
Michela Del Vicario, Fabiana Zollo, Guido Caldarelli, Antonio Scala, Walter Quattrociocchi
2016 J jnl
CoRR
Alessandro Bessi, Fabiana Zollo, Michela Del Vicario, Michelangelo Puliga, Antonio Scala, Guido Caldarelli, Brian Uzzi, Walter Quattrociocchi
2015 J jnl
Theor. Comput. Sci.
Sara Brunetti, Elena Lodi, Walter Quattrociocchi
2015 J jnl
Comput. Hum. Behav.
Delia Mocanu, Luca Rossi, Qian Zhang, Márton Karsai, Walter Quattrociocchi
2015 J jnl
CoRR
Fabiana Zollo, Alessandro Bessi, Michela Del Vicario, Antonio Scala, Guido Caldarelli, Louis M. Shekhtman, Shlomo Havlin, Walter Quattrociocchi
2015 J jnl
CoRR
Michela Del Vicario, Alessandro Bessi, Fabiana Zollo, Fabio Petroni, Antonio Scala, Guido Caldarelli, Harry Eugene Stanley, Walter Quattrociocchi
2015 J jnl
CoRR
Fabiana Zollo, Petra Kralj Novak, Michela Del Vicario, Alessandro Bessi, Igor Mozetic, Antonio Scala, Guido Caldarelli, Walter Quattrociocchi
2015 J jnl
CoRR
Alessandro Bessi, Fabiana Zollo, Michela Del Vicario, Antonio Scala, Guido Caldarelli, Fabio Petroni, Bruno Gonçalves, Walter Quattrociocchi
2015 J jnl
CoRR
Irene Crimaldi, Michela Del Vicario, Greg Morrison, Walter Quattrociocchi, Massimo Riccaboni
2015 J jnl
CoRR
Michela Del Vicario, Qian Zhang, Alessandro Bessi, Fabiana Zollo, Antonio Scala, Guido Caldarelli, Walter Quattrociocchi
2015 J jnl
CoRR
Alessandro Bessi, Fabiana Zollo, Michela Del Vicario, Antonio Scala, Guido Caldarelli, Walter Quattrociocchi
2015 conf
WWW (Companion Volume)
Alessandro Bessi, Fabio Petroni, Michela Del Vicario, Fabiana Zollo, Aris Anagnostopoulos, Antonio Scala, Guido Caldarelli, Walter Quattrociocchi
2014 J jnl
CoRR
Delia Mocanu, Luca Rossi, Qian Zhang, Márton Karsai, Walter Quattrociocchi
2014 J jnl
CoRR
Alessandro Bessi, Mauro Coletto, George Alexandru Davidescu, Antonio Scala, Guido Caldarelli, Walter Quattrociocchi
2014 C conf
CRITIS
Antonio Scala, Walter Quattrociocchi, Giuliano Andrea Pagani, Marco Aiello
2014 conf
SocInfo
Alessandro Bessi, Guido Caldarelli, Michela Del Vicario, Antonio Scala, Walter Quattrociocchi
2014 J jnl
CoRR
Alessandro Bessi, Guido Caldarelli, Michela Del Vicario, Antonio Scala, Walter Quattrociocchi
2014 ch.
Encyclopedia of Social Network Analysis and Mining
Eugenia Galeota, Susanna Liberti, Frédéric Amblard, Walter Quattrociocchi
2014 J jnl
CoRR
Aris Anagnostopoulos, Alessandro Bessi, Guido Caldarelli, Michela Del Vicario, Fabio Petroni, Antonio Scala, Fabiana Zollo, Walter Quattrociocchi
2013 J jnl
CoRR
Walter Quattrociocchi, Guido Caldarelli, Antonio Scala
2013 J jnl
CoRR
Walter Quattrociocchi, Guido Caldarelli, Antonio Scala
2012 J jnl
CoRR
Sara Brunetti, Gennaro Cordasco, Luisa Gargano, Elena Lodi, Walter Quattrociocchi
2012 B conf
WG
Sara Brunetti, Gennaro Cordasco, Luisa Gargano, Elena Lodi, Walter Quattrociocchi
2012 J jnl
Soc. Netw. Anal. Min.
Walter Quattrociocchi, Frédéric Amblard, Eugenia Galeota
2012 J jnl
Int. J. Parallel Emergent Distributed Syst.
Arnaud Casteigts, Paola Flocchini, Walter Quattrociocchi, Nicola Santoro
2011 J jnl
CoRR
Sara Brunetti, Elena Lodi, Walter Quattrociocchi
2011 conf
IPDPS Workshops
Sara Brunetti, Elena Lodi, Walter Quattrociocchi
2011 J jnl
CoRR
Walter Quattrociocchi, Frédéric Amblard
2011 J jnl
CoRR
Walter Quattrociocchi, Rosaria Conte
2011 conf
CASoN
Frédéric Amblard, Arnaud Casteigts, Paola Flocchini, Walter Quattrociocchi, Nicola Santoro
2011 J jnl
Adv. Complex Syst.
Walter Quattrociocchi, Rosaria Conte, Elena Lodi
2011 J jnl
CoRR
Walter Quattrociocchi, Rosaria Conte, Elena Lodi
2011 J jnl
CoRR
Francesca Giardini, Walter Quattrociocchi, Rosaria Conte
2011 J jnl
CoRR
Walter Quattrociocchi, Rosaria Conte, Elena Lodi
2011 conf
IFIPTM
Audun Jøsang, Walter Quattrociocchi, Dino Karabeg
2011 conf
ADHOC-NOW
Arnaud Casteigts, Paola Flocchini, Walter Quattrociocchi, Nicola Santoro
2011 J jnl
CoRR
Nicola Santoro, Walter Quattrociocchi, Paola Flocchini, Arnaud Casteigts, Frédéric Amblard
2011 J jnl
CoRR
Francesca Giardini, Walter Quattrociocchi, Rosaria Conte
2010 J jnl
Int. J. Artif. Life Res.
Walter Quattrociocchi, Daniela Latorre, Elena Lodi, Mirco Nanni
2010 J jnl
CoRR
Sara Brunetti, Elena Lodi, Walter Quattrociocchi
2010 J jnl
CoRR
Walter Quattrociocchi, Frédéric Amblard
2010 J jnl
CoRR
Arnaud Casteigts, Paola Flocchini, Walter Quattrociocchi, Nicola Santoro
2009 B conf
TrustBus
Audun Jøsang, Walter Quattrociocchi
2009 conf
WSKS (1)
Walter Quattrociocchi, Mario Paolucci, Rosaria Conte
2009 J jnl
Int. J. Knowl. Learn.
Walter Quattrociocchi, Mario Paolucci, Rosaria Conte
2009 ed.
ICONS
Raimund K. Ege, Walter Quattrociocchi, Daniela Dragomirescu, Oana Dini
2008 conf
AAMAS-TRUST
Walter Quattrociocchi, Mario Paolucci, Rosaria Conte
redb/extractors/apk_extractors/apk_signature.py
← Index redb/extractors/apk_extractors/apk_signature.py python
import hashlib
import inspect
from datetime import datetime, timezone
from typing import Any, Optional, Tuple

from redb.extractors.enum import Tag
from redb.extractors.apk_extractor import APKExtractor
from redb.models.dataclasses import APKCertificate, APKCodeSigningInfo


# OID to RFC 4514 short name mapping
_OID_SHORT_NAMES = {
    '2.5.4.3': 'CN', '2.5.4.6': 'C', '2.5.4.7': 'L', '2.5.4.8': 'ST',
    '2.5.4.10': 'O', '2.5.4.11': 'OU', '1.2.840.113549.1.9.1': 'E',
    '2.5.4.5': 'SERIALNUMBER', '2.5.4.12': 'T', '2.5.4.42': 'GN',
    '2.5.4.4': 'SN', '2.5.4.9': 'STREET', '2.5.4.17': 'POSTALCODE',
}


def _asn1_name_to_rfc4514(name):
    """Convert an asn1crypto x509.Name to RFC 4514 string (CN=..., O=...)."""
    parts = []
    for rdn in name.chosen:
        for attr in rdn:
            oid = attr['type'].dotted
            val = attr['value'].native
            short = _OID_SHORT_NAMES.get(oid, oid)
            parts.append(f'{short}={val}')
    return ', '.join(parts)


class APKSignatureExtractor(APKExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False,
        apk=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, apk,
        )
        self.signing_info = None
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.APK_SIGNATURE.value

    def _detect_signature_schemes(self):
        """Detect which APK signature schemes are present."""
        schemes = []
        try:
            if self.apk.is_signed_v1():
                schemes.append(1)
        except Exception:
            pass
        try:
            if self.apk.is_signed_v2():
                schemes.append(2)
        except Exception:
            pass
        try:
            if self.apk.is_signed_v3():
                schemes.append(3)
        except Exception:
            pass
        return schemes

    def _extract_certificate_info(self, cert, source_scheme=None):
        """Extract certificate details from an androguard certificate object."""
        try:
            # Subject and Issuer — asn1crypto doesn't have rfc4514_string, convert manually
            subject = _asn1_name_to_rfc4514(cert.subject)
            issuer = _asn1_name_to_rfc4514(cert.issuer)

            # Serial number
            serial = str(cert.serial_number)

            # Validity
            valid_from = cert.not_valid_before
            valid_to = cert.not_valid_after
            if isinstance(valid_from, datetime):
                valid_from = valid_from.strftime("%Y-%m-%d %H:%M:%S")
            else:
                valid_from = str(valid_from)
            if isinstance(valid_to, datetime):
                valid_to = valid_to.strftime("%Y-%m-%d %H:%M:%S")
            else:
                valid_to = str(valid_to)

            # Thumbprints
            cert_der = cert.dump()
            thumbprint_sha1 = hashlib.sha1(cert_der).hexdigest()
            thumbprint_sha256 = hashlib.sha256(cert_der).hexdigest()

            # Algorithm
            algorithm = None
            try:
                algorithm = cert.hash_algo
            except Exception:
                try:
                    algorithm = cert.signature_algo
                except Exception:
                    pass

            # Key size
            key_size = None
            try:
                pub_key = cert.public_key
                if hasattr(pub_key, 'bit_size'):
                    key_size = pub_key.bit_size
                elif hasattr(pub_key, 'key_size'):
                    key_size = pub_key.key_size
            except Exception:
                pass

            # Self-signed check
            is_self_signed = cert.subject == cert.issuer

            return APKCertificate(
                subject=subject,
                issuer=issuer,
                serial_number=serial,
                valid_from=valid_from,
                valid_to=valid_to,
                thumbprint_sha1=thumbprint_sha1,
                thumbprint_sha256=thumbprint_sha256,
                algorithm=algorithm,
                key_size=key_size,
                is_self_signed=is_self_signed,
                certificate_source_scheme=source_scheme,
            )
        except Exception as e:
            self.log.error(f"Error extracting certificate info: {e}")
            return None

    def _get_signer_certificate(self, schemes) -> Tuple[Optional[APKCertificate], Optional[str]]:
        """Identify the actual signer certificate using V3>V2>V1 priority.

        V2/V3: certificates[0] is the signer per spec.
        V1: androguard's get_certificate() does SignerInfo matching internally.

        Returns (signer_cert_info, source_scheme) or (None, None).
        """
        # V3 takes priority (Android 9+)
        if 3 in schemes:
            try:
                certs = self.apk.get_certificates_v3()
                if certs:
                    cert_info = self._extract_certificate_info(certs[0], source_scheme='v3')
                    if cert_info:
                        return cert_info, 'v3'
            except Exception as e:
                self.log.debug(f"V3 signer extraction failed: {e}")

        # V2 next (Android 7.0+)
        if 2 in schemes:
            try:
                certs = self.apk.get_certificates_v2()
                if certs:
                    cert_info = self._extract_certificate_info(certs[0], source_scheme='v2')
                    if cert_info:
                        return cert_info, 'v2'
            except Exception as e:
                self.log.debug(f"V2 signer extraction failed: {e}")

        # V1 fallback — androguard does SignerInfo.issuerAndSerialNumber matching
        if 1 in schemes:
            try:
                names = self.apk.get_signature_names()
                if names:
                    cert = self.apk.get_certificate(names[0])
                    if cert:
                        cert_info = self._extract_certificate_info(cert, source_scheme='v1')
                        if cert_info:
                            return cert_info, 'v1'
            except Exception as e:
                self.log.debug(f"V1 signer extraction failed: {e}")

        return None, None

    def _extract_all_certificates(self, schemes):
        """Extract all certificates with their source scheme tracked.

        Uses scheme-specific methods to preserve source information,
        deduplicating by thumbprint_sha1 and merging source schemes.
        """
        # cert thumbprint -> (APKCertificate, set of source schemes)
        seen = {}

        for scheme_num, method_name in [
            (3, 'get_certificates_v3'),
            (2, 'get_certificates_v2'),
            (1, 'get_certificates_v1'),
        ]:
            if scheme_num not in schemes:
                continue
            try:
                method = getattr(self.apk, method_name, None)
                if method is None:
                    continue
                certs = method()
                if not certs:
                    continue
                for cert in certs:
                    cert_info = self._extract_certificate_info(cert, source_scheme=f'v{scheme_num}')
                    if cert_info:
                        key = cert_info.thumbprint_sha1
                        if key in seen:
                            # Merge source schemes
                            existing_cert, existing_schemes = seen[key]
                            existing_schemes.add(f'v{scheme_num}')
                        else:
                            seen[key] = (cert_info, {f'v{scheme_num}'})
            except Exception as e:
                self.log.warning(f"Error extracting v{scheme_num} certificates: {e}")

        # Build final list with merged source schemes
        result = []
        for cert_info, source_schemes in seen.values():
            cert_info.certificate_source_scheme = ','.join(sorted(source_schemes))
            result.append(cert_info)

        return result

    def extract(self):
        if not self._is_valid_apk():
            self.log.error(f"Invalid APK for {self.hash.sha256}")
            return None

        schemes = self._detect_signature_schemes()
        is_signed = len(schemes) > 0

        # Extract all certificates with source scheme tracking
        certificates = self._extract_all_certificates(schemes)

        # Identify the actual signer using V3>V2>V1 priority
        signer_cert, signer_scheme = self._get_signer_certificate(schemes)

        apk_signer_subject = signer_cert.subject if signer_cert else None
        apk_signer_issuer = signer_cert.issuer if signer_cert else None

        self.signing_info = APKCodeSigningInfo(
            _id=self.sha256,
            is_signed=is_signed,
            signature_scheme_versions=schemes,
            number_of_certificates=len(certificates),
            x509_certificates=certificates if certificates else None,
            apk_signer_subject=apk_signer_subject,
            apk_signer_issuer=apk_signer_issuer,
        )
        return self.signing_info

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ClickHouseExporter":
            if not self.signing_info:
                return None

            current_time = datetime.now(timezone.utc)
            sig = self.signing_info

            # Signature summary table
            signature_data = [[
                self.sha256,
                int(sig.is_signed),
                sig.signature_scheme_versions,
                sig.number_of_certificates,
                sig.apk_signer_subject,
                sig.apk_signer_issuer,
                current_time,
            ]]

            # Certificates table (one row per certificate)
            certificates_data = []
            if sig.x509_certificates:
                for cert in sig.x509_certificates:
                    certificates_data.append([
                        self.sha256,
                        cert.subject,
                        cert.issuer,
                        cert.serial_number,
                        datetime.strptime(cert.valid_from, "%Y-%m-%d %H:%M:%S") if cert.valid_from else None,
                        datetime.strptime(cert.valid_to, "%Y-%m-%d %H:%M:%S") if cert.valid_to else None,
                        cert.thumbprint_sha1,
                        cert.algorithm,
                        cert.key_size,
                        int(cert.is_self_signed),
                        cert.certificate_source_scheme,
                        current_time,
                    ])

            return {
                'multi_table': True,
                'signature': {
                    'table': 'redb_apk_signature',
                    'data': signature_data,
                    'column_names': [
                        'sha256',
                        'is_signed', 'signature_scheme_versions',
                        'number_of_certificates',
                        'apk_signer_subject', 'apk_signer_issuer',
                        'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)',
                        'UInt8', 'Array(UInt8)',
                        'UInt8',
                        'Nullable(String)', 'Nullable(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
                'certificates': {
                    'table': 'redb_apk_certificates',
                    'data': certificates_data,
                    'column_names': [
                        'sha256', 'certificate_subject', 'certificate_issuer',
                        'certificate_serial_number',
                        'certificate_valid_from', 'certificate_valid_to',
                        'certificate_thumbprint',
                        'certificate_algorithm', 'key_size', 'is_self_signed',
                        'certificate_source_scheme',
                        'analysis_date',
                    ],
                    'column_type_names': [
                        'FixedString(64)', 'String', 'String', 'String',
                        "DateTime64(3, 'UTC')", "DateTime64(3, 'UTC')",
                        'FixedString(40)',
                        'LowCardinality(String)', 'Nullable(UInt16)', 'UInt8',
                        'LowCardinality(String)',
                        "DateTime64(3, 'UTC')",
                    ],
                },
            }

    def get_clickhouse_table(self) -> str:
        return "redb_apk_signature"