rtty-soda 0.1.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rtty-soda might be problematic. Click here for more details.
- rtty_soda/.DS_Store +0 -0
- rtty_soda/.mypy_cache/.gitignore +2 -0
- rtty_soda/.mypy_cache/3.13/@plugins_snapshot.json +1 -0
- rtty_soda/.mypy_cache/3.13/__future__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/__future__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_ast.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_ast.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_bz2.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_bz2.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_codecs.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_codecs.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_collections_abc.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_collections_abc.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_compression.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_compression.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_contextvars.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_contextvars.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_decimal.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_decimal.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_frozen_importlib.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_frozen_importlib.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_frozen_importlib_external.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_frozen_importlib_external.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_io.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_io.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_lzma.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_lzma.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_operator.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_operator.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_pickle.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_pickle.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_sitebuiltins.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_sitebuiltins.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_stat.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_stat.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_thread.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_thread.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_typeshed/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_typeshed/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_typeshed/importlib.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_typeshed/importlib.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_warnings.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_warnings.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_weakref.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_weakref.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/_weakrefset.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/_weakrefset.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/abc.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/abc.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/annotated_types/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/annotated_types/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/argparse.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/argparse.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/ast.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/ast.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/base64.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/base64.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/binascii.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/binascii.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/builtins.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/builtins.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/bz2.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/bz2.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/_compat.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/_compat.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/_termui_impl.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/_termui_impl.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/core.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/core.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/decorators.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/decorators.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/exceptions.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/exceptions.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/formatting.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/formatting.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/globals.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/globals.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/parser.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/parser.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/shell_completion.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/shell_completion.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/termui.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/termui.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/types.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/types.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/utils.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click/utils.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/click_aliases/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/click_aliases/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/codecs.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/codecs.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/collections/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/collections/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/collections/abc.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/collections/abc.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/colorsys.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/colorsys.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/contextlib.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/contextlib.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/contextvars.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/contextvars.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/copy.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/copy.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/crc/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/crc/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/crc/_crc.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/crc/_crc.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/dataclasses.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/dataclasses.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/datetime.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/datetime.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/decimal.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/decimal.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/difflib.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/difflib.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/dis.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/dis.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/_policybase.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/_policybase.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/charset.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/charset.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/contentmanager.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/contentmanager.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/errors.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/errors.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/header.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/header.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/message.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/message.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/policy.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/email/policy.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/enum.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/enum.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/errno.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/errno.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/fractions.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/fractions.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/functools.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/functools.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/genericpath.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/genericpath.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/gettext.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/gettext.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/gzip.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/gzip.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/_abc.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/_abc.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/_bootstrap.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/_bootstrap.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/_bootstrap_external.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/_bootstrap_external.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/abc.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/abc.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/machinery.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/machinery.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/metadata/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/metadata/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/metadata/_meta.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/metadata/_meta.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/readers.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/readers.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/resources/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/resources/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/resources/_common.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/resources/_common.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/resources/_functional.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/resources/_functional.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/resources/abc.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/importlib/resources/abc.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/inspect.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/inspect.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/io.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/io.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/ipaddress.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/ipaddress.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/itertools.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/itertools.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/json/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/json/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/json/decoder.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/json/decoder.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/json/encoder.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/json/encoder.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/keyword.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/keyword.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/lzma.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/lzma.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/math.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/math.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_aead.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_aead.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_box.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_box.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_core.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_core.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_generichash.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_generichash.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_hash.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_hash.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_kx.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_kx.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_pwhash.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_pwhash.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_scalarmult.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_scalarmult.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_secretbox.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_secretbox.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_secretstream.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_secretstream.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_shorthash.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_shorthash.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_sign.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_sign.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/randombytes.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/randombytes.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/sodium_core.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/sodium_core.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/utils.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/bindings/utils.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/encoding.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/encoding.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/exceptions.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/exceptions.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/hash.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/hash.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/public.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/public.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/pwhash/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/pwhash/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/pwhash/_argon2.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/pwhash/_argon2.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/pwhash/argon2i.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/pwhash/argon2i.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/pwhash/argon2id.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/pwhash/argon2id.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/pwhash/scrypt.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/pwhash/scrypt.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/secret.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/secret.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/utils.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/nacl/utils.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/numbers.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/numbers.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/opcode.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/opcode.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/operator.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/operator.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/os/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/os/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/os/path.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/os/path.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pathlib/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pathlib/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pickle.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pickle.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/posixpath.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/posixpath.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_config.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_config.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_core_metadata.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_core_metadata.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_core_utils.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_core_utils.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_dataclasses.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_dataclasses.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_decorators.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_decorators.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_decorators_v1.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_decorators_v1.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_discriminated_union.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_discriminated_union.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_docs_extraction.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_docs_extraction.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_fields.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_fields.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_forward_ref.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_forward_ref.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_generate_schema.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_generate_schema.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_generics.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_generics.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_import_utils.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_import_utils.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_internal_dataclass.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_internal_dataclass.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_known_annotated_metadata.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_known_annotated_metadata.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_mock_val_ser.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_mock_val_ser.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_model_construction.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_model_construction.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_namespace_utils.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_namespace_utils.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_repr.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_repr.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_schema_gather.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_schema_gather.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_schema_generation_shared.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_schema_generation_shared.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_serializers.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_serializers.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_signature.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_signature.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_typing_extra.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_typing_extra.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_utils.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_utils.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_validate_call.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_validate_call.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_validators.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_internal/_validators.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_migration.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/_migration.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/aliases.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/aliases.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/annotated_handlers.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/annotated_handlers.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/color.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/color.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/config.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/config.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/dataclasses.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/dataclasses.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/class_validators.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/class_validators.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/config.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/config.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/copy_internals.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/copy_internals.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/json.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/json.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/parse.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/parse.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/tools.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/deprecated/tools.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/errors.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/errors.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/fields.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/fields.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/functional_serializers.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/functional_serializers.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/functional_validators.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/functional_validators.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/json_schema.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/json_schema.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/main.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/main.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/networks.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/networks.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/plugin/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/plugin/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/plugin/_schema_validator.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/plugin/_schema_validator.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/root_model.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/root_model.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/type_adapter.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/type_adapter.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/types.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/types.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/annotated_types.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/annotated_types.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/class_validators.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/class_validators.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/color.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/color.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/config.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/config.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/dataclasses.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/dataclasses.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/datetime_parse.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/datetime_parse.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/decorator.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/decorator.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/env_settings.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/env_settings.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/error_wrappers.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/error_wrappers.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/errors.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/errors.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/fields.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/fields.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/json.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/json.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/main.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/main.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/networks.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/networks.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/parse.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/parse.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/schema.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/schema.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/tools.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/tools.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/types.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/types.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/typing.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/typing.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/utils.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/utils.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/validators.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/validators.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/version.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/v1/version.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/validate_call_decorator.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/validate_call_decorator.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/version.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/version.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/warnings.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic/warnings.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic_core/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic_core/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic_core/_pydantic_core.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic_core/_pydantic_core.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic_core/core_schema.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/pydantic_core/core_schema.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/re.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/re.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/resource.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/resource.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/app/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/app/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/app/soda_private_key.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/app/soda_private_key.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/app/soda_public_key.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/app/soda_public_key.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/archivers.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/archivers.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cli_io/message_io.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cli_io/message_io.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cli_io.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cli_io.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/kdf.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/kdf.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/private_key_ext.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/private_key_ext.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/public.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/public.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/public_key_ext.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/public_key_ext.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/secret.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/secret.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base26_encoder.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base26_encoder.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base36_encoder.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base36_encoder.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base94_encoder.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base94_encoder.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/functions.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/functions.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/error_search.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/error_search.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/format_table.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/format_table.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/handles/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/handles/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/handles/message_handle.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/handles/message_handle.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/handles/private_key_handle.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/handles/private_key_handle.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/handles/public_key_handle.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/handles/public_key_handle.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/handles/types.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/handles/types.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/io_utils.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/io_utils.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/main.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/rtty_soda/main.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/shlex.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/shlex.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/shutil.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/shutil.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/signal.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/signal.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/sre_compile.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/sre_compile.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/sre_constants.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/sre_constants.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/sre_parse.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/sre_parse.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/stat.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/stat.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/string/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/string/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/subprocess.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/subprocess.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/sys/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/sys/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/sys/_monitoring.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/sys/_monitoring.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/tarfile.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/tarfile.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/tempfile.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/tempfile.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/termios.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/termios.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/textwrap.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/textwrap.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/threading.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/threading.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/time.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/time.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/tty.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/tty.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/types.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/types.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/typing.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/typing.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/typing_extensions.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/typing_extensions.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/typing_inspection/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/typing_inspection/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/typing_inspection/introspection.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/typing_inspection/introspection.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/typing_inspection/typing_objects.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/typing_inspection/typing_objects.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/uuid.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/uuid.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/warnings.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/warnings.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/weakref.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/weakref.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/zipfile/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/zipfile/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/zipfile/_path/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/zipfile/_path/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/zipimport.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/zipimport.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/zlib.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/zlib.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/zoneinfo/__init__.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/zoneinfo/__init__.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/zoneinfo/_common.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/zoneinfo/_common.meta.json +1 -0
- rtty_soda/.mypy_cache/3.13/zoneinfo/_tzpath.data.json +1 -0
- rtty_soda/.mypy_cache/3.13/zoneinfo/_tzpath.meta.json +1 -0
- rtty_soda/.mypy_cache/CACHEDIR.TAG +3 -0
- rtty_soda/__init__.py +0 -0
- rtty_soda/archivers.py +57 -0
- rtty_soda/cli_io.py +77 -0
- rtty_soda/cryptography/__init__.py +0 -0
- rtty_soda/cryptography/kdf.py +42 -0
- rtty_soda/cryptography/public.py +20 -0
- rtty_soda/cryptography/secret.py +17 -0
- rtty_soda/encoders/__init__.py +26 -0
- rtty_soda/encoders/base26_encoder.py +19 -0
- rtty_soda/encoders/base36_encoder.py +19 -0
- rtty_soda/encoders/base94_encoder.py +17 -0
- rtty_soda/encoders/functions.py +48 -0
- rtty_soda/main.py +318 -0
- rtty_soda/py.typed +0 -0
- rtty_soda-0.1.2.dist-info/METADATA +254 -0
- rtty_soda-0.1.2.dist-info/RECORD +578 -0
- rtty_soda-0.1.2.dist-info/WHEEL +4 -0
- rtty_soda-0.1.2.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import string
|
|
2
|
+
|
|
3
|
+
from nacl.encoding import _Encoder as EncoderABC # pyright: ignore [reportPrivateUsage]
|
|
4
|
+
|
|
5
|
+
from .functions import base_to_bytes, bytes_to_base, decode_bytes, encode_str
|
|
6
|
+
|
|
7
|
+
__all__ = ["ALPHABET", "Base26Encoder"]
|
|
8
|
+
|
|
9
|
+
ALPHABET = string.ascii_uppercase
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Base26Encoder(EncoderABC):
|
|
13
|
+
@staticmethod
|
|
14
|
+
def encode(data: bytes) -> bytes:
|
|
15
|
+
return encode_str(bytes_to_base(data, ALPHABET))
|
|
16
|
+
|
|
17
|
+
@staticmethod
|
|
18
|
+
def decode(data: bytes) -> bytes:
|
|
19
|
+
return base_to_bytes(decode_bytes(data), ALPHABET)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import string
|
|
2
|
+
|
|
3
|
+
from nacl.encoding import _Encoder as EncoderABC # pyright: ignore [reportPrivateUsage]
|
|
4
|
+
|
|
5
|
+
from .functions import base_to_bytes, bytes_to_base, decode_bytes, encode_str
|
|
6
|
+
|
|
7
|
+
__all__ = ["ALPHABET", "Base36Encoder"]
|
|
8
|
+
|
|
9
|
+
ALPHABET = string.digits + string.ascii_uppercase
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Base36Encoder(EncoderABC):
|
|
13
|
+
@staticmethod
|
|
14
|
+
def encode(data: bytes) -> bytes:
|
|
15
|
+
return encode_str(bytes_to_base(data, ALPHABET))
|
|
16
|
+
|
|
17
|
+
@staticmethod
|
|
18
|
+
def decode(data: bytes) -> bytes:
|
|
19
|
+
return base_to_bytes(decode_bytes(data), ALPHABET)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from nacl.encoding import _Encoder as EncoderABC # pyright: ignore [reportPrivateUsage]
|
|
2
|
+
|
|
3
|
+
from .functions import base_to_bytes, bytes_to_base, decode_bytes, encode_str
|
|
4
|
+
|
|
5
|
+
__all__ = ["ALPHABET", "Base94Encoder"]
|
|
6
|
+
|
|
7
|
+
ALPHABET = "".join([chr(i) for i in range(33, 127)])
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Base94Encoder(EncoderABC):
|
|
11
|
+
@staticmethod
|
|
12
|
+
def encode(data: bytes) -> bytes:
|
|
13
|
+
return encode_str(bytes_to_base(data, ALPHABET))
|
|
14
|
+
|
|
15
|
+
@staticmethod
|
|
16
|
+
def decode(data: bytes) -> bytes:
|
|
17
|
+
return base_to_bytes(decode_bytes(data), ALPHABET)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
__all__ = ["base_to_bytes", "bytes_to_base", "decode_bytes", "encode_str"]
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def encode_str(data: str) -> bytes:
|
|
5
|
+
return data.encode(encoding="utf-8", errors="strict")
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def decode_bytes(data: bytes) -> str:
|
|
9
|
+
return data.decode(encoding="utf-8", errors="strict")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def int_to_base(number: int, alphabet: str) -> str:
|
|
13
|
+
result: list[str] = []
|
|
14
|
+
base = len(alphabet)
|
|
15
|
+
abs_number = abs(number)
|
|
16
|
+
while abs_number:
|
|
17
|
+
abs_number, remainder = divmod(abs_number, base)
|
|
18
|
+
result.append(alphabet[remainder])
|
|
19
|
+
|
|
20
|
+
return "".join(reversed(result))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def base_to_int(source: str, alphabet: str) -> int:
|
|
24
|
+
number = 0
|
|
25
|
+
base = len(alphabet)
|
|
26
|
+
for index, digit in enumerate(reversed(source)):
|
|
27
|
+
number += alphabet.index(digit) * (base**index)
|
|
28
|
+
|
|
29
|
+
return number
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def bytes_to_base(source: bytes, alphabet: str) -> str:
|
|
33
|
+
number = int.from_bytes(source, byteorder="big", signed=False)
|
|
34
|
+
return int_to_base(number, alphabet)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def int_to_bytes(number: int) -> bytes:
|
|
38
|
+
buffer = bytearray()
|
|
39
|
+
while number:
|
|
40
|
+
buffer.append(number & 0xFF)
|
|
41
|
+
number //= 256
|
|
42
|
+
|
|
43
|
+
buffer.reverse()
|
|
44
|
+
return bytes(buffer)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def base_to_bytes(source: str, alphabet: str) -> bytes:
|
|
48
|
+
return int_to_bytes(base_to_int(source, alphabet))
|
rtty_soda/main.py
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# ruff: noqa: PLR0913 - not applicable because we don't call Click Commands directly
|
|
2
|
+
# ruff: noqa: ANN201 - not applicable because the Click Commands are untyped
|
|
3
|
+
# mypy: disable-error-code = "no-untyped-def, misc"
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import click
|
|
7
|
+
from click_aliases import ClickAliasedGroup
|
|
8
|
+
from nacl.public import PrivateKey, PublicKey
|
|
9
|
+
|
|
10
|
+
from rtty_soda.archivers import ARCHIVERS, UNARCHIVERS
|
|
11
|
+
from rtty_soda.cli_io import (
|
|
12
|
+
print_stats,
|
|
13
|
+
read_bytes,
|
|
14
|
+
read_ciphertext_bytes,
|
|
15
|
+
read_clean_bytes,
|
|
16
|
+
read_plaintext_bytes,
|
|
17
|
+
write_output,
|
|
18
|
+
)
|
|
19
|
+
from rtty_soda.cryptography import public, secret
|
|
20
|
+
from rtty_soda.cryptography.kdf import KDF_PROFILES, kdf
|
|
21
|
+
from rtty_soda.encoders import ENCODERS, RawEncoder
|
|
22
|
+
|
|
23
|
+
in_path = click.Path(
|
|
24
|
+
exists=True,
|
|
25
|
+
file_okay=True,
|
|
26
|
+
dir_okay=False,
|
|
27
|
+
readable=True,
|
|
28
|
+
allow_dash=True,
|
|
29
|
+
path_type=Path,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
out_path = click.Path(
|
|
33
|
+
file_okay=True, dir_okay=False, writable=True, allow_dash=True, path_type=Path
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
CONTEXT_SETTINGS = {"help_option_names": ["-h", "--help"]}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@click.group(cls=ClickAliasedGroup, context_settings=CONTEXT_SETTINGS)
|
|
40
|
+
@click.version_option(package_name="rtty-soda")
|
|
41
|
+
def cli():
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@cli.command()
|
|
46
|
+
@click.option("--encoding", "-e", default="base64", show_default=True)
|
|
47
|
+
def genkey_cmd(encoding: str):
|
|
48
|
+
"""Generate Private Key.
|
|
49
|
+
|
|
50
|
+
Encoding: base26 | base36 | base64 | base94
|
|
51
|
+
"""
|
|
52
|
+
enc = ENCODERS[encoding]
|
|
53
|
+
key = PrivateKey.generate()
|
|
54
|
+
click.echo(key.encode(enc))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@cli.command()
|
|
58
|
+
@click.argument("private_key_file", type=in_path)
|
|
59
|
+
@click.option("--encoding", "-e", default="base64", show_default=True)
|
|
60
|
+
def pubkey_cmd(private_key_file: Path, encoding: str):
|
|
61
|
+
"""Get Public Key.
|
|
62
|
+
|
|
63
|
+
Encoding: base26 | base36 | base64 | base94
|
|
64
|
+
"""
|
|
65
|
+
enc = ENCODERS[encoding]
|
|
66
|
+
key = read_clean_bytes(private_key_file)
|
|
67
|
+
priv = PrivateKey(key, enc)
|
|
68
|
+
click.echo(priv.public_key.encode(enc))
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@cli.command()
|
|
72
|
+
@click.argument("password_file", type=in_path)
|
|
73
|
+
@click.option("--encoding", "-e", default="base64", show_default=True)
|
|
74
|
+
@click.option("--profile", "-p", default="sensitive", show_default=True)
|
|
75
|
+
def kdf_cmd(password_file: Path, encoding: str, profile: str):
|
|
76
|
+
"""Key Derivation Function.
|
|
77
|
+
|
|
78
|
+
Encoding: base26 | base36 | base64 | base94
|
|
79
|
+
|
|
80
|
+
Profile: interactive | moderate | sensitive
|
|
81
|
+
"""
|
|
82
|
+
enc = ENCODERS[encoding]
|
|
83
|
+
prof = KDF_PROFILES[profile]
|
|
84
|
+
pw = read_bytes(password_file)
|
|
85
|
+
key = kdf(pw, prof, enc)
|
|
86
|
+
click.echo(key)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@cli.command(aliases=["e"])
|
|
90
|
+
@click.argument("private_key_file", type=in_path)
|
|
91
|
+
@click.argument("public_key_file", type=in_path)
|
|
92
|
+
@click.argument("message_file", type=in_path)
|
|
93
|
+
@click.option("--key-encoding", default="base64", show_default=True)
|
|
94
|
+
@click.option("--data-encoding", "-e", default="base64", show_default=True)
|
|
95
|
+
@click.option("--compression", "-c", default="zlib", show_default=True)
|
|
96
|
+
@click.option("--output-file", "-o", type=out_path, help="(Optional)")
|
|
97
|
+
def encrypt_public_cmd(
|
|
98
|
+
private_key_file: Path,
|
|
99
|
+
public_key_file: Path,
|
|
100
|
+
message_file: Path,
|
|
101
|
+
key_encoding: str,
|
|
102
|
+
data_encoding: str,
|
|
103
|
+
compression: str,
|
|
104
|
+
output_file: Path | None,
|
|
105
|
+
):
|
|
106
|
+
"""Encrypt Message (Public).
|
|
107
|
+
|
|
108
|
+
Encoding: base26 | base36 | base64 | base94 | binary
|
|
109
|
+
|
|
110
|
+
Compression: zlib | bz2 | lzma | raw
|
|
111
|
+
"""
|
|
112
|
+
key_enc = ENCODERS[key_encoding]
|
|
113
|
+
data_enc = ENCODERS[data_encoding]
|
|
114
|
+
archiver = ARCHIVERS[compression]
|
|
115
|
+
priv_bytes = read_clean_bytes(private_key_file)
|
|
116
|
+
priv = PrivateKey(priv_bytes, key_enc)
|
|
117
|
+
pub_bytes = read_clean_bytes(public_key_file)
|
|
118
|
+
pub = PublicKey(pub_bytes, key_enc)
|
|
119
|
+
data = stats = read_plaintext_bytes(message_file, data_enc)
|
|
120
|
+
data = archiver(data)
|
|
121
|
+
data = public.encrypt(private=priv, public=pub, data=data, out_enc=data_enc)
|
|
122
|
+
write_output(output_file, data, data_enc)
|
|
123
|
+
print_stats(stats, data)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
@cli.command(aliases=["es"])
|
|
127
|
+
@click.argument("key_file", type=in_path)
|
|
128
|
+
@click.argument("message_file", type=in_path)
|
|
129
|
+
@click.option("--key-encoding", default="base64", show_default=True)
|
|
130
|
+
@click.option("--data-encoding", "-e", default="base64", show_default=True)
|
|
131
|
+
@click.option("--compression", "-c", default="zlib", show_default=True)
|
|
132
|
+
@click.option("--output-file", "-o", type=out_path, help="(Optional)")
|
|
133
|
+
def encrypt_secret_cmd(
|
|
134
|
+
key_file: Path,
|
|
135
|
+
message_file: Path,
|
|
136
|
+
key_encoding: str,
|
|
137
|
+
data_encoding: str,
|
|
138
|
+
compression: str,
|
|
139
|
+
output_file: Path | None,
|
|
140
|
+
):
|
|
141
|
+
"""Encrypt Message (Secret).
|
|
142
|
+
|
|
143
|
+
Encoding: base26 | base36 | base64 | base94 | binary
|
|
144
|
+
|
|
145
|
+
Compression: zlib | bz2 | lzma | raw
|
|
146
|
+
"""
|
|
147
|
+
key_enc = ENCODERS[key_encoding]
|
|
148
|
+
data_enc = ENCODERS[data_encoding]
|
|
149
|
+
archiver = ARCHIVERS[compression]
|
|
150
|
+
key = read_clean_bytes(key_file)
|
|
151
|
+
data = stats = read_plaintext_bytes(message_file, data_enc)
|
|
152
|
+
data = archiver(data)
|
|
153
|
+
data = secret.encrypt(key=key, data=data, key_enc=key_enc, out_enc=data_enc)
|
|
154
|
+
write_output(output_file, data, data_enc)
|
|
155
|
+
print_stats(stats, data)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@cli.command(aliases=["ep"])
|
|
159
|
+
@click.argument("password_file", type=in_path)
|
|
160
|
+
@click.argument("message_file", type=in_path)
|
|
161
|
+
@click.option("--kdf-profile", "-p", default="sensitive", show_default=True)
|
|
162
|
+
@click.option("--data-encoding", "-e", default="base64", show_default=True)
|
|
163
|
+
@click.option("--compression", "-c", default="zlib", show_default=True)
|
|
164
|
+
@click.option("--output-file", "-o", type=out_path, help="(Optional)")
|
|
165
|
+
def encrypt_password_cmd(
|
|
166
|
+
password_file: Path,
|
|
167
|
+
message_file: Path,
|
|
168
|
+
kdf_profile: str,
|
|
169
|
+
data_encoding: str,
|
|
170
|
+
compression: str,
|
|
171
|
+
output_file: Path | None,
|
|
172
|
+
):
|
|
173
|
+
"""Encrypt Message (Password).
|
|
174
|
+
|
|
175
|
+
KDF profile: interactive | moderate | sensitive
|
|
176
|
+
|
|
177
|
+
Encoding: base26 | base36 | base64 | base94 | binary
|
|
178
|
+
|
|
179
|
+
Compression: zlib | bz2 | lzma | raw
|
|
180
|
+
"""
|
|
181
|
+
prof = KDF_PROFILES[kdf_profile]
|
|
182
|
+
data_enc = ENCODERS[data_encoding]
|
|
183
|
+
archiver = ARCHIVERS[compression]
|
|
184
|
+
pw = read_bytes(password_file)
|
|
185
|
+
key = kdf(pw, prof, RawEncoder)
|
|
186
|
+
data = stats = read_plaintext_bytes(message_file, data_enc)
|
|
187
|
+
data = archiver(data)
|
|
188
|
+
data = secret.encrypt(key=key, data=data, key_enc=RawEncoder, out_enc=data_enc)
|
|
189
|
+
write_output(output_file, data, data_enc)
|
|
190
|
+
print_stats(stats, data)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@cli.command(aliases=["d"])
|
|
194
|
+
@click.argument("private_key_file", type=in_path)
|
|
195
|
+
@click.argument("public_key_file", type=in_path)
|
|
196
|
+
@click.argument("message_file", type=in_path)
|
|
197
|
+
@click.option("--key-encoding", default="base64", show_default=True)
|
|
198
|
+
@click.option("--data-encoding", "-e", default="base64", show_default=True)
|
|
199
|
+
@click.option("--compression", "-c", default="zlib", show_default=True)
|
|
200
|
+
@click.option("--output-file", "-o", type=out_path, help="(Optional)")
|
|
201
|
+
def decrypt_public_cmd(
|
|
202
|
+
private_key_file: Path,
|
|
203
|
+
public_key_file: Path,
|
|
204
|
+
message_file: Path,
|
|
205
|
+
key_encoding: str,
|
|
206
|
+
data_encoding: str,
|
|
207
|
+
compression: str,
|
|
208
|
+
output_file: Path | None,
|
|
209
|
+
):
|
|
210
|
+
"""Decrypt Message (Public).
|
|
211
|
+
|
|
212
|
+
Encoding: base26 | base36 | base64 | base94 | binary
|
|
213
|
+
|
|
214
|
+
Compression: zlib | bz2 | lzma | raw
|
|
215
|
+
"""
|
|
216
|
+
key_enc = ENCODERS[key_encoding]
|
|
217
|
+
data_enc = ENCODERS[data_encoding]
|
|
218
|
+
unarchiver = UNARCHIVERS[compression]
|
|
219
|
+
priv_bytes = read_clean_bytes(private_key_file)
|
|
220
|
+
priv = PrivateKey(priv_bytes, key_enc)
|
|
221
|
+
pub_bytes = read_clean_bytes(public_key_file)
|
|
222
|
+
pub = PublicKey(pub_bytes, key_enc)
|
|
223
|
+
data = stats = read_ciphertext_bytes(message_file, data_enc)
|
|
224
|
+
data = public.decrypt(priv, pub, data, data_enc)
|
|
225
|
+
data = unarchiver(data)
|
|
226
|
+
write_output(output_file, data, data_enc)
|
|
227
|
+
print_stats(data, stats)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
@cli.command(aliases=["ds"])
|
|
231
|
+
@click.argument("key_file", type=in_path)
|
|
232
|
+
@click.argument("message_file", type=in_path)
|
|
233
|
+
@click.option("--key-encoding", default="base64", show_default=True)
|
|
234
|
+
@click.option("--data-encoding", "-e", default="base64", show_default=True)
|
|
235
|
+
@click.option("--compression", "-c", default="zlib", show_default=True)
|
|
236
|
+
@click.option("--output-file", "-o", type=out_path, help="(Optional)")
|
|
237
|
+
def decrypt_secret_cmd(
|
|
238
|
+
key_file: Path,
|
|
239
|
+
message_file: Path,
|
|
240
|
+
key_encoding: str,
|
|
241
|
+
data_encoding: str,
|
|
242
|
+
compression: str,
|
|
243
|
+
output_file: Path | None,
|
|
244
|
+
):
|
|
245
|
+
"""Decrypt Message (Secret).
|
|
246
|
+
|
|
247
|
+
Encoding: base26 | base36 | base64 | base94 | binary
|
|
248
|
+
|
|
249
|
+
Compression: zlib | bz2 | lzma | raw
|
|
250
|
+
"""
|
|
251
|
+
key_enc = ENCODERS[key_encoding]
|
|
252
|
+
data_enc = ENCODERS[data_encoding]
|
|
253
|
+
unarchiver = UNARCHIVERS[compression]
|
|
254
|
+
key = read_clean_bytes(key_file)
|
|
255
|
+
data = stats = read_ciphertext_bytes(message_file, data_enc)
|
|
256
|
+
data = secret.decrypt(key, data, key_enc, data_enc)
|
|
257
|
+
data = unarchiver(data)
|
|
258
|
+
write_output(output_file, data, data_enc)
|
|
259
|
+
print_stats(data, stats)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
@cli.command(aliases=["dp"])
|
|
263
|
+
@click.argument("password_file", type=in_path)
|
|
264
|
+
@click.argument("message_file", type=in_path)
|
|
265
|
+
@click.option("--kdf-profile", "-p", default="sensitive", show_default=True)
|
|
266
|
+
@click.option("--data-encoding", "-e", default="base64", show_default=True)
|
|
267
|
+
@click.option("--compression", "-c", default="zlib", show_default=True)
|
|
268
|
+
@click.option("--output-file", "-o", type=out_path, help="(Optional)")
|
|
269
|
+
def decrypt_password_cmd(
|
|
270
|
+
password_file: Path,
|
|
271
|
+
message_file: Path,
|
|
272
|
+
kdf_profile: str,
|
|
273
|
+
data_encoding: str,
|
|
274
|
+
compression: str,
|
|
275
|
+
output_file: Path | None,
|
|
276
|
+
):
|
|
277
|
+
"""Decrypt Message (Password).
|
|
278
|
+
|
|
279
|
+
KDF profile: interactive | moderate | sensitive
|
|
280
|
+
|
|
281
|
+
Encoding: base26 | base36 | base64 | base94 | binary
|
|
282
|
+
|
|
283
|
+
Compression: zlib | bz2 | lzma | raw
|
|
284
|
+
"""
|
|
285
|
+
prof = KDF_PROFILES[kdf_profile]
|
|
286
|
+
data_enc = ENCODERS[data_encoding]
|
|
287
|
+
unarchiver = UNARCHIVERS[compression]
|
|
288
|
+
pw = read_bytes(password_file)
|
|
289
|
+
key = kdf(pw, prof, RawEncoder)
|
|
290
|
+
data = stats = read_ciphertext_bytes(message_file, data_enc)
|
|
291
|
+
data = secret.decrypt(key, data, RawEncoder, data_enc)
|
|
292
|
+
data = unarchiver(data)
|
|
293
|
+
write_output(output_file, data, data_enc)
|
|
294
|
+
print_stats(data, stats)
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
@cli.command()
|
|
298
|
+
@click.argument("in_encoding")
|
|
299
|
+
@click.argument("out_encoding")
|
|
300
|
+
@click.argument("file", type=in_path)
|
|
301
|
+
@click.option("--output-file", "-o", type=out_path, help="(Optional)")
|
|
302
|
+
def encode_cmd(
|
|
303
|
+
in_encoding: str, out_encoding: str, file: Path, output_file: Path | None
|
|
304
|
+
):
|
|
305
|
+
"""Encode File.
|
|
306
|
+
|
|
307
|
+
Encoding: base26 | base36 | base64 | base94 | binary
|
|
308
|
+
"""
|
|
309
|
+
in_enc = ENCODERS[in_encoding]
|
|
310
|
+
out_enc = ENCODERS[out_encoding]
|
|
311
|
+
data = read_ciphertext_bytes(file, in_enc)
|
|
312
|
+
data = in_enc.decode(data)
|
|
313
|
+
data = out_enc.encode(data)
|
|
314
|
+
write_output(output_file, data, out_enc)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
if __name__ == "__main__":
|
|
318
|
+
cli()
|
rtty_soda/py.typed
ADDED
|
File without changes
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: rtty-soda
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: A CLI tool for Unix-like environments to encrypt a RTTY session using NaCl
|
|
5
|
+
Keywords: cli,encryption,libsodium,nacl,rtty
|
|
6
|
+
Author: Theo Saveliev
|
|
7
|
+
Author-email: Theo Saveliev <89431871+theosaveliev@users.noreply.github.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Operating System :: POSIX
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Topic :: Communications
|
|
16
|
+
Classifier: Topic :: Security :: Cryptography
|
|
17
|
+
Classifier: Topic :: Utilities
|
|
18
|
+
Requires-Dist: click>=8.2.1,<9.0.0
|
|
19
|
+
Requires-Dist: click-aliases>=1.0.5,<2.0.0
|
|
20
|
+
Requires-Dist: pynacl>=1.5.0,<2.0.0
|
|
21
|
+
Requires-Python: >=3.13, <4.0
|
|
22
|
+
Project-URL: github, https://github.com/theosaveliev/rtty-soda
|
|
23
|
+
Project-URL: issues, https://github.com/theosaveliev/rtty-soda/issues
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
|
|
26
|
+
# rtty-soda
|
|
27
|
+
|
|
28
|
+
A CLI tool for Unix-like environments to encrypt a RTTY session using NaCl.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
#### Features
|
|
32
|
+
|
|
33
|
+
- Public Key encryption (Curve25519-XSalsa20-Poly1305)
|
|
34
|
+
- Secret Key encryption (XSalsa20-Poly1305)
|
|
35
|
+
- Key derivation (Argon2id-Blake2b)
|
|
36
|
+
- Password encryption
|
|
37
|
+
- Text compression (zlib, bz2, lzma)
|
|
38
|
+
- Custom encodings
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
## Installation
|
|
42
|
+
#### Package manager
|
|
43
|
+
|
|
44
|
+
1. [Install uv](https://docs.astral.sh/uv/getting-started/installation/)
|
|
45
|
+
2. Install rtty-soda:
|
|
46
|
+
```
|
|
47
|
+
% uv tool install rtty-soda
|
|
48
|
+
```
|
|
49
|
+
3. Remove rtty-soda:
|
|
50
|
+
```
|
|
51
|
+
% uv tool uninstall rtty-soda
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
#### Docker
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
% docker run -it --rm -h rtty-soda -v .:/app/host nett/rtty-soda:0.1.2
|
|
58
|
+
% docker run -it --rm -h rtty-soda -v .:/app/host nett/rtty-soda:0.1.2-tools
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
## Getting help
|
|
63
|
+
|
|
64
|
+
All commands have `[-h | --help]` option.
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
% soda
|
|
68
|
+
Usage: soda [OPTIONS] COMMAND [ARGS]...
|
|
69
|
+
|
|
70
|
+
Options:
|
|
71
|
+
--version Show the version and exit.
|
|
72
|
+
-h, --help Show this message and exit.
|
|
73
|
+
|
|
74
|
+
Commands:
|
|
75
|
+
decrypt-password (dp) Decrypt Message (Password).
|
|
76
|
+
decrypt-public (d) Decrypt Message (Public).
|
|
77
|
+
decrypt-secret (ds) Decrypt Message (Secret).
|
|
78
|
+
encode Encode File.
|
|
79
|
+
encrypt-password (ep) Encrypt Message (Password).
|
|
80
|
+
encrypt-public (e) Encrypt Message (Public).
|
|
81
|
+
encrypt-secret (es) Encrypt Message (Secret).
|
|
82
|
+
genkey Generate Private Key.
|
|
83
|
+
kdf Key Derivation Function.
|
|
84
|
+
pubkey Get Public Key.
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Some commands have aliases, so `% soda encrypt-password ...` and `% soda ep ...`
|
|
88
|
+
are equivalent.
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
## Public Key encryption
|
|
92
|
+
#### Key generation
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
% soda genkey | tee alice | soda pubkey - | tee alice_pub
|
|
96
|
+
R5xUCEhvkRRwQD+iWo2hV65fIsWucUZtiFJGKy6pTyA=
|
|
97
|
+
|
|
98
|
+
% soda genkey | tee bob | soda pubkey - | tee bob_pub
|
|
99
|
+
woNtqALnGLzp8VBuzJ8T13E4OZRv5YZy6kXMBpV8/mI=
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### Encryption
|
|
103
|
+
|
|
104
|
+
Alice sends the message to Bob:
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
% cat message
|
|
108
|
+
A telegraph key is a specialized electrical switch used by a trained operator to
|
|
109
|
+
transmit text messages in Morse code in a telegraphy system.
|
|
110
|
+
The first telegraph key was invented by Alfred Vail, an associate of Samuel Morse.
|
|
111
|
+
(c) Wikipedia
|
|
112
|
+
|
|
113
|
+
% soda encrypt-public alice bob_pub message --output-file encrypted
|
|
114
|
+
Plaintext: 239
|
|
115
|
+
Ciphertext: 280
|
|
116
|
+
Overhead: 1.172
|
|
117
|
+
|
|
118
|
+
% cat encrypted
|
|
119
|
+
xaLTAu3qD/h7cUspHL2HP0HVASovUE84WnWBj+uHgIqNPzxVhUoObILvDlb2WBJqiXmhMHSXpdMBMSiewdXtU9m
|
|
120
|
+
YlNumkJ8qq+pzsBL3Lrrjdg3jdoeMkweyR9xUY2QytR91Qi9Cga5GM5tTO+rHB6yriThUp2XGEQ1Bap358AT8u/
|
|
121
|
+
dJ7dOzaAv2ei5LfgqtlGmetACfXqxG5SunrOqWvmxpi2QI3FqWUkOLUl00Rj/ZnISmZRsDjekKgJcknKit498cL
|
|
122
|
+
7AVUKQA5PxFm4ZN9Q==
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### Decryption
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
$ soda decrypt-public bob alice_pub encrypted
|
|
129
|
+
|
|
130
|
+
A telegraph key is a specialized electrical switch used by a trained operator to
|
|
131
|
+
transmit text messages in Morse code in a telegraphy system.
|
|
132
|
+
The first telegraph key was invented by Alfred Vail, an associate of Samuel Morse.
|
|
133
|
+
(c) Wikipedia
|
|
134
|
+
|
|
135
|
+
Plaintext: 239
|
|
136
|
+
Ciphertext: 280
|
|
137
|
+
Overhead: 1.172
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
## Secret Key encryption
|
|
142
|
+
|
|
143
|
+
Alice and Bob share a key for symmetric encryption:
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
% soda genkey > shared
|
|
147
|
+
% soda encrypt-secret shared message > encrypted
|
|
148
|
+
Plaintext: 239
|
|
149
|
+
Ciphertext: 280
|
|
150
|
+
Overhead: 1.172
|
|
151
|
+
|
|
152
|
+
% soda decrypt-secret shared encrypted -o message
|
|
153
|
+
Overwrite the output file? (message) [y/N]: y
|
|
154
|
+
Plaintext: 239
|
|
155
|
+
Ciphertext: 280
|
|
156
|
+
Overhead: 1.172
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Another day, they share a password:
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
% echo qwerty | soda encrypt-password - message -p interactive > encrypted
|
|
163
|
+
Plaintext: 239
|
|
164
|
+
Ciphertext: 280
|
|
165
|
+
Overhead: 1.172
|
|
166
|
+
|
|
167
|
+
% echo qwerty | soda decrypt-password - encrypted -p interactive > plain
|
|
168
|
+
Plaintext: 239
|
|
169
|
+
Ciphertext: 280
|
|
170
|
+
Overhead: 1.172
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
## Key derivation
|
|
175
|
+
|
|
176
|
+
The KDF function derives the key from the password.
|
|
177
|
+
It accepts different profiles: interactive, moderate, and sensitive.
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
% echo qwerty > password
|
|
181
|
+
% time soda kdf password
|
|
182
|
+
jNLXU8/Ne5ZC8KuhDYqPUBg7xrxwv8J6yDJgCcFib9g=
|
|
183
|
+
real 0m7.850s
|
|
184
|
+
user 0m7.386s
|
|
185
|
+
sys 0m0.461s
|
|
186
|
+
|
|
187
|
+
% time soda kdf password --profile interactive
|
|
188
|
+
HqbvUXflAG+no3YS9njezZ3leyr8IwERAyeNoG2l41U=
|
|
189
|
+
real 0m0.295s
|
|
190
|
+
user 0m0.279s
|
|
191
|
+
sys 0m0.014s
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
## Text compression
|
|
196
|
+
|
|
197
|
+
That works as follows:
|
|
198
|
+
1. The plaintext is compressed with the compression lib
|
|
199
|
+
2. The 16-byte MAC and 24-byte nonce are added
|
|
200
|
+
3. The result is encoded with Base64, which adds ~25% overhead
|
|
201
|
+
|
|
202
|
+
Aside from the default zlib, there are more compression options. \
|
|
203
|
+
For a short message, the raw option provides smaller output.
|
|
204
|
+
For a long text, the bz2 showed the best results. \
|
|
205
|
+
Overall, encrypting a letter into 1.172 letters is a working solution.
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
% soda encrypt-public alice bob_pub message --compression zlib > /dev/null
|
|
209
|
+
Plaintext: 239
|
|
210
|
+
Ciphertext: 280
|
|
211
|
+
Overhead: 1.172
|
|
212
|
+
% soda encrypt-public alice bob_pub message --compression bz2 > /dev/null
|
|
213
|
+
Plaintext: 239
|
|
214
|
+
Ciphertext: 344
|
|
215
|
+
Overhead: 1.439
|
|
216
|
+
% soda encrypt-public alice bob_pub message --compression lzma > /dev/null
|
|
217
|
+
Plaintext: 239
|
|
218
|
+
Ciphertext: 324
|
|
219
|
+
Overhead: 1.356
|
|
220
|
+
% soda encrypt-public alice bob_pub message --compression raw > /dev/null
|
|
221
|
+
Plaintext: 239
|
|
222
|
+
Ciphertext: 372
|
|
223
|
+
Overhead: 1.556
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
## Encoding
|
|
228
|
+
|
|
229
|
+
The rtty-soda supports various encodings:
|
|
230
|
+
|
|
231
|
+
- Base26 (Latin)
|
|
232
|
+
- Base36 (Latin with numbers)
|
|
233
|
+
- Base64 (RFC 3548)
|
|
234
|
+
- Base94 (ASCII printable)
|
|
235
|
+
- Binary
|
|
236
|
+
|
|
237
|
+
```
|
|
238
|
+
% soda encrypt-public alice bob_pub message --data-encoding base36
|
|
239
|
+
|
|
240
|
+
67EG0R6HNKWJCVWF76SXDVXBUVR2L1CZ5WNZ2O1GHVM6488OGHZGIVX6GQE19V7VMSHFWOQD09GRIOOFSUXFRVG
|
|
241
|
+
M2UNVG9NN9X2113FA6JNQ8082WQ38YNQ5KUXHB82SD7HK4YHQDODYTA3O8WY93T6EG5ZX5JB9W1IETKC4D7TOHT
|
|
242
|
+
K7ZROL69IYLZVT9MCIPX7V6IX259F4RGC6PRKVNTP8HRLYZZVU4B1V5Y1HZV0AFGLEIPYECEKN7WC7ZL1YVTWJQ
|
|
243
|
+
458E5E9ZK4E731MCFO8USWBHJ7SM9PTK4IP5NFFB28WWS6KVWU9RBV1WL11MT
|
|
244
|
+
|
|
245
|
+
Plaintext: 239
|
|
246
|
+
Ciphertext: 322
|
|
247
|
+
Overhead: 1.347
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
## Compatibility
|
|
252
|
+
|
|
253
|
+
During the initial development (versions prior to 1.0.0),
|
|
254
|
+
I can break backwards compatibility.
|