Oswald Lanz

128 papers A* 10A 2B 15C 1Misc 7Journal 50Unranked 33
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Tsung-Ming Tai, Sofia Casarin, Andrea Pilzer, Werner Nutt, Oswald Lanz
2026 J jnl
J. Imaging
Emanuele Caruso, Francesco Pelosin, Alessandro Simoni, Oswald Lanz
2026 J jnl
Inf. Syst.
Vincenzo Pasquadibisceglie, Ivan Donadello, Annalisa Appice, Oswald Lanz, Fabrizio Maria Maggi, Giuseppe Fiameni, Donato Malerba
2025 conf
WACV (Workshops)
Edoardo Bianchi, Oswald Lanz
2025 J jnl
CoRR
Edoardo Bianchi, Oswald Lanz
2025 A* conf
CVPR
Sofia Casarin, Sergio Escalera, Oswald Lanz
2025 J jnl
CoRR
Sofia Casarin, Sergio Escalera, Oswald Lanz
2025 J jnl
CoRR
Emmanouil Zaranis, António Farinhas, Saul José Rodrigues dos Santos, Beatriz Canaverde, Miguel Moura Ramos, Aditya K. Surikuchi, André Viveiros, Baohao Liao, Elena Belén Bueno-Benito, Nithin Sivakumaran, Pavlo Vasylenko, Shoubin Yu, Sonal Sannigrahi, Wafaa Mohammed, Ben Peters, Danae Sánchez Villegas, Elias Stengel-Eskin, Giuseppe Attanasio, Jaehong Yoon, Stella Frank, Alessandro Suglia, Chrysoula Zerva, Desmond Elliott, Mariella Dimiccoli, Mohit Bansal, Oswald Lanz, Raffaella Bernardi, Raquel Fernández, Sandro Pezzelle, Vlad Niculae, André F. T. Martins
2025 conf
ICCVW
Sofia Casarin, Sergio Escalera, Oswald Lanz
2025 conf
DEXA (2)
Maryam Mozaffari, Anton Dignös, Oswald Lanz, Dominik T. Matt, Gabriele Pasetti Monizza, Matthias Gauly, Johann Gamper
2024 conf
CVPR Workshops
Cynthia Ifeyinwa Ugwu, Sofia Casarin, Oswald Lanz
2024 J jnl
CoRR
Cynthia Ifeyinwa Ugwu, Sofia Casarin, Oswald Lanz
2024 conf
CVPR Workshops
Sofia Casarin, Oswald Lanz, Sergio Escalera
2024 J jnl
CoRR
Sofia Casarin, Oswald Lanz, Sergio Escalera
2024 J jnl
Comput. Vis. Image Underst.
Alex Falcon, Giuseppe Serra, Oswald Lanz
2024 conf
ICMVA
Cynthia Ifeyinwa Ugwu, Sofia Casarin, Oswald Lanz
2024 conf
Ital-IA
Andrea Rosani, Ivan Donadello, Michele Calvanese, Alessandro Torcinovich, Giuseppe Di Fatta, Marco Montali, Oswald Lanz
2024 A* conf
CVPR
Sofia Casarin, Cynthia Ifeyinwa Ugwu, Sergio Escalera, Oswald Lanz
2024 J jnl
CoRR
Sofia Casarin, Cynthia Ifeyinwa Ugwu, Sergio Escalera, Oswald Lanz
2023 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2023 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2023 conf
VISIGRAPP (5: VISAPP)
Mohamed Ilyes Lakhal, Oswald Lanz, Andrea Cavallaro
2023 J jnl
CoRR
Cynthia Ifeyinwa Ugwu, Sofia Casarin, Oswald Lanz
2023 J jnl
Multim. Tools Appl.
Alex Falcon, Giuseppe Serra, Oswald Lanz
2022 A* conf
ACM Multimedia
Alex Falcon, Giuseppe Serra, Oswald Lanz
2022 J jnl
CoRR
Alex Falcon, Giuseppe Serra, Oswald Lanz
2022 J jnl
IEEE Trans. Multim.
Xinyuan Qian, Alessio Brutti, Oswald Lanz, Maurizio Omologo, Andrea Cavallaro
2022 conf
AIABI@AI*IA
Giovanni D'Agostino, Alex Falcon, Oswald Lanz, Giorgio Brajnik, Carlo Tasso, Giuseppe Serra
2022 J jnl
CoRR
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2022 B conf
ICIP
Tsung-Ming Tai, Giuseppe Fiameni, Cheng-Kuang Lee, Oswald Lanz
2022 A conf
BMVC
Mohamed Ilyes Lakhal, Oswald Lanz, Andrea Cavallaro
2022 J jnl
CoRR
Tsung-Ming Tai, Giuseppe Fiameni, Cheng-Kuang Lee, Simon See, Oswald Lanz
2022 conf
ICIAP (3)
Alex Falcon, Giuseppe Serra, Oswald Lanz
2022 J jnl
CoRR
Alex Falcon, Giuseppe Serra, Oswald Lanz
2022 J jnl
CoRR
Tsung-Ming Tai, Oswald Lanz, Giuseppe Fiameni, Yi-Kwan Wong, Sze-Sen Poon, Cheng-Kuang Lee, Ka Chun Cheung, Simon See
2022 J jnl
Comput. Ind.
Alex Falcon, Giovanni D'Agostino, Oswald Lanz, Giorgio Brajnik, Carlo Tasso, Giuseppe Serra
2022 B conf
ICMR
Alex Falcon, Swathikiran Sudhakaran, Giuseppe Serra, Sergio Escalera, Oswald Lanz
2022 J jnl
CoRR
Alex Falcon, Swathikiran Sudhakaran, Giuseppe Serra, Sergio Escalera, Oswald Lanz
2022 J jnl
CoRR
Alex Falcon, Giuseppe Serra, Sergio Escalera, Oswald Lanz
2022 B conf
ICPR
Tsung-Ming Tai, Giuseppe Fiameni, Cheng-Kuang Lee, Simon See, Oswald Lanz
2022 J jnl
CoRR
Tsung-Ming Tai, Giuseppe Fiameni, Cheng-Kuang Lee, Simon See, Oswald Lanz
2021 J jnl
CoRR
Tsung-Ming Tai, Giuseppe Fiameni, Cheng-Kuang Lee, Oswald Lanz
2021 J jnl
CoRR
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2021 J jnl
CoRR
Swathikiran Sudhakaran, Adrian Bulat, Juan-Manuel Pérez-Rúa, Alex Falcon, Sergio Escalera, Oswald Lanz, Brais Martínez, Georgios Tzimiropoulos
2020 J jnl
IEEE Trans. Image Process.
Alessio Xompero, Oswald Lanz, Andrea Cavallaro
2020 conf
ECCV Workshops (1)
Alex Falcon, Oswald Lanz, Giuseppe Serra
2020 J jnl
CoRR
Alex Falcon, Oswald Lanz, Giuseppe Serra
2020 J jnl
CoRR
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2020 A* conf
CVPR
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2020 conf
ACCV (4)
Mohamed Ilyes Lakhal, Davide Boscaini, Fabio Poiesi, Oswald Lanz, Andrea Cavallaro
2020 J jnl
CoRR
Mohamed Ilyes Lakhal, Davide Boscaini, Fabio Poiesi, Oswald Lanz, Andrea Cavallaro
2019 Misc conf
ICASSP
Oswald Lanz, Alessio Brutti, Alessio Xompero, Xinyuan Qian, Maurizio Omologo, Andrea Cavallaro
2019 J jnl
CoRR
Swathikiran Sudhakaran, Oswald Lanz
2019 J jnl
CoRR
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2019 J jnl
CoRR
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2019 J jnl
CoRR
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2019 ed.
ICIAP (1)
Elisa Ricci, Samuel Rota Bulò, Cees Snoek, Oswald Lanz, Stefano Messelodi, Nicu Sebe
2019 ed.
ICIAP (2)
Elisa Ricci, Samuel Rota Bulò, Cees Snoek, Oswald Lanz, Stefano Messelodi, Nicu Sebe
2019 A* conf
CVPR
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2019 B conf
ICIP
Mohamed Ilyes Lakhal, Oswald Lanz, Andrea Cavallaro
2019 J jnl
IEEE Trans. Multim.
Xinyuan Qian, Alessio Brutti, Oswald Lanz, Maurizio Omologo, Andrea Cavallaro
2019 ed.
ICIAP Workshops
Marco Cristani, Andrea Prati, Oswald Lanz, Stefano Messelodi, Nicu Sebe
2019 J jnl
Intelligenza Artificiale
Swathikiran Sudhakaran, Oswald Lanz
2019 A* conf
ICCV
Mohamed Ilyes Lakhal, Oswald Lanz, Andrea Cavallaro
2018 Misc conf
ICASSP
Xinyuan Qian, Alessio Xompero, Andrea Cavallaro, Alessio Brutti, Oswald Lanz, Maurizio Omologo
2018 A conf
BMVC
Swathikiran Sudhakaran, Oswald Lanz
2018 J jnl
CoRR
Swathikiran Sudhakaran, Oswald Lanz
2018 J jnl
Int. J. Comput. Vis.
Jagannadan Varadarajan, Ramanathan Subramanian, Samuel Rota Bulò, Narendra Ahuja, Oswald Lanz, Elisa Ricci
2018 J jnl
CoRR
Swathikiran Sudhakaran, Sergio Escalera, Oswald Lanz
2018 B conf
ICIP
Alessio Xompero, Oswald Lanz, Andrea Cavallaro
2018 C conf
FUSION
Alessio Xompero, Oswald Lanz, Andrea Cavallaro
2018 conf
ECCV Workshops (2)
Mohamed Ilyes Lakhal, Oswald Lanz, Andrea Cavallaro
2018 conf
ECCV Workshops (2)
Mohamed Ilyes Lakhal, Albert Clapés, Sergio Escalera, Oswald Lanz, Andrea Cavallaro
2018 conf
AI*IA
Swathikiran Sudhakaran, Oswald Lanz
2018 J jnl
CoRR
Swathikiran Sudhakaran, Oswald Lanz
2017 J jnl
Mach. Vis. Appl.
Lorenzo Porzi, Samuel Rota Bulò, Oswald Lanz, Paolo Valigi, Elisa Ricci
2017 conf
ICCV Workshops
Swathikiran Sudhakaran, Oswald Lanz
2017 J jnl
CoRR
Swathikiran Sudhakaran, Oswald Lanz
2017 ch.
Group and Crowd Behavior for Computer Vision
Elisa Ricci, Yan Yan, Anoop Kolar Rajagopal, Ramanathan Subramanian, Radu L. Vieriu, Oswald Lanz, Nicu Sebe
2017 J jnl
CoRR
Swathikiran Sudhakaran, Oswald Lanz
2017 B conf
AVSS
Swathikiran Sudhakaran, Oswald Lanz
2017 ch.
Group and Crowd Behavior for Computer Vision
Xavier Alameda-Pineda, Ramanathan Subramanian, Elisa Ricci, Oswald Lanz, Nicu Sebe
2016 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Yan Yan, Elisa Ricci, Ramanathan Subramanian, Gaowen Liu, Oswald Lanz, Nicu Sebe
2016 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Xavier Alameda-Pineda, Jacopo Staiano, Ramanathan Subramanian, Ligia Maria Batrinca, Elisa Ricci, Bruno Lepri, Oswald Lanz, Nicu Sebe
2015 A* conf
ACM Multimedia
Xavier Alameda-Pineda, Yan Yan, Elisa Ricci, Oswald Lanz, Nicu Sebe
2015 J jnl
Comput. Vis. Image Underst.
Tao Hu, Stefano Messelodi, Oswald Lanz
2015 A* conf
ACM Multimedia
Ramanathan Subramanian, Jagannadan Varadarajan, Elisa Ricci, Oswald Lanz, Stefan Winkler
2015 J jnl
CoRR
Xavier Alameda-Pineda, Jacopo Staiano, Ramanathan Subramanian, Ligia Maria Batrinca, Elisa Ricci, Bruno Lepri, Oswald Lanz, Nicu Sebe
2015 A* conf
ICCV
Elisa Ricci, Jagannadan Varadarajan, Ramanathan Subramanian, Samuel Rota Bulò, Narendra Ahuja, Oswald Lanz
2014 B conf
ICPR
Tao Hu, Stefano Messelodi, Oswald Lanz
2014 B conf
ICPR
Yan Yan, Ramanathan Subramanian, Elisa Ricci, Oswald Lanz, Nicu Sebe
2014 conf
ICIAR (2)
Sinan Mutlu, Samuel Rota Bulò, Oswald Lanz
2014 J jnl
Int. J. Comput. Vis.
Anoop Kolar Rajagopal, Subramanian Ramanathan, Elisa Ricci, Radu L. Vieriu, Oswald Lanz, Kalpathi Ramakrishnan, Nicu Sebe
2014 conf
ICDSC
Lorenzo Porzi, Samuel Rota Bulò, Paolo Valigi, Oswald Lanz, Elisa Ricci
2014 conf
EUSIPCO
Gabriele Costante, Lorenzo Porzi, Oswald Lanz, Paolo Valigi, Elisa Ricci
2014 conf
ICDSC
Tao Hu, Stefano Messelodi, Oswald Lanz
2013 conf
ICIAP (2)
Sinan Mutlu, Tao Hu, Oswald Lanz
2013 B conf
ICIP
Francesco Setti, Oswald Lanz, Roberta Ferrario, Vittorio Murino, Marco Cristani
2013 conf
ICIAP (2)
Tao Hu, Sinan Mutlu, Oswald Lanz
2013 A* conf
ICCV
Yan Yan, Elisa Ricci, Subramanian Ramanathan, Oswald Lanz, Nicu Sebe
2013 B conf
ICMI
Subramanian Ramanathan, Yan Yan, Jacopo Staiano, Oswald Lanz, Nicu Sebe
2012 B conf
ICPR
Yan Yan, Subramanian Ramanathan, Oswald Lanz, Nicu Sebe
2012 conf
ACCV (2)
Anoop Kolar Rajagopal, Subramanian Ramanathan, Radu L. Vieriu, Elisa Ricci, Oswald Lanz, Kalpathi Ramakrishnan, Nicu Sebe
2012 conf
EUSIPCO
Radu L. Vieriu, Anoop Kolar Rajagopal, Subramanian Ramanathan, Oswald Lanz, Elisa Ricci, Nicu Sebe, Kalpathi Ramakrishnan
2011 B conf
AVSS
Oswald Lanz, Tao Hu
2010 conf
EUSIPCO
Alessio Brutti, Oswald Lanz
2010 B conf
LREC
Massimo Poesio, Marco Baroni, Oswald Lanz, Alessandro Lenci, Alexandros Potamianos, Hinrich Schütze, Sabine Schulte im Walde, Luca Surian
2010 ch.
Handbook of Ambient Intelligence and Smart Environments
Alexander Waibel, Rainer Stiefelhagen, Rolf Carlson, Josep R. Casas, Jan Kleindienst, Lori Lamel, Oswald Lanz, Djamel Mostefa, Maurizio Omologo, Fabio Pianesi, Lazaros Polymenakos, Gerasimos Potamianos, John Soldatos, Gerhard Sutschet, Jacques M. B. Terken
2010 conf
MPVA@MM
Gloria Zen, Bruno Lepri, Elisa Ricci, Oswald Lanz
2010 B conf
ICPR
Gloria Zen, Oswald Lanz, Stefano Messelodi, Elisa Ricci
2009 Misc conf
ICASSP
Oswald Lanz
2009 B conf
AVSS
Oswald Lanz, Stefano Messelodi
2009 ch.
Computers in the Human Interaction Loop
Michael Voit, Nicolas Gourier, Cristian Canton-Ferrer, Oswald Lanz, Rainer Stiefelhagen, Roberto Brunelli
2009 ch.
Computers in the Human Interaction Loop
Oswald Lanz, Roberto Brunelli, Paul Chippendale, Michael Voit, Rainer Stiefelhagen
2009 conf
IWANN (2)
Vit Libal, Bhuvana Ramabhadran, Nadia Mana, Fabio Pianesi, Paul Chippendale, Oswald Lanz, Gerasimos Potamianos
2009 ch.
Computers in the Human Interaction Loop
Keni Bernardin, Rainer Stiefelhagen, Aristodemos Pnevmatikakis, Oswald Lanz, Alessio Brutti, Josep R. Casas, Gerasimos Potamianos
2008 conf
MLMI
Paul Chippendale, Oswald Lanz
2007 conf
CLEAR
Oswald Lanz, Paul Chippendale, Roberto Brunelli
2007 Misc conf
ICIAP
Oswald Lanz
2007 conf
CLEAR
Oswald Lanz, Roberto Brunelli
2007 ch.
PEACH - Intelligent Interfaces for Museum Visits
Roberto Brunelli, Oswald Lanz, A. Santuari, Francesco Tobia
2006 conf
CLEAR
Roberto Brunelli, Alessio Brutti, Paul Chippendale, Oswald Lanz, Maurizio Omologo, Piergiorgio Svaizer, Francesco Tobia
2006 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Oswald Lanz
2006 conf
MFI
Oswald Lanz, Roberto Brunelli
2005 conf
CVPR (1)
Oswald Lanz, Roberto Manduchi
2004 Misc conf
ICCVG
Oswald Lanz
2004 Misc conf
ICCVG
Oswald Lanz
2003 Misc conf
ICIAP
F. Bertamini, Roberto Brunelli, Oswald Lanz, A. Roat, A. Santuari, Francesco Tobia, Qing Xu
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"