Jacques Patarin

121 papers A* 19A 8B 10C 3Misc 7Journal 49Unranked 22
YearRankTypeTitle / Venue / Authors
2026 book
Jacques Patarin, Emmanuel Volte, Benoît Cogliati
2026 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin, Jan Vacek
2025 Misc conf
INDOCRYPT
Jacques Patarin, Pierre Varjabedian
2024 conf
SAC (2)
Maya Chartouny, Benoît Cogliati, Jacques Patarin
2024 J jnl
IACR Cryptol. ePrint Arch.
Maya Chartouny, Benoit Cogliati, Jacques Patarin
2024 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin, Pierre Varjabedian
2024 conf
PQCrypto (2)
Benoît Cogliati, Gilles Macario-Rat, Jacques Patarin, Pierre Varjabedian
2024 J jnl
IACR Cryptol. ePrint Arch.
Benoit Cogliati, Gilles Macario-Rat, Jacques Patarin, Pierre Varjabedian
2023 conf
EUROCRYPT (4)
Benoît Cogliati, Avijit Dutta, Mridul Nandi, Jacques Patarin, Abishanka Saha
2023 conf
C2SI
Maya Chartouny, Jacques Patarin, Ambre Toulemonde
2023 J jnl
IACR Cryptol. ePrint Arch.
Gilles Macario-Rat, Jacques Patarin, Benoit Cogliati, Jean-Charles Faugère, Pierre-Alain Fouque, Louis Goubin, Robin Larrieu, Brice Minaud
2022 J jnl
IACR Cryptol. ePrint Arch.
Jean-Charles Faugère, Gilles Macario-Rat, Jacques Patarin, Ludovic Perret
2022 J jnl
IACR Cryptol. ePrint Arch.
Benoît Cogliati, Avijit Dutta, Mridul Nandi, Jacques Patarin, Abishanka Saha
2022 J jnl
IACR Cryptol. ePrint Arch.
Maya Chartouny, Jacques Patarin, Ambre Toulemonde
2022 conf
GoodIT
Ambre Toulemonde, Loïc Besson, Louis Goubin, Jacques Patarin
2021 J jnl
IACR Cryptol. ePrint Arch.
Gilles Macario-Rat, Jacques Patarin
2021 conf
BRAINS
Aline Gouget, Jacques Patarin, Ambre Toulemonde
2021 J jnl
IACR Cryptol. ePrint Arch.
Gilles Macario-Rat, Jacques Patarin
2021 J jnl
IACR Cryptol. ePrint Arch.
Gilles Macario-Rat, Jacques Patarin
2021 conf
IEEE ICBC
Aline Gouget, Jacques Patarin, Ambre Toulemonde
2020 Misc conf
ICISC
Aline Gouget, Jacques Patarin, Ambre Toulemonde
2020 J jnl
IACR Cryptol. ePrint Arch.
Benoît Cogliati, Jacques Patarin
2020 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin, Gilles Macario-Rat, Maxime Bros, Eliane Koussa
2019 J jnl
IACR Cryptol. ePrint Arch.
Eliane Koussa, Gilles Macario-Rat, Jacques Patarin
2019 Misc conf
INDOCRYPT
Ward Beullens, Jean-Charles Faugère, Eliane Koussa, Gilles Macario-Rat, Jacques Patarin, Ludovic Perret
2018 conf
BDCSIntell
Eliane Koussa, Jean-Charles Faugère, Gilles Macario-Rat, Jacques Patarin, Ludovic Perret
2018 J jnl
Cryptogr. Commun.
Valérie Nachef, Jacques Patarin, Emmanuel Volte
2018 J jnl
IACR Cryptol. ePrint Arch.
Jean-Charles Faugère, Eliane Koussa, Gilles Macario-Rat, Jacques Patarin, Ludovic Perret
2018 conf
AFRICACRYPT
Jacques Patarin
2018 conf
AFRICACRYPT
Gilles Macario-Rat, Jacques Patarin
2017 conf
NuTMiC
Jacques Patarin, Valérie Nachef
2017 J jnl
IACR Cryptol. ePrint Arch.
Nicolas T. Courtois, Klaus Schmeh, Jörg Drobick, Jacques Patarin, Maria-Bristena Oprisanu, Matteo Scarlata, Om Bhallamudi
2017 book
Valérie Nachef, Jacques Patarin, Emmanuel Volte
2017 J jnl
Appl. Algebra Eng. Commun. Comput.
Jacques Patarin
2017 J jnl
IACR Cryptol. ePrint Arch.
Gilles Macario-Rat, Jacques Patarin
2016 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin, Valérie Nachef
2016 J jnl
J. Cryptol.
Jean-Sébastien Coron, Thomas Holenstein, Robin Künzler, Jacques Patarin, Yannick Seurin, Stefano Tessaro
2016 conf
The New Codebreakers
Valérie Nachef, Jacques Patarin, Armel Dubois-Nayt
2016 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin
2016 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin
2014 J jnl
IACR Cryptol. ePrint Arch.
Valérie Nachef, Jacques Patarin, Emmanuel Volte
2014 B conf
Selected Areas in Cryptography
Benoit Cogliati, Jacques Patarin, Yannick Seurin
2014 A* conf
FSE
Benoit Cogliati, Rodolphe Lampe, Jacques Patarin
2013 B conf
CANS
Valérie Nachef, Emmanuel Volte, Jacques Patarin
2013 B conf
ACNS
Jacques Patarin
2013 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin
2013 B conf
CANS
Emmanuel Volte, Jacques Patarin, Valérie Nachef
2012 A conf
ASIACRYPT
Rodolphe Lampe, Jacques Patarin, Yannick Seurin
2012 C conf
SECRYPT
Rodolphe Lampe, Jacques Patarin
2012 conf
Cryptography and Security
Jacques Patarin, Benjamin Gittins, Joana Treger
2012 B conf
TCC
Avradip Mandal, Jacques Patarin, Yannick Seurin
2012 J jnl
IACR Cryptol. ePrint Arch.
Rodolphe Lampe, Jacques Patarin
2012 conf
Computation, Physics and Beyond
Jacques Patarin
2012 J jnl
Int. J. Unconv. Comput.
Jacques Patarin
2012 J jnl
IACR Cryptol. ePrint Arch.
Emmanuel Volte, Jacques Patarin, Valérie Nachef
2012 conf
LATINCRYPT
Valérie Nachef, Jacques Patarin, Emmanuel Volte
2012 J jnl
IACR Cryptol. ePrint Arch.
Valérie Nachef, Jacques Patarin, Emmanuel Volte
2011 J jnl
IACR Cryptol. ePrint Arch.
Rodolphe Lampe, Jacques Patarin
2011 J jnl
IACR Cryptol. ePrint Arch.
Valérie Nachef, Emmanuel Volte, Jacques Patarin
2011 ch.
Encyclopedia of Cryptography and Security (2nd Ed.)
Louis Goubin, Jacques Patarin, Bo-Yin Yang
2011 J jnl
IACR Cryptol. ePrint Arch.
Avradip Mandal, Jacques Patarin, Yannick Seurin
2010 J jnl
Cryptologia
Jacques Patarin, Valérie Nachef
2010 conf
LATINCRYPT
Valérie Nachef, Jacques Patarin, Joana Treger
2010 A conf
ASIACRYPT
Emmanuel Volte, Valérie Nachef, Jacques Patarin
2010 Misc conf
INDOCRYPT
Avradip Mandal, Jacques Patarin, Valérie Nachef
2010 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin
2010 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin
2010 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin
2009 J jnl
IACR Cryptol. ePrint Arch.
Olivier Billet, Jacques Patarin, Yannick Seurin
2009 conf
AFRICACRYPT
Joana Treger, Jacques Patarin
2009 J jnl
IACR Cryptol. ePrint Arch.
Valérie Nachef, Jacques Patarin, Joana Treger
2009 J jnl
IACR Cryptol. ePrint Arch.
Valérie Nachef, Jacques Patarin
2009 J jnl
J. Symb. Comput.
Côme Berbain, Henri Gilbert, Jacques Patarin
2008 conf
AFRICACRYPT
Jacques Patarin
2008 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin
2008 conf
ICITS
Jacques Patarin
2008 B conf
Selected Areas in Cryptography
Jacques Patarin, Yannick Seurin
2008 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin
2008 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin
2008 B conf
Selected Areas in Cryptography
Jacques Patarin
2008 A* conf
CRYPTO
Jean-Sébastien Coron, Jacques Patarin, Yannick Seurin
2008 J jnl
IACR Cryptol. ePrint Arch.
Jean-Sébastien Coron, Jacques Patarin, Yannick Seurin
2007 A conf
ASIACRYPT
Jacques Patarin, Valérie Nachef, Côme Berbain
2007 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin, Valérie Nachef, Côme Berbain
2007 conf
Symmetric Cryptography
David Arditti, Côme Berbain, Olivier Billet, Henri Gilbert, Jacques Patarin
2006 A conf
ASIACRYPT
Jacques Patarin, Valérie Nachef, Côme Berbain
2006 conf
VIETCRYPT
Aline Gouget, Jacques Patarin
2006 A* conf
EUROCRYPT
Côme Berbain, Henri Gilbert, Jacques Patarin
2005 Misc conf
ICISC
Jacques Patarin, Audrey Montreuil
2005 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin, Audrey Montreuil
2005 J jnl
IACR Cryptol. ePrint Arch.
Jacques Patarin, Paul Camion
2005 Misc conf
ICISC
Jacques Patarin
2004 A* conf
CRYPTO
Jacques Patarin
2004 Misc conf
INDOCRYPT
Audrey Montreuil, Jacques Patarin
2003 B conf
CT-RSA
Nicolas T. Courtois, Jacques Patarin
2003 A* conf
CRYPTO
Jacques Patarin
2003 J jnl
IACR Cryptol. ePrint Arch.
Nicolas T. Courtois, Louis Goubin, Jacques Patarin
2001 B conf
CT-RSA
Jacques Patarin, Nicolas T. Courtois, Louis Goubin
2001 A conf
ASIACRYPT
Jacques Patarin
2001 B conf
CT-RSA
Jacques Patarin, Nicolas T. Courtois, Louis Goubin
2000 J jnl
Des. Codes Cryptogr.
Jacques Patarin
2000 A* conf
EUROCRYPT
Nicolas T. Courtois, Alexander Klimov, Jacques Patarin, Adi Shamir
1999 A conf
CHES
Louis Goubin, Jacques Patarin
1999 A* conf
EUROCRYPT
Aviad Kipnis, Jacques Patarin, Louis Goubin
1998 A* conf
FSE
Jacques Patarin
1998 A* conf
EUROCRYPT
Jacques Patarin, Louis Goubin, Nicolas T. Courtois
1997 C conf
ICICS
Jacques Patarin, Louis Goubin
1997 A* conf
CCS
Jacques Patarin
1997 C conf
ICICS
Jacques Patarin, Louis Goubin
1996 A* conf
CRYPTO
Jacques Patarin
1996 A* conf
EUROCRYPT
Jacques Patarin
1996 A* conf
EUROCRYPT
Don Coppersmith, Matthew K. Franklin, Jacques Patarin, Michael K. Reiter
1995 A* conf
CRYPTO
Jacques Patarin
1994 A conf
ASIACRYPT
Jacques Patarin
1993 A* conf
EUROCRYPT
Jacques Patarin
1993 A* conf
CRYPTO
Jacques Patarin, Pascal Chauvaud
1992 A* conf
EUROCRYPT
Jacques Patarin
1991 A* conf
CRYPTO
Jacques Patarin
1991 A* conf
EUROCRYPT
Paul Camion, Jacques Patarin
1990 A conf
ESORICS
Jacques Patarin
1990 conf
EUROCODE
Jacques Patarin
redb/extractors/elf_extractors/elf_sections.py
← Index redb/extractors/elf_extractors/elf_sections.py python
import inspect
import hashlib
import math
from collections import Counter
from datetime import datetime, timezone
from typing import Any, List, Dict

