Naomi Yamashita

132 papers A* 35A 11B 7Journal 45Unranked 31
YearRankTypeTitle / Venue / Authors
2026 A* conf
CHI
Hyungjun Cho, Jiyeon Amy Seo, Woosuk Seo, Naomi Yamashita
2026 J jnl
CoRR
Peinuan Qin, Yugin Tan, Jingzhu Chen, Nattapat Boonprakong, Zicheng Zhu, Naomi Yamashita, Yi-Chieh Lee
2026 A* conf
CHI
Peinuan Qin, Yugin Tan, Jingzhu Chen, Nattapat Boonprakong, Zicheng Zhu, Naomi Yamashita, Yi-Chieh Lee
2026 A* conf
CHI
Yamato Mogi, Wataru Akahori, Naomi Yamashita
2026 conf
CHI Extended Abstracts
Jiyeon Amy Seo, Hyungjun Cho, Naomi Yamashita, Woosuk Seo, Ge Gao, Elizabeth Gerber, Volker Wulf, Pernille Bjørn, Donghee Yvette Wohn
2025 J jnl
CoRR
Peinuan Qin, Zicheng Zhu, Naomi Yamashita, Yitian Yang, Keita Suga, Yi-Chieh Lee
2025 J jnl
Proc. ACM Hum. Comput. Interact.
Peinuan Qin, Zicheng Zhu, Naomi Yamashita, Yitian Yang, Keita Suga, Yi-Chieh Lee
2025 A* conf
CHI
Yuexi Chen, Yimin Xiao, Kazi Tasnim Zinat, Naomi Yamashita, Ge Gao, Zhicheng Liu
2025 J jnl
CoRR
Yuexi Chen, Yimin Xiao, Kazi Tasnim Zinat, Naomi Yamashita, Ge Gao, Zhicheng Liu
2025 A conf
IUI
Naoto Nishida, Yoshio Ishiguro, Jun Rekimoto, Naomi Yamashita
2025 J jnl
CoRR
Naoto Nishida, Yoshio Ishiguro, Jun Rekiomto, Naomi Yamashita
2025 conf
CHI Extended Abstracts
Koutaro Kamada, Masami Takahashi, Naomi Yamashita
2025 J jnl
CoRR
Tianqi Song, Jack Jamieson, Tianwen Zhu, Naomi Yamashita, Yi-Chieh Lee
2025 J jnl
Proc. ACM Hum. Comput. Interact.
Tianqi Song, Jack Jamieson, Tianwen Zhu, Naomi Yamashita, Yi-Chieh Lee
2025 J jnl
Proc. ACM Hum. Comput. Interact.
Qingxiaoyang Zhu, Angela Rodolico, Naomi Yamashita, Hao-Chuan Wang
2025 A* ed.
CHI
Naomi Yamashita, Vanessa Evers, Koji Yatani, Sharon Xianghua Ding, Bongshin Lee, Marshini Chetty, Phoebe O. Toups Dugas
2025 ed.
CHI Extended Abstracts
Naomi Yamashita, Vanessa Evers, Koji Yatani, Sharon Xianghua Ding
2025 A* conf
CHI
Zicheng Zhu, Yugin Tan, Naomi Yamashita, Yi-Chieh Lee, Renwen Zhang
2025 J jnl
CoRR
Zicheng Zhu, Yugin Tan, Naomi Yamashita, Yi-Chieh Lee, Renwen Zhang
2025 A* conf
CHI
Tomu Tominaga, Naomi Yamashita, Takeshi Kurashima
2025 J jnl
CoRR
Shunpei Norihama, Yuka Iwane, Jo Takezawa, Simo Hosio, Mari Hirano, Naomi Yamashita, Koji Yatani
2025 A* conf
CHI
Jack Jamieson, Wataru Akahori, Naomi Yamashita
2025 A* conf
CHI
Chi-Lan Yang, Alarith Uhde, Naomi Yamashita, Hideaki Kuzuoka
2025 J jnl
CoRR
Chi-Lan Yang, Alarith Uhde, Naomi Yamashita, Hideaki Kuzuoka
2025 conf
CHI Extended Abstracts
Hui Guan, Jack Jamieson, Ge Gao, Naomi Yamashita
2025 conf
CHI Extended Abstracts
Tae Sato, Taiga Sano, Eiji Kumakawa, Kaori Fujimura, Naomi Yamashita
2024 J jnl
CoRR
Yimin Xiao, Yuewen Chen, Naomi Yamashita, Yuexi Chen, Zhicheng Liu, Ge Gao
2024 J jnl
Proc. ACM Hum. Comput. Interact.
Yimin Xiao, Yuewen Chen, Naomi Yamashita, Yuexi Chen, Zhicheng Liu, Ge Gao
2024 J jnl
Proc. ACM Hum. Comput. Interact.
Yichao Cui, Yu-Jen Lee, Jack Jamieson, Naomi Yamashita, Yi-Chieh Lee
2024 A* conf
CHI
Mingzhe Yang, Hiromi Arai, Naomi Yamashita, Yukino Baba
2024 J jnl
CoRR
Mingzhe Yang, Hiromi Arai, Naomi Yamashita, Yukino Baba
2024 A* conf
ICSE
Jack Jamieson, Naomi Yamashita, Eureka Foong
2024 A* conf
IJCAI
Tomu Tominaga, Naomi Yamashita, Takeshi Kurashima
2024 J jnl
CoRR
Tomu Tominaga, Naomi Yamashita, Takeshi Kurashima
2024 J jnl
Frontiers Robotics AI
Kazuaki Tanaka, Kentaro Oshiro, Naomi Yamashita, Hideyuki Nakanishi
2024 J jnl
Interactions
Naomi Yamashita, Vanessa Evers
2024 A* conf
CHI
Wataru Akahori, Naomi Yamashita, Jack Jamieson, Momoko Nakatani, Ryo Hashimoto, Masahiro Watanabe
2023 A* conf
CHI
Chi-Lan Yang, Shigeo Yoshida, Hideaki Kuzuoka, Takuji Narumi, Naomi Yamashita
2023 J jnl
IEICE Trans. Inf. Syst.
Ayako Akiyama Hasegawa, Mitsuaki Akiyama, Naomi Yamashita, Daisuke Inoue, Tatsuya Mori
2023 conf
INTERACT (2)
Eureka Foong, Jack Jamieson, Hideaki Kuzuoka, Naomi Yamashita, Tomoki Nishida
2023 J jnl
Proc. ACM Hum. Comput. Interact.
Jack Jamieson, Naomi Yamashita
2023 A* conf
CHI
Yi-Chieh Lee, Yichao Cui, Jack Jamieson, Wayne Fu, Naomi Yamashita
2023 A* conf
CHI
Wataru Akahori, Naomi Yamashita, Jack Jamieson, Momoko Nakatani, Ryo Hashimoto, Masahiro Watanabe
2023 J jnl
Proc. ACM Hum. Comput. Interact.
Xiaoyan Li, Naomi Yamashita, Wen Duan, Yoshinari Shirai, Susan R. Fussell
2023 J jnl
Comput. Support. Cooperative Work.
John C. Tang, Kori Inkpen, Paul Luff, Geraldine Fitzpatrick, Naomi Yamashita, Juho Kim
2023 J jnl
Proc. ACM Hum. Comput. Interact.
Munmun De Choudhury, Xianghua Ding, Shion Guha, Aparecido Fabiano Pinatti de Carvalho, Hideaki Kuzuoka, Katharina Reinecke, Hao-Chuan Wang, Naomi Yamashita
2023 conf
CSCW Companion
Adriana S. Vivacqua, Neha Kumar, Nicola J. Bidwell, Kagonya Awori, Kathrin Gerling, Dhruv Jain, Andrew L. Kun, Naomi Yamashita
2023 J jnl
Proc. ACM Hum. Comput. Interact.
Teale W. Masrani, Jack Jamieson, Naomi Yamashita, Helen Ai He
2023 A* conf
UIST
Takumi Ito, Naomi Yamashita, Tatsuki Kuribayashi, Masatoshi Hidaka, Jun Suzuki, Ge Gao, Jack Jamieson, Kentaro Inui
2022 A* conf
CHI
Yichao Cui, Naomi Yamashita, Mingjie Liu, Yi-Chieh Lee
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Yichao Cui, Naomi Yamashita, Yi-Chieh Lee
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Chi-Lan Yang, Naomi Yamashita, Hideaki Kuzuoka, Hao-Chuan Wang, Eureka Foong
2022 conf
CHI Extended Abstracts
SIGCHI Executive Committee, Adriana S. Vivacqua, Andrew L. Kun, Cale J. Passmore, Helena M. Mentis, Josh Andres, Kashyap Todi, Matt Jones, Luigi De Russis, Naomi Yamashita, Neha Kumar, Nicola J. Bidwell, Pejman Mirza-Babaei, Priya C. Kumar, Shaowen Bardzell, Simone Kriglstein, Susan M. Dray, Susanne Boll, Stacy M. Branham, Tamara L. Clegg
2022 J jnl
J. Inf. Process.
Ayako Akiyama Hasegawa, Naomi Yamashita, Mitsuaki Akiyama, Tatsuya Mori
2022 conf
CHI Extended Abstracts
SIGCHI Executive Committee, Adriana S. Vivacqua, Andrew L. Kun, Cale J. Passmore, Helena M. Mentis, Josh Andres, Kashyap Todi, Luigi De Russis, Matt Jones, Naomi Yamashita, Neha Kumar, Nicola J. Bidwell, Pejman Mirza-Babaei, Priya C. Kumar, Shaowen Bardzell, Simone Kriglstein, Stacy M. Branham, Susan Dray, Susanne Boll, Tamara L. Clegg
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Jack Jamieson, Eureka Foong, Naomi Yamashita
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Shaowen Bardzell, Siân E. Lindley, Aleksandra Sarcevic, Hideaki Kuzuoka, Katharina Reinecke, Hao-Chuan Wang, Naomi Yamashita
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Hideaki Kuzuoka, Katharina Reinecke, Hao-Chuan Wang, Naomi Yamashita, Shaowen Bardzell, Siân Lindley, Aleksandra Sarcevic
2022 conf
CHI Extended Abstracts
SIGCHI Executive Committee, Adriana S. Vivacqua, Andrew L. Kun, Cale J. Passmore, Helena M. Mentis, Josh Andres, Kashyap Todi, Luigi De Russis, Matt Jones, Naomi Yamashita, Neha Kumar, Nicola J. Bidwell, Pejman Mirza-Babaei, Priya C. Kumar, Shaowen Bardzell, Simone Kriglstein, Stacy M. Branham, Susan M. Dray, Susanne Boll, Tamara L. Clegg
2022 J jnl
CoRR
Ge Gao, Jian Zheng, Eun Kyoung Choe, Naomi Yamashita
2022 J jnl
Proc. ACM Hum. Comput. Interact.
Ge Gao, Jian Zheng, Eun Kyoung Choe, Naomi Yamashita
2022 conf
SOUPS @ USENIX Security Symposium
Ayako Akiyama Hasegawa, Naomi Yamashita, Tatsuya Mori, Daisuke Inoue, Mitsuaki Akiyama
2022 conf
CSCW Companion
Angela Rodolico, Qingxiaoyang Zhu, Naomi Yamashita, Hao-Chuan Wang
2022 A* conf
CHI
Jack Jamieson, Daniel A. Epstein, Yunan Chen, Naomi Yamashita
2021 J jnl
Proc. ACM Hum. Comput. Interact.
Wen Duan, Naomi Yamashita, Yoshinari Shirai, Susan R. Fussell
2021 J jnl
Proc. ACM Hum. Comput. Interact.
Jack Jamieson, Naomi Yamashita, Daniel A. Epstein, Yunan Chen
2021 A* conf
CHI
Amanda Baughan, Nigini Oliveira, Tal August, Naomi Yamashita, Katharina Reinecke
2021 J jnl
Proc. ACM Hum. Comput. Interact.
Yi-Chieh Lee, Naomi Yamashita, Yun Huang
2021 conf
CSCW Companion
Adriana S. Vivacqua, Naomi Yamashita, Shaowen Bardzell, Neha Kumar
2021 conf
SOUPS @ USENIX Security Symposium
Ayako Akiyama Hasegawa, Naomi Yamashita, Mitsuaki Akiyama, Tatsuya Mori
2020 A* conf
CHI
Yi-Chieh Lee, Naomi Yamashita, Yun Huang, Wai Fu
2020 B conf
IVA
Masamune Kawasaki, Naomi Yamashita, Yi-Chieh Lee, Kayoko Nohara
2020 conf
PervasiveHealth
Seokwoo Song, Naomi Yamashita, John Kim
2020 J jnl
Proc. ACM Hum. Comput. Interact.
Yi-Chieh Lee, Naomi Yamashita, Yun Huang
2020 A* conf
CHI
Amanda Baughan, Tal August, Naomi Yamashita, Katharina Reinecke
2020 conf
HCI (15)
Huichen Chou, Donghui Lin, Toru Ishida, Naomi Yamashita
2019 J jnl
Proc. ACM Hum. Comput. Interact.
Wen Duan, Naomi Yamashita, Susan R. Fussell
2019 A conf
Conference on Designing Interactive Systems
Zhengqing Li, Shio Miyafuji, Erwin Wu, Hideaki Kuzuoka, Naomi Yamashita, Hideki Koike
2018 conf
CHI Extended Abstracts
Wen Duan, Naomi Yamashita, Sun Young Hwang, Susan R. Fussell
2018 J jnl
Proc. ACM Hum. Comput. Interact.
Mei-Ling Chen, Naomi Yamashita, Hao-Chuan Wang
2018 conf
CHI Extended Abstracts
Mei-Ling Chen, Naomi Yamashita, Hao-Chuan Wang
2018 J jnl
IEICE Trans. Inf. Syst.
Xun Cao, Naomi Yamashita, Toru Ishida
2018 A conf
Conference on Designing Interactive Systems
Zhengqing Li, Shio Miyafuji, Toshiki Sato, Hideki Koike, Naomi Yamashita, Hideaki Kuzuoka
2018 A* conf
CHI
Naomi Yamashita, Hideaki Kuzuoka, Takashi Kudo, Keiji Hirata, Eiji Aramaki, Kazuki Hattori
2018 conf
CollabTech
Mondheera Pituxcoosuvarn, Toru Ishida, Naomi Yamashita, Toshiyuki Takasaki, Yumiko Mori
2018 J jnl
IEICE Trans. Electron.
Naomi Yamashita, Yuya Ota, Faiz Salleh, Mani Navaneethan, Masaru Shimomura, Kenji Murakami, Hiroya Ikeda
2018 ch.
Services Computing for Language Resources
Xun Cao, Naomi Yamashita, Toru Ishida
2018 conf
IUI Companion
Mondheera Pituxcoosuvarn, Toru Ishida, Naomi Yamashita, Toshiyuki Takasaki, Yumiko Mori
2017 A* conf
CHI
Naomi Yamashita, Hideaki Kuzuoka, Keiji Hirata, Takashi Kudo, Eiji Aramaki, Kazuki Hattori
2017 J jnl
IEEE Trans. Emerg. Top. Comput.
Takuya Maekawa, Naomi Yamashita, Yasushi Sakurai
2017 conf
INTERACT (2)
Jack Jamieson, Naomi Yamashita, Jeffrey Boase
2017 A conf
Conference on Designing Interactive Systems
Hideyuki Nakanishi, Kazuaki Tanaka, Ryoji Kato, Xing Geng, Naomi Yamashita
2017 conf
CHI Extended Abstracts
Ari Hautasaari, Naomi Yamashita, Takashi Kudo
2017 A* conf
CHI
Christian Licoppe, Paul K. Luff, Christian Heath, Hideaki Kuzuoka, Naomi Yamashita, Sylvaine Tuncer
2017 A conf
CSCW
Mei-Hua Pan, Naomi Yamashita, Hao-Chuan Wang
2017 conf
HCI (2)
Hideaki Kuzuoka, Ryo Kimura, Yuki Tashiro, Yoshihiko Kubota, Hideyuki Suzuki, Hiroshi Kato, Naomi Yamashita
2017 J jnl
Proc. ACM Hum. Comput. Interact.
Helen Ai He, Naomi Yamashita, Chat Wacharamanotham, Andrea B. Horn, Jenny Schmid, Elaine M. Huang
2017 A conf
CSCW
Helen Ai He, Naomi Yamashita, Ari Hautasaari, Xun Cao, Elaine M. Huang
2016 conf
CollabTech
Xun Cao, Naomi Yamashita, Toru Ishida
2016 B conf
ICMI
Xun Cao, Naomi Yamashita, Toru Ishida
2016 A* conf
HRI
Kazuaki Tanaka, Naomi Yamashita, Hideyuki Nakanishi, Hiroshi Ishiguro
2015 conf
CHI Extended Abstracts
Petr Slovák, Greg Wadley, David Coyle, Anja Thieme, Naomi Yamashita, Reeva Lederman, Stefan Schutt, Mia Doces
2015 conf
INTERACT (1)
Ari Hautasaari, Naomi Yamashita
2015 A* conf
CHI
Paul K. Luff, Naomi Yamashita, Hideaki Kuzuoka, Christian Heath
2015 A* conf
CHI
Ge Gao, Naomi Yamashita, Ari M. J. Hautasaari, Susan R. Fussell
2014 A* conf
CHI
Ari M. J. Hautasaari, Naomi Yamashita, Ge Gao
2014 A* conf
CHI
Ge Gao, Naomi Yamashita, Ari M. J. Hautasaari, Andy Echenique, Susan R. Fussell
2014 conf
EuroHaptics (1)
Vibol Yem, Hideaki Kuzuoka, Naomi Yamashita, Shoichi Ohta, Yasuo Takeuchi
2014 B conf
HAI
Hideaki Kuzuoka, Naomi Yamashita, Hiroshi Kato, Hideyuki Suzuki, Yoshihiko Kubota
2013 J jnl
ACM Trans. Comput. Hum. Interact.
Paul Luff, Marina Jirotka, Naomi Yamashita, Hideaki Kuzuoka, Christian Heath, Grace Eden
2013 A conf
CSCW
Naomi Yamashita, Andy Echenique, Toru Ishida, Ari Hautasaari
2013 A* conf
CHI
Naomi Yamashita, Hideaki Kuzuoka, Keiji Hirata, Takashi Kudo
2012 A* conf
CHI
Vibol Yem, Hideaki Kuzuoka, Naomi Yamashita, Ryota Shibusawa, Hiroaki Yano, Jun Yamashita
2012 conf
ICIC
Naomi Yamashita, Hideaki Kuzuoka
2011 conf
Culture and Computing
Linsi Xia, Naomi Yamashita, Toru Ishida
2011 ch.
The Language Grid
Naomi Yamashita, Toru Ishida
2011 A* conf
CHI
Paul Luff, Naomi Yamashita, Hideaki Kuzuoka, Christian Heath
2011 A conf
CSCW
Naomi Yamashita, Katsuhiko Kaji, Hideaki Kuzuoka, Keiji Hirata
2011 A* conf
CHI
Naomi Yamashita, Hideaki Kuzuoka, Keiji Hirata, Shigemi Aoyagi, Yoshinari Shirai
2009 J jnl
IEICE Trans. Electron.
Keiji Hirata, Yasunori Harada, Toshihiro Takada, Naomi Yamashita, Shigemi Aoyagi, Yoshinari Shirai, Katsuhiko Kaji, Junji Yamato, Kenji Nakazawa
2009 A* conf
CHI
Naomi Yamashita, Rieko Inaba, Hideaki Kuzuoka, Toru Ishida
2009 conf
IWIC
Heeryon Cho, Toru Ishida, Naomi Yamashita, Tomoko Koda, Toshiyuki Takasaki
2008 J jnl
Inf. Media Technol.
Naomi Yamashita, Keiji Hirata, Toshihiro Takada, Yasunori Harada, Yoshinari Shirai, Shigemi Aoyagi
2008 B conf
AVI
Naomi Yamashita, Keiji Hirata, Toshihiro Takada, Yasunori Harada
2008 A conf
CSCW
Naomi Yamashita, Keiji Hirata, Shigemi Aoyagi, Hideaki Kuzuoka, Yasunori Harada
2008 B conf
GLOBECOM
Keiji Hirata, Yasunori Harada, Toshihiro Takada, Shigemi Aoyagi, Yoshinari Shirai, Naomi Yamashita, Katsuhiko Kaji, Junji Yamato, Kenji Nakazawa
2007 conf
IWIC
Heeryon Cho, Toru Ishida, Naomi Yamashita, Rieko Inaba, Yumiko Mori, Tomoko Koda
2007 B conf
PRIMA
Heeryon Cho, Naomi Yamashita, Toru Ishida
2006 A conf
IUI
Naomi Yamashita, Toru Ishida
2006 A conf
CSCW
Naomi Yamashita, Toru Ishida
2005 B conf
GROUP
Naomi Yamashita, Toru Ishida
2003 conf
HCI (4)
Saeko Nomura, Toru Ishida, Mika Yasuoka, Naomi Yamashita, Kaname Funakoshi
redb/extractors/hashes.py
← Index redb/extractors/hashes.py python
from dataclasses import asdict
from typing import Any
from datetime import datetime, timezone

