Calvin Plett

55 papers B 1C 10Journal 20Unranked 22
YearRankTypeTitle / Venue / Authors
2023 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Zhe Jiang, Hazem Beshara, Jerry Lam, Naim Ben-Hamida, Calvin Plett
2021 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Jacob Pike, Mahdi Parvizi, David Berton, Naim Ben-Hamida, Sadok Aouini, Calvin Plett
2018 C conf
ISCAS
Jacob Pike, Mahdi Parvizi, Naim Ben-Hamida, Sadok Aouini, Calvin Plett
2018 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Paulo M. M. Silva, Fernando Rangel de Sousa, Calvin Plett
2018 conf
MWSCAS
Ahmad Eldahshan, William Knisely, Rony E. Amaya, Calvin Plett
2015 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Jerry Lam, Tom A. D. Riley, Norman M. Filiol, John W. M. Rogers, Calvin Plett
2015 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Samira Bashiri, Sadok Aouini, Naim Ben-Hamida, Calvin Plett
2015 ed.
SBCCI
Robson Nunes de Lima, Ana Isabela Araújo Cunha, Calvin Plett, Wagner Luiz Alves de Oliveira
2014 conf
NEWCAS
Wilson J. Bortoletto Machado, Calvin Plett
2014 conf
SBCCI
Wilson J. Bortoletto Machado, Calvin Plett
2013 J jnl
IEEE Trans. Circuits Syst. II Express Briefs
Fabricio G. S. Silva, Robson Nunes de Lima, Raimundo Carlos Silvério Freire, Calvin Plett
2012 conf
NEWCAS
Richard Beare, Calvin Plett, John W. M. Rogers
2012 conf
NEWCAS
Jerry Lam, Calvin Plett
2010 C conf
ISCAS
Samira Bashiri, Calvin Plett, Jorge Aguirre, Peter Schvan
2010 C conf
ISCAS
Omid Salehi-Abari, Calvin Plett
2010 C conf
ISCAS
Jerry Lam, Calvin Plett
2010 C conf
ISCAS
Kimia Taghizadeh Ansari, Calvin Plett
2009 conf
ICECS
Kimia Taghizadeh Ansari, Calvin Plett, Mustapha C. E. Yagoub
2009 conf
SBCCI
Calvin Plett, Robson Nunes de Lima
2009 ed.
SBCCI
Ivan Saraiva Silva, Renato P. Ribas, Calvin Plett
2008 J jnl
IEEE J. Solid State Circuits
Peter H. R. Popplewell, Victor Karam, Atif Shamim, John W. M. Rogers, Langis Roy, Calvin Plett
2006 C conf
ISCAS
Peter H. R. Popplewell, Victor Karam, Atef Shamim, John W. M. Rogers, Mark Cloutier, Calvin Plett
2006 C conf
ISCAS
Travis Lovitt, Calvin Plett, John W. M. Rogers
2006 J jnl
IEEE J. Solid State Circuits
Saied Hemati, Amir H. Banihashemi, Calvin Plett
2006 J jnl
EURASIP J. Wirel. Commun. Netw.
John W. M. Rogers, Foster F. Dai, Calvin Plett, Mark S. Cavin
2006 conf
CCECE
Atef Shamim, Peter H. R. Popplewell, Victor Karam, Langis Roy, John W. M. Rogers, Calvin Plett
2006 J jnl
EURASIP J. Wirel. Commun. Netw.
John Danson, Calvin Plett, Niall Tait
2005 conf
ESSCIRC
Justin P. Abbott, Calvin Plett, John W. M. Rogers
2005 conf
CICC
Justin P. Abbott, Calvin Plett, John W. M. Rogers
2005 B conf
ISIT
Saied Hemati, Amir H. Banihashemi, Calvin Plett
2005 conf
ISCAS (3)
Justin P. Abbott, Calvin Plett, John W. M. Rogers
2005 conf
CICC
Saied Hemati, Amir H. Banihashemi, Calvin Plett
2005 conf
CICC
John Danson, Calvin Plett, Niall Tait
2005 J jnl
IEEE J. Solid State Circuits
Rony E. Amaya, Peter H. R. Popplewell, Mark Cloutier, Calvin Plett
2005 J jnl
IEEE Trans. Very Large Scale Integr. Syst.
Fred Ma, John P. Knight, Calvin Plett
2004 conf
ISCAS (4)
Paul W. M. Laferriere, Dave Rahn, Calvin Plett, John W. M. Rogers
2004 J jnl
IEEE J. Solid State Circuits
Neric H. W. Fong, Jonghae Kim, Jean-Olivier Plouchart, Noah Zamdmer, Duixian Liu, Lawrence F. Wagner, Calvin Plett, Garry Tarr
2004 conf
CICC
Rony E. Amaya, Peter H. R. Popplewell, Mark Cloutier, Calvin Plett
2004 conf
ISCAS (4)
Rony E. Amaya, Jorge Aguirre, Calvin Plett
2004 conf
ERSA
Fred Ma, John P. Knight, Calvin Plett
2004 J jnl
IEEE Trans. Circuits Syst. I Regul. Pap.
Bill Toole, Calvin Plett, Mark Cloutier
2003 J jnl
IEEE J. Solid State Circuits
John W. M. Rogers, Calvin Plett
2003 J jnl
IEEE J. Solid State Circuits
John W. M. Rogers, David G. Rahn, Calvin Plett
2003 conf
ESSCIRC
Rony E. Amaya, Calvin Plett
2003 J jnl
IEEE J. Solid State Circuits
Neric H. W. Fong, Jean-Olivier Plouchart, Noah Zamdmer, Duixian Liu, Lawrence F. Wagner, Calvin Plett, N. Garry Tarr
2002 conf
CICC
Neric H. W. Fong, Jean-Olivier Plouchart, Noah Zamdmer, Duixian Liu, Lawrence F. Wagner, Calvin Plett, Gerry Tarr
2001 conf
CICC
John W. M. Rogers, Vladislav Levenets, Chris A. Pawlowicz, N. Garry Tarr, Tom J. Smy, Calvin Plett
2001 conf
CICC
Mohsen Moussavi, Ralph Mason, Calvin Plett
2000 C conf
ISCAS
Norm M. Filiol, Tom A. D. Riley, Miles A. Copeland, Calvin Plett
2000 J jnl
IEEE J. Solid State Circuits
John W. M. Rogers, José Macedo, Calvin Plett
1999 conf
ISCAS (2)
Shijun Yang, Ralph Mason, Calvin Plett
1998 J jnl
IEEE J. Solid State Circuits
Norman M. Filiol, Thomas A. D. Riley, Calvin Plett, Miles A. Copeland
1995 C conf
ISCAS
Walt T. Bax, Tom A. D. Riley, Calvin Plett, Miles A. Copeland
1995 C conf
ISCAS
Norman M. Filiol, Calvin Plett, Tom A. D. Riley, Miles A. Copeland
1994 J jnl
J. VLSI Signal Process.
Calvin Plett, Miles A. Copeland
tests/integration/test_base_extractor.py
← Index tests/integration/test_base_extractor.py python
"""
Integration tests for the base Extractor class.
"""
import pytest
import hashlib
import math
from unittest.mock import Mock, patch, MagicMock
from collections import Counter

