Ran Wang

114 papers B 20C 3Journal 59Unranked 31
YearRankTypeTitle / Venue / Authors
2026 J jnl
IEEE Trans. Cogn. Commun. Netw.
Shiqi Tian, Ran Wang, Jie Hao, Qiang Wu, Dusit Niyato
2026 J jnl
IEEE Trans. Netw. Sci. Eng.
Liang Liu, Wenbin Zhai, Xin Li, Youwei Ding, Wanying Lu, Ran Wang
2026 J jnl
IEEE Internet Things J.
Wanyue Li, Shuyang Li, Jie Hao, Qiang Wu, Ran Wang
2026 J jnl
IEEE Trans. Netw. Sci. Eng.
Luting Cao, Yan Lyu, Jin Sun, Zhe Wang, Ran Wang, Guanyu Gao
2026 J jnl
Digit. Commun. Networks
Hao Liu, Xiaonyu Hu, Ran Wang, Jie Hao, Qiang Wu, Hongke Zhang
2026 J jnl
IEEE Trans. Cogn. Commun. Netw.
Yuhan Zhang, Ran Wang, Jie Hao, Qiang Wu, Zehui Xiong, Dusit Niyato
2026 J jnl
IEEE Trans. Mob. Comput.
Meng Yuan, Songjing Tao, Qiang Wu, Xiangbin Wang, Ran Wang, Jie Hao, Dusit Niyato
2026 J jnl
IEEE Trans. Image Process.
Chaojun Li, Peiliang Gong, Shengrong Li, Chunwei Tian, Yinbo Yu, Ran Wang, Daoqiang Zhang, Qi Zhu
2026 J jnl
IEEE Trans. Netw. Sci. Eng.
Lundan Cai, Ran Wang, Qiang Wu, Yidan Teng, Zehui Xiong
2025 J jnl
IEEE Trans. Veh. Technol.
Denghui Liu, Ruoyang Chen, Changyan Yi, Tong Zhang, Xiaolong Li, Juan Li, Ran Wang, Kun Zhu
2025 J jnl
IEEE Trans. Green Commun. Netw.
Jialiuyuan Li, Changyan Yi, Jiayuan Chen, You Shi, Tong Zhang, Xiaolong Li, Ran Wang, Kun Zhu
2025 conf
NPC (1)
Yuhan Zhang, Ran Wang, Jie Hao, Qiang Wu, Zehui Xiong, Jiawen Kang
2025 J jnl
IEEE Trans. Mob. Comput.
Shuyang Li, Qiang Wu, Ran Wang, Long Chen, Hongke Zhang
2025 J jnl
IEEE Internet Things J.
Shuyang Li, Guanchen Wu, Qiang Wu, Ran Wang, Hongke Zhang
2025 B conf
WCNC
Shuyang Li, Qiang Wu, Ran Wang
2025 conf
WASA (3)
Wanyue Li, Shuyang Li, Jie Hao, Qiang Wu, Ran Wang
2025 J jnl
IEEE Trans. Mob. Comput.
Guiliang Cai, Qiang Wu, Ran Wang, Lianyi Zhi, Xiaoming Fu, Hongke Zhang
2025 J jnl
IEEE Internet Things J.
Songjing Tao, Meng Yuan, Qiang Wu, Ran Wang, Jie Hao
2025 J jnl
IEEE Trans. Green Commun. Netw.
Ran Wang, Rixin Wu, Linfeng Liu, Changyan Yi, Kun Zhu, Ping Wang, Dusit Niyato
2025 J jnl
IEEE Trans. Intell. Transp. Syst.
Rixin Wu, Ran Wang, Jie Hao, Qiang Wu, Ping Wang, Dusit Niyato
2025 conf
ICSOC (2)
Yunkang Zhang, Qiang Wu, Ran Wang, Jie Hao, Hao Liu, Yiyun Xu
2025 conf
NPC (1)
Shengnan Cao, Qiang Wu, Ran Wang, Shuyang Li
2025 J jnl
IEEE Trans. Veh. Technol.
You Shi, Jian Wang, Changyan Yi, Ran Wang, Bing Chen
2025 J jnl
IEEE Internet Things J.
Xiangbin Wang, Qiang Wu, Meng Yuan, Ran Wang, Siyang Sun
2025 J jnl
IEEE Trans. Mob. Comput.
Ran Wang, Lundan Cai, Qiang Wu, Dusit Niyato
2025 J jnl
IEEE Trans. Mob. Comput.
Yuhan Zhang, Ran Wang, Jie Hao, Qiang Wu, Yidan Teng, Ping Wang, Dusit Niyato
2025 J jnl
IEEE Commun. Mag.
Shuyang Li, Qiang Wu, Ran Wang, Rongxing Lu
2024 J jnl
IEEE Netw.
Qiang Wu, Ran Wang, Xiangyang Duan, Changyan Yi, Ping Wang
2024 conf
ICCEIC
Lianyi Zhi, Qiang Wu, Ran Wang, Guiliang Cai
2024 J jnl
IEEE/ACM Trans. Netw.
Shuyang Li, Qiang Wu, Ran Wang
2024 J jnl
IEEE Trans. Multim.
Guanyu Gao, Yuqi Dong, Ran Wang, Xin Zhou
2024 conf
MSN
Mengjie Guo, Qiang Wu, Ran Wang, Rixin Wu, Hongke Zhang
2024 J jnl
IEEE Trans. Mob. Comput.
Ran Wang, Xue Yu, Qiang Wu, Changyan Yi, Ping Wang, Dusit Niyato
2024 J jnl
CoRR
Rixin Wu, Ran Wang, Jie Hao, Qiang Wu, Ping Wang, Dusit Niyato
2024 J jnl
IEEE Trans. Cogn. Commun. Netw.
Xue Yu, Ran Wang, Jie Hao, Qiang Wu, Changyan Yi, Ping Wang, Dusit Niyato
2024 J jnl
IEEE Trans. Wirel. Commun.
You Shi, Changyan Yi, Ran Wang, Qiang Wu, Bing Chen, Jun Cai
2023 conf
MobiArch
Tingli Xu, Ran Wang, Jie Hao
2023 J jnl
IEEE Trans. Veh. Technol.
Jiayuan Chen, Changyan Yi, Ran Wang, Kun Zhu, Jun Cai
2023 J jnl
IEEE Veh. Technol. Mag.
Ran Wang, Hui Wang, Kun Zhu, Changyan Yi, Ping Wang, Dusit Niyato
2023 B conf
WiOpt
Yuhan Zhang, Ran Wang, Qiang Wu, Jie Hao, Zehui Xiong
2023 J jnl
CoRR
Rixin Wu, Ran Wang, Jie Hao, Qiang Wu, Ping Wang
2022 conf
ICC
Jiayuan Chen, Changyan Yi, Ran Wang, Kun Zhu, Jun Cai
2022 J jnl
IEEE Trans. Mob. Comput.
Changyan Yi, Jun Cai, Kun Zhu, Ran Wang
2022 C conf
EUC
Chen Ying, Zhen Zhao, Changyan Yi, You Shi, Ran Wang
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Kun Zhu, Yue Zhou, Changyan Yi, Ran Wang
2022 B conf
GLOBECOM
Jian Zheng, Kun Zhu, Ran Wang
2022 conf
APWeb/WAIM Workshops
Rongtao Zhang, Jie Hao, Ran Wang, Hui Wang, Hai Deng, Shifang Lu
2022 J jnl
Inf. Sci.
Qi Zhu, Huijie Li, Haizhou Ye, Zhiqiang Zhang, Ran Wang, Zizhu Fan, Daoqiang Zhang
2022 J jnl
IEEE Wirel. Commun.
Qiang Wu, Ran Wang, Xincheng Yan, Chunming Wu, Rongxing Lu
2022 conf
WASA (3)
Wenqiu Zhang, Ran Wang, Changyan Yi, Kun Zhu
2022 J jnl
IEEE Trans. Intell. Transp. Syst.
Linfeng Liu, Zhiyuan Xi, Kun Zhu, Ran Wang, Ekram Hossain
2022 conf
APWeb/WAIM (2)
Rongtao Zhang, Jie Hao, Ran Wang, Hai Deng, Hui Wang
2022 conf
WASA (1)
Zhenxian Ma, Ran Wang, Changyan Yi, Kun Zhu
2022 B conf
WCNC
Hu Xu, Jiequ Ji, Kun Zhu, Ran Wang
2022 J jnl
IEEE Trans. Medical Imaging
Qi Zhu, Ruting Xu, Ran Wang, Xijia Xu, Zhiqiang Zhang, Daoqiang Zhang
2021 J jnl
Mob. Networks Appl.
Yang Li, Yunlong Zhao, Bin Guo, Zhenhua Zhang, Qian Geng, Ran Wang
2021 conf
WASA (2)
Hu Xu, Jiequ Ji, Kun Zhu, Ran Wang
2021 J jnl
Expert Syst. Appl.
Shoufei Han, Kun Zhu, Ran Wang
2021 conf
HPCC/DSS/SmartCity/DependSys
Zizhen Li, Ran Wang, Kun Zhu, Changyan Yi, Linfeng Liu, Dusit Niyato
2021 J jnl
IEEE Internet Things J.
Jiequ Ji, Kun Zhu, Dusit Niyato, Ran Wang
2021 B conf
WCNC
Aijin Zhang, Kun Zhu, Ran Wang, Changyan Yi
2021 B conf
GLOBECOM
Hui Wang, Ran Wang, Hu Xu, Kun Zhu, Changyan Yi, Dusit Niyato
2021 J jnl
IEEE Trans. Syst. Man Cybern. Syst.
Yue Cao, Tao Jiang, Omprakash Kaiwartya, Hongjian Sun, Huan Zhou, Ran Wang
2020 J jnl
IEEE Commun. Lett.
Meng Chen, Kun Zhu, Ran Wang, Dusit Niyato
2020 conf
WASA (1)
Zhitian Tu, Kun Zhu, Changyan Yi, Ran Wang
2020 conf
VTC Fall
Changyan Yi, Jun Cai, Ran Wang, Kun Zhu
2020 B conf
GLOBECOM
Chengzhen Xu, Kun Zhu, Changyan Yi, Ran Wang
2020 conf
ICC
Chengzhen Xu, Kun Zhu, Ran Wang, Yuanyuan Xu
2020 J jnl
IEEE Trans. Wirel. Commun.
Jiequ Ji, Kun Zhu, Dusit Niyato, Ran Wang
2020 conf
ICC
Jiequ Ji, Kun Zhu, Dusit Niyato, Ran Wang
2020 B conf
GLOBECOM
Jiequ Ji, Kun Zhu, Changyan Yi, Ran Wang, Dusit Niyato
2020 J jnl
Comput. Networks
Linfeng Liu, Ran Wang, Gaoxi Xiao, Dongyue Guo
2020 B conf
GLOBECOM
Ang Ji, Ran Wang, Kun Zhu, Zehui Xiong, Dusit Niyato
2020 J jnl
IEEE Trans. Commun.
Jiequ Ji, Kun Zhu, Dusit Niyato, Ran Wang
2019 J jnl
Wirel. Commun. Mob. Comput.
Linfeng Liu, Ping Zhou, Jiagao Wu, Ran Wang, Xiaojun Fan, Haiting Zhu
2019 conf
SmartGridComm
Bijian Dai, Ran Wang, Kun Zhu, Jie Hao, Ping Wang
2019 J jnl
Sensors
Jie Hao, Jing Chen, Ran Wang, Yi Zhuang, Baoxian Zhang
2019 conf
MLICOM
Jing Chen, Jie Hao, Ran Wang, Ao Shen, Ze Yu
2019 J jnl
J. Parallel Distributed Comput.
Linfeng Liu, Ran Wang, Jiagao Wu
2019 J jnl
IEEE Trans. Cogn. Commun. Netw.
Chen Dai, Kun Zhu, Ran Wang, Bing Chen
2019 conf
ICC
Chen Dai, Kun Zhu, Ran Wang, Yuanyuan Xu
2019 B conf
WCNC
Chen Dai, Kun Zhu, Ran Wang, Yuanyuan Xu
2019 conf
HPCC/SmartCity/DSS
Na Wang, Kun Zhu, Hongyan Qian, Ran Wang, Yuanyuan Xu
2019 B conf
ICPADS
Jun Qian, Kun Zhu, Ran Wang, Yanchao Zhao
2019 conf
MSN
Jinwei Xu, Kun Zhu, Ran Wang
2019 conf
SmartGridComm
Yueyu Deng, Kun Zhu, Ran Wang, Yong Wan
2019 B conf
GLOBECOM
Shan Li, Kun Zhu, Yuanyuan Xu, Ran Wang, Yanchao Zhao
2018 conf
iThings/GreenCom/CPSCom/SmartData
Xiaoming Yuan, Ran Wang, Yi Zhuang, Kun Zhu, Jie Hao
2018 C conf
CSCWD
Linfeng Liu, Ping Zhou, Jiagao Wu, Ran Wang, Xiaojun Fan, Haiting Zhu
2018 C conf
GPC
Zhenhua Zhang, Yunlong Zhao, Yang Li, Kun Zhu, Ran Wang
2018 J jnl
IEEE Access
Ran Wang, Yiwen Lu, Kun Zhu, Jie Hao, Ping Wang, Yue Cao
2018 J jnl
Wirel. Commun. Mob. Comput.
Jie Hao, Ran Wang, Baoxian Zhang, Yi Zhuang, Bing Chen
2018 B conf
GLOBECOM
Zhenzhen Li, Kun Zhu, Ran Wang, Yuanyuan Xu
2018 J jnl
Wirel. Commun. Mob. Comput.
Jiequ Ji, Kun Zhu, Ran Wang, Bing Chen, Chen Dai
2018 conf
iThings/GreenCom/CPSCom/SmartData
Jiequ Ji, Kun Zhu, Ran Wang, Bing Chen, Chen Dai
2018 conf
iThings/GreenCom/CPSCom/SmartData
Yiwen Lu, Ran Wang, Ping Wang, Yue Cao, Jie Hao, Kun Zhu
2018 conf
ICC
Chengqing Wu, Ran Wang, Ping Wang, Yue Cao, Linfeng Liu, Kun Zhu, Bing Chen
2018 J jnl
J. Parallel Distributed Comput.
Linfeng Liu, Ran Wang, Jiagao Wu
2018 J jnl
Wirel. Commun. Mob. Comput.
Longteng Xu, Kun Zhu, Ran Wang, Shimin Gong
2018 B conf
WCNC
Longteng Xu, Kun Zhu, Ran Wang, Shimin Gong
2017 B conf
IWCMC
Yue Cao, Xu Zhang, Ran Wang, Linyu Peng, Nauman Aslam, Xiaomin Chen
2017 B conf
GLOBECOM
Ran Wang, Gaoxi Xiao, Ping Wang, Yue Cao, Guoqi Li, Jie Hao, Kun Zhu
2017 B conf
GLOBECOM
Mengyun Sun, Hongyan Qian, Kun Zhu, Donghai Guan, Ran Wang
2017 J jnl
IEEE Trans. Veh. Technol.
Ran Wang, Gaoxi Xiao, Ping Wang
2017 J jnl
Comput. Networks
Linfeng Liu, Ping Wang, Ran Wang
2017 J jnl
IEEE Wirel. Commun.
Yue Cao, Omprakash Kaiwartya, Ran Wang, Tao Jiang, Yang Cao, Nauman Aslam, Graham Sexton
2017 B conf
GLOBECOM
Xuan Zhang, Hongyan Qian, Kun Zhu, Ran Wang, Yang Zhang
2017 B conf
WCNC
Kun Zhu, Zijing Cheng, Bing Chen, Ran Wang
2016
Ran Wang
2016 B conf
SECON
Linfeng Liu, Ran Wang, Dongyue Guo, Xiaojun Fan
2016 J jnl
IEEE Trans. Veh. Technol.
Ran Wang, Ping Wang, Gaoxi Xiao
2014 conf
ICCVE
Ran Wang, Ping Wang, Gaoxi Xiao
2013 conf
SmartGridComm
Ran Wang, Yifan Li, Ping Wang, Dusit Niyato
2012 conf
SmartGridComm
Yifan Li, Ran Wang, Ping Wang, Dusit Niyato, Walid Saad, Zhu Han
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"