Jan J. Koenderink

97 papers A* 4A 1C 2Journal 41Unranked 38
YearRankTypeTitle / Venue / Authors
2023 J jnl
J. Percept. Imaging
Jan J. Koenderink, Andrea J. van Doorn
2021 J jnl
Frontiers Comput. Sci.
Jan J. Koenderink, Andrea J. van Doorn, Karl R. Gegenfurtner
2021 J jnl
Biol. Cybern.
Jan J. Koenderink
2018 J jnl
SIAM J. Imaging Sci.
Jan J. Koenderink, Andrea J. van Doorn
2017 conf
HVEI
Jan J. Koenderink, Andrea J. van Doorn, Matteo Valsecchi, Johan Wagemans, Karl R. Gegenfurtner
2016 J jnl
ACM Trans. Appl. Percept.
Jan J. Koenderink, Andrea J. van Doorn, Vebjørn Ekroll
2015 conf
Human Vision and Electronic Imaging
Sylvia C. Pont, Andrea J. van Doorn, Maarten W. A. Wijntjes, Jan J. Koenderink
2015 J jnl
Pattern Recognit. Lett.
Jan J. Koenderink, Andrea J. van Doorn, Johan Wagemans
2014 ch.
Computer Vision, A Reference Guide
Jan J. Koenderink
2014 ch.
Computer Vision, A Reference Guide
Jan J. Koenderink
2014 ch.
Computer Vision, A Reference Guide
Jan J. Koenderink
2014 ch.
Computer Vision, A Reference Guide
Jan J. Koenderink
2014 ch.
Registration and Recognition in Images and Videos
Jan J. Koenderink, Andrea J. van Doorn, Whitman Richards
2013 conf
Human Vision and Electronic Imaging
Andrea J. van Doorn, Huib de Ridder, Jan J. Koenderink
2013 J jnl
Int. J. Comput. Vis.
Jan J. Koenderink, Andrea J. van Doorn, Sylvia C. Pont
2013 ch.
Shape Perception in Human and Computer Vision
Jan J. Koenderink, Andrea J. van Doorn
2013 conf
Human Vision and Electronic Imaging
Jan J. Koenderink
2012 conf
CGIV
Jan J. Koenderink
2012 J jnl
SIAM J. Imaging Sci.
Jan J. Koenderink, Andrea J. van Doorn
2012 conf
Human Vision and Electronic Imaging
Sylvia C. Pont, Jan J. Koenderink, Andrea J. van Doorn, Maarten W. A. Wijntjes, Susan F. te Pas
2011 conf
Human Vision and Electronic Imaging
Andrea J. van Doorn, Johan Wagemans, Huib de Ridder, Jan J. Koenderink
2011 conf
Human Vision and Electronic Imaging
Jan J. Koenderink
2010 J jnl
Int. J. Comput. Vis.
Stefan M. Karlsson, Sylvia C. Pont, Jan J. Koenderink, Andrew Zisserman
2010 ch.
Computer Vision: Detection, Recognition and Reconstruction
Jan J. Koenderink
2009 conf
Human Vision and Electronic Imaging
Maarten W. A. Wijntjes, Robert Volcic, Sylvia C. Pont, Jan J. Koenderink, Astrid M. L. Kappers
2009 conf
CSE (4)
Jan J. Koenderink, Whitman Richards
2008 conf
ECCV (1)
Jan J. Koenderink
2008 J jnl
J. Math. Imaging Vis.
Jan J. Koenderink, Andrea J. van Doorn
2007 J jnl
ACM Trans. Appl. Percept.
Adar Pelah, Jan J. Koenderink
2007 conf
APGV
Alexander A. Mury, Sylvia C. Pont, Jan J. Koenderink
2005 J jnl
Int. J. Comput. Vis.
Sylvia C. Pont, Jan J. Koenderink
2005 conf
DSSCV
Jan J. Koenderink, Andrea J. van Doorn
2005 conf
DSSCV
Sylvia C. Pont, Jan J. Koenderink
2005 conf
Human Vision and Electronic Imaging
Andrea J. van Doorn, Huib de Ridder, Jan J. Koenderink
2005 J jnl
Comput. Vis. Image Underst.
Sylvia C. Pont, Jan J. Koenderink
2004 conf
Rendering Techniques
Jan J. Koenderink
2004 conf
3DPVT
Sylvia C. Pont, Jan J. Koenderink
2003 C conf
CAIP
Sylvia C. Pont, Jan J. Koenderink
2003 C conf
CAIP
Jan J. Koenderink
2003 J jnl
Mach. Vis. Appl.
Jan J. Koenderink, Sylvia C. Pont
2002 conf
ECCV (4)
Sylvia C. Pont, Jan J. Koenderink
2002 conf
ECCV (1)
Jan J. Koenderink, Andrea J. van Doorn
2002 conf
3DPVT
Jan J. Koenderink, Sylvia C. Pont
2001 conf
Scale-Space
Bart M. ter Haar Romeny, Jan-Mark Geusebroek, Peter Van Osta, Rein van den Boomgaard, Jan J. Koenderink
2001 conf
Human Vision and Electronic Imaging
Andrea J. van Doorn, Jan J. Koenderink, Huib de Ridder
2001 conf
Human Vision and Electronic Imaging
Jan J. Koenderink, Andrea J. van Doorn
2000 J jnl
J. Vis. Commun. Image Represent.
Jan J. Koenderink, Andrea J. van Doorn
2000 J jnl
Comput. Vis. Image Underst.
Harro M. G. Stokman, Theo Gevers, Jan J. Koenderink
2000 conf
CIC
Jan J. Koenderink
2000 conf
Human Vision and Electronic Imaging
Jan J. Koenderink, Andrea J. van Doorn, Astrid M. L. Kappers, James T. Todd
2000 J jnl
Comput. Vis. Image Underst.
Rong Lu, Jan J. Koenderink, Astrid M. L. Kappers
2000 conf
IMA Conference on the Mathematics of Surfaces
Jan J. Koenderink, Andrea J. van Doorn, Astrid M. L. Kappers
2000 conf
AFPAC
Jan J. Koenderink, Andrea J. van Doorn
1999 J jnl
Int. J. Comput. Vis.
Jan J. Koenderink, Andrea J. van Doorn, Kristin J. Dana, Shree K. Nayar
1999 conf
Scale-Space
Jan J. Koenderink, Andrea J. van Doorn
1999 J jnl
ACM Trans. Graph.
Kristin J. Dana, Bram van Ginneken, Shree K. Nayar, Jan J. Koenderink
1999 A* conf
ICCV
Rong Lu, Jan J. Koenderink, Astrid M. L. Kappers
1999 J jnl
Int. J. Comput. Vis.
Bram van Ginneken, Jan J. Koenderink, Kristin J. Dana
1999 J jnl
Int. J. Comput. Vis.
Jan J. Koenderink, Andrea J. van Doorn
1998 conf
ECCV (2)
Jan J. Koenderink, Andrea J. van Doorn
1997 ed.
AFPAC
Gerald Sommer, Jan J. Koenderink
1997 conf
DAGM-Symposium
Jan J. Koenderink, Andrea J. van Doorn
1997 conf
AFPAC
Jan J. Koenderink, Andrea J. van Doorn
1997 A* conf
CVPR
Kristin J. Dana, Shree K. Nayar, Bram van Ginneken, Jan J. Koenderink
1997 ed.
Scale-Space
Bart M. ter Haar Romeny, Luc Florack, Jan J. Koenderink, Max A. Viergever
1997 J jnl
Int. J. Comput. Vis.
Jan J. Koenderink, Andrea J. van Doorn
1996 A* conf
CVPR
Ruth Rosenholtz, Jan J. Koenderink
1996 conf
ECCV (2)
Jan J. Koenderink, Andrea J. van Doorn, Marigo Stavridi
1996 conf
ICIP (3)
Frederic F. Leymarie, Arnaud de La Fortelle, Jan J. Koenderink, Astrid M. L. Kappers, Marigo Stavridi, Bram van Ginneken, Stefan Müller, S. Krake, Olivier D. Faugeras, Luc Robert, Cyrille Gauclin, Stéphane Laveau, Cyril Zeller
1996 conf
Object Representation in Computer Vision
Jan J. Koenderink, Andrea J. van Doorn, Chris Christou, Joseph S. Lappin
1996 conf
ICIP (3)
Marigo Stavridi, Jan J. Koenderink
1996 J jnl
Int. J. Comput. Vis.
Luc Florack, Bart M. ter Haar Romeny, Max A. Viergever, Jan J. Koenderink
1995 J jnl
Image Vis. Comput.
Luc Florack, Alfons H. Salden, Bart M. ter Haar Romeny, Jan J. Koenderink, Max A. Viergever
1995 J jnl
Image Vis. Comput.
Jan J. Koenderink, Andrea J. van Doorn
1994 J jnl
J. Math. Imaging Vis.
Luc Florack, Bart M. ter Haar Romeny, Jan J. Koenderink, Max A. Viergever
1994 J jnl
J. Math. Imaging Vis.
Luc Florack, Bart M. ter Haar Romeny, Jan J. Koenderink, Max A. Viergever
1994 ch.
Geometry-Driven Diffusion in Computer Vision
Luc M. J. Florack, Alfons H. Salden, Bart M. ter Haar Romeny, Jan J. Koenderink, Max A. Viergever
1994 A conf
BMVC
Jan J. Koenderink, Andrea J. van Doorn
1994 J jnl
Pattern Recognit. Lett.
Jan J. Koenderink, Andrea J. van Doorn
1993 J jnl
J. Math. Imaging Vis.
Luc M. J. Florack, Bart M. ter Haar Romeny, Jan J. Koenderink, Max A. Viergever
1993 J jnl
J. Vis. Commun. Image Represent.
Johan Blom, Bart M. ter Haar Romeny, Arjan Bel, Jan J. Koenderink
1992 conf
ICPR (3)
Alfons H. Salden, Bart M. ter Haar Romeny, Luc M. J. Florack, Max A. Viergever, Jan J. Koenderink
1992 J jnl
Biol. Cybern.
Herman P. Snippe, Jan J. Koenderink
1992 A* conf
ECCV
Luc Florack, Bart M. ter Haar Romeny, Jan J. Koenderink, Max A. Viergever
1992 conf
25th Anniversary of INRIA
Jan J. Koenderink
1992 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Jan J. Koenderink, Andrea J. van Doorn
1992 J jnl
Biol. Cybern.
Herman P. Snippe, Jan J. Koenderink
1992 J jnl
J. Vis. Commun. Image Represent.
Jan J. Koenderink, Andrea J. van Doorn
1992 J jnl
Image Vis. Comput.
Luc Florack, Bart M. ter Haar Romeny, Jan J. Koenderink, Max A. Viergever
1992 J jnl
Image Vis. Comput.
Jan J. Koenderink, Andrea J. van Doorn
1991 conf
IPMI
Bart M. ter Haar Romeny, Luc Florack, Jan J. Koenderink, Max A. Viergever
1990 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Peter J. Werkhoven, Alexander Toet, Jan J. Koenderink
1990 J jnl
J. Vis. Commun. Image Represent.
Peter J. Werkhoven, Herman P. Snippe, Jan J. Koenderink
1990 book
Solid shape.
Jan J. Koenderink
1989 J jnl
IEEE Trans. Pattern Anal. Mach. Intell.
Jan J. Koenderink
1983 J jnl
IEEE Trans. Syst. Man Cybern.
Peter Zuidema, Jan J. Koenderink, Maarten A. Bouman
1983 J jnl
IEEE Trans. Syst. Man Cybern.
Andrea J. van Doorn, Jan J. Koenderink
redb/extractors/pe_extractors/pe_signature_old.py
← Index redb/extractors/pe_extractors/pe_signature_old.py python
import inspect
import pefile

