rtty-soda 0.3.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.
@@ -0,0 +1,43 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ from nacl.public import PrivateKey
4
+
5
+ from rtty_soda.cryptography import kdf
6
+ from rtty_soda.encoders import ENCODERS, encode_str
7
+
8
+ from .service import Service
9
+
10
+ if TYPE_CHECKING:
11
+ from rtty_soda.formatters import Formatter
12
+ from rtty_soda.interfaces import Reader, Writer
13
+
14
+ __all__ = ["KeyService"]
15
+
16
+
17
+ class KeyService(Service):
18
+ def __init__(
19
+ self, encoding: str, formatter: Formatter, writer: Writer, verbose: bool
20
+ ) -> None:
21
+ super().__init__(formatter, writer, verbose)
22
+ self.encoder = ENCODERS.get(encoding)
23
+
24
+ def genkey(self) -> None:
25
+ key = bytes(PrivateKey.generate())
26
+ self.write_output(key, self.encoder)
27
+
28
+ def pubkey(self, priv_key: Reader) -> None:
29
+ priv_seed = self.read_input(priv_key, self.encoder)
30
+ priv = PrivateKey(private_key=priv_seed)
31
+ pub = bytes(priv.public_key)
32
+ self.write_output(pub, self.encoder)
33
+
34
+ @staticmethod
35
+ def derive_key(password: Reader, kdf_profile: str) -> bytes:
36
+ prof = kdf.KDF_PROFILES[kdf_profile]
37
+ pw_str = password.read_str().strip()
38
+ pw = encode_str(pw_str)
39
+ return kdf.kdf(password=pw, profile=prof)
40
+
41
+ def kdf(self, password: Reader, kdf_profile: str) -> None:
42
+ key = self.derive_key(password, kdf_profile)
43
+ self.write_output(key, self.encoder)
@@ -0,0 +1,52 @@
1
+ from typing import TYPE_CHECKING, NamedTuple
2
+
3
+ from rtty_soda.encoders import Encoder, encode_str
4
+ from rtty_soda.formatters import remove_whitespace
5
+
6
+ if TYPE_CHECKING:
7
+ from rtty_soda.formatters import Formatter
8
+ from rtty_soda.interfaces import Reader, Writer
9
+
10
+ __all__ = ["FormattedOutput", "Service"]
11
+
12
+
13
+ class FormattedOutput(NamedTuple):
14
+ data: bytes
15
+ chars: int
16
+ groups: int
17
+
18
+
19
+ class Service:
20
+ def __init__(
21
+ self, formatter: Formatter | None, writer: Writer, verbose: bool
22
+ ) -> None:
23
+ self.formatter = formatter
24
+ self.writer = writer
25
+ self.verbose = verbose
26
+
27
+ @staticmethod
28
+ def read_input(source: Reader, encoder: Encoder | None) -> bytes:
29
+ if encoder is None:
30
+ return source.read_bytes()
31
+
32
+ data = source.read_str()
33
+ data = remove_whitespace(data)
34
+ return encoder.decode(data)
35
+
36
+ def format_data(self, data: bytes, encoder: Encoder | None) -> FormattedOutput:
37
+ chars = 0
38
+ groups = 0
39
+ if encoder is not None and self.formatter is not None:
40
+ data_str = encoder.encode(data)
41
+ chars = len(data_str)
42
+ data_str, groups = self.formatter.format(data_str)
43
+ data = encode_str(data_str)
44
+
45
+ return FormattedOutput(data, chars, groups)
46
+
47
+ def write_output(self, data: bytes, encoder: Encoder | None) -> None:
48
+ buff = self.format_data(data, encoder)
49
+ self.writer.write_bytes(buff.data)
50
+ if self.verbose:
51
+ self.writer.write_diag(f"Length: {buff.chars}")
52
+ self.writer.write_diag(f"Groups: {buff.groups}")
@@ -0,0 +1,362 @@
1
+ Metadata-Version: 2.3
2
+ Name: rtty-soda
3
+ Version: 0.3.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.14
11
+ Classifier: Operating System :: POSIX
12
+ Classifier: Environment :: Console
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Topic :: Security :: Cryptography
15
+ Classifier: Topic :: Utilities
16
+ Requires-Dist: pynacl>=1.6.0,<2.0.0
17
+ Requires-Dist: scsu>=1.1.1,<2.0.0
18
+ Requires-Dist: click>=8.3.0,<9.0.0 ; extra == 'cli'
19
+ Requires-Dist: click-aliases>=1.0.5,<2.0.0 ; extra == 'cli'
20
+ Requires-Python: >=3.14, <4.0
21
+ Project-URL: github, https://github.com/theosaveliev/rtty-soda
22
+ Project-URL: issues, https://github.com/theosaveliev/rtty-soda/issues
23
+ Provides-Extra: cli
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
+ - Text compression (zstd, zlib, bz2, lzma)
37
+ - Custom encodings:
38
+ - Base26 (Latin)
39
+ - Base31 (Cyrillic)
40
+ - Base36 (Latin with numbers)
41
+ - Base64 (RFC 4648)
42
+ - Base94 (ASCII printable)
43
+ - Binary
44
+
45
+
46
+ ## Installation
47
+ #### Package manager
48
+
49
+ 1. [Install uv](https://docs.astral.sh/uv/getting-started/installation/)
50
+ 2. Install rtty-soda:
51
+ ```
52
+ % uv tool install "rtty-soda[cli]"
53
+ ```
54
+ 3. Remove rtty-soda:
55
+ ```
56
+ % uv tool uninstall rtty-soda
57
+ ```
58
+
59
+ #### Docker
60
+
61
+ ```
62
+ % docker run -it --rm -h rtty-soda -v .:/app/host nett/rtty-soda:0.3.2
63
+ % docker run -it --rm -h rtty-soda -v .:/app/host nett/rtty-soda:0.3.2-tools
64
+ ```
65
+
66
+
67
+ ## Getting help
68
+
69
+ All commands have `[-h | --help]` option.
70
+
71
+ ```
72
+ % soda
73
+ Usage: soda [OPTIONS] COMMAND [ARGS]...
74
+
75
+ Options:
76
+ --version Show the version and exit.
77
+ -h, --help Show this message and exit.
78
+
79
+ Commands:
80
+ decrypt-password (dp) Decrypt Message (Password).
81
+ decrypt-public (d) Decrypt Message (Public).
82
+ decrypt-secret (ds) Decrypt Message (Secret).
83
+ encode Encode File.
84
+ encrypt-password (ep) Encrypt Message (Password).
85
+ encrypt-public (e) Encrypt Message (Public).
86
+ encrypt-secret (es) Encrypt Message (Secret).
87
+ genkey Generate Private Key.
88
+ kdf Key Derivation Function.
89
+ pubkey Get Public Key.
90
+ ```
91
+
92
+ Some commands have aliases, so `% soda encrypt-password ...` and `% soda ep ...`
93
+ are equivalent.
94
+
95
+
96
+ ## Public Key encryption
97
+ #### Key generation
98
+
99
+ ```
100
+ % soda genkey | tee alice | soda pubkey - | tee alice_pub
101
+ R5xUCEhvkRRwQD+iWo2hV65fIsWucUZtiFJGKy6pTyA=
102
+
103
+ % soda genkey | tee bob | soda pubkey - | tee bob_pub
104
+ woNtqALnGLzp8VBuzJ8T13E4OZRv5YZy6kXMBpV8/mI=
105
+
106
+ % soda genkey -h
107
+ Usage: soda genkey [OPTIONS]
108
+
109
+ Generate Private Key.
110
+
111
+ Encoding: base26 | base31 | base36 | base64 | base94 | binary
112
+
113
+ Options:
114
+ -e, --encoding TEXT [default: base64]
115
+ -o, --output-file FILE Write output to file.
116
+ --group-len INTEGER [default: 0]
117
+ --line-len INTEGER [default: 80]
118
+ --padding INTEGER [default: 0]
119
+ -v, --verbose Show verbose output.
120
+ -h, --help Show this message and exit.
121
+ ```
122
+
123
+ #### Encryption
124
+
125
+ Alice sends the message to Bob:
126
+
127
+ ```
128
+ % cat message
129
+ A telegraph key is a specialized electrical switch used by a trained operator to
130
+ transmit text messages in Morse code in a telegraphy system.
131
+ The first telegraph key was invented by Alfred Vail, an associate of Samuel Morse.
132
+ (c) Wikipedia
133
+
134
+ % soda encrypt-public alice bob_pub message --group-len 79 | tee encrypted
135
+ q+zCgyCfHdlSHrcuyM/Yfw1+ZvqNRXgY0O7gGrauPyQlsI0MdPXoVlkfyKZUtg6Jcqn47d4BGLMBITo
136
+ y3Wp9+9FvI1rolCd7JmyIxRIHHYWqxux+czh88aDdGjbDQ2pRNX68TU33PylBDw/H+VfYSZ6fyw1xdJ
137
+ 005pJeEXCzpOXljvXMgAElBIFJ/vsluunrRI9Sw6WcnrCsPYFxTFRZVOvsq6U8PJwnhnaDyLW0Z28Op
138
+ dS71gNH/7xA7P1LbFwxSD0jAjDqPZdLYkPzd94=
139
+
140
+ % soda encrypt-public -h
141
+ Usage: soda encrypt-public [OPTIONS] PRIVATE_KEY_FILE PUBLIC_KEY_FILE
142
+ MESSAGE_FILE
143
+
144
+ Encrypt Message (Public).
145
+
146
+ Encoding: base26 | base31 | base36 | base64 | base94 | binary
147
+
148
+ Compression: zstd | zlib | bz2 | lzma | raw
149
+
150
+ Options:
151
+ -t, --text Treat message as text (binary if not specified).
152
+ --key-encoding TEXT [default: base64]
153
+ -e, --data-encoding TEXT [default: base64]
154
+ -c, --compression TEXT [default: zstd]
155
+ -o, --output-file FILE Write output to file.
156
+ --group-len INTEGER [default: 0]
157
+ --line-len INTEGER [default: 80]
158
+ --padding INTEGER [default: 0]
159
+ -v, --verbose Show verbose output.
160
+ -h, --help Show this message and exit.
161
+ ```
162
+
163
+ #### Decryption
164
+
165
+ ```
166
+ % soda decrypt-public bob alice_pub encrypted
167
+ A telegraph key is a specialized electrical switch used by a trained operator to
168
+ transmit text messages in Morse code in a telegraphy system.
169
+ The first telegraph key was invented by Alfred Vail, an associate of Samuel Morse.
170
+ (c) Wikipedia
171
+ ```
172
+
173
+
174
+ ## Secret Key encryption
175
+
176
+ Alice and Bob share a key for symmetric encryption:
177
+
178
+ ```
179
+ % soda genkey > shared
180
+ % soda encrypt-secret shared message -o encrypted
181
+ % soda decrypt-secret shared encrypted -o message
182
+ ```
183
+
184
+ Another day, they share a password:
185
+
186
+ ```
187
+ % echo qwerty | soda encrypt-password - message -p interactive -o encrypted
188
+ % echo qwerty | soda decrypt-password - encrypted -p interactive -o message
189
+ ```
190
+
191
+
192
+ ## Key derivation
193
+
194
+ The KDF function derives the key from the password.
195
+ It accepts different profiles: interactive, moderate, and sensitive.
196
+
197
+ ```
198
+ % echo qwerty | soda kdf --profile interactive -
199
+ HqbvUXflAG+no3YS9njezZ3leyr8IwERAyeNoG2l41U=
200
+
201
+ % soda kdf -h
202
+ Usage: soda kdf [OPTIONS] PASSWORD_FILE
203
+
204
+ Key Derivation Function.
205
+
206
+ Encoding: base26 | base31 | base36 | base64 | base94 | binary
207
+
208
+ Profile: interactive | moderate | sensitive
209
+
210
+ Options:
211
+ -e, --encoding TEXT [default: base64]
212
+ -p, --profile TEXT [default: sensitive]
213
+ -o, --output-file FILE Write output to file.
214
+ --group-len INTEGER [default: 0]
215
+ --line-len INTEGER [default: 80]
216
+ --padding INTEGER [default: 0]
217
+ -v, --verbose Show verbose output.
218
+ -h, --help Show this message and exit.
219
+ ```
220
+
221
+
222
+ ## Text compression
223
+
224
+ That works as follows:
225
+ 1. The plaintext is compressed with the compression lib
226
+ 2. The 16-byte MAC and 24-byte nonce are added
227
+ 3. The result is encoded with Base64, which adds ~25% overhead
228
+
229
+ ```
230
+ % soda es shared message -c zstd -v > /dev/null
231
+ Groups: 0
232
+ Plaintext: 239
233
+ Ciphertext: 276
234
+ Overhead: 1.155
235
+ % soda es shared message -c zlib -v > /dev/null
236
+ Groups: 0
237
+ Plaintext: 239
238
+ Ciphertext: 280
239
+ Overhead: 1.172
240
+ % soda es shared message -c bz2 -v > /dev/null
241
+ Groups: 0
242
+ Plaintext: 239
243
+ Ciphertext: 340
244
+ Overhead: 1.423
245
+ % soda es shared message -c lzma -v > /dev/null
246
+ Groups: 0
247
+ Plaintext: 239
248
+ Ciphertext: 324
249
+ Overhead: 1.356
250
+ % soda es shared message -c raw -v > /dev/null
251
+ Groups: 0
252
+ Plaintext: 239
253
+ Ciphertext: 372
254
+ Overhead: 1.556
255
+ ```
256
+
257
+ When working with Unicode messages, enabling SCSU encoding can save
258
+ up to 15-50% of space. To achieve this, pass the `--text` flag to both
259
+ encryption and decryption commands. This instructs rtty-soda to
260
+ read the message as text, applying SCSU automatically.
261
+
262
+
263
+ ## Encoding
264
+
265
+ The rtty-soda supports various encodings:
266
+
267
+ ```
268
+ % soda encrypt-public alice bob_pub message --data-encoding base36 --group-len 5
269
+ 9URCN ARRN8 MSE7G G9980 37D8S 568QP 16AZW TOHAI KYP5W VAK7R VZ6YO GZ38A QOIP7
270
+ 60P2E GWWOG DSHDD EG2TZ 7PSZM 7FKBX 50TAD RHS2E VM063 N297Y 753BP TLUX0 9K8BD
271
+ DZF8O 7TPUG MJV4R T2C92 HU1G8 KGJCN URU1F 9COP9 EFLZO BSL2V 171DS 2HKPE JY2GY
272
+ V86IT T0HBR 9B08H M9R2V IEM7A R91IF UWQYM ZV4JN 7YU3K ILPJY E8OMA NWQC5 Q6BG7
273
+ PXM4I 9UU9E J9IRU HSZ41 RPZQG XTDC6 E5NMS B4HBQ 7QRI2 RRUYH HSHGQ 7USN
274
+ ```
275
+
276
+
277
+ ## Environment variables
278
+
279
+ Common options can be set in the environment variables:
280
+
281
+ ```
282
+ % cat ~/.soda/ru.env
283
+ TEXT=1
284
+ KEY_ENCODING=base31
285
+ DATA_ENCODING=base31
286
+ COMPRESSION=zlib
287
+ KDF_PROFILE=sensitive
288
+ GROUP_LEN=5
289
+ LINE_LEN=69
290
+ PADDING=0
291
+ VERBOSE=0
292
+ ```
293
+
294
+
295
+ ## Tutorial for the Underground Moscow Museum
296
+
297
+ ```
298
+ % docker run -it --rm -h rtty-soda -v .:/app/host nett/rtty-soda:0.3.2-tools
299
+ % set -a
300
+ % source ~/.soda/ru.env
301
+
302
+ % soda genkey | tee 173-закрытый | soda pubkey - | tee 173-публичный
303
+ ЖАЯГЭ ШЦДФР ТЮУОЮ ШМЕВР НЬИЛР ИЫФЧД БФГЫП КЮДЫЛ ОРЫКВ СБХЕЫ СУ
304
+ % soda genkey | tee 305-закрытый | soda pubkey - | tee 305-публичный
305
+ ЙОАРЫ РОЮЩЯ ШВМПФ ЛТЬТЕ ЫПКУС ДЧББЮ ЦХКХА РЖЯМС ХНТИУ ФЙСКВ ЙЛ
306
+
307
+ % cat телеграмма
308
+ Телетайп — стартстопный приёмно-передающий телеграфный аппарат с клавиатурой
309
+ как у пищущей машинки, применявшийся также в качестве терминала устройств
310
+ вычислительной техники.
311
+ Наиболее совершенные телетайпы являются полностью электронными устройствами
312
+ и используют дисплей вместо принтера.
313
+ (c) Wikipedia
314
+
315
+ % soda e 173-закрытый 305-публичный телеграмма -v
316
+ КЭСМЗ ЛЖЧЧЮ ЧЛФРД ЩЦЛЮМ ГКЗФР ИРФНЗ ЧКАЗЛ РОМЩЮ БХМПФ ЧРТПМ ЙРЧМВ
317
+ ЦТСМГ ХЛЯЯП УНИИХ УДЗГН ЙЧЭЙЕ ЛМХСШ ВЭЯКШ ЫРЯЯХ ШЖЫОЯ ХГТПЖ ШКСЛЛ
318
+ ЖДЗЮИ ВФЭВЧ ЖГКЩШ ТЧТАД ЖАЭГР ДТЙЬЬ ЧАПБТ ЮРЬТА ЫШЦКБ ЗЛГГС ЙЮСЧБ
319
+ АЙАЯФ ЦХРЯМ ЧТЮУТ ЭЕЙРШ УТКЛЯ УЫЧКЬ ЖСФЬЯ ЗХПЙС СЯМЗВ АЗСФЭ РФЦНХ
320
+ ЖИТЗЕ ХЦГЛЗ ЗЭМЗК ОЯЦГЦ ВМОНР ЬЫДРВ ХПЭЭТ ИАШЯК ХРЮБС ЬЭВТМ ЛПФЦВ
321
+ ЙЙИЖГ ЦЯАЩЦ ОЙФЯК ЕОЭЯЗ ЧЕПЖЗ КЕВЩИ ХОПЛХ ЖХЖЛМ ШАТЬФ ТШФЖУ ЩРСЛТ
322
+ НРПСК ЯЮХЬЭ МВХХЭ ИИЗЙВ ВЯФДЬ УЗЫФИ ЛГХЩЬ СЯЛХА ХЭТАГ ВАЩЛГ ЖЦФБЕ
323
+ ЖОБЮЗ ЛФЩЙЛ ОЩЦПЧ ЗЖИЙЭ ЫРШЭТ ОЯВРФ ХНКВС ЩЬХЭМ ЙЛЧТС ММЭДО ШЬНКР
324
+ ВФСТ
325
+ Groups: 89
326
+ Plaintext: 302
327
+ Ciphertext: 444
328
+ Overhead: 1.470
329
+ ```
330
+
331
+
332
+ ## Alternative usage
333
+
334
+ - Password source
335
+ ```
336
+ % echo 'A line from a book or a poem' | soda kdf - -e base94
337
+ wN/K.@3Q#]Czn4kk3(negX=R|*xvvPQmk'XW$-s
338
+ ```
339
+
340
+ - WireGuard keyer
341
+ ```
342
+ % echo 'A line from a book or a poem' | soda kdf - -o privkey
343
+ % cat privkey
344
+ thyA4dlQgg93+rQj/evBbBymw82GTwQCh3RJ0I6GOsY=
345
+ % soda pubkey privkey
346
+ ruIUMqbUtyqRVSIBLSGI7AOruE2DLWgTe9o+h7Yktkw=
347
+ % cat privkey | wg pubkey
348
+ ruIUMqbUtyqRVSIBLSGI7AOruE2DLWgTe9o+h7Yktkw=
349
+ ```
350
+
351
+
352
+ ## Compatibility
353
+
354
+ During the initial development (versions prior to 1.0.0),
355
+ I can break backwards compatibility.
356
+
357
+
358
+ ## Releases
359
+
360
+ This project follows a rolling release cycle.
361
+ Each version bump represents where I completed a full test cycle.
362
+ When testing passes successfully, I commit and release - so every release is a verified stable point.
@@ -0,0 +1,34 @@
1
+ rtty_soda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ rtty_soda/archivers.py,sha256=HvruHvxtHeMeB1-kTBCFrA92NohIJSOTNQ4NdFWZOcM,1259
3
+ rtty_soda/cli/__init__.py,sha256=hhemjt3-8eF3JXQ12HYTB_nL41TXTrMAdsMRYxarPOc,185
4
+ rtty_soda/cli/cli_options.py,sha256=HiBLgJg0PbJV-Y8EiI_zDDg_Co_9P2kCs8OLlt-ta9A,3002
5
+ rtty_soda/cli/cli_reader.py,sha256=iCcvWR2InWJ38gSgVXhM42zYYhypMMGterunYxyotqg,624
6
+ rtty_soda/cli/cli_writer.py,sha256=tXAlE9-jzYj4pT-6QuegARg9a1TXnUqO5Zlzun0Kf-g,1155
7
+ rtty_soda/cli/main.py,sha256=JxUrHafMPJ5vWyacodcvCha6lgrIGm6vkH9blA1HBRw,11028
8
+ rtty_soda/cli/main.pyi,sha256=A8ytzT0AX9a-ARjUYrVIEeSusaKSdtRpm_QhdP2V0wg,2299
9
+ rtty_soda/cryptography/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ rtty_soda/cryptography/kdf.py,sha256=HymfTiK7BD7lhZu0OdtFW_i-v0r7e8XedT8_Q84ClJc,1529
11
+ rtty_soda/cryptography/public.py,sha256=6gwsT4ilaMDHwtdYPOEYlX8IfwHPew8lMIbxRva1mLs,612
12
+ rtty_soda/cryptography/secret.py,sha256=N5ytktC2oxYfTFew0utytEClWK2rMvcnxlqeppR7wDQ,529
13
+ rtty_soda/encoders/__init__.py,sha256=SFKsywPyFURgwI9mQhC3cH8VE6sD2Wwm4ZK1mfoR-q0,748
14
+ rtty_soda/encoders/base26_encoder.py,sha256=IJXYPtbx9YIhUJuIcT9U1FqtFb-NHc4SeinCq2XDQxM,403
15
+ rtty_soda/encoders/base31_encoder.py,sha256=Xyfam773ouuXOeRfUCj4fUMmB2tzhrKVD0Phg_YbVxc,430
16
+ rtty_soda/encoders/base36_encoder.py,sha256=nFchzvFmSNiqIZ0_HYJZzkSZNNfhiWRSQzYkZWOWrNE,419
17
+ rtty_soda/encoders/base64_encoder.py,sha256=DzZkBxx3Lr9gr_jHEcNpGWaTyGDEntrrneaOCG6GT1I,364
18
+ rtty_soda/encoders/base94_encoder.py,sha256=9sRGWVGB8No0hn3cig4k5P-ZY1VX3q-pmHf93U6SyEk,407
19
+ rtty_soda/encoders/encoder.py,sha256=0nufik44s1g00MiB-TfwmgGA1WCe2CQJX1x6WZPvXlo,195
20
+ rtty_soda/encoders/functions.py,sha256=JxtgbZg3kdbFqAhjm59QwJS6zEXYsR1m02k7cg_rFI4,1385
21
+ rtty_soda/encoders/scsu.py,sha256=W7csQHRV9W62h3_F3VNFFAmWV0oZ2lhc6SxM-E3Kn7I,571
22
+ rtty_soda/encoders/scsu_stubs.pyi,sha256=jmzY1Gm8etztGJXwHhjuQ7Uaf75PhNU7nvBo728pPi8,309
23
+ rtty_soda/formatters.py,sha256=sECdQiQKpQe44S6T0VlkZFcqO_TSniC7mqjJoc4KuUI,1350
24
+ rtty_soda/interfaces.py,sha256=7CB5EZI9ctvk6c4NJyRPWaw-ATMvt6cyRTs66B9jO2o,370
25
+ rtty_soda/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ rtty_soda/services/__init__.py,sha256=eDG9XvAGSiZzsTGOk_mhjVfwz1SOblpOx07ZaSVdaDs,339
27
+ rtty_soda/services/encoding_service.py,sha256=O7qmR_D1eW6-lVSyvrTM8q3wXIwWmyti-6PeEpiqay8,772
28
+ rtty_soda/services/encryption_service.py,sha256=6SW2yDT0l8AL5pre7Wk9xKcl8GWBylFpHk2_CQZ0D-Q,4558
29
+ rtty_soda/services/key_service.py,sha256=plS-yL_mH3rveqQFMM8CJDenR4WcoklagCPvVSRdoeg,1354
30
+ rtty_soda/services/service.py,sha256=5QykTVgYvoiC325knCSHV5yPIq7hToGylBLccqm4myM,1605
31
+ rtty_soda-0.3.2.dist-info/WHEEL,sha256=DpNsHFUm_gffZe1FgzmqwuqiuPC6Y-uBCzibcJcdupM,78
32
+ rtty_soda-0.3.2.dist-info/entry_points.txt,sha256=3a-nlDu4rktJdHzeVEWJMPUoEyybCBXmpz9FkVR878s,49
33
+ rtty_soda-0.3.2.dist-info/METADATA,sha256=E4Wb-o8dLaSsx_piUsUlfu5Zt5gZdLIRfDpsUpPxA3A,11229
34
+ rtty_soda-0.3.2.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: uv 0.9.8
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ soda = rtty_soda.cli.main:cli
3
+