from elftools.elf.elffile import ELFFile
from elftools.common.exceptions import ELFError

from redb.extractors.enum import Tag
from redb.extractors.elf_extractor import ELFExtractor
from redb.models.dataclasses import ELFSection


class ELFSectionExtractor(ELFExtractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        elf=None,
    ):
        super().__init__(
            filepath,
            log,
            exporters,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            elf,
        )
        self.elf_sections = []
        self.elastic_index = self.index_prefix + "-elf_sections"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def _is_empty_result(self, extracted_data) -> bool:
        """
        Override: Empty sections is an ERROR, not a valid empty case.
        A valid ELF file must have sections (at minimum a null section).
        """
        # Always return False - empty sections should be treated as an error
        return False

    def _calculate_entropy(self, data: bytes) -> float:
        """Calculate Shannon entropy of data."""
        if not data:
            return 0.0

        try:
            # Count frequency of each byte
            byte_counts = Counter(data)
            data_len = len(data)

            # Calculate entropy
            entropy = 0.0
            for count in byte_counts.values():
                if count > 0:
                    frequency = count / data_len
                    entropy -= frequency * math.log2(frequency)

            return entropy
        except Exception as e:
            self.log.error(f"Error calculating entropy: {e}")
            return 0.0

    def _map_section_type(self, sh_type_str: str) -> int:
        """Map section type string to enum value."""
        type_map = {
            'SHT_NULL': 0,
            'SHT_PROGBITS': 1,
            'SHT_SYMTAB': 2,
            'SHT_STRTAB': 3,
            'SHT_RELA': 4,
            'SHT_HASH': 5,
            'SHT_DYNAMIC': 6,
            'SHT_NOTE': 7,
            'SHT_NOBITS': 8,
            'SHT_REL': 9,
            'SHT_DYNSYM': 11
        }
        return type_map.get(sh_type_str, 0)

    def _decode_section_flags(self, flags: int) -> List[str]:
        """Decode section flags to human-readable strings."""
        flag_strings = []

        # Common ELF section flags
        if flags & 0x1:  # SHF_WRITE
            flag_strings.append('WRITE')
        if flags & 0x2:  # SHF_ALLOC
            flag_strings.append('ALLOC')
        if flags & 0x4:  # SHF_EXECINSTR
            flag_strings.append('EXECINSTR')
        if flags & 0x10:  # SHF_MERGE
            flag_strings.append('MERGE')
        if flags & 0x20:  # SHF_STRINGS
            flag_strings.append('STRINGS')
        if flags & 0x40:  # SHF_INFO_LINK
            flag_strings.append('INFO_LINK')
        if flags & 0x80:  # SHF_LINK_ORDER
            flag_strings.append('LINK_ORDER')
        if flags & 0x100:  # SHF_OS_NONCONFORMING
            flag_strings.append('OS_NONCONFORMING')
        if flags & 0x200:  # SHF_GROUP
            flag_strings.append('GROUP')
        if flags & 0x400:  # SHF_TLS
            flag_strings.append('TLS')

        return flag_strings if flag_strings else ['NONE']

    def _extract_section_data(self, section) -> Dict:
        """Extract data from a single section."""
        try:
            header = section.header

            # Get section name (handle empty names)
            section_name = section.name if section.name else f"<unnamed_{section.header.get('sh_name', 0)}>"

            # Get section type and map to enum
            sh_type_str = header.get('sh_type', 'SHT_NULL')
            section_type_enum = self._map_section_type(sh_type_str)
            section_type_str = sh_type_str.replace('SHT_', '') if sh_type_str.startswith('SHT_') else sh_type_str

            # Get section properties
            section_flags = header.get('sh_flags', 0)
            section_flags_str = self._decode_section_flags(section_flags)
            section_addr = header.get('sh_addr', 0)
            section_offset = header.get('sh_offset', 0)
            section_size = header.get('sh_size', 0)
            section_link = header.get('sh_link', 0)
            section_info = header.get('sh_info', 0)
            section_addralign = header.get('sh_addralign', 0)
            section_entsize = header.get('sh_entsize', 0)

            # Calculate entropy and hashes for section data
            section_entropy = 0.0
            section_sha256 = ""
            section_md5 = ""

            try:
                if section_size > 0 and section_type_str != 'NOBITS':
                    section_data = section.data()
                    if section_data:
                        # Calculate entropy
                        section_entropy = self._calculate_entropy(section_data)

                        # Calculate hashes
                        section_sha256 = hashlib.sha256(section_data).hexdigest()
                        section_md5 = hashlib.md5(section_data).hexdigest()
            except Exception as e:
                self.log.warning(f"Could not read section '{section_name}' data: {e}")
                section_entropy = 0.0
                section_sha256 = ""
                section_md5 = ""

            return ELFSection(
                section_name=section_name,
                section_type=section_type_enum,
                section_type_str=section_type_str,
                section_flags=section_flags,
                section_flags_str=section_flags_str,
                section_addr=section_addr,
                section_offset=section_offset,
                section_size=section_size,
                section_link=section_link,
                section_info=section_info,
                section_addralign=section_addralign,
                section_entsize=section_entsize,
                section_entropy=section_entropy,
                section_sha256=section_sha256,
                section_md5=section_md5
            )

        except Exception as e:
            self.log.error(f"Error extracting section data: {e}")
            return None

    def tag(self):
        return Tag.ELF_SECTIONS.value if hasattr(Tag, 'ELF_SECTIONS') else "elf_sections"

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)

            def extract_data(elf):
                sections_data = []

                # Iterate through all sections with per-section error handling
                for section_index, section in enumerate(elf.iter_sections()):
                    try:
                        section_data = self._extract_section_data(section)
                        if section_data:
                            sections_data.append(section_data)
                        else:
                            self.log.warning(f"Failed to extract data for section {section_index}")
                    except Exception as e:
                        self.log.warning(f"Error processing section {section_index}: {e}")
                        # Continue processing other sections

                return sections_data

            if not self._is_elf_file():
                return None

            result = self._with_elf_file(extract_data)
            if result is None:
                return None

            self.elf_sections = result
            return self.elf_sections

        except Exception as e:
            self.log.error(f"Error extracting ELF sections {self.hash.sha256}: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        self.log.debug(inspect.currentframe().f_code.co_name)

        if exporter_type == "ElasticsearchExporter":
            return self.elf_sections
        elif exporter_type == "ClickHouseExporter":
            try:
                if not self.elf_sections:
                    return None

                # Prepare data arrays for all sections
                data = []
                current_time = datetime.now(timezone.utc)
                for section in self.elf_sections:
                    row = [
                        self.sha256,
                        self.md5,
                        self.sha1,
                        section.section_name,
                        section.section_type,
                        section.section_type_str,
                        section.section_flags,
                        section.section_flags_str,
                        section.section_addr,
                        section.section_offset,
                        section.section_size,
                        section.section_link,
                        section.section_info,
                        section.section_addralign,
                        section.section_entsize,
                        section.section_entropy,
                        section.section_sha256,
                        section.section_md5,
                        current_time
                    ]
                    data.append(row)

                column_names = [
                    'sha256', 'md5', 'sha1',
                    'section_name', 'section_type', 'section_type_str',
                    'section_flags', 'section_flags_str',
                    'section_addr', 'section_offset', 'section_size',
                    'section_link', 'section_info', 'section_addralign', 'section_entsize',
                    'section_entropy', 'section_sha256', 'section_md5',
                    'analysis_date'
                ]

                column_type_names = [
                    'FixedString(64)', 'FixedString(32)', 'FixedString(40)',
                    'LowCardinality(String)',
                    "Enum8('NULL'=0, 'PROGBITS'=1, 'SYMTAB'=2, 'STRTAB'=3, 'RELA'=4, 'HASH'=5, 'DYNAMIC'=6, 'NOTE'=7, 'NOBITS'=8, 'REL'=9, 'DYNSYM'=11)",
                    'LowCardinality(String)',
                    'UInt64',
                    'Array(LowCardinality(String))',
                    'UInt64', 'UInt64', 'UInt64',
                    'UInt32', 'UInt32', 'UInt64', 'UInt64',
                    'Float64',
                    'FixedString(64)', 'FixedString(32)',
                    'DateTime64(3, \'UTC\')'
                ]

                if not data:
                    return None

                return (data, column_names, column_type_names)

            except Exception as e:
                self.log.error(f"Error preparing export data: {e}")
                raise

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