Isaac Shiri

35 papers Journal 33Unranked 1
YearRankTypeTitle / Venue / Authors
2025 J jnl
Comput. Methods Programs Biomed.
Anselm W. Stark, Pooya Mohammadi Kazaj, Sebastian Balzer, Marc Ilic, Manuel Bergamin, Ryota Kakizaki, Andreas Giannopoulos, Andreas Haeberlin, Lorenz Räber, Isaac Shiri, Christoph Graeni
2025 J jnl
CoRR
Pooya Mohammadi Kazaj, Giovanni Baj, Yazdan Salimi, Anselm W. Stark, Waldo Valenzuela, George CM. Siontis, Habib Zaidi, Mauricio Reyes, Christoph Graeni, Isaac Shiri
2025 J jnl
CoRR
Anselm W. Stark, Marc Ilic, Ali Mokhtari, Pooya Mohammadi Kazaj, Christoph Graeni, Isaac Shiri
2024 J jnl
Int. J. Imaging Syst. Technol.
Isaac Shiri, Yazdan Salimi, Abdollah Saberi, Masoumeh Pakbin, Ghasem Hajianfar, Atlas Haddadi Avval, Amirhossein Sanaat, Azadeh Akhavanallaf, Shayan Mostafaei, Zahra Mansouri, Dariush Askari, Mohammadreza Ghasemian, Ehsan Sharifipour, Saleh Sandoughdaran, Ahmad Sohrabi, Elham Sadati, Somayeh Livani, Pooya Iranpour, Shahriar Kolahi, Bardia Khosravi, Maziar Khateri, Salar Bijari, Mohammad Reza Atashzar, Sajad P. Shayesteh, Mohammadreza Babaei, Elnaz Jenabi, Mohammad Hasanian, Alireza Shahhamzeh, Seyed Yaser Foroghi Ghomi, Abolfazl Mozafari, Hesamaddin Shirzad-Aski, Fatemeh Movaseghi, Rama Bozorgmehr, Neda Goharpey, Hamid Abdollahi, Parham Geramifar, Amir Reza Radmard, Hossein Arabi, Kiara Rezaei-Kalantari, Mehrdad Oveisi, Arman Rahmim, Habib Zaidi
2024 J jnl
Medical Biol. Eng. Comput.
Ghasem Hajianfar, Seyyed Ali Hosseini, Sara Bagherieh, Mehrdad Oveisi, Isaac Shiri, Habib Zaidi
2024 J jnl
J. Biomed. Informatics
Isaac Shiri, Behrooz Razeghi, Sohrab Ferdowsi, Yazdan Salimi, Deniz Gündüz, Douglas Teodoro, Slava Voloshynovskiy, Habib Zaidi
2024 J jnl
CoRR
Amirhosein Toosi, Isaac Shiri, Habib Zaidi, Arman Rahmim
2024 conf
EUVIP
Ghasem Hajianfar, Maziar Sabouri, Abdollah Saberi Manesh, Soroush Bagheri, Mohsen Arabi, Seyed Rasoul Zakavi, Emran Askari, Ali Rasouli, Azin Asadzadeh, Atena Aghaee, Kourosh Fattahi, Ehsan Bayat, Mahdi Mogharrabi, Mohammad Chehreghani, Yazdan Salimi, Amirhossein Sanaat, Arman Rahmim, Isaac Shiri, Habib Zaidi
2023 J jnl
J. Digit. Imaging
Mohammad Salehi, Alireza Vafaei Sadr, Seied Rabi Mahdavi, Hossein Arabi, Isaac Shiri, Reza Reiazi
2023 J jnl
J. Digit. Imaging
Haniyeh Taleie, Ghasem Hajianfar, Maziar Sabouri, Mozhgan Parsaee, Golnaz Houshmand, Ahmad Bitarafan-rajabi, Habib Zaidi, Isaac Shiri
2023 J jnl
Comput. Methods Programs Biomed.
Isaac Shiri, Behrooz Razeghi, Alireza Vafaei Sadr, Mehdi Amini, Yazdan Salimi, Sohrab Ferdowsi, Peter Boor, Deniz Gündüz, Slava Voloshynovskiy, Habib Zaidi
2023
Isaac Shiri
2023 J jnl
J. Digit. Imaging
Maziar Sabouri, Ghasem Hajianfar, Zahra Hosseini, Mehdi Amini, Mobin Mohebi, Tahereh Ghaedian, Shabnam Madadi, Fereydoon Rastgou, Mehrdad Oveisi, Ahmad Bitarafan-rajabi, Isaac Shiri, Habib Zaidi
2023 J jnl
J. Digit. Imaging
Mobin Mohebi, Mehdi Amini, Mohammad Javad Alemzadeh-Ansari, Azin Alizadehasl, Ahmad Bitarafan-rajabi, Isaac Shiri, Habib Zaidi, Mahdi Orooji
2022 J jnl
Int. J. Imaging Syst. Technol.
Isaac Shiri, Hossein Arabi, Yazdan Salimi, Amirhossein Sanaat, Azadeh Akhavanallaf, Ghasem Hajianfar, Dariush Askari, Shakiba Moradi, Zahra Mansouri, Masoumeh Pakbin, Saleh Sandoughdaran, Hamid Abdollahi, Amir Reza Radmard, Kiara Rezaei-Kalantari, Mostafa Ghelich Oghli, Habib Zaidi
2022 J jnl
Comput. Biol. Medicine
Isaac Shiri, Yazdan Salimi, Masoumeh Pakbin, Ghasem Hajianfar, Atlas Haddadi Avval, Amirhossein Sanaat, Shayan Mostafaei, Azadeh Akhavanallaf, Abdollah Saberi, Zahra Mansouri, Dariush Askari, Mohammadreza Ghasemian, Ehsan Sharifipour, Saleh Sandoughdaran, Ahmad Sohrabi, Elham Sadati, Somayeh Livani, Pooya Iranpour, Shahriar Kolahi, Maziar Khateri, Salar Bijari, Mohammad Reza Atashzar, Sajad P. Shayesteh, Bardia Khosravi, Mohammadreza Babaei, Elnaz Jenabi, Mohammad Hasanian, Alireza Shahhamzeh, Seyed Yaser Foroghi Ghomi, Abolfazl Mozafari, Arash Teimouri, Fatemeh Movaseghi, Azin Ahmari, Neda Goharpey, Rama Bozorgmehr, Hesamaddin Shirzad-Aski, Roozbeh Mortazavi, Jalal Karimi, Nazanin Mortazavi, Sima Besharat, Mandana Afsharpad, Hamid Abdollahi, Parham Geramifar, Amir Reza Radmard, Hossein Arabi, Kiara Rezaei-Kalantari, Mehrdad Oveisi, Arman Rahmim, Habib Zaidi
2022 J jnl
Comput. Biol. Medicine
Isaac Shiri, Mehdi Amini, Mostafa Nazari, Ghasem Hajianfar, Atlas Haddadi Avval, Hamid Abdollahi, Mehrdad Oveisi, Hossein Arabi, Arman Rahmim, Habib Zaidi
2022 J jnl
J. Digit. Imaging
Fatemeh Arian, Mehdi Amini, Shayan Mostafaei, Kiara Rezaei-Kalantari, Atlas Haddadi Avval, Zahra Shahbazi, Kianosh Kasani, Ahmad Bitarafan-rajabi, Saikat Chatterjee, Mehrdad Oveisi, Isaac Shiri, Habib Zaidi
2022 J jnl
Comput. Biol. Medicine
Elham Avard, Isaac Shiri, Ghasem Hajianfar, Hamid Abdollahi, Kiara Rezaei-Kalantari, Golnaz Houshmand, Kianosh Kasani, Ahmad Bitarafan-rajabi, Mohammad Reza Deevband, Mehrdad Oveisi, Habib Zaidi
2022 J jnl
J. Digit. Imaging
Amirhossein Sanaat, Isaac Shiri, Sohrab Ferdowsi, Hossein Arabi, Habib Zaidi
2022 J jnl
CoRR
Arman Rahmim, Amirhosein Toosi, Mohammad R. Salmanpour, Natalia Dubljevic, Ian Janzen, Isaac Shiri, Mohamad A. Ramezani, Ren Yuan, Cheryl Ho, Habib Zaidi, Calum MacAulay, Carlos F. Uribe, Fereshteh Yousefirizi
2022 J jnl
Comput. Biol. Medicine
Pegah Moradi Khaniabadi, Yassine Bouchareb, Humoud Al Dhuhli, Isaac Shiri, Faiza Al Kindi, Bita Moradi Khaniabadi, Habib Zaidi, Arman Rahmim
2022 J jnl
Comput. Biol. Medicine
Amir Jabbarpour, Seied Rabi Mahdavi, Alireza Vafaei Sadr, Golbarg Esmaili, Isaac Shiri, Habib Zaidi
2021 J jnl
Comput. Biol. Medicine
Yassine Bouchareb, Pegah Moradi Khaniabadi, Faiza Al Kindi, Humoud Al Dhuhli, Isaac Shiri, Habib Zaidi, Arman Rahmim
2021 J jnl
NeuroImage
Amirhossein Sanaat, Hossein Shooli, Sohrab Ferdowsi, Isaac Shiri, Hossein Arabi, Habib Zaidi
2021 J jnl
Comput. Biol. Medicine
Isaac Shiri, Majid Sorouri, Parham Geramifar, Mostafa Nazari, Mohammad Abdollahi, Yazdan Salimi, Bardia Khosravi, Dariush Askari, Leila Aghaghazvini, Ghasem Hajianfar, Amir Kasaeian, Hamid Abdollahi, Hossein Arabi, Arman Rahmim, Amir Reza Radmard, Habib Zaidi
2021 J jnl
Comput. Biol. Medicine
Zahra Khodabakhshi, Shayan Mostafaei, Hossein Arabi, Mehrdad Oveisi, Isaac Shiri, Habib Zaidi
2021 J jnl
J. Digit. Imaging
Zahra Khodabakhshi, Mehdi Amini, Shayan Mostafaei, Atlas Haddadi Avval, Mostafa Nazari, Mehrdad Oveisi, Isaac Shiri, Habib Zaidi
2021 J jnl
Comput. Biol. Medicine
Azadeh Akhavanallaf, Reza Mohammadi, Isaac Shiri, Yazdan Salimi, Hossein Arabi, Habib Zaidi
2021 J jnl
Comput. Biol. Medicine
Mostafa Nazari, Isaac Shiri, Habib Zaidi
2019 J jnl
CoRR
Shakiba Moradi, Azin Alizadehasl, Jan Dhooge, Isaac Shiri, Niki Oveisi, Mehrdad Oveisi, Majid Maleki, Mostafa Ghelich Oghli
2019 J jnl
CoRR
Isaac Shiri, Hassan Maleki, Ghasem Hajianfar, Hamid Abdollahi, Saeed Ashrafinia, Mathieu Hatt, Mehrdad Oveisi, Arman Rahmim
2019 J jnl
CoRR
Mostafa Nazari, Isaac Shiri, Ghasem Hajianfar, Niki Oveisi, Hamid Abdollahi, Mohammad Reza Deevband, Mehrdad Oveisi
2019 J jnl
CoRR
Ghasem Hajianfar, Isaac Shiri, Hassan Maleki, Niki Oveisi, Abbass Haghparast, Hamid Abdollahi, Mehrdad Oveisi
2019 J jnl
CoRR
Isaac Shiri, Hassan Maleki, Ghasem Hajianfar, Hamid Abdollahi, Saeed Ashrafinia, Mathieu Hatt, Mehrdad Oveisi, Arman Rahmim
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"