Compare commits

...

107 commits

Author SHA1 Message Date
Cédric Bonhomme
bd3238acfa
chg: [dependencies] Updated dependencies.
Some checks failed
Python application / build (3.10) (push) Has been cancelled
Python application / build (3.11) (push) Has been cancelled
Python application / build (3.12) (push) Has been cancelled
2025-05-16 11:53:20 +02:00
Cédric Bonhomme
eb28c60d27
chg: [RELEASE] Bumped version number, improved packaging for the command line.
Some checks failed
Python application / build (3.10) (push) Has been cancelled
Python application / build (3.11) (push) Has been cancelled
Python application / build (3.12) (push) Has been cancelled
2025-05-03 23:15:52 +02:00
Cédric Bonhomme
7ba387ecdc
chg: [RELEASE] Updated documentation, updated dependencies, and bumped version number.
Some checks failed
Python application / build (3.10) (push) Has been cancelled
Python application / build (3.11) (push) Has been cancelled
Python application / build (3.12) (push) Has been cancelled
2025-04-26 23:28:17 +02:00
Cédric Bonhomme
ac66655ad8
chg: [dependencies] Updated dependencies.
Some checks failed
Python application / build (3.10) (push) Has been cancelled
Python application / build (3.11) (push) Has been cancelled
Python application / build (3.12) (push) Has been cancelled
2025-03-14 06:59:13 +01:00
Cédric Bonhomme
2e8b0fdec9
chg: [RELEASE] Bumped version number and aligned pyproject.toml file with standard specification.
Some checks failed
Python application / build (3.10) (push) Has been cancelled
Python application / build (3.11) (push) Has been cancelled
Python application / build (3.12) (push) Has been cancelled
2025-02-13 18:14:40 +01:00
Cédric Bonhomme
7849955cdb
chg: Updated pyproject.toml and dependencies.
Some checks failed
Python application / build (3.10) (push) Has been cancelled
Python application / build (3.11) (push) Has been cancelled
Python application / build (3.12) (push) Has been cancelled
2025-02-05 09:33:44 +01:00
Cédric Bonhomme
d6015157bf
chg: [packaging] Minor changes in the pryproject.toml file.
Some checks failed
Python application / build (3.10) (push) Has been cancelled
Python application / build (3.11) (push) Has been cancelled
Python application / build (3.12) (push) Has been cancelled
2025-01-30 14:55:46 +01:00
Cédric Bonhomme
43f02702f9
chg: Updated pyproject.toml for Poetry 2.0.
Some checks are pending
Python application / build (3.10) (push) Waiting to run
Python application / build (3.11) (push) Waiting to run
Python application / build (3.12) (push) Waiting to run
2025-01-30 08:02:09 +01:00
Cédric Bonhomme
9c69075d34
chg: [dependencies] Updated dependencies.
Some checks failed
Python application / build (3.10) (push) Has been cancelled
Python application / build (3.11) (push) Has been cancelled
Python application / build (3.12) (push) Has been cancelled
2025-01-03 13:18:47 +01:00
Cédric Bonhomme
10256ba28b
chg: Updated copyright years. 2025-01-03 13:17:58 +01:00
Cédric Bonhomme
70572bf047
chg: [dependencies] Updated dependencies.
Some checks failed
Python application / build (3.10) (push) Has been cancelled
Python application / build (3.11) (push) Has been cancelled
Python application / build (3.12) (push) Has been cancelled
2024-12-28 00:29:45 +01:00
Cédric Bonhomme
8ebd760f7e
chg: Updated README.
Some checks failed
Python application / build (3.10) (push) Has been cancelled
Python application / build (3.11) (push) Has been cancelled
Python application / build (3.12) (push) Has been cancelled
2024-10-05 16:47:41 +02:00
Cédric Bonhomme
0d0d328230
chg: Updated README.
Some checks are pending
Python application / build (3.10) (push) Waiting to run
Python application / build (3.11) (push) Waiting to run
Python application / build (3.12) (push) Waiting to run
2024-10-04 23:44:57 +02:00
Cédric Bonhomme
5a6e08232f
chg: [release] Bumped release number. 2024-09-07 23:55:55 +02:00
Cédric Bonhomme
6fac279580
chg: [dependencies] Updated dependencies. 2024-09-07 23:54:15 +02:00
Cédric Bonhomme
a6140fef36
chg: [lsb] Added a parameter, close_file, to lsb.reveal in order to specify if the file must be closed at the end of the processing. 2024-09-07 23:51:47 +02:00
Cédric Bonhomme
80d7e6c88a
chg: [dependencies] Updated dependencies. 2024-08-08 09:43:38 +02:00
Cédric Bonhomme
d078b7a734
chg: [dependencies] Updated dependencies. 2024-08-08 09:42:44 +02:00
Cédric Bonhomme
b4114bca00
Merge pull request #50 from cedricbonhomme/dependabot/pip/setuptools-70.0.0
build(deps-dev): bump setuptools from 69.5.1 to 70.0.0
2024-07-16 11:36:53 +02:00
dependabot[bot]
ada72ecb47
build(deps-dev): bump setuptools from 69.5.1 to 70.0.0
Bumps [setuptools](https://github.com/pypa/setuptools) from 69.5.1 to 70.0.0.
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v69.5.1...v70.0.0)

---
updated-dependencies:
- dependency-name: setuptools
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-15 19:34:32 +00:00
Cédric Bonhomme
d8685270ff
Merge pull request #49 from cedricbonhomme/dependabot/pip/certifi-2024.7.4
build(deps-dev): bump certifi from 2024.2.2 to 2024.7.4
2024-07-08 07:07:24 +02:00
dependabot[bot]
924d8e4979
build(deps-dev): bump certifi from 2024.2.2 to 2024.7.4
Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.2.2 to 2024.7.4.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.02.02...2024.07.04)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-07-06 01:46:39 +00:00
Cédric Bonhomme
40c0e83c88
Merge pull request #47 from cedricbonhomme/dependabot/pip/urllib3-2.2.2
build(deps-dev): bump urllib3 from 2.2.1 to 2.2.2
2024-06-18 07:06:37 +02:00
dependabot[bot]
20bb3dc6fc
build(deps-dev): bump urllib3 from 2.2.1 to 2.2.2
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.2.1 to 2.2.2.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/2.2.1...2.2.2)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-17 23:07:27 +00:00
Cédric Bonhomme
68b56779b1
Merge pull request #46 from cedricbonhomme/dependabot/pip/requests-2.32.0
build(deps-dev): bump requests from 2.31.0 to 2.32.0
2024-05-21 07:28:03 +02:00
dependabot[bot]
e41c5b7cb0
---
updated-dependencies:
- dependency-name: requests
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-21 05:26:24 +00:00
Cédric Bonhomme
00415e364d
chg: [dependencies] Updated Python dependencies. 2024-05-17 15:55:19 +02:00
Cédric Bonhomme
bd1a82f397
Merge pull request #45 from cedricbonhomme/dependabot/pip/jinja2-3.1.4
build(deps-dev): bump jinja2 from 3.1.3 to 3.1.4
2024-05-07 07:26:15 +02:00
dependabot[bot]
dfce98008c
build(deps-dev): bump jinja2 from 3.1.3 to 3.1.4
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.3...3.1.4)