import hashlib
import inspect
from struct import pack

from magika import Magika
from signify.fingerprinter import AuthenticodeFingerprinter
import ppdeep
import tlsh

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

from redb.extractors.enum import Tag
from redb.models.dataclasses import Hashes
from redb.extractors.extractor import Extractor


class HashExtractor(Extractor):

    def __init__(
        self,
        filepath,
        log,
        exporters=None,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        macho=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix, elastic_index, known_benign, known_malicious
        )
        self.hashes = None
        self.elastic_index = self.index_prefix + "-hashes"
        self.filetype = Magika().identify_bytes(self.binary).output.label
        self.pe = None
        self.elf = None
        self.macho = macho
        if self.filetype == "pebin":  # else None
            try:
                self.pe = pefile.PE(self.filepath)
            except Exception as e:
                self.log.error(f"Failed to initialize PE file object: {e}")
                self.pe = None
        elif self.filetype == "elf":
            # ELF file will be created when needed in _extract_elf_hashes
            pass

    def _extract_hashes(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        
        # Initialize hash values with None
        md5 = None
        sha1 = None
        sha256 = None
        ssdeep_hash = None
        tlsh_hash = None
        
        # Calculate basic hashes with error handling
        try:
            md5 = hashlib.md5(self.binary).hexdigest()
        except Exception as e:
            self.log.error(f"Failed to calculate MD5 hash: {e}")
            
        try:
            sha1 = hashlib.sha1(self.binary).hexdigest()
        except Exception as e:
            self.log.error(f"Failed to calculate SHA1 hash: {e}")
            
        try:
            sha256 = hashlib.sha256(self.binary).hexdigest()
        except Exception as e:
            self.log.error(f"Failed to calculate SHA256 hash: {e}")
            
        try:
            ssdeep_hash = ppdeep.hash_from_file(self.filepath)
        except Exception as e:
            self.log.error(f"Failed to calculate ssdeep hash: {e}")
            
        try:
            tlsh_hash = tlsh.hash(self.binary)
        except Exception as e:
            self.log.error(f"Failed to calculate TLSH hash: {e}")
        
        # Create Hashes object with available values
        self.hashes = Hashes(
            md5 or "",
            sha1 or "",
            sha256 or "",
            ssdeep_hash or "",
            tlsh_hash or "",
        )

        if self.filetype == "pebin" and self.pe is not None:
            self.log.debug("Computing PEBIN related hash values")
            
            # Authentihash
            try:
                with open(self.filepath, 'rb') as f:
                    fingerprinter = AuthenticodeFingerprinter(f)
                    fingerprinter.add_authenticode_hashers(hashlib.sha256)
                    self.hashes.authentihash = fingerprinter.hash()['sha256'].hex()
            except Exception as e:
                self.log.error(f"Failed to calculate Authentihash: {e}")
                self.hashes.authentihash = None
                
            # Imphash
            try:
                self.hashes.imphash = self.pe.get_imphash()
            except Exception as e:
                self.log.error(f"Failed to calculate Imphash: {e}")
                self.hashes.imphash = None
                
            # Rich header hashes
            try:
                if self.pe.parse_rich_header():
                    self.log.debug("Computing RichHeader related hash values")
                    
                    richhash = self._compute_richhash()
                    if richhash:
                        self.hashes.richhash = richhash
                        
                    richpe_hash = self._compute_richpe_hash()
                    if richpe_hash:
                        self.hashes.richpe_hash = richpe_hash
                        
                    richpv_result = self._compute_richpv_hash()
                    if richpv_result:
                        self.hashes.richpv_hash, self.hashes.richpv_hash_sorted = richpv_result
            except Exception as e:
                self.log.error(f"Failed to calculate Rich header hashes: {e}")
        elif self.filetype == "pebin" and self.pe is None:
            self.log.warning("PE file type detected but PE object initialization failed - skipping PE-specific hashes")

        elif self.filetype == "elf":
            self.log.debug("Computing ELF related hash values")
            self._extract_elf_hashes()
        elif self.filetype == "macho":
            self.log.debug("Computing Mach-O related hash values")
            self._extract_macho_hashes()
        elif self.filetype == "apk":
            self.log.debug("Computing APK related hash values")
            self._extract_apk_hashes()
        else:
            pass
        self.log.debug(f"Hashes dump: {asdict(self.hashes)}")
        return self.hashes

    def _compute_richhash(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            rich_header = self.pe.parse_rich_header()
            if not rich_header:
                return ""
            data = rich_header["clear_data"]
            return hashlib.md5(data).hexdigest().lower()
        except:
            return ""

    def _compute_richpe_hash(self):
        """
        Computes the RichPE hash given a file path or PE object.

        RichPE hash is includes RichHeader CompID and count, as well as
        fields from IMAGE_FILE_HEADER and IMAGE_OPTIONAL_HEADER

        Parameters:
        input: it can be either a file path or a PE object

        Returns:
        richpe_hash: md5 hash of the RichPE value
        None: if no Rich Header present
        """
        try:
            # Attempt to parse Rich header
            self.log.debug(inspect.currentframe().f_code.co_name)
            rich_header = self.pe.parse_rich_header()
            if rich_header is None:
                return None

            # Get list of @Comp.IDs and counts from Rich header
            # Elements in rich_fields at even indices are @Comp.IDs
            # Elements in rich_fields at odd indices are counts
            rich_fields = rich_header.get("values", None)
            if not rich_fields or len(rich_fields) % 2 != 0:
                return None

            md5 = hashlib.md5()

            # Update hash using @Comp.IDs and masked counts from Rich header
            while len(rich_fields):
                compid = rich_fields.pop(0)
                count = rich_fields.pop(0)
                mask = 2 ** (count.bit_length() // 2 + 1) - 1
                count |= mask
                md5.update(pack("<L", compid))
                md5.update(pack("<L", count))

            # Update hash using metadata from the PE header
            md5.update(pack("<L", self.pe.FILE_HEADER.Machine))
            md5.update(pack("<L", self.pe.FILE_HEADER.Characteristics))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.Subsystem))
            md5.update(pack("<B", self.pe.OPTIONAL_HEADER.MajorLinkerVersion))
            md5.update(pack("<B", self.pe.OPTIONAL_HEADER.MinorLinkerVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MajorOperatingSystemVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MinorOperatingSystemVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MajorImageVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MinorImageVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MajorSubsystemVersion))
            md5.update(pack("<L", self.pe.OPTIONAL_HEADER.MinorSubsystemVersion))

            return md5.hexdigest()
        except Exception as e:
            self.log.error(f"Failed to compute RichPE hash: {e}")
            return None

    def _compute_richpv_hash(self):
        """
        Compute the RichPV hash values, sorted and unsorted.
        RichPV excludes the most volatile Rich Header field from the MD5 input data,
        the Product Count (pC) field.

        Returns:
        richpv_hash_unsorted: md5 hash of the RichPV value unsorted
        richpv_hash_sorted: md5 hash of the RichPV value sorted
        None: if no Rich Header present
        """
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            # Attempt to parse Rich header
            rich_header = self.pe.parse_rich_header()
            if rich_header is None:
                return None

            # Get list of @Comp.IDs and counts from Rich header
            # Elements in rich_fields at even indices are @Comp.IDs
            # Elements in rich_fields at odd indices are counts
            rich_fields = rich_header.get("values", None)
            if not rich_fields or len(rich_fields) % 2 != 0:
                return None

            md5 = hashlib.md5()
            md5_sorted = hashlib.md5()
            sorted_vector = []

            # Update hash using @Comp.IDs only
            for i in range(0, len(rich_fields), 2):
                compid = rich_fields[i]
                md5.update(pack("<L", compid))
                sorted_vector.append(compid)

            sorted_vector.sort()
            for compid in sorted_vector:
                md5_sorted.update(pack("<L", compid))

            return md5.hexdigest(), md5_sorted.hexdigest()
        except Exception as e:
            self.log.error(f"Failed to compute RichPV hash: {e}")
            return None

    def _extract_elf_hashes(self):
        """Extract ELF specific similarity hashes."""
        self.log.debug(inspect.currentframe().f_code.co_name)

        try:
            with open(self.filepath, 'rb') as f:
                elf = ELFFile(f)
                if not elf:
                    return

                # Generate all similarity hashes
                import_hash = self._generate_elf_import_hash(elf)
                export_hash = self._generate_elf_export_hash(elf)
                section_hash = self._generate_elf_section_hash(elf)
                symbol_hash = self._generate_elf_symbol_hash(elf)
                dynamic_hash = self._generate_elf_dynamic_hash(elf)

                # Only set hashes if they have meaningful values
                if import_hash:
                    self.hashes.import_hash = import_hash
                if export_hash:
                    self.hashes.export_hash = export_hash
                if section_hash:
                    self.hashes.section_hash = section_hash
                if symbol_hash:
                    self.hashes.symhash = symbol_hash
                if dynamic_hash:
                    self.hashes.dynamic_hash = dynamic_hash

        except Exception as e:
            self.log.error(f"Failed to extract ELF hashes: {e}")

    def _generate_elf_import_hash(self, elf) -> str:
        """Generate MD5 hash of sorted, deduplicated imported symbol names."""
        try:
            imported_symbols = set()

            # Get dynamic symbol table
            dynsym_section = elf.get_section_by_name('.dynsym')
            if dynsym_section and hasattr(dynsym_section, 'iter_symbols'):
                for symbol in dynsym_section.iter_symbols():
                    # Look for undefined symbols (imports)
                    if (symbol.entry.get('st_shndx', 0) == 'SHN_UNDEF' and
                        symbol.name and
                        symbol.entry.get('st_info', {}).get('bind') in ['STB_GLOBAL', 'STB_WEAK']):
                        imported_symbols.add(symbol.name)

            # Also check relocations for additional imports
            for section in elf.iter_sections():
                if hasattr(section, 'iter_relocations'):
                    try:
                        for relocation in section.iter_relocations():
                            if hasattr(relocation, 'symbol') and relocation.symbol and relocation.symbol.name:
                                imported_symbols.add(relocation.symbol.name)
                    except:
                        pass

            # Sort and concatenate
            sorted_imports = sorted(list(imported_symbols))

            # Return None if no imports found
            if not sorted_imports:
                return None

            imports_string = '|'.join(sorted_imports)

            # Generate MD5 hash
            return hashlib.md5(imports_string.encode('utf-8')).hexdigest()

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

    def _generate_elf_export_hash(self, elf) -> str:
        """Generate MD5 hash of sorted, deduplicated exported symbol names."""
        try:
            exported_symbols = set()

            # Check both static and dynamic symbol tables
            symbol_sections = ['.symtab', '.dynsym']

            for section_name in symbol_sections:
                section = elf.get_section_by_name(section_name)
                if not section or not hasattr(section, 'iter_symbols'):
                    continue

                for symbol in section.iter_symbols():
                    # Check if symbol is exported (defined and globally visible)
                    if (symbol.name and
                        symbol.entry.get('st_shndx', 0) != 'SHN_UNDEF' and
                        symbol.entry.get('st_info', {}).get('bind') in ['STB_GLOBAL', 'STB_WEAK'] and
                        symbol.entry.get('st_info', {}).get('type') in ['STT_FUNC', 'STT_OBJECT']):
                        exported_symbols.add(symbol.name)

            # Sort and concatenate
            sorted_exports = sorted(list(exported_symbols))

            # Return None if no exports found
            if not sorted_exports:
                return None

            exports_string = '|'.join(sorted_exports)

            # Generate MD5 hash
            return hashlib.md5(exports_string.encode('utf-8')).hexdigest()

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

    def _generate_elf_section_hash(self, elf) -> str:
        """Generate MD5 hash of section layout (names, types, flags sequence)."""
        try:
            section_info = []

            for section in elf.iter_sections():
                header = section.header
                section_name = section.name or "<unnamed>"
                section_type = header.get('sh_type', 'SHT_NULL')
                section_flags = header.get('sh_flags', 0)

                # Create a consistent representation
                section_repr = f"{section_name}:{section_type}:{section_flags}"
                section_info.append(section_repr)

            # Return None if no meaningful sections found
            if not section_info:
                return None

            # Join all section info
            sections_string = '|'.join(section_info)

            # Generate MD5 hash
            return hashlib.md5(sections_string.encode('utf-8')).hexdigest()

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

    def _generate_elf_symbol_hash(self, elf) -> str:
        """Generate MD5 hash of sorted symbol names and types."""
        try:
            symbol_info = set()

            # Check both static and dynamic symbol tables
            symbol_sections = ['.symtab', '.dynsym']

            for section_name in symbol_sections:
                section = elf.get_section_by_name(section_name)
                if not section or not hasattr(section, 'iter_symbols'):
                    continue

                for symbol in section.iter_symbols():
                    if symbol.name:
                        symbol_type = symbol.entry.get('st_info', {}).get('type', 'STT_NOTYPE')
                        symbol_bind = symbol.entry.get('st_info', {}).get('bind', 'STB_LOCAL')

                        # Create a consistent representation
                        symbol_repr = f"{symbol.name}:{symbol_type}:{symbol_bind}"
                        symbol_info.add(symbol_repr)

            # Sort and concatenate
            sorted_symbols = sorted(list(symbol_info))

            # Return None if no symbols found
            if not sorted_symbols:
                return None

            symbols_string = '|'.join(sorted_symbols)

            # Generate MD5 hash
            return hashlib.md5(symbols_string.encode('utf-8')).hexdigest()

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

    def _generate_elf_dynamic_hash(self, elf) -> str:
        """Generate MD5 hash of dynamic section entries (DT_* tags)."""
        try:
            dynamic_info = []

            # Get the dynamic section
            dynamic_section = elf.get_section_by_name('.dynamic')
            if not dynamic_section:
                return None

            # Extract dynamic tags and their values
            for tag in dynamic_section.iter_tags():
                dt_tag = tag.entry.d_tag

                # Create a representation based on tag type
                if dt_tag == 'DT_NEEDED':
                    dynamic_info.append(f"DT_NEEDED:{tag.needed}")
                elif dt_tag == 'DT_SONAME':
                    dynamic_info.append(f"DT_SONAME:{tag.soname}")
                elif dt_tag == 'DT_RPATH':
                    dynamic_info.append(f"DT_RPATH:{tag.rpath}")
                elif dt_tag == 'DT_RUNPATH':
                    dynamic_info.append(f"DT_RUNPATH:{tag.runpath}")
                else:
                    # For other tags, use the tag name and value
                    dt_value = tag.entry.d_val if hasattr(tag.entry, 'd_val') else 0
                    dynamic_info.append(f"{dt_tag}:{dt_value}")

            # Sort to ensure consistent ordering
            dynamic_info.sort()
            dynamics_string = '|'.join(dynamic_info)

            # Generate MD5 hash
            return hashlib.md5(dynamics_string.encode('utf-8')).hexdigest()

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

    def _extract_macho_hashes(self):
        """Extract Mach-O specific similarity hashes using machofile API.

        For FAT binaries, this extracts hashes for the current file being processed
        (either the FAT container or an individual slice). The machofile library
        handles the architecture-specific extraction when an arch parameter is provided.

        For slices: We parse the slice file directly since it's a standalone Mach-O.
        For FAT container: We use the provided macho object with combined/fat hashes.
        """
        self.log.debug(inspect.currentframe().f_code.co_name)

        try:
            # If we have a pre-parsed macho object (FAT container or single-arch with passed object)
            if self.macho:
                architectures = self.macho.get_architectures()
                is_fat = len(architectures) > 1

                if is_fat:
                    # For FAT container, get combined hashes (key may be 'fat' or 'combined')
                    all_hashes = self.macho.get_similarity_hashes()
                    if all_hashes:
                        # Try 'fat' first, then 'combined' for backwards compatibility
                        similarity_hashes = all_hashes.get('fat', all_hashes.get('combined', {}))
                    else:
                        similarity_hashes = {}
                else:
                    # Single-arch with pre-parsed object
                    similarity_hashes = self.macho.get_similarity_hashes(arch=architectures[0]) if architectures else {}
            else:
                # No pre-parsed object - parse the file (slice case)
                import machofile
                macho = machofile.UniversalMachO(self.filepath)
                macho.parse()

                architectures = macho.get_architectures()
                if architectures:
                    # For a slice, there's only one architecture
                    similarity_hashes = macho.get_similarity_hashes(arch=architectures[0]) or {}
                else:
                    similarity_hashes = {}

            # Set the hash values on the Hashes object
            if similarity_hashes:
                if similarity_hashes.get('dylib_hash'):
                    self.hashes.macho_dylib_hash = similarity_hashes['dylib_hash']
                if similarity_hashes.get('import_hash'):
                    self.hashes.macho_import_hash = similarity_hashes['import_hash']
                if similarity_hashes.get('export_hash'):
                    self.hashes.macho_export_hash = similarity_hashes['export_hash']
                if similarity_hashes.get('entitlement_hash'):
                    self.hashes.macho_entitlement_hash = similarity_hashes['entitlement_hash']
                if similarity_hashes.get('symhash'):
                    self.hashes.macho_symhash = similarity_hashes['symhash']

        except Exception as e:
            self.log.error(f"Failed to extract Mach-O hashes: {e}")

    def _extract_apk_hashes(self):
        """Extract APK specific similarity hashes (permhash)."""
        self.log.debug(inspect.currentframe().f_code.co_name)
        try:
            from permhash.functions import permhash_apk
            ph = permhash_apk(self.filepath)
            if ph:
                self.hashes.permhash = ph
        except Exception as e:
            self.log.error(f"Failed to extract APK hashes: {e}")

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            self._extract_hashes()
            return self.hashes
        except Exception as e:
            self.log.error(f"Error extracting hashes: {e}")
            return None

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type == "ElasticsearchExporter":
            return self.hashes
        elif exporter_type == "ClickHouseExporter":
            # Safely get hash values with fallbacks for None values
            sha256 = getattr(self.hashes, 'sha256', None) or ""
            md5 = getattr(self.hashes, 'md5', None) or ""
            sha1 = getattr(self.hashes, 'sha1', None) or ""
            ssdeep_hash = getattr(self.hashes, 'ssdeep_hash', None) or ""
            tlsh_hash = getattr(self.hashes, 'tlsh_hash', None) or ""
            authentihash = getattr(self.hashes, 'authentihash', None)
            imphash = getattr(self.hashes, 'imphash', None)
            impfuzzy = getattr(self.hashes, 'impfuzzy', None)
            typerefhash = getattr(self.hashes, 'typerefhash', None)
            richhash = getattr(self.hashes, 'richhash', None)
            richpe_hash = getattr(self.hashes, 'richpe_hash', None)
            richpv_hash = getattr(self.hashes, 'richpv_hash', None)
            richpv_hash_sorted = getattr(self.hashes, 'richpv_hash_sorted', None)
            # ELF hashes
            import_hash = getattr(self.hashes, 'import_hash', None)
            export_hash = getattr(self.hashes, 'export_hash', None)
            section_hash = getattr(self.hashes, 'section_hash', None)
            symbol_hash = getattr(self.hashes, 'symhash', None)
            dynamic_hash = getattr(self.hashes, 'dynamic_hash', None)
            # Mach-O hashes
            macho_dylib_hash = getattr(self.hashes, 'macho_dylib_hash', None)
            macho_import_hash = getattr(self.hashes, 'macho_import_hash', None)
            macho_export_hash = getattr(self.hashes, 'macho_export_hash', None)
            macho_entitlement_hash = getattr(self.hashes, 'macho_entitlement_hash', None)
            macho_symhash = getattr(self.hashes, 'macho_symhash', None)
            # APK hashes
            permhash = getattr(self.hashes, 'permhash', None)

            data = [[
                sha256,
                md5,
                sha1,
                ssdeep_hash,
                tlsh_hash,
                authentihash,
                imphash,
                impfuzzy,
                typerefhash,
                richhash,
                richpe_hash,
                richpv_hash,
                richpv_hash_sorted,
                import_hash,
                export_hash,
                section_hash,
                symbol_hash,
                dynamic_hash,
                macho_dylib_hash,
                macho_import_hash,
                macho_export_hash,
                macho_entitlement_hash,
                macho_symhash,
                permhash,
                datetime.now(timezone.utc)
            ]]

            column_names = [
                'sha256', 'md5', 'sha1', 'ssdeep_hash', 'tlsh_hash',
                'authentihash', 'imphash', 'impfuzzy', 'typerefhash',
                'richhash', 'richpe_hash', 'richpv_hash', 'richpv_hash_sorted',
                'import_hash', 'export_hash', 'section_hash', 'symbol_hash', 'dynamic_hash',
                'macho_dylib_hash', 'macho_import_hash', 'macho_export_hash',
                'macho_entitlement_hash', 'macho_symhash',
                'permhash',
                'analysis_date'
            ]

            column_type_names = [
                # sha256, md5, sha1
                'String', 'String', 'String',
                # ssdeep_hash, tlsh_hash
                'Nullable(String)', 'Nullable(String)',
                # authentihash, imphash, impfuzzy, typerefhash
                'Nullable(String)', 'Nullable(String)',
                'Nullable(String)', 'Nullable(String)',
                # richhash, richpe_hash, richpv_hash, richpv_hash_sorted
                'Nullable(String)', 'Nullable(String)',
                'Nullable(String)', 'Nullable(String)',
                # import_hash, export_hash, section_hash, symbol_hash, dynamic_hash
                'Nullable(FixedString(32))', 'Nullable(FixedString(32))',
                'Nullable(FixedString(32))', 'Nullable(FixedString(32))',
                'Nullable(FixedString(32))',
                # macho_dylib_hash, macho_import_hash, macho_export_hash, macho_entitlement_hash, macho_symhash
                'Nullable(FixedString(32))', 'Nullable(FixedString(32))',
                'Nullable(FixedString(32))', 'Nullable(FixedString(32))',
                'Nullable(FixedString(32))',
                # permhash (APK)
                'Nullable(FixedString(64))',
                # analysis_date
                'DateTime64(3, \'UTC\')'
            ]

            return (data, column_names, column_type_names)

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

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