from hashlib import md5, sha1, sha256

from asn1crypto import cms, pem, x509, core

from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PECertificate, PESigner


class PESignatureExtractor(PEExtractor):
    """
    RFC 3161 - Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)
    Section 2.4.2 defines the TSTInfo structure.
    https://tools.ietf.org/html/rfc3161#section-2.4.2

    Microsoft Authenticode Time Stamping Specification
    https://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Authenticode_PE.docx
    """

    def __init__(
        self,
        filepath,
        log,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        pe=None,
    ):
        super().__init__(
            filepath,
            log,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            pe,
        )
        self.elastic_index = self.index_prefix + "-pe_signature"
        self.log.debug(inspect.currentframe().f_code.co_name)

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

    @staticmethod
    def _extract_certificate_info(cert_data):
        # self.log.debug(inspect.currentframe().f_code.co_name)

        certificate = x509.Certificate.load(cert_data)
        certificate_serial_number = format(certificate.serial_number, "x").upper()
        grouped_serial_number = ":".join(
            [
                certificate_serial_number[i : i + 2]
                for i in range(0, len(certificate_serial_number), 2)
            ]
        )
        return PECertificate(
            _id=format(certificate.serial_number, "x").upper(),
            certificate_serial_number=grouped_serial_number,
            certificate_issuer=certificate.issuer.human_friendly,
            certificate_subject=certificate.subject.human_friendly,
            certificate_valid_from=certificate["tbs_certificate"]["validity"][
                "not_before"
            ].native.strftime("%Y-%m-%d %H:%M:%S"),
            certificate_valid_to=certificate["tbs_certificate"]["validity"][
                "not_after"
            ].native.strftime("%Y-%m-%d %H:%M:%S"),
            certificate_thumbprint=sha1(cert_data).hexdigest().upper(),
            certificate_md5=md5(cert_data).hexdigest().upper(),
            certificate_sha256=sha256(cert_data).hexdigest().upper(),
        )

    @staticmethod
    def _parse_microsoft_time_stamp(ts_token):
        class TSTInfo(core.Sequence):
            _fields = [
                ("version", core.Integer),
                ("policy_id", core.ObjectIdentifier),
                ("message_imprint", core.Sequence),
                ("serial_number", core.Integer),
                ("gen_time", core.GeneralizedTime),
                ("accuracy", core.Sequence, {"optional": True}),
                ("ordering", core.Boolean, {"optional": True}),
                ("nonce", core.Integer, {"optional": True}),
                ("tsa", core.Sequence, {"optional": True}),
                ("extensions", core.Sequence, {"optional": True}),
            ]

        # The content should be SignedData
        signed_data = ts_token["content"]

        # The actual timestamp should be in the encapContentInfo
        encap_content_info = signed_data["encap_content_info"]
        tst_info = TSTInfo.load(encap_content_info["content"])

        # Extract the genTime field from TSTInfo, type(genTime): <class 'datetime.datetime'>
        gen_time = tst_info["gen_time"].native

        return gen_time

    def _extract_signer_info(self, signer):
        self.log.debug(inspect.currentframe().f_code.co_name)
        signing_time = None

        for attr_set in [signer["signed_attrs"], signer["unsigned_attrs"]]:
            if attr_set:
                for attribute in attr_set:
                    attr_type = attribute["type"].dotted
                    if attr_type == "1.2.840.113549.1.9.5":  # signingTime
                        signing_time = attribute["values"][0].native
                        break
                    elif (
                        attr_type == "1.3.6.1.4.1.311.3.2.1"
                        or attr_type == "1.3.6.1.4.1.311.3.3.1"
                    ):  # microsoft_time_stamp_token
                        try:
                            ts_token = attribute["values"][0].native
                            signing_time = self._parse_microsoft_time_stamp(ts_token)
                            self.log.debug(
                                f"Signing Time from Microsoft Time Stamp Token: {signing_time}"
                            )
                        except Exception as e:
                            self.log.error(
                                f"Error parsing Microsoft Time Stamp Token: {e}"
                            )
                            self.log.error("Token structure:", attribute["values"][0])
                    elif attr_type == "1.2.840.113549.1.9.6":  # counterSignature
                        counter_sig_values = attribute["values"]
                        for counter_sig_value in counter_sig_values:
                            try:
                                counter_sig_info = cms.SignerInfo.load(
                                    counter_sig_value.native
                                )
                                cs_signed_attrs = counter_sig_info["signed_attrs"]
                                for cs_attr in cs_signed_attrs:
                                    cs_attr_type = cs_attr["type"].dotted
                                    if (
                                        cs_attr_type == "1.2.840.113549.1.9.5"
                                    ):  # signingTime
                                        signing_time = cs_attr["values"][0].native
                                        self.log.debug(
                                            "Signing Time (from countersignature):",
                                            signing_time,
                                        )
                                        break
                                if signing_time:
                                    break
                            except Exception as e:
                                self.log.error(
                                    f"Error processing countersignature: {e}"
                                )
                    if signing_time:
                        break
            if signing_time:
                break
        signer_serial_number = format(
            signer["sid"].native["serial_number"], "x"
        ).upper()
        grouped_serial_number = " ".join(
            [
                signer_serial_number[i : i + 2]
                for i in range(0, len(signer_serial_number), 2)
            ]
        )
        return PESigner(
            # this is to avoid duplicate _id with the Signer certificate used to sign as they are in the same ES index
            _id=format(signer["sid"].native["serial_number"], "x").upper()
            + signer["digest_algorithm"]["algorithm"].native,
            signer_serial_number=grouped_serial_number,
            signer_digest_algorithm=signer["digest_algorithm"]["algorithm"].native,
            signer_signature_algorithm=signer["signature_algorithm"][
                "algorithm"
            ].native,
            signing_time=(
                signing_time.strftime("%Y-%m-%d %H:%M:%S") if signing_time else None
            ),
            # "countersigners": extract_countersigners(signer), # TODO: Implement this
        )

    def _extract_signature_info(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        address = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].VirtualAddress
        size = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].Size

        addr_8 = address + 8
        signature_data = bytes(
            self.pe.write()[addr_8 : addr_8 + size]  # noqa E203
        )  # Ensure this is a bytes object
        if pem.detect(signature_data):
            signature_data = pem.unarmor(signature_data)

        content_info = cms.ContentInfo.load(signature_data)
        signed_data = content_info["content"]

        certificates = signed_data["certificates"]
        signers = signed_data["signer_infos"]

        certificates_list = []
        for cert in certificates:
            cert_info = self._extract_certificate_info(cert.chosen.dump())
            certificates_list.append(cert_info)

        signer_info_list = []
        for signer in signers:
            signer_info = self._extract_signer_info(signer)
            signer_info_list.append(signer_info)

        return certificates_list, signer_info_list

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            if self._is_signed():
                certificates_list, signers_list = self._extract_signature_info()
                # self.export_to_elastic([PECodeSigning(certificates_list, signers_list)])
                self.export_to_elastic(certificates_list, Tag.PE_CERTIFICATE.value)
                self.export_to_elastic(signers_list, Tag.PE_SIGNER.value)
            return True
        except Exception as e:
            self.log.error(f"Error extracting PE Signature: {e}")
            return None