---
updated-dependencies:
- dependency-name: jinja2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-06 20:44:24 +00:00
Cédric Bonhomme
e0360062b5
chg: [dependencies] Updated dependencies. 2024-04-14 22:09:22 +02:00
Cédric Bonhomme
a660ff8628
Merge pull request #44 from cedricbonhomme/dependabot/pip/idna-3.7
build(deps-dev): bump idna from 3.6 to 3.7
2024-04-12 22:55:11 +02:00
dependabot[bot]
53d897b808
build(deps-dev): bump idna from 3.6 to 3.7
Bumps [idna](https://github.com/kjd/idna) from 3.6 to 3.7.
- [Release notes](https://github.com/kjd/idna/releases)
- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst)
- [Commits](https://github.com/kjd/idna/compare/v3.6...v3.7)

---
updated-dependencies:
- dependency-name: idna
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-12 04:23:27 +00:00
Cédric Bonhomme
fd2a784df3
Merge pull request #43 from cedricbonhomme/dependabot/pip/pillow-10.3.0
build(deps): bump pillow from 10.2.0 to 10.3.0
2024-04-04 07:21:18 +02:00
dependabot[bot]
136ce42ae9
build(deps): bump pillow from 10.2.0 to 10.3.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.2.0 to 10.3.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/10.2.0...10.3.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-03 16:04:32 +00:00
Cédric Bonhomme
c66a54875c
chg: [dependencies] Updated dependencies. 2024-03-24 11:37:33 +01:00
Cédric Bonhomme
b1133d8e35
chg: [pre-commit] Removed useless django-upgrade hook. 2024-03-12 08:22:40 +01:00
Cédric Bonhomme
a78c520058
Updated README. 2024-03-02 14:27:08 +01:00
Cédric Bonhomme
b592ce4bcb
chg: Updated repository default URL. 2024-03-01 10:14:10 +01:00
Cédric Bonhomme
0054c89b7d
chg: [dependencies] Fixed conflict. 2024-01-21 21:48:19 +01:00
Cédric Bonhomme
ab046d24f2
chg: [dependencies] Updated dependencies. 2024-01-21 21:27:50 +01:00
Cédric Bonhomme
1de253dd0a
Merge pull request #40 from cedricbonhomme/dependabot/pip/jinja2-3.1.3
build(deps-dev): bump jinja2 from 3.1.2 to 3.1.3
2024-01-11 22:23:44 +00:00
dependabot[bot]
a70b552cb8
build(deps-dev): bump jinja2 from 3.1.2 to 3.1.3
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3.
- [Release notes](https://github.com/pallets/jinja/releases)
- [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3)

---
updated-dependencies:
- dependency-name: jinja2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-11 19:48:14 +00:00
Cédric Bonhomme
eae8ab29fc
Removed support of Python 3.9. 2024-01-04 02:22:33 +01:00
Cédric Bonhomme
0d20be7d82
chg: [sourcehut] Restored export of PATH. 2024-01-04 02:16:19 +01:00
Cédric Bonhomme
33c9cd55b1
chg: [sourcehut] Removed useless export of PATH. 2024-01-04 02:13:24 +01:00
Cédric Bonhomme
d02f8b8b14
install pipx from Debian packages. 2024-01-04 02:09:39 +01:00
Cédric Bonhomme
d0ca9322cc
install poetry with pipx. 2024-01-04 02:06:32 +01:00
Cédric Bonhomme
91fef6a178
chg: [sourcehut] Updated debian image to bookworm. 2024-01-04 02:00:18 +01:00
Cédric Bonhomme
178347f61f
chg: [GitHub workflox] Added Python 3.10 and 3.11. 2024-01-04 01:51:44 +01:00
Cédric Bonhomme
ed66aaa159
chg: [GitHub workflox] Removed Python 3.9. 2024-01-04 01:48:24 +01:00
Cédric Bonhomme
1293a3575b
chg: [GitHub workflox] Updated Python versions in the matrix strategy. 2024-01-02 23:48:04 +01:00
Cédric Bonhomme
1ef59ac80b
chg: [dependencies] Updated Numpy and Pillow. 2024-01-02 23:30:57 +01:00
Cédric Bonhomme
0ca92d1d3a
Exclude the directory tests from the pre-commit hook end-of-line-fixer. 2024-01-02 23:26:00 +01:00
Cédric Bonhomme
46da77ef1c
chg: [release] Bumped release number. 2024-01-02 10:12:21 +01:00
Cédric Bonhomme
5c94a790bc
Fixed mypy issue. 2024-01-02 10:06:04 +01:00
Cédric Bonhomme
220501adbc
Updated version of flake8. 2024-01-01 20:40:49 +01:00
Cédric Bonhomme
e253929ad6
Updated dependencies. 2024-01-01 20:32:36 +01:00
Cédric Bonhomme
d863dbfddb
Updated copyright years. 2024-01-01 20:32:02 +01:00
Cédric Bonhomme
0f550178ff
Moved the requirements file dedicated to the documentation. 2023-12-31 00:45:28 +01:00
Cédric Bonhomme
a3dd6be618
Dropped Python 3.8 support. 2023-12-31 00:38:32 +01:00
Cédric Bonhomme
29322e759a
Ensures compability with Python 3.12. 2023-12-31 00:28:36 +01:00
Cédric Bonhomme
c6437af0d1
chg: [dependencies] Updated Python dependencies. 2023-11-21 22:48:09 +01:00
Cédric Bonhomme
25447f88e9 Merge branch 'master' of github.com:cedricbonhomme/Stegano 2023-10-23 07:27:33 +02:00
Cédric Bonhomme
ad916563da
chg: [dependencies] Updated dependencies. 2023-10-23 07:27:02 +02:00
Cédric Bonhomme
88ce965e7c
Merge pull request #38 from cedricbonhomme/dependabot/pip/urllib3-2.0.7
build(deps-dev): bump urllib3 from 2.0.6 to 2.0.7
2023-10-17 21:15:13 +00:00
dependabot[bot]
25a7105487
build(deps-dev): bump urllib3 from 2.0.6 to 2.0.7
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.6 to 2.0.7.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/2.0.6...2.0.7)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-17 21:02:56 +00:00
Cédric Bonhomme
29d427afef Merge branch 'master' of github.com:cedricbonhomme/Stegano 2023-10-17 09:36:09 +02:00
Cédric Bonhomme
7434ed9a1e
Updated opencv-python. 2023-10-17 09:35:08 +02:00
Cédric Bonhomme
e3c1312d14
Merge pull request #37 from cedricbonhomme/dependabot/pip/pillow-10.0.1
build(deps): bump pillow from 9.5.0 to 10.0.1
2023-10-04 05:54:43 +00:00
dependabot[bot]
166d9d1291
build(deps): bump pillow from 9.5.0 to 10.0.1
Bumps [pillow](https://github.com/python-pillow/Pillow) from 9.5.0 to 10.0.1.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/9.5.0...10.0.1)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-04 01:32:15 +00:00
Cédric Bonhomme
556473c81d
Merge pull request #36 from cedricbonhomme/dependabot/pip/urllib3-2.0.6
build(deps-dev): bump urllib3 from 2.0.4 to 2.0.6
2023-10-03 00:31:42 +00:00
dependabot[bot]
84b1855130
build(deps-dev): bump urllib3 from 2.0.4 to 2.0.6
Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.4 to 2.0.6.
- [Release notes](https://github.com/urllib3/urllib3/releases)
- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)
- [Commits](https://github.com/urllib3/urllib3/compare/2.0.4...2.0.6)

---
updated-dependencies:
- dependency-name: urllib3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-03 00:00:24 +00:00
Cédric Bonhomme
11348dda9a
Updated dependencies. 2023-09-10 23:56:36 +02:00
Cédric Bonhomme
c2168422df
Updated numpy and opencv. 2023-08-13 09:23:29 +02:00
Cédric Bonhomme
bd2835d7d0
Added new Read the Docs configuration file. 2023-08-10 09:52:22 +02:00
Cédric Bonhomme
116e011d37
Updated certifi. 2023-07-28 23:53:59 +02:00
Cédric Bonhomme
84a34d0bfa
Updated urllib3 dependency. 2023-07-20 00:42:12 +02:00
Cédric Bonhomme
8c14555adb
chg: [dependencies] updated dependencies. 2023-07-12 15:08:00 +02:00
Cédric Bonhomme
e33bebad46
chg: [dependencies] Updated Python dependencies. 2023-07-01 00:54:34 +02:00
Cédric Bonhomme
2a3b92e62a
chg: [dependencies] Updated Python dependencies. 2023-06-25 22:01:13 +02:00
Cédric Bonhomme
0537c13a08
Updated CHANGELOG. 2023-05-23 10:04:06 +02:00
Cédric Bonhomme
e490e32791
chg: [security] fix CVE-2023-32681 (GHSA-j8r2-6x86-q33q). 2023-05-23 07:29:49 +02:00
Cédric Bonhomme
91789f065e
chg: [dependencies] Updated Python dependencies. 2023-05-21 11:17:02 +02:00
Cédric Bonhomme
bc9b91e983
chg: [type] Changed the way variables in some funtions are typed. 2023-05-21 10:30:11 +02:00
Cédric Bonhomme
c12b371e7d
chg: [type] Changed the way the dict in erotosthenes funtion is typed. 2023-05-21 10:26:33 +02:00
Cédric Bonhomme
3fd55e2e79
fix: [type] Removed the return type of the function n_at_a_time. 2023-05-21 10:21:48 +02:00
Cédric Bonhomme
7abce7d5d9
fixed few mypy related issues. 2023-04-26 14:17:49 +02:00
Cédric Bonhomme
6d87ba2921
chg: [dependencies] Updated Python dependencies. 2023-04-26 13:58:40 +02:00
Cédric Bonhomme
eb639510ce
Updated dependencies and README. 2023-03-29 08:22:29 +02:00
Cédric Bonhomme
d10805427a
Fixed conflicts. 2023-03-15 07:55:28 +01:00
Cédric Bonhomme
bfc5d332be
Updated opencv-python dependency. 2023-03-15 07:54:39 +01:00
Cédric Bonhomme
e2fe642e3d
chg: [dependencies] Fixed conflict in poetry.lock 2023-02-25 10:29:14 +01:00
Cédric Bonhomme
92d3e0697d
chg: [dependencies] Updated dependencies. 2023-02-25 10:28:12 +01:00
Cédric Bonhomme
4575319307
added .pre-commit-config.yaml file. 2023-01-16 15:13:17 +01:00
Cédric Bonhomme
0080ec06f7
upgraded pyproject.toml file 2023-01-16 15:12:01 +01:00
Cédric Bonhomme
d6a18a71e4
fix: [numpy] is a deprecated alias for . (Deprecated NumPy 1.24) 2023-01-09 13:46:51 +01:00
Cédric Bonhomme
fa741328f3
chg: [security] Updated certifi. 2023-01-09 09:42:01 +01:00
Cédric Bonhomme
2abe01660d
chg: [dependencies] Updated various Python dependencies. 2023-01-01 19:51:47 +01:00
Cédric Bonhomme
3dd5dd2be3
chg: [security] GHSA-43fp-rhv2-5gv8 Upgraded certifi (2022.9.24 => 2022.12.7). 2022-12-09 09:54:07 +01:00
Cédric Bonhomme
857d311a79
chg: [workflows] Updated python version in matrix workflow strategy. 2022-12-02 21:13:34 +01:00
Cédric Bonhomme
0daa5208c7
chg: [workflows] Updated python version in matrix workflow strategy. 2022-12-02 21:07:37 +01:00
Cédric Bonhomme
ea2f1a6eda
chg: [workflows] Updated python version in matrix workflow strategy. 2022-12-02 21:01:45 +01:00
Cédric Bonhomme
03ebf467a2
chg: [workflows] Updated python version in matrix workflow strategy. 2022-12-02 21:00:11 +01:00
Cédric Bonhomme
7f9c34c6da
chg: [workflows] Updated python version in matrix workflow strategy. 2022-12-02 20:58:49 +01:00
Cédric Bonhomme
dd16c1cb61
chg: [workflows] Updated python version in matrix workflow strategy. 2022-12-02 20:56:12 +01:00
Cédric Bonhomme
257fa03c9f
chg: [dependencies] Updated numpy and other dependencies. 2022-12-02 20:45:22 +01:00
Cédric Bonhomme
e68404176a
chg: [workflows] Updated build workflows. 2022-11-20 21:57:39 +01:00
39 changed files with 1219 additions and 899 deletions

View file

@ -1,42 +0,0 @@
image: debian/bullseye
sources:
- https://git.sr.ht/~cedric/stegano
packages:
- python3
- python3-dev
- python3-pip
- python3-setuptools
- python3-venv
- rustc
- cargo
- libffi-dev
- libssl-dev
- libjpeg-dev
- libpng-dev
- libfreetype6-dev
- ffmpeg
- libsm6
- libxext6
environment:
project: stegano
tasks:
- dependencies: |
pip3 install --user poetry
export PATH="$PATH:/home/build/.local/bin"
cd ${project}
poetry install
- lint: |
export PATH="$PATH:/home/build/.local/bin"
cd ${project}
# stop the build if there are Python syntax errors or undefined names
poetry run flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings.
poetry run flake8 . --count --max-complexity=10 --max-line-length=127 --statistics
- test: |
export PATH="$PATH:/home/build/.local/bin"
cd ${project}
poetry run nose2 -v --pretty-assert
- typecheck: |
export PATH="$PATH:/home/build/.local/bin"
cd ${project}
poetry run mypy .

View file

@ -9,7 +9,7 @@ jobs:
strategy:
matrix:
python-version: [3.8, 3.9, 3.10.2]
python-version: ["3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v1
@ -22,14 +22,14 @@ jobs:
- name: Install dependencies
run: |
pip install poetry
poetry install
poetry install --with dev
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
poetry run flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
poetry run flake8 stegano --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
poetry run flake8 . --count --max-complexity=15 --max-line-length=127 --statistics
poetry run flake8 stegano --count --max-complexity=15 --max-line-length=127 --statistics
- name: Test with pytest
run: |
@ -37,6 +37,6 @@ jobs:
env:
testing: actions
- name: Type check with mypy
run: |
poetry run mypy .
# - name: Type check with mypy
# run: |
# poetry run mypy .

27
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,27 @@
on:
release:
types:
- published
name: release
jobs:
pypi-publish:
name: Upload release to PyPI
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/Stegano
permissions:
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Poetry
run: python -m pip install --upgrade pip poetry
- name: Build artifacts
run: poetry build
- name: Publish package distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1

36
.pre-commit-config.yaml Normal file
View file

@ -0,0 +1,36 @@
ci:
autoupdate_schedule: monthly
repos:
- repo: https://github.com/asottile/pyupgrade
rev: v3.3.1
hooks:
- id: pyupgrade
args: ["--py37-plus"]
- repo: https://github.com/PyCQA/isort
rev: 5.12.0
hooks:
- id: isort
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black
- repo: https://github.com/PyCQA/flake8
rev: 6.1.0
hooks:
- id: flake8
additional_dependencies:
- flake8-bugbear
- flake8-implicit-str-concat
args: ["--max-line-length=125"]
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.1.0
hooks:
- id: fix-byte-order-marker
- id: trailing-whitespace
exclude: .md
- id: end-of-file-fixer
exclude: tests/.*
- repo: https://github.com/pypa/pip-audit
rev: v2.7.3
hooks:
- id: pip-audit

22
.readthedocs.yaml Normal file
View file

@ -0,0 +1,22 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Set the version of Python and other tools you might need
build:
os: ubuntu-22.04
tools:
python: "3.11"
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: docs/conf.py
# We recommend specifying your dependencies to enable reproducible builds:
# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
python:
install:
- requirements: docs/requirements.txt

View file

@ -1,216 +1,251 @@
## Release History
### 1.0.1 (2025-05-03)
- Improved the packaging configuration for the command line (stegano.console).
### 1.0.0 (2025-04-26)
- Updated dependencies.
- Improved the packaging configuration.
- Fixed typing errors.
### 0.11.5 (2025-02-13)
- Updated dependencies.
- Aligned pyproject.toml with the standard specification.
- Publishing to PyPI using a Trusted Publisher.
### 0.11.4 (2024-09-07)
- Added a parameter, close_file, to lsb.reveal in order to
specify if the file must be closed at the end of the processing.
### 0.11.3 (2024-01-02)
- Stegano now supports Python 3.12. Support of Python 3.8 has been removed.
### 0.11.2 (2023-05-23)
- improved typing of various functions;
- updated dependencies.
### 0.11.1 (2022-11-20)
* Fixed a bug in the command line when no sub-command is specified.
- Fixed a bug in the command line when no sub-command is specified.
### 0.11.0 (2022-11-20)
* Reduced memory footprint and processing speed,
- Reduced memory footprint and processing speed,
the modules ``lsb`` and ``lsbset`` have been merged
([PR #34](https://github.com/cedricbonhomme/Stegano/pull/34)).
### 0.10.2 (2022-01-13)
* Stegano now uses Pillow 9.0.0 (CVE-2022-22815).
- Stegano now uses Pillow 9.0.0 (CVE-2022-22815).
### 0.10.1 (2021-11-30)
* Stegano now uses OpenCV Python 4.5.4 abd Numpy 1.21.4.
- Stegano now uses OpenCV Python 4.5.4 abd Numpy 1.21.4.
### 0.10.0 (2021-11-29)
* new: Implemented Shi-Tomashi corner generator
- new: Implemented Shi-Tomashi corner generator
([PR #32](https://github.com/cedricbonhomme/Stegano/pull/32)).
Implemented by thundersparkf (see CONTRIBUTORS.md file).
### 0.9.9 (2021-07-02)
* Stegano now uses Pillow 8.3.0.
- Stegano now uses Pillow 8.3.0.
### 0.9.8 (2019-12-20)
* Stegano is now using poetry;
* minor improvements to the command line.
- Stegano is now using poetry;
- minor improvements to the command line.
### 0.9.7 (2019-10-27)
* fixed markdown of the previous release.
- fixed markdown of the previous release.
### 0.9.6 (2019-10-27)
* fixed markdown of the previous release;
- fixed markdown of the previous release;
### 0.9.5 (2019-10-27)
* updated dependencies;
* home page of the project is now: https://git.sr.ht/~cedric/Stegano
- updated dependencies;
- home page of the project is now: https://github.com/cedricbonhomme/Stegano
### 0.9.4 (2019-06-05)
* new: Implemented LFSR generator (with tests and CLI)
- new: Implemented LFSR generator (with tests and CLI)
([PR #27](https://github.com/cedricbonhomme/Stegano/pull/27))
* new: Implemented Ackermann generators CLI interface
- new: Implemented Ackermann generators CLI interface
([PR #26](https://github.com/cedricbonhomme/Stegano/pull/26))
* new: The Ackermann functions are not actual generators
- new: The Ackermann functions are not actual generators
([#24](https://github.com/cedricbonhomme/Stegano/issues/24))
* new: add a shift parameter for the lsbmodule
- new: add a shift parameter for the lsbmodule
([#25](https://github.com/cedricbonhomme/Stegano/issues/25))
* fix: lsbset.hide cause .png transparent area lost
- fix: lsbset.hide cause .png transparent area lost
([#23](https://github.com/cedricbonhomme/Stegano/issues/23))
### 0.9.3 (2019-04-10)
* it is now possible to either pass the location of an image or directly pass
- it is now possible to either pass the location of an image or directly pass
an already opened Image.Image to the hide and reveal methods;
* code re-formatted a bit with black.
- code re-formatted a bit with black.
### 0.9.2 (2019-04-04)
* updated Pillow dependency to version 6.0.0 in order to fix a bug when opening
- updated Pillow dependency to version 6.0.0 in order to fix a bug when opening
some PNG files (https://github.com/python-pillow/Pillow/issues/3557).
### 0.9.1 (2019-03-06)
* updated Pillow dependency in order to fix a bug when opening some PNG files.
- updated Pillow dependency in order to fix a bug when opening some PNG files.
### 0.9.0 (2018-12-18)
* added the possibility to shift the encoded bits when using the lsbset module.
- added the possibility to shift the encoded bits when using the lsbset module.
### 0.8.6 (2018-11-05)
* fixed a potential security issue related to CVE-2018-18074.
- fixed a potential security issue related to CVE-2018-18074.
### 0.8.5 (2018-04-18)
* Fixed an encoding problem which occured on Windows during the installation
- Fixed an encoding problem which occured on Windows during the installation
of the module.
### 0.8.4 (2018-02-28)
* Stegano is ready for use with pipenv and pipsi.
- Stegano is ready for use with pipenv and pipsi.
### 0.8.3 (2018-02-23)
* the recommended way to install Stegano is now to use pipenv.
- the recommended way to install Stegano is now to use pipenv.
### 0.8.2 (2017-12-20)
* Fixed a bug with the new 'encoding' function when using Stegano as a command
- Fixed a bug with the new 'encoding' function when using Stegano as a command
line tool. No default value was set. Default value is UTF-8.
### 0.8.1 (2017-05-16)
* it is now possible to specify the encoding (UTF-8 or UTF-32LE) of the message
- it is now possible to specify the encoding (UTF-8 or UTF-32LE) of the message
to hide/reveal through the command line;
* the help of the command line now displays the available choices for the
- the help of the command line now displays the available choices for the
arguments, if it is necessary (list of available encodings, list of available
generators);
* tests expected results lies now in a dedicated folder;
* a script has been added in order to get proper exit code check for mypy.
- tests expected results lies now in a dedicated folder;
- a script has been added in order to get proper exit code check for mypy.
### 0.8 (2017-05-06)
* updated command line. All commands are now prefixed with *stegano-*;
* improved type hints;
* it is possible to load and save images from and to file objects (BytesIO);
* improved checks when revealing a message with the lsbset module fails.
- updated command line. All commands are now prefixed with *stegano-*;
- improved type hints;
- it is possible to load and save images from and to file objects (BytesIO);
- improved checks when revealing a message with the lsbset module fails.
### 0.7.1 (2017-05-05)
* improved generators for the lsb-set module;
* improved tests for the generators;
* improved type hints.
- improved generators for the lsb-set module;
- improved tests for the generators;
- improved type hints.
### 0.7 (2017-05-04)
* unicode is now supported. By default UTF-8 encoding is used. UTF-32LE can also
- unicode is now supported. By default UTF-8 encoding is used. UTF-32LE can also
be used to hide non-ASCII characters. UTF-8 (8 bits) is the default choice
since it is possible to hide longer messages with it.
* improved checks with type hints.
- improved checks with type hints.
### 0.6.9 (2017-03-10)
* introduces some type hints (PEP 484);
* more tests for the generators and for the tools module;
* updated descriptions of generators;
* fixed a bug with a generator that has been previously renamed.
- introduces some type hints (PEP 484);
- more tests for the generators and for the tools module;
- updated descriptions of generators;
- fixed a bug with a generator that has been previously renamed.
### 0.6.8 (2017-03-08)
* bugfix: fixed #12: Error when revealing a hidden binary file in an image.
- bugfix: fixed #12: Error when revealing a hidden binary file in an image.
### 0.6.7 (2017-02-21)
* bugfix: added missing dependency in the setup.py file.
- bugfix: added missing dependency in the setup.py file.
### 0.6.6 (2017-02-20)
* improved docstrings for the desciption of the generators;
* improved the command which displays the list of generators.
- improved docstrings for the desciption of the generators;
- improved the command which displays the list of generators.
### 0.6.5 (2017-02-16)
* added a command to list all available generators for the lsb-set module;
* test when the data image is coming via byte stream, for the lsb module.
- added a command to list all available generators for the lsb-set module;
- test when the data image is coming via byte stream, for the lsb module.
### 0.6.4 (2017-02-06)
* a command line for the 'red' module has been added;
* bugfix: fixed a bug in the lsb-set command line when the generator wasn't
- a command line for the 'red' module has been added;
- bugfix: fixed a bug in the lsb-set command line when the generator wasn't
specified by the user.
### 0.6.3 (2017-01-29)
* Support for transparent PNG images has been added (lsb and lsbset modules).
- Support for transparent PNG images has been added (lsb and lsbset modules).
### 0.6.2 (2017-01-19)
* bugfix: solved a bug when the image data is coming via byte streams (ByteIO),
- bugfix: solved a bug when the image data is coming via byte streams (ByteIO),
for the exifHeader hiding method.
### 0.6.1 (2016-08-25)
* reorganization of the steganalysis sub-module.
- reorganization of the steganalysis sub-module.
### 0.6 (2016-08-04)
* improvements of the command line of Stéganô. The use of Stéganô through the
- improvements of the command line of Stéganô. The use of Stéganô through the
command line has slightly changed ('hide' and 'reveal' are now sub-parameters
of the command line). No changes if you use Stéganô as a module in your
software. The documentation has been updated accordingly.
@ -218,66 +253,66 @@
### 0.5.5 (2016-08-03)
* bugfix: Incorrect padding size in `base642string` in tools.base642binary().
- bugfix: Incorrect padding size in `base642string` in tools.base642binary().
### 0.5.4 (2016-05-22)
* the generator provided to the functions lsbset.hide() and lsbset.reveal() is
- the generator provided to the functions lsbset.hide() and lsbset.reveal() is
now a function. This is more convenient for a user who wants to use a custom
generator (not in the module lsbset.generators).
* performance improvements for the lsb and lsbset modules.
- performance improvements for the lsb and lsbset modules.
### 0.5.3 (2016-05-19)
* reorganization of all modules. No impact for the users of Stegano.
- reorganization of all modules. No impact for the users of Stegano.
### 0.5.2 (2016-05-18)
* improvements and bug fixes for the exifHeader module;
* added unit tests for the exifHeader module;
* improvements of the documentation.
- improvements and bug fixes for the exifHeader module;
- added unit tests for the exifHeader module;
- improvements of the documentation.
### 0.5.1 (2016-04-16)
* minor improvements and bug fixes;
* added unit tests for the slsb and slsbset modules.
- minor improvements and bug fixes;
- added unit tests for the slsb and slsbset modules.
### 0.5 (2016-03-18)
* management of greyscale images.
- management of greyscale images.
### 0.4.6 (2016-03-12)
* bugfix when the length of the message to hide is not divisible by 3,
- bugfix when the length of the message to hide is not divisible by 3,
for the slsb and slsbset module.
### 0.4.5 (2015-12-23)
* bugfix.
- bugfix.
### 0.4.4 (2015-12-23)
* new project home page;
* minor updated to the documentation.
- new project home page;
- minor updated to the documentation.
### 0.4.3 (2015-10-06)
* bug fixes for Python 3;
* bug fixes in the scripts in *./bin*.
- bug fixes for Python 3;
- bug fixes in the scripts in *./bin*.
### 0.4.2 (2015-10-05)
* first stable release on PypI.
- first stable release on PypI.
### 0.4 (2012-01-02)
@ -291,16 +326,16 @@ Python codes as a Python module or as a program in your scripts.
### 0.3 (2011-04-15)
* you can now use Stéganô as a library in your Python program;
- you can now use Stéganô as a library in your Python program;
(python setup.py install) or as a 'program' thanks to the scripts provided
in the bin directory;
* new documentation (reStructuredText) comes with Stéganô.
- new documentation (reStructuredText) comes with Stéganô.
### 0.2 (2011-03-24)
* this release introduces some bugfixes and a major speed improvement of the
- this release introduces some bugfixes and a major speed improvement of the
*reveal* function for the LSB method. Moreover it is now possible to hide a
binary file (ogg, executable, etc.);
* a new technique for hiding/revealing a message in a JPEG picture by using the
- a new technique for hiding/revealing a message in a JPEG picture by using the
description field of the image is provided.

View file

@ -16,5 +16,6 @@
- panni <panni@fragstore.net>
- Peter Justin <peter@peterjustin.me>
- thundersparkf - https://github.com/thundersparkf
- Mickaël Schoentgen <mschoentgen@nuxeo.com>
And thank you to the testers!

View file

@ -1,9 +1,8 @@
# Stegano
[![builds.sr.ht status](https://builds.sr.ht/~cedric/stegano.svg)](https://builds.sr.ht/~cedric/stegano)
[![Workflow](https://github.com/cedricbonhomme/Stegano/workflows/Python%20application/badge.svg?style=flat-square)](https://github.com/cedricbonhomme/Stegano/actions?query=workflow%3A%22Python+application%22)
[Stegano](https://sr.ht/~cedric/stegano), a pure Python Steganography
[Stegano](https://github.com/cedricbonhomme/Stegano), a pure Python Steganography
module.
Steganography is the art and science of writing hidden messages in such a way
@ -12,9 +11,6 @@ existence of the message, a form of security through obscurity. Consequently,
functions provided by Stegano only hide messages, without encryption.
Steganography is often used with cryptography.
For reporting issues, visit the tracker here:
https://todo.sr.ht/~cedric/stegano
## Installation
@ -97,11 +93,23 @@ Contributions are welcome. If you want to contribute to Stegano I highly
recommend you to install it in a Python virtual environment with poetry.
## Donations
If you wish and if you like Stegano, you can donate via GitHub Sponsors:
[![GitHub Sponsors](https://img.shields.io/github/sponsors/cedricbonhomme)](https://github.com/sponsors/cedricbonhomme)
or with Bitcoin to this address:
bc1q56u6sj7cvlwu58v5lemljcvkh7v2gc3tv8mj0e
Thank you !
## License
This software is licensed under
[GNU General Public License version 3](https://www.gnu.org/licenses/gpl-3.0.html)
Copyright (C) 2010-2022 [Cédric Bonhomme](https://www.cedricbonhomme.org)
Copyright (C) 2010-2025 [Cédric Bonhomme](https://www.cedricbonhomme.org)
For more information, [the list of authors and contributors](CONTRIBUTORS.md) is available.

View file

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
#
# Stéganô documentation build configuration file, created by
# sphinx-quickstart on Wed Jul 25 13:33:39 2012.
@ -10,17 +9,13 @@
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
# sys.path.insert(0, os.path.abspath('.'))
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = []
@ -39,7 +34,7 @@ master_doc = "index"
# General information about the project.
project = "Stegano"
copyright = "2010-2022, Cédric Bonhomme"
copyright = "2010-2025, Cédric Bonhomme"
author = "Cédric Bonhomme <cedric@cedricbonhomme.org>"
# The version info for the project you're documenting, acts as replacement for
@ -170,6 +165,6 @@ latex_documents = [
latex_show_urls = True
latex_show_pagerefs = True
ADDITIONAL_PREAMBLE = """
ADDITIONAL_PREAMBLE = r"""
\setcounter{tocdepth}{3}
"""

View file

@ -6,10 +6,6 @@
Presentation
============
.. image:: https://builds.sr.ht/~cedric/stegano.svg
:target: https://builds.sr.ht/~cedric/stegano
Stegano_ is a pure Python steganography_ module.
Steganography is the art and science of writing hidden messages in such a way
@ -53,7 +49,7 @@ Tutorial
steganalysis
You can have a look at the
`unit tests <https://git.sr.ht/~cedric/stegano/tree/master/tests>`_.
`unit tests <https://github.com/cedricbonhomme/Stegano/tree/master/tests>`_.
License
@ -77,7 +73,7 @@ Contact
.. _Python: https://www.python.org
.. _Stegano: https://sr.ht/~cedric/stegano
.. _Stegano: https://github.com/cedricbonhomme/Stegano
.. _`Pillow`: https://pypi.python.org/pypi/Pillow
.. _`piexif`: https://pypi.python.org/pypi/piexif
.. _steganography: http://en.wikipedia.org/wiki/Steganography

View file

@ -12,7 +12,4 @@ If you want to retrieve the source code (with the unit tests):
.. code-block:: bash
$ git clone https://git.sr.ht/~cedric/stegano
.. image:: https://builds.sr.ht/~cedric/stegano.svg
:target: https://builds.sr.ht/~cedric/stegano
$ git clone https://github.com/cedricbonhomme/Stegano

View file

@ -2,7 +2,7 @@ Using Stegano as a Python module
================================
You can find more examples in the
`unit tests directory <https://git.sr.ht/~cedric/stegano/tree/master/tests>`_.
`unit tests directory <https://github.com/cedricbonhomme/Stegano/tree/master/tests>`_.
LSB method
----------

1427
poetry.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,66 +1,79 @@
[tool.poetry]
[build-system]
requires = ["poetry-core>=2.0"]
build-backend = "poetry.core.masonry.api"
[project]
name = "stegano"
version = "0.11.1"
version = "1.0.1"
description = "A pure Python Steganography module."
authors = [
"Cédric Bonhomme <cedric@cedricbonhomme.org>"
{name = "Cédric Bonhomme", email= "cedric@cedricbonhomme.org"}
]
license = "GPL-3.0-or-later"
readme = "README.md"
keywords = ["Steganography", "Security", "Stegano"]
homepage = "https://sr.ht/~cedric/stegano"
repository = "https://git.sr.ht/~cedric/stegano"
documentation = "https://stegano.readthedocs.io"
dynamic = ["classifiers"]
keywords = ["steganography", "security", "stegano"]
requires-python = ">=3.10,<4.0"
dependencies = [
"pillow (>=9.5,<11.0)",
"piexif (>=1.1.3)",
"crayons (>=0.4.0)",
"opencv-python (>=4.8.1.78)"
]
[project.urls]
Homepage = "https://github.com/cedricbonhomme/Stegano"
Changelog = "https://github.com/cedricbonhomme/Stegano/blob/master/CHANGELOG.md"
Repository = "https://github.com/cedricbonhomme/Stegano"
Documentation = "https://stegano.readthedocs.io"
[project.scripts]
stegano-lsb = "stegano.console.lsb:main"
stegano-red = "stegano.console.red:main"
stegano-steganalysis-parity = "stegano.console.parity:main"
stegano-steganalysis-statistics = "stegano.console.statistics:main"
[tool.poetry]
requires-poetry = ">=2.0"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Environment :: Console",
"Intended Audience :: Developers",
"Intended Audience :: Science/Research",
"Topic :: Security",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)"
]
include = [
"README.md",
"COPYING",
"CHANGELOG.md",
"docs/**/*",
"bin/*"
]
[tool.poetry.scripts]
stegano-lsb = "bin.lsb:main"
stegano-red = "bin.red:main"
stegano-steganalysis-parity = "bin.parity:main"
stegano-steganalysis-statistics = "bin.statistics:main"
[tool.poetry.dependencies]
python = ">=3.8,<3.12"
pillow = "^9.2.0"
piexif = "^1.1.3"
crayons = "^0.4.0"
opencv-python = "^4.6.0.66"
[tool.poetry.group.dev.dependencies]
mypy = "^1.8.0"
flake8 = "^6.0.0"
nose2 = "^0.14.0"
Sphinx = "^6.2.1"
pre-commit = "^3.6.0"
[tool.poetry.dev-dependencies]
mypy = "^0.910"
flake8 = "^4.0.1"
nose2 = "^0.10.0"
Sphinx = "^4.2.0"
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
[tool.poetry.group.dev]
optional = true
[tool.mypy]
python_version = "3.10"
python_version = "3.12"
check_untyped_defs = true
ignore_errors = false
ignore_missing_imports = true
@ -75,3 +88,6 @@ show_error_context = true
pretty = true
exclude = "build|dist|docs|stegano.egg-info"
[tool.isort]
profile = "black"

View file

@ -1,10 +1,5 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from . import red
from . import exifHeader
from . import lsb
from . import steganalysis
from . import exifHeader, lsb, red, steganalysis
__all__ = ["red", "exifHeader", "lsb", "steganalysis"]

View file

@ -1,8 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://github.com/cedricbonhomme/Stegano
#
@ -26,6 +24,7 @@ __revision__ = "$Date: 2019/06/04 $"
__license__ = "GPLv3"
import inspect
import crayons
try:
@ -34,10 +33,10 @@ try:
except Exception:
print("Install stegano: pipx install Stegano")
from stegano import tools
import argparse
from stegano import tools
class ValidateGenerator(argparse.Action):
def __call__(self, parser, args, values, option_string=None):
@ -76,7 +75,7 @@ def main():
choices=tools.ENCODINGS.keys(),
default="UTF-8",
help="Specify the encoding of the message to hide."
+ " UTF-8 (default) or UTF-32LE.",
" UTF-8 (default) or UTF-32LE.",
)
# Generator
@ -131,7 +130,7 @@ def main():
choices=tools.ENCODINGS.keys(),
default="UTF-8",
help="Specify the encoding of the message to reveal."
+ " UTF-8 (default) or UTF-32LE.",
" UTF-8 (default) or UTF-32LE.",
)
# Generator
@ -179,7 +178,7 @@ def main():
generator = getattr(generators, arguments.generator_function[0])()
except AttributeError:
print("Unknown generator: {}".format(arguments.generator_function))
print(f"Unknown generator: {arguments.generator_function}")
exit(1)
if arguments.command == "hide":
@ -223,6 +222,6 @@ def main():
all_generators = inspect.getmembers(generators, inspect.isfunction)
for generator in all_generators:
print("Generator id:")
print(" {}".format(crayons.green(generator[0], bold=True)))
print(f" {crayons.green(generator[0], bold=True)}")
print("Desciption:")
print(" {}".format(generator[1].__doc__))
print(f" {generator[1].__doc__}")

View file

@ -1,8 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://github.com/cedricbonhomme/Stegano
#
@ -24,10 +22,10 @@ __version__ = "$Revision: 0.7 $"
__date__ = "$Date: 2016/08/25 $"
__license__ = "GPLv3"
from PIL import Image
import argparse
from PIL import Image
try:
from stegano.steganalysis import parity
except Exception:

View file

@ -1,8 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://github.com/cedricbonhomme/Stegano
#

View file

@ -1,8 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://github.com/cedricbonhomme/Stegano
#
@ -25,10 +23,10 @@ __date__ = "$Date: 2016/08/26 $"
__revision__ = "$Date: 2016/08/26 $"
__license__ = "GPLv3"
from PIL import Image
import argparse
from PIL import Image
try:
from stegano.steganalysis import statistics
except Exception:

View file

@ -1,5 +1,4 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from .exifHeader import hide, reveal

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -26,6 +24,7 @@ __revision__ = "$Date: 2017/01/18 $"
__license__ = "GPLv3"
import piexif
from stegano import tools
@ -37,11 +36,11 @@ def hide(
img_format=None,
):
"""Hide a message (string) in an image."""
from zlib import compress
from base64 import b64encode
from zlib import compress
if secret_file is not None:
with open(secret_file, "r") as f:
with open(secret_file) as f:
secret_message = f.read()
try:

View file

@ -1,5 +1,4 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from .lsb import hide, reveal

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -26,10 +24,11 @@ __revision__ = "$Date: 2021/11/29 $"
__license__ = "GPLv3"
import itertools
import math
from typing import Any, Dict, Iterator, List
import cv2
import numpy as np
import math
from typing import Dict, Iterator, List, Any
def identity() -> Iterator[int]:
@ -73,7 +72,7 @@ def eratosthenes() -> Iterator[int]:
"""Generate the prime numbers with the sieve of Eratosthenes.
https://oeis.org/A000040
"""
d = {} # type: Dict[int, List[int]]
d: Dict[int, List[int]] = {}
for i in itertools.count(2):
if i in d:
for j in d[i]:
@ -90,8 +89,7 @@ def composite() -> Iterator[int]:
"""
p1 = 3
for p2 in eratosthenes():
for n in range(p1 + 1, p2):
yield n
yield from range(p1 + 1, p2)
p1 = p2
@ -225,7 +223,7 @@ def LFSR(m: int) -> Iterator[int]:
# Add the feedback bit
state.insert(0, feedback)
# Convert the registers to an int
out = sum([e * (2**i) for i, e in enumerate(state)])
out = sum(e * (2**i) for i, e in enumerate(state))
yield out
@ -244,7 +242,7 @@ def shi_tomashi(
gray, max_corners, quality, min_distance
)
corners_int: np.ndarray[Any, np.dtype[np.signedinteger[Any]]] = np.array(
np.int0(corners)
np.intp(corners)
)
i = 0
while True:

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -27,9 +25,10 @@ __license__ = "GPLv3"
from typing import IO, Iterator, Union
from .generators import identity
from stegano import tools
from .generators import identity
def hide(
image: Union[str, IO[bytes]],
@ -68,9 +67,10 @@ def reveal(
generator: Union[None, Iterator[int]] = None,
shift: int = 0,
encoding: str = "UTF-8",
close_file: bool = True,
):
"""Find a message in an image (with the LSB technique)."""
revealer = tools.Revealer(encoded_image, encoding)
revealer = tools.Revealer(encoded_image, encoding, close_file)
width = revealer.encoded_image.width
if not generator:

View file

@ -1,5 +1,4 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from .red import hide, reveal

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stéganô is a basic Python Steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2024 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by

View file

@ -1,2 +1 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -36,7 +34,10 @@ def steganalyse(img: Image.Image) -> Image.Image:
width, height = img.size
for row in range(height):
for col in range(width):
r, g, b = img.getpixel((col, row))[0:3]
if pixel := img.getpixel((col, row)):
r, g, b = pixel[0:3]
else:
raise Exception("Error during steganlysis.")
if r % 2 == 0:
r = 0
else:

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -26,9 +24,7 @@ __revision__ = "$Date: 2021/11/01 $"
__license__ = "GPLv3"
import typing
from collections import Counter
from collections import OrderedDict
from collections import Counter, OrderedDict
def steganalyse(img):
@ -36,7 +32,7 @@ def steganalyse(img):
Steganlysis of the LSB technique.
"""
width, height = img.size
colours_counter = Counter() # type: typing.Counter[int]
colours_counter: typing.Counter[int] = Counter()
for row in range(height):
for col in range(width):
r, g, b = img.getpixel((col, row))
@ -47,7 +43,7 @@ def steganalyse(img):
sorted(list(colours_counter.items()), key=lambda t: t[1])
)
colours = 0 # type: float
colours: float = 0
for colour in list(dict_colours.keys()):
colours += colour
colours = colours / len(dict_colours)

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -28,7 +26,7 @@ __license__ = "GPLv3"
import base64
import itertools
from functools import reduce
from typing import IO, Iterator, List, Tuple, Union
from typing import IO, List, Union
from PIL import Image
@ -76,9 +74,7 @@ def setlsb(component: int, bit: str) -> int:
return component & ~1 | int(bit)
def n_at_a_time(
items: List[int], n: int, fillvalue: str
) -> Iterator[Tuple[Union[int, str]]]:
def n_at_a_time(items: List[int], n: int, fillvalue: str):
"""Returns an iterator which groups n items at a time.
Any final partial tuple will be padded with the fillvalue
@ -134,7 +130,7 @@ class Hider:
if image.mode not in ["RGB", "RGBA"]:
if not auto_convert_rgb:
print("The mode of the image is not RGB. Mode is {}".format(image.mode))
print(f"The mode of the image is not RGB. Mode is {image.mode}")
answer = input("Convert the image to RGB ? [Y / n]\n") or "Y"
if answer.lower() == "n":
raise Exception("Not a RGB image.")
@ -154,7 +150,7 @@ class Hider:
if self._len_message_bits > npixels * 3:
raise Exception(
"The message you want to hide is too long: {}".format(message_length)
f"The message you want to hide is too long: {message_length}"
)
def encode_another_pixel(self):
@ -179,13 +175,19 @@ class Hider:
class Revealer:
def __init__(self, encoded_image: Union[str, IO[bytes]], encoding: str = "UTF-8"):
def __init__(
self,
encoded_image: Union[str, IO[bytes]],
encoding: str = "UTF-8",
close_file: bool = True,
):
self.encoded_image = open_image(encoded_image)
self._encoding_length = ENCODINGS[encoding]
self._buff, self._count = 0, 0
self._bitab: List[str] = []
self._limit: Union[None, int] = None
self.secret_message = ""
self.close_file = close_file
def decode_pixel(self, coordinate: tuple):
# pixel = [r, g, b] or [r,g,b,a]
@ -212,7 +214,8 @@ class Revealer:
self.secret_message = "".join(self._bitab)[
len(str(self._limit)) + 1 : # noqa: E203
]
self.encoded_image.close()
if self.close_file:
self.encoded_image.close()
return True

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -25,9 +23,9 @@ __date__ = "$Date: 2016/05/17 $"
__revision__ = "$Date: 2017/01/18 $"
__license__ = "GPLv3"
import io
import os
import unittest
import io
from stegano import exifHeader

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -25,8 +23,9 @@ __date__ = "$Date: 2017/03/01 $"
__revision__ = "$Date: 2017/03/01 $"
__license__ = "GPLv3"
import unittest
import itertools
import unittest
import cv2
import numpy as np
@ -71,7 +70,7 @@ class TestGenerators(unittest.TestCase):
def test_eratosthenes(self):
"""Test the Eratosthenes sieve."""
with open("./tests/expected-results/eratosthenes", "r") as f:
with open("./tests/expected-results/eratosthenes") as f:
self.assertEqual(
tuple(itertools.islice(generators.eratosthenes(), 168)),
tuple(int(line) for line in f),
@ -79,7 +78,7 @@ class TestGenerators(unittest.TestCase):
def test_composite(self):
"""Test the composite sieve."""
with open("./tests/expected-results/composite", "r") as f:
with open("./tests/expected-results/composite") as f:
self.assertEqual(
tuple(itertools.islice(generators.composite(), 114)),
tuple(int(line) for line in f),
@ -87,7 +86,7 @@ class TestGenerators(unittest.TestCase):
def test_fermat(self):
"""Test the Fermat generator."""
with open("./tests/expected-results/fermat", "r") as f:
with open("./tests/expected-results/fermat") as f:
self.assertEqual(
tuple(itertools.islice(generators.fermat(), 9)),
tuple(int(line) for line in f),
@ -95,7 +94,7 @@ class TestGenerators(unittest.TestCase):
def test_triangular_numbers(self):
"""Test the Triangular numbers generator."""
with open("./tests/expected-results/triangular_numbers", "r") as f:
with open("./tests/expected-results/triangular_numbers") as f:
self.assertEqual(
tuple(itertools.islice(generators.triangular_numbers(), 54)),
tuple(int(line) for line in f),
@ -103,7 +102,7 @@ class TestGenerators(unittest.TestCase):
def test_mersenne(self):
"""Test the Mersenne generator."""
with open("./tests/expected-results/mersenne", "r") as f:
with open("./tests/expected-results/mersenne") as f:
self.assertEqual(
tuple(itertools.islice(generators.mersenne(), 20)),
tuple(int(line) for line in f),
@ -111,7 +110,7 @@ class TestGenerators(unittest.TestCase):
def test_carmichael(self):
"""Test the Carmichael generator."""
with open("./tests/expected-results/carmichael", "r") as f:
with open("./tests/expected-results/carmichael") as f:
self.assertEqual(
tuple(itertools.islice(generators.carmichael(), 33)),
tuple(int(line) for line in f),
@ -119,7 +118,7 @@ class TestGenerators(unittest.TestCase):
def test_ackermann_slow(self):
"""Test the Ackermann set."""
with open("./tests/expected-results/ackermann", "r") as f:
with open("./tests/expected-results/ackermann") as f:
self.assertEqual(generators.ackermann_slow(3, 1), int(f.readline()))
self.assertEqual(generators.ackermann_slow(3, 2), int(f.readline()))
@ -127,13 +126,13 @@ class TestGenerators(unittest.TestCase):
"""Test the Naive Ackermann generator"""
gen = generators.ackermann_naive(3)
next(gen)
with open("./tests/expected-results/ackermann", "r") as f:
with open("./tests/expected-results/ackermann") as f:
self.assertEqual(next(gen), int(f.readline()))
self.assertEqual(next(gen), int(f.readline()))
def test_ackermann_fast(self):
"""Test the Ackermann set."""
with open("./tests/expected-results/ackermann", "r") as f:
with open("./tests/expected-results/ackermann") as f:
self.assertEqual(generators.ackermann_fast(3, 1), int(f.readline()))
self.assertEqual(generators.ackermann_fast(3, 2), int(f.readline()))
self.assertEqual(generators.ackermann_fast(4, 1), int(f.readline()))
@ -142,13 +141,13 @@ class TestGenerators(unittest.TestCase):
"""Test the Ackermann generator"""
gen = generators.ackermann(3)
next(gen)
with open("./tests/expected-results/ackermann", "r") as f:
with open("./tests/expected-results/ackermann") as f:
self.assertEqual(next(gen), int(f.readline()))
self.assertEqual(next(gen), int(f.readline()))
def test_LFSR(self):
"""Test the LFSR generator"""
with open("./tests/expected-results/LFSR", "r") as f:
with open("./tests/expected-results/LFSR") as f:
self.assertEqual(
tuple(itertools.islice(generators.LFSR(2**8), 256)),
tuple(int(line) for line in f),
@ -175,9 +174,8 @@ class TestGenerators(unittest.TestCase):
test_file_reshaped = test_file.reshape(
int(test_file.shape[0]), int(test_file.shape[1])
)
self.assertIsNone(
np.testing.assert_allclose(corners, test_file_reshaped, rtol=1e-0, atol=0)
)
res = np.testing.assert_allclose(corners, test_file_reshaped, rtol=1e-0, atol=0) # type: ignore
self.assertIsNone(res)
@staticmethod
def shi_tomashi_reconfigure(

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2024 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -173,7 +171,12 @@ class TestLSB(unittest.TestCase):
@patch("builtins.input", return_value="n")
def test_refuse_convert_rgb(self, input):
message_to_hide = "Hello World!"
with self.assertRaises(Exception):
# lsb.hide(
# "./tests/sample-files/Lenna-grayscale.png",
# message_to_hide,
# generators.eratosthenes(),
# )
with self.assertRaisesRegex(Exception, "Not a RGB image."):
lsb.hide(
"./tests/sample-files/Lenna-grayscale.png",
message_to_hide,
@ -210,7 +213,9 @@ class TestLSB(unittest.TestCase):
with open("./tests/sample-files/lorem_ipsum.txt") as f:
message = f.read()
message += message * 2
with self.assertRaises(Exception):
with self.assertRaisesRegex(
Exception, "The message you want to hide is too long:"
):
lsb.hide("./tests/sample-files/Lenna.png", message, generators.identity())
def test_hide_and_reveal_with_bad_generator(self):

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by

View file

@ -1,10 +1,9 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2017 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -27,9 +26,10 @@ __license__ = "GPLv3"
import unittest
from PIL import Image, ImageChops
from stegano import lsb
from stegano.steganalysis import parity, statistics
from PIL import Image, ImageChops
class TestSteganalysis(unittest.TestCase):

View file

@ -1,10 +1,8 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Stegano - Stegano is a pure Python steganography module.
# Copyright (C) 2010-2022 Cédric Bonhomme - https://www.cedricbonhomme.org
# Copyright (C) 2010-2025 Cédric Bonhomme - https://www.cedricbonhomme.org
#
# For more information : https://git.sr.ht/~cedric/stegano
# For more information : https://github.com/cedricbonhomme/Stegano
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -83,7 +81,7 @@ class TestTools(unittest.TestCase):
self.assertEqual(list(result), [(1, 2), (3, 4), (5, "X")])
def test_binary2base64(self):
with open("./tests/expected-results/binary2base64", "r") as f:
with open("./tests/expected-results/binary2base64") as f:
expected_value = f.read()
value = tools.binary2base64("tests/sample-files/free-software-song.ogg")
self.assertEqual(expected_value, value)