pytestmark = [pytest.mark.integration]


class TestExtractorStaticMethods:
    """Tests for static methods in Extractor class."""

    def test_process_binary_string_printable(self):
        """Test processing a printable binary string."""
        from redb.extractors.extractor import Extractor

        # Test with printable ASCII characters
        input_bytes = b"Hello World\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "Hello World"

    def test_process_binary_string_non_printable(self):
        """Test processing a string with non-printable characters."""
        from redb.extractors.extractor import Extractor

        # Test with non-printable characters
        input_bytes = b"\x01\x02Hello\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x01" in result
        assert "\\x02" in result
        assert "Hello" in result

    def test_process_binary_string_empty(self):
        """Test processing an empty binary string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"\x00\x00\x00"
        result = Extractor.process_binary_string(input_bytes)
        assert result == ""

    def test_process_binary_string_all_printable(self):
        """Test processing a fully printable string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"TestString123"
        result = Extractor.process_binary_string(input_bytes)
        assert result == "TestString123"

    def test_remove_non_utf8_valid(self):
        """Test removing non-UTF8 characters from valid UTF8 string."""
        from redb.extractors.extractor import Extractor

        input_bytes = b"Hello World"
        result = Extractor.remove_non_utf8(input_bytes)
        assert result == b"Hello World"

    def test_remove_non_utf8_with_invalid(self):
        """Test removing non-UTF8 characters from mixed string."""
        from redb.extractors.extractor import Extractor

        # Mix of valid UTF8 and invalid bytes
        input_bytes = b"Hello\xff\xfeWorld"
        result = Extractor.remove_non_utf8(input_bytes)
        # Should remove the invalid bytes
        assert b"\xff" not in result
        assert b"\xfe" not in result
        assert b"Hello" in result
        assert b"World" in result

    def test_remove_non_utf8_empty(self):
        """Test removing non-UTF8 from empty string."""
        from redb.extractors.extractor import Extractor

        result = Extractor.remove_non_utf8(b"")
        assert result == b""


class TestExtractorEntropyCalculation:
    """Tests for entropy calculation in Extractor class."""

    def test_calculate_entropy_empty_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with empty data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(b"")
            assert result == 0.0

    def test_calculate_entropy_uniform_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with uniform (low entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # All same bytes = 0 entropy
            uniform_data = b"\x00" * 256
            result = extractor.calculate_entropy(uniform_data)
            assert result == 0.0

    def test_calculate_entropy_random_data(self, elf_binary_path, mock_logger, high_entropy_data):
        """Test entropy calculation with random (high entropy) data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(high_entropy_data)
            # Random data should have entropy close to 8 (max for bytes)
            assert result > 7.0

    def test_calculate_entropy_binary_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with binary data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # Two equally distributed values = 1 bit entropy
            binary_data = b"\x00\x01" * 128
            result = extractor.calculate_entropy(binary_data)
            assert abs(result - 1.0) < 0.01

    def test_calculate_entropy_string_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with string data."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            # String with two equally distributed characters
            string_data = "ab" * 100
            result = extractor.calculate_entropy(string_data)
            assert abs(result - 1.0) < 0.01


class TestExtractorInitialization:
    """Tests for Extractor initialization."""

    def test_extractor_hashes_computed_on_init(self, elf_binary_path, mock_logger, known_hashes):
        """Test that hashes are computed during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.md5 == known_hashes['md5']
            assert extractor.sha1 == known_hashes['sha1']
            assert extractor.sha256 == known_hashes['sha256']

    def test_extractor_hash_dataclass_created(self, elf_binary_path, mock_logger, known_hashes):
        """Test that Hash dataclass is created during initialization."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            assert extractor.hash.md5 == known_hashes['md5']
            assert extractor.hash.sha1 == known_hashes['sha1']
            assert extractor.hash.sha256 == known_hashes['sha256']

    def test_extractor_binary_cached_property(self, elf_binary_path, mock_logger, elf_binary_content):
        """Test that binary content is loaded as cached property."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)

            # Access binary property
            binary = extractor.binary
            assert binary == elf_binary_content

            # Second access should return cached value (same id)
            assert extractor.binary is binary

    def test_extractor_with_exporters(self, elf_binary_path, mock_logger, mock_print_exporter):
        """Test extractor initialization with exporters."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            assert len(extractor.exporters) == 1
            assert extractor.exporters[0] is mock_print_exporter

    def test_extractor_with_index_prefix(self, elf_binary_path, mock_logger):
        """Test extractor initialization with custom index prefix."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                index_prefix="custom_prefix"
            )

            assert "custom_prefix" in extractor.elastic_index

    def test_extractor_known_benign_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_benign flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                known_benign=True
            )

            assert extractor.known_benign is True
            assert extractor.known_malicious is False

    def test_extractor_known_malicious_flag(self, elf_binary_path, mock_logger):
        """Test extractor with known_malicious flag."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                known_malicious=True
            )

            assert extractor.known_benign is False
            assert extractor.known_malicious is True


class TestExtractorExportData:
    """Tests for export_data method."""

    def test_export_data_with_print_exporter(self, elf_binary_path, mock_logger, mock_print_exporter, capsys):
        """Test export_data with PrintExporter."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[mock_print_exporter]
            )

            result = extractor.export_data()
            # Should succeed with PrintExporter
            assert result is True

    def test_export_data_no_exporters(self, elf_binary_path, mock_logger):
        """Test export_data with no exporters configured."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(
                elf_binary_path,
                mock_logger,
                exporters=[]
            )

            result = extractor.export_data()
            # Should succeed with no exporters (nothing to export)
            assert result is True


class TestExtractorEdgeCases:
    """Tests for edge cases in Extractor class."""

    def test_extractor_with_nonexistent_file(self, mock_logger):
        """Test extractor with non-existent file."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            with pytest.raises(FileNotFoundError):
                BasicPropertiesExtractor("/nonexistent/file.bin", mock_logger)

    def test_entropy_none_data(self, elf_binary_path, mock_logger):
        """Test entropy calculation with None returns 0."""
        from redb.extractors.basicproperties import BasicPropertiesExtractor

        with patch('redb.settings.ELASTIC_BINARIES_COLLECTION', 'test'):
            extractor = BasicPropertiesExtractor(elf_binary_path, mock_logger)
            result = extractor.calculate_entropy(None)
            assert result == 0.0

    def test_process_binary_string_high_bytes(self):
        """Test processing binary string with high byte values."""
        from redb.extractors.extractor import Extractor

        # Characters above 126 are non-printable
        input_bytes = b"\x7f\x80\x81\xff"
        result = Extractor.process_binary_string(input_bytes)
        assert "\\x7f" in result
        assert "\\x80" in result
        assert "\\xff" in result