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.

Files changed (578) hide show
  1. rtty_soda/.DS_Store +0 -0
  2. rtty_soda/.mypy_cache/.gitignore +2 -0
  3. rtty_soda/.mypy_cache/3.13/@plugins_snapshot.json +1 -0
  4. rtty_soda/.mypy_cache/3.13/__future__.data.json +1 -0
  5. rtty_soda/.mypy_cache/3.13/__future__.meta.json +1 -0
  6. rtty_soda/.mypy_cache/3.13/_ast.data.json +1 -0
  7. rtty_soda/.mypy_cache/3.13/_ast.meta.json +1 -0
  8. rtty_soda/.mypy_cache/3.13/_bz2.data.json +1 -0
  9. rtty_soda/.mypy_cache/3.13/_bz2.meta.json +1 -0
  10. rtty_soda/.mypy_cache/3.13/_codecs.data.json +1 -0
  11. rtty_soda/.mypy_cache/3.13/_codecs.meta.json +1 -0
  12. rtty_soda/.mypy_cache/3.13/_collections_abc.data.json +1 -0
  13. rtty_soda/.mypy_cache/3.13/_collections_abc.meta.json +1 -0
  14. rtty_soda/.mypy_cache/3.13/_compression.data.json +1 -0
  15. rtty_soda/.mypy_cache/3.13/_compression.meta.json +1 -0
  16. rtty_soda/.mypy_cache/3.13/_contextvars.data.json +1 -0
  17. rtty_soda/.mypy_cache/3.13/_contextvars.meta.json +1 -0
  18. rtty_soda/.mypy_cache/3.13/_decimal.data.json +1 -0
  19. rtty_soda/.mypy_cache/3.13/_decimal.meta.json +1 -0
  20. rtty_soda/.mypy_cache/3.13/_frozen_importlib.data.json +1 -0
  21. rtty_soda/.mypy_cache/3.13/_frozen_importlib.meta.json +1 -0
  22. rtty_soda/.mypy_cache/3.13/_frozen_importlib_external.data.json +1 -0
  23. rtty_soda/.mypy_cache/3.13/_frozen_importlib_external.meta.json +1 -0
  24. rtty_soda/.mypy_cache/3.13/_io.data.json +1 -0
  25. rtty_soda/.mypy_cache/3.13/_io.meta.json +1 -0
  26. rtty_soda/.mypy_cache/3.13/_lzma.data.json +1 -0
  27. rtty_soda/.mypy_cache/3.13/_lzma.meta.json +1 -0
  28. rtty_soda/.mypy_cache/3.13/_operator.data.json +1 -0
  29. rtty_soda/.mypy_cache/3.13/_operator.meta.json +1 -0
  30. rtty_soda/.mypy_cache/3.13/_pickle.data.json +1 -0
  31. rtty_soda/.mypy_cache/3.13/_pickle.meta.json +1 -0
  32. rtty_soda/.mypy_cache/3.13/_sitebuiltins.data.json +1 -0
  33. rtty_soda/.mypy_cache/3.13/_sitebuiltins.meta.json +1 -0
  34. rtty_soda/.mypy_cache/3.13/_stat.data.json +1 -0
  35. rtty_soda/.mypy_cache/3.13/_stat.meta.json +1 -0
  36. rtty_soda/.mypy_cache/3.13/_thread.data.json +1 -0
  37. rtty_soda/.mypy_cache/3.13/_thread.meta.json +1 -0
  38. rtty_soda/.mypy_cache/3.13/_typeshed/__init__.data.json +1 -0
  39. rtty_soda/.mypy_cache/3.13/_typeshed/__init__.meta.json +1 -0
  40. rtty_soda/.mypy_cache/3.13/_typeshed/importlib.data.json +1 -0
  41. rtty_soda/.mypy_cache/3.13/_typeshed/importlib.meta.json +1 -0
  42. rtty_soda/.mypy_cache/3.13/_warnings.data.json +1 -0
  43. rtty_soda/.mypy_cache/3.13/_warnings.meta.json +1 -0
  44. rtty_soda/.mypy_cache/3.13/_weakref.data.json +1 -0
  45. rtty_soda/.mypy_cache/3.13/_weakref.meta.json +1 -0
  46. rtty_soda/.mypy_cache/3.13/_weakrefset.data.json +1 -0
  47. rtty_soda/.mypy_cache/3.13/_weakrefset.meta.json +1 -0
  48. rtty_soda/.mypy_cache/3.13/abc.data.json +1 -0
  49. rtty_soda/.mypy_cache/3.13/abc.meta.json +1 -0
  50. rtty_soda/.mypy_cache/3.13/annotated_types/__init__.data.json +1 -0
  51. rtty_soda/.mypy_cache/3.13/annotated_types/__init__.meta.json +1 -0
  52. rtty_soda/.mypy_cache/3.13/argparse.data.json +1 -0
  53. rtty_soda/.mypy_cache/3.13/argparse.meta.json +1 -0
  54. rtty_soda/.mypy_cache/3.13/ast.data.json +1 -0
  55. rtty_soda/.mypy_cache/3.13/ast.meta.json +1 -0
  56. rtty_soda/.mypy_cache/3.13/base64.data.json +1 -0
  57. rtty_soda/.mypy_cache/3.13/base64.meta.json +1 -0
  58. rtty_soda/.mypy_cache/3.13/binascii.data.json +1 -0
  59. rtty_soda/.mypy_cache/3.13/binascii.meta.json +1 -0
  60. rtty_soda/.mypy_cache/3.13/builtins.data.json +1 -0
  61. rtty_soda/.mypy_cache/3.13/builtins.meta.json +1 -0
  62. rtty_soda/.mypy_cache/3.13/bz2.data.json +1 -0
  63. rtty_soda/.mypy_cache/3.13/bz2.meta.json +1 -0
  64. rtty_soda/.mypy_cache/3.13/click/__init__.data.json +1 -0
  65. rtty_soda/.mypy_cache/3.13/click/__init__.meta.json +1 -0
  66. rtty_soda/.mypy_cache/3.13/click/_compat.data.json +1 -0
  67. rtty_soda/.mypy_cache/3.13/click/_compat.meta.json +1 -0
  68. rtty_soda/.mypy_cache/3.13/click/_termui_impl.data.json +1 -0
  69. rtty_soda/.mypy_cache/3.13/click/_termui_impl.meta.json +1 -0
  70. rtty_soda/.mypy_cache/3.13/click/core.data.json +1 -0
  71. rtty_soda/.mypy_cache/3.13/click/core.meta.json +1 -0
  72. rtty_soda/.mypy_cache/3.13/click/decorators.data.json +1 -0
  73. rtty_soda/.mypy_cache/3.13/click/decorators.meta.json +1 -0
  74. rtty_soda/.mypy_cache/3.13/click/exceptions.data.json +1 -0
  75. rtty_soda/.mypy_cache/3.13/click/exceptions.meta.json +1 -0
  76. rtty_soda/.mypy_cache/3.13/click/formatting.data.json +1 -0
  77. rtty_soda/.mypy_cache/3.13/click/formatting.meta.json +1 -0
  78. rtty_soda/.mypy_cache/3.13/click/globals.data.json +1 -0
  79. rtty_soda/.mypy_cache/3.13/click/globals.meta.json +1 -0
  80. rtty_soda/.mypy_cache/3.13/click/parser.data.json +1 -0
  81. rtty_soda/.mypy_cache/3.13/click/parser.meta.json +1 -0
  82. rtty_soda/.mypy_cache/3.13/click/shell_completion.data.json +1 -0
  83. rtty_soda/.mypy_cache/3.13/click/shell_completion.meta.json +1 -0
  84. rtty_soda/.mypy_cache/3.13/click/termui.data.json +1 -0
  85. rtty_soda/.mypy_cache/3.13/click/termui.meta.json +1 -0
  86. rtty_soda/.mypy_cache/3.13/click/types.data.json +1 -0
  87. rtty_soda/.mypy_cache/3.13/click/types.meta.json +1 -0
  88. rtty_soda/.mypy_cache/3.13/click/utils.data.json +1 -0
  89. rtty_soda/.mypy_cache/3.13/click/utils.meta.json +1 -0
  90. rtty_soda/.mypy_cache/3.13/click_aliases/__init__.data.json +1 -0
  91. rtty_soda/.mypy_cache/3.13/click_aliases/__init__.meta.json +1 -0
  92. rtty_soda/.mypy_cache/3.13/codecs.data.json +1 -0
  93. rtty_soda/.mypy_cache/3.13/codecs.meta.json +1 -0
  94. rtty_soda/.mypy_cache/3.13/collections/__init__.data.json +1 -0
  95. rtty_soda/.mypy_cache/3.13/collections/__init__.meta.json +1 -0
  96. rtty_soda/.mypy_cache/3.13/collections/abc.data.json +1 -0
  97. rtty_soda/.mypy_cache/3.13/collections/abc.meta.json +1 -0
  98. rtty_soda/.mypy_cache/3.13/colorsys.data.json +1 -0
  99. rtty_soda/.mypy_cache/3.13/colorsys.meta.json +1 -0
  100. rtty_soda/.mypy_cache/3.13/contextlib.data.json +1 -0
  101. rtty_soda/.mypy_cache/3.13/contextlib.meta.json +1 -0
  102. rtty_soda/.mypy_cache/3.13/contextvars.data.json +1 -0
  103. rtty_soda/.mypy_cache/3.13/contextvars.meta.json +1 -0
  104. rtty_soda/.mypy_cache/3.13/copy.data.json +1 -0
  105. rtty_soda/.mypy_cache/3.13/copy.meta.json +1 -0
  106. rtty_soda/.mypy_cache/3.13/crc/__init__.data.json +1 -0
  107. rtty_soda/.mypy_cache/3.13/crc/__init__.meta.json +1 -0
  108. rtty_soda/.mypy_cache/3.13/crc/_crc.data.json +1 -0
  109. rtty_soda/.mypy_cache/3.13/crc/_crc.meta.json +1 -0
  110. rtty_soda/.mypy_cache/3.13/dataclasses.data.json +1 -0
  111. rtty_soda/.mypy_cache/3.13/dataclasses.meta.json +1 -0
  112. rtty_soda/.mypy_cache/3.13/datetime.data.json +1 -0
  113. rtty_soda/.mypy_cache/3.13/datetime.meta.json +1 -0
  114. rtty_soda/.mypy_cache/3.13/decimal.data.json +1 -0
  115. rtty_soda/.mypy_cache/3.13/decimal.meta.json +1 -0
  116. rtty_soda/.mypy_cache/3.13/difflib.data.json +1 -0
  117. rtty_soda/.mypy_cache/3.13/difflib.meta.json +1 -0
  118. rtty_soda/.mypy_cache/3.13/dis.data.json +1 -0
  119. rtty_soda/.mypy_cache/3.13/dis.meta.json +1 -0
  120. rtty_soda/.mypy_cache/3.13/email/__init__.data.json +1 -0
  121. rtty_soda/.mypy_cache/3.13/email/__init__.meta.json +1 -0
  122. rtty_soda/.mypy_cache/3.13/email/_policybase.data.json +1 -0
  123. rtty_soda/.mypy_cache/3.13/email/_policybase.meta.json +1 -0
  124. rtty_soda/.mypy_cache/3.13/email/charset.data.json +1 -0
  125. rtty_soda/.mypy_cache/3.13/email/charset.meta.json +1 -0
  126. rtty_soda/.mypy_cache/3.13/email/contentmanager.data.json +1 -0
  127. rtty_soda/.mypy_cache/3.13/email/contentmanager.meta.json +1 -0
  128. rtty_soda/.mypy_cache/3.13/email/errors.data.json +1 -0
  129. rtty_soda/.mypy_cache/3.13/email/errors.meta.json +1 -0
  130. rtty_soda/.mypy_cache/3.13/email/header.data.json +1 -0
  131. rtty_soda/.mypy_cache/3.13/email/header.meta.json +1 -0
  132. rtty_soda/.mypy_cache/3.13/email/message.data.json +1 -0
  133. rtty_soda/.mypy_cache/3.13/email/message.meta.json +1 -0
  134. rtty_soda/.mypy_cache/3.13/email/policy.data.json +1 -0
  135. rtty_soda/.mypy_cache/3.13/email/policy.meta.json +1 -0
  136. rtty_soda/.mypy_cache/3.13/enum.data.json +1 -0
  137. rtty_soda/.mypy_cache/3.13/enum.meta.json +1 -0
  138. rtty_soda/.mypy_cache/3.13/errno.data.json +1 -0
  139. rtty_soda/.mypy_cache/3.13/errno.meta.json +1 -0
  140. rtty_soda/.mypy_cache/3.13/fractions.data.json +1 -0
  141. rtty_soda/.mypy_cache/3.13/fractions.meta.json +1 -0
  142. rtty_soda/.mypy_cache/3.13/functools.data.json +1 -0
  143. rtty_soda/.mypy_cache/3.13/functools.meta.json +1 -0
  144. rtty_soda/.mypy_cache/3.13/genericpath.data.json +1 -0
  145. rtty_soda/.mypy_cache/3.13/genericpath.meta.json +1 -0
  146. rtty_soda/.mypy_cache/3.13/gettext.data.json +1 -0
  147. rtty_soda/.mypy_cache/3.13/gettext.meta.json +1 -0
  148. rtty_soda/.mypy_cache/3.13/gzip.data.json +1 -0
  149. rtty_soda/.mypy_cache/3.13/gzip.meta.json +1 -0
  150. rtty_soda/.mypy_cache/3.13/importlib/__init__.data.json +1 -0
  151. rtty_soda/.mypy_cache/3.13/importlib/__init__.meta.json +1 -0
  152. rtty_soda/.mypy_cache/3.13/importlib/_abc.data.json +1 -0
  153. rtty_soda/.mypy_cache/3.13/importlib/_abc.meta.json +1 -0
  154. rtty_soda/.mypy_cache/3.13/importlib/_bootstrap.data.json +1 -0
  155. rtty_soda/.mypy_cache/3.13/importlib/_bootstrap.meta.json +1 -0
  156. rtty_soda/.mypy_cache/3.13/importlib/_bootstrap_external.data.json +1 -0
  157. rtty_soda/.mypy_cache/3.13/importlib/_bootstrap_external.meta.json +1 -0
  158. rtty_soda/.mypy_cache/3.13/importlib/abc.data.json +1 -0
  159. rtty_soda/.mypy_cache/3.13/importlib/abc.meta.json +1 -0
  160. rtty_soda/.mypy_cache/3.13/importlib/machinery.data.json +1 -0
  161. rtty_soda/.mypy_cache/3.13/importlib/machinery.meta.json +1 -0
  162. rtty_soda/.mypy_cache/3.13/importlib/metadata/__init__.data.json +1 -0
  163. rtty_soda/.mypy_cache/3.13/importlib/metadata/__init__.meta.json +1 -0
  164. rtty_soda/.mypy_cache/3.13/importlib/metadata/_meta.data.json +1 -0
  165. rtty_soda/.mypy_cache/3.13/importlib/metadata/_meta.meta.json +1 -0
  166. rtty_soda/.mypy_cache/3.13/importlib/readers.data.json +1 -0
  167. rtty_soda/.mypy_cache/3.13/importlib/readers.meta.json +1 -0
  168. rtty_soda/.mypy_cache/3.13/importlib/resources/__init__.data.json +1 -0
  169. rtty_soda/.mypy_cache/3.13/importlib/resources/__init__.meta.json +1 -0
  170. rtty_soda/.mypy_cache/3.13/importlib/resources/_common.data.json +1 -0
  171. rtty_soda/.mypy_cache/3.13/importlib/resources/_common.meta.json +1 -0
  172. rtty_soda/.mypy_cache/3.13/importlib/resources/_functional.data.json +1 -0
  173. rtty_soda/.mypy_cache/3.13/importlib/resources/_functional.meta.json +1 -0
  174. rtty_soda/.mypy_cache/3.13/importlib/resources/abc.data.json +1 -0
  175. rtty_soda/.mypy_cache/3.13/importlib/resources/abc.meta.json +1 -0
  176. rtty_soda/.mypy_cache/3.13/inspect.data.json +1 -0
  177. rtty_soda/.mypy_cache/3.13/inspect.meta.json +1 -0
  178. rtty_soda/.mypy_cache/3.13/io.data.json +1 -0
  179. rtty_soda/.mypy_cache/3.13/io.meta.json +1 -0
  180. rtty_soda/.mypy_cache/3.13/ipaddress.data.json +1 -0
  181. rtty_soda/.mypy_cache/3.13/ipaddress.meta.json +1 -0
  182. rtty_soda/.mypy_cache/3.13/itertools.data.json +1 -0
  183. rtty_soda/.mypy_cache/3.13/itertools.meta.json +1 -0
  184. rtty_soda/.mypy_cache/3.13/json/__init__.data.json +1 -0
  185. rtty_soda/.mypy_cache/3.13/json/__init__.meta.json +1 -0
  186. rtty_soda/.mypy_cache/3.13/json/decoder.data.json +1 -0
  187. rtty_soda/.mypy_cache/3.13/json/decoder.meta.json +1 -0
  188. rtty_soda/.mypy_cache/3.13/json/encoder.data.json +1 -0
  189. rtty_soda/.mypy_cache/3.13/json/encoder.meta.json +1 -0
  190. rtty_soda/.mypy_cache/3.13/keyword.data.json +1 -0
  191. rtty_soda/.mypy_cache/3.13/keyword.meta.json +1 -0
  192. rtty_soda/.mypy_cache/3.13/lzma.data.json +1 -0
  193. rtty_soda/.mypy_cache/3.13/lzma.meta.json +1 -0
  194. rtty_soda/.mypy_cache/3.13/math.data.json +1 -0
  195. rtty_soda/.mypy_cache/3.13/math.meta.json +1 -0
  196. rtty_soda/.mypy_cache/3.13/nacl/__init__.data.json +1 -0
  197. rtty_soda/.mypy_cache/3.13/nacl/__init__.meta.json +1 -0
  198. rtty_soda/.mypy_cache/3.13/nacl/bindings/__init__.data.json +1 -0
  199. rtty_soda/.mypy_cache/3.13/nacl/bindings/__init__.meta.json +1 -0
  200. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_aead.data.json +1 -0
  201. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_aead.meta.json +1 -0
  202. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_box.data.json +1 -0
  203. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_box.meta.json +1 -0
  204. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_core.data.json +1 -0
  205. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_core.meta.json +1 -0
  206. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_generichash.data.json +1 -0
  207. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_generichash.meta.json +1 -0
  208. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_hash.data.json +1 -0
  209. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_hash.meta.json +1 -0
  210. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_kx.data.json +1 -0
  211. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_kx.meta.json +1 -0
  212. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_pwhash.data.json +1 -0
  213. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_pwhash.meta.json +1 -0
  214. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_scalarmult.data.json +1 -0
  215. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_scalarmult.meta.json +1 -0
  216. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_secretbox.data.json +1 -0
  217. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_secretbox.meta.json +1 -0
  218. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_secretstream.data.json +1 -0
  219. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_secretstream.meta.json +1 -0
  220. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_shorthash.data.json +1 -0
  221. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_shorthash.meta.json +1 -0
  222. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_sign.data.json +1 -0
  223. rtty_soda/.mypy_cache/3.13/nacl/bindings/crypto_sign.meta.json +1 -0
  224. rtty_soda/.mypy_cache/3.13/nacl/bindings/randombytes.data.json +1 -0
  225. rtty_soda/.mypy_cache/3.13/nacl/bindings/randombytes.meta.json +1 -0
  226. rtty_soda/.mypy_cache/3.13/nacl/bindings/sodium_core.data.json +1 -0
  227. rtty_soda/.mypy_cache/3.13/nacl/bindings/sodium_core.meta.json +1 -0
  228. rtty_soda/.mypy_cache/3.13/nacl/bindings/utils.data.json +1 -0
  229. rtty_soda/.mypy_cache/3.13/nacl/bindings/utils.meta.json +1 -0
  230. rtty_soda/.mypy_cache/3.13/nacl/encoding.data.json +1 -0
  231. rtty_soda/.mypy_cache/3.13/nacl/encoding.meta.json +1 -0
  232. rtty_soda/.mypy_cache/3.13/nacl/exceptions.data.json +1 -0
  233. rtty_soda/.mypy_cache/3.13/nacl/exceptions.meta.json +1 -0
  234. rtty_soda/.mypy_cache/3.13/nacl/hash.data.json +1 -0
  235. rtty_soda/.mypy_cache/3.13/nacl/hash.meta.json +1 -0
  236. rtty_soda/.mypy_cache/3.13/nacl/public.data.json +1 -0
  237. rtty_soda/.mypy_cache/3.13/nacl/public.meta.json +1 -0
  238. rtty_soda/.mypy_cache/3.13/nacl/pwhash/__init__.data.json +1 -0
  239. rtty_soda/.mypy_cache/3.13/nacl/pwhash/__init__.meta.json +1 -0
  240. rtty_soda/.mypy_cache/3.13/nacl/pwhash/_argon2.data.json +1 -0
  241. rtty_soda/.mypy_cache/3.13/nacl/pwhash/_argon2.meta.json +1 -0
  242. rtty_soda/.mypy_cache/3.13/nacl/pwhash/argon2i.data.json +1 -0
  243. rtty_soda/.mypy_cache/3.13/nacl/pwhash/argon2i.meta.json +1 -0
  244. rtty_soda/.mypy_cache/3.13/nacl/pwhash/argon2id.data.json +1 -0
  245. rtty_soda/.mypy_cache/3.13/nacl/pwhash/argon2id.meta.json +1 -0
  246. rtty_soda/.mypy_cache/3.13/nacl/pwhash/scrypt.data.json +1 -0
  247. rtty_soda/.mypy_cache/3.13/nacl/pwhash/scrypt.meta.json +1 -0
  248. rtty_soda/.mypy_cache/3.13/nacl/secret.data.json +1 -0
  249. rtty_soda/.mypy_cache/3.13/nacl/secret.meta.json +1 -0
  250. rtty_soda/.mypy_cache/3.13/nacl/utils.data.json +1 -0
  251. rtty_soda/.mypy_cache/3.13/nacl/utils.meta.json +1 -0
  252. rtty_soda/.mypy_cache/3.13/numbers.data.json +1 -0
  253. rtty_soda/.mypy_cache/3.13/numbers.meta.json +1 -0
  254. rtty_soda/.mypy_cache/3.13/opcode.data.json +1 -0
  255. rtty_soda/.mypy_cache/3.13/opcode.meta.json +1 -0
  256. rtty_soda/.mypy_cache/3.13/operator.data.json +1 -0
  257. rtty_soda/.mypy_cache/3.13/operator.meta.json +1 -0
  258. rtty_soda/.mypy_cache/3.13/os/__init__.data.json +1 -0
  259. rtty_soda/.mypy_cache/3.13/os/__init__.meta.json +1 -0
  260. rtty_soda/.mypy_cache/3.13/os/path.data.json +1 -0
  261. rtty_soda/.mypy_cache/3.13/os/path.meta.json +1 -0
  262. rtty_soda/.mypy_cache/3.13/pathlib/__init__.data.json +1 -0
  263. rtty_soda/.mypy_cache/3.13/pathlib/__init__.meta.json +1 -0
  264. rtty_soda/.mypy_cache/3.13/pickle.data.json +1 -0
  265. rtty_soda/.mypy_cache/3.13/pickle.meta.json +1 -0
  266. rtty_soda/.mypy_cache/3.13/posixpath.data.json +1 -0
  267. rtty_soda/.mypy_cache/3.13/posixpath.meta.json +1 -0
  268. rtty_soda/.mypy_cache/3.13/pydantic/__init__.data.json +1 -0
  269. rtty_soda/.mypy_cache/3.13/pydantic/__init__.meta.json +1 -0
  270. rtty_soda/.mypy_cache/3.13/pydantic/_internal/__init__.data.json +1 -0
  271. rtty_soda/.mypy_cache/3.13/pydantic/_internal/__init__.meta.json +1 -0
  272. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_config.data.json +1 -0
  273. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_config.meta.json +1 -0
  274. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_core_metadata.data.json +1 -0
  275. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_core_metadata.meta.json +1 -0
  276. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_core_utils.data.json +1 -0
  277. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_core_utils.meta.json +1 -0
  278. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_dataclasses.data.json +1 -0
  279. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_dataclasses.meta.json +1 -0
  280. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_decorators.data.json +1 -0
  281. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_decorators.meta.json +1 -0
  282. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_decorators_v1.data.json +1 -0
  283. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_decorators_v1.meta.json +1 -0
  284. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_discriminated_union.data.json +1 -0
  285. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_discriminated_union.meta.json +1 -0
  286. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_docs_extraction.data.json +1 -0
  287. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_docs_extraction.meta.json +1 -0
  288. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_fields.data.json +1 -0
  289. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_fields.meta.json +1 -0
  290. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_forward_ref.data.json +1 -0
  291. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_forward_ref.meta.json +1 -0
  292. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_generate_schema.data.json +1 -0
  293. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_generate_schema.meta.json +1 -0
  294. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_generics.data.json +1 -0
  295. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_generics.meta.json +1 -0
  296. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_import_utils.data.json +1 -0
  297. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_import_utils.meta.json +1 -0
  298. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_internal_dataclass.data.json +1 -0
  299. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_internal_dataclass.meta.json +1 -0
  300. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_known_annotated_metadata.data.json +1 -0
  301. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_known_annotated_metadata.meta.json +1 -0
  302. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_mock_val_ser.data.json +1 -0
  303. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_mock_val_ser.meta.json +1 -0
  304. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_model_construction.data.json +1 -0
  305. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_model_construction.meta.json +1 -0
  306. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_namespace_utils.data.json +1 -0
  307. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_namespace_utils.meta.json +1 -0
  308. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_repr.data.json +1 -0
  309. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_repr.meta.json +1 -0
  310. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_schema_gather.data.json +1 -0
  311. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_schema_gather.meta.json +1 -0
  312. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_schema_generation_shared.data.json +1 -0
  313. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_schema_generation_shared.meta.json +1 -0
  314. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_serializers.data.json +1 -0
  315. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_serializers.meta.json +1 -0
  316. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_signature.data.json +1 -0
  317. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_signature.meta.json +1 -0
  318. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_typing_extra.data.json +1 -0
  319. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_typing_extra.meta.json +1 -0
  320. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_utils.data.json +1 -0
  321. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_utils.meta.json +1 -0
  322. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_validate_call.data.json +1 -0
  323. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_validate_call.meta.json +1 -0
  324. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_validators.data.json +1 -0
  325. rtty_soda/.mypy_cache/3.13/pydantic/_internal/_validators.meta.json +1 -0
  326. rtty_soda/.mypy_cache/3.13/pydantic/_migration.data.json +1 -0
  327. rtty_soda/.mypy_cache/3.13/pydantic/_migration.meta.json +1 -0
  328. rtty_soda/.mypy_cache/3.13/pydantic/aliases.data.json +1 -0
  329. rtty_soda/.mypy_cache/3.13/pydantic/aliases.meta.json +1 -0
  330. rtty_soda/.mypy_cache/3.13/pydantic/annotated_handlers.data.json +1 -0
  331. rtty_soda/.mypy_cache/3.13/pydantic/annotated_handlers.meta.json +1 -0
  332. rtty_soda/.mypy_cache/3.13/pydantic/color.data.json +1 -0
  333. rtty_soda/.mypy_cache/3.13/pydantic/color.meta.json +1 -0
  334. rtty_soda/.mypy_cache/3.13/pydantic/config.data.json +1 -0
  335. rtty_soda/.mypy_cache/3.13/pydantic/config.meta.json +1 -0
  336. rtty_soda/.mypy_cache/3.13/pydantic/dataclasses.data.json +1 -0
  337. rtty_soda/.mypy_cache/3.13/pydantic/dataclasses.meta.json +1 -0
  338. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/__init__.data.json +1 -0
  339. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/__init__.meta.json +1 -0
  340. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/class_validators.data.json +1 -0
  341. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/class_validators.meta.json +1 -0
  342. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/config.data.json +1 -0
  343. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/config.meta.json +1 -0
  344. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/copy_internals.data.json +1 -0
  345. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/copy_internals.meta.json +1 -0
  346. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/json.data.json +1 -0
  347. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/json.meta.json +1 -0
  348. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/parse.data.json +1 -0
  349. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/parse.meta.json +1 -0
  350. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/tools.data.json +1 -0
  351. rtty_soda/.mypy_cache/3.13/pydantic/deprecated/tools.meta.json +1 -0
  352. rtty_soda/.mypy_cache/3.13/pydantic/errors.data.json +1 -0
  353. rtty_soda/.mypy_cache/3.13/pydantic/errors.meta.json +1 -0
  354. rtty_soda/.mypy_cache/3.13/pydantic/fields.data.json +1 -0
  355. rtty_soda/.mypy_cache/3.13/pydantic/fields.meta.json +1 -0
  356. rtty_soda/.mypy_cache/3.13/pydantic/functional_serializers.data.json +1 -0
  357. rtty_soda/.mypy_cache/3.13/pydantic/functional_serializers.meta.json +1 -0
  358. rtty_soda/.mypy_cache/3.13/pydantic/functional_validators.data.json +1 -0
  359. rtty_soda/.mypy_cache/3.13/pydantic/functional_validators.meta.json +1 -0
  360. rtty_soda/.mypy_cache/3.13/pydantic/json_schema.data.json +1 -0
  361. rtty_soda/.mypy_cache/3.13/pydantic/json_schema.meta.json +1 -0
  362. rtty_soda/.mypy_cache/3.13/pydantic/main.data.json +1 -0
  363. rtty_soda/.mypy_cache/3.13/pydantic/main.meta.json +1 -0
  364. rtty_soda/.mypy_cache/3.13/pydantic/networks.data.json +1 -0
  365. rtty_soda/.mypy_cache/3.13/pydantic/networks.meta.json +1 -0
  366. rtty_soda/.mypy_cache/3.13/pydantic/plugin/__init__.data.json +1 -0
  367. rtty_soda/.mypy_cache/3.13/pydantic/plugin/__init__.meta.json +1 -0
  368. rtty_soda/.mypy_cache/3.13/pydantic/plugin/_schema_validator.data.json +1 -0
  369. rtty_soda/.mypy_cache/3.13/pydantic/plugin/_schema_validator.meta.json +1 -0
  370. rtty_soda/.mypy_cache/3.13/pydantic/root_model.data.json +1 -0
  371. rtty_soda/.mypy_cache/3.13/pydantic/root_model.meta.json +1 -0
  372. rtty_soda/.mypy_cache/3.13/pydantic/type_adapter.data.json +1 -0
  373. rtty_soda/.mypy_cache/3.13/pydantic/type_adapter.meta.json +1 -0
  374. rtty_soda/.mypy_cache/3.13/pydantic/types.data.json +1 -0
  375. rtty_soda/.mypy_cache/3.13/pydantic/types.meta.json +1 -0
  376. rtty_soda/.mypy_cache/3.13/pydantic/v1/__init__.data.json +1 -0
  377. rtty_soda/.mypy_cache/3.13/pydantic/v1/__init__.meta.json +1 -0
  378. rtty_soda/.mypy_cache/3.13/pydantic/v1/annotated_types.data.json +1 -0
  379. rtty_soda/.mypy_cache/3.13/pydantic/v1/annotated_types.meta.json +1 -0
  380. rtty_soda/.mypy_cache/3.13/pydantic/v1/class_validators.data.json +1 -0
  381. rtty_soda/.mypy_cache/3.13/pydantic/v1/class_validators.meta.json +1 -0
  382. rtty_soda/.mypy_cache/3.13/pydantic/v1/color.data.json +1 -0
  383. rtty_soda/.mypy_cache/3.13/pydantic/v1/color.meta.json +1 -0
  384. rtty_soda/.mypy_cache/3.13/pydantic/v1/config.data.json +1 -0
  385. rtty_soda/.mypy_cache/3.13/pydantic/v1/config.meta.json +1 -0
  386. rtty_soda/.mypy_cache/3.13/pydantic/v1/dataclasses.data.json +1 -0
  387. rtty_soda/.mypy_cache/3.13/pydantic/v1/dataclasses.meta.json +1 -0
  388. rtty_soda/.mypy_cache/3.13/pydantic/v1/datetime_parse.data.json +1 -0
  389. rtty_soda/.mypy_cache/3.13/pydantic/v1/datetime_parse.meta.json +1 -0
  390. rtty_soda/.mypy_cache/3.13/pydantic/v1/decorator.data.json +1 -0
  391. rtty_soda/.mypy_cache/3.13/pydantic/v1/decorator.meta.json +1 -0
  392. rtty_soda/.mypy_cache/3.13/pydantic/v1/env_settings.data.json +1 -0
  393. rtty_soda/.mypy_cache/3.13/pydantic/v1/env_settings.meta.json +1 -0
  394. rtty_soda/.mypy_cache/3.13/pydantic/v1/error_wrappers.data.json +1 -0
  395. rtty_soda/.mypy_cache/3.13/pydantic/v1/error_wrappers.meta.json +1 -0
  396. rtty_soda/.mypy_cache/3.13/pydantic/v1/errors.data.json +1 -0
  397. rtty_soda/.mypy_cache/3.13/pydantic/v1/errors.meta.json +1 -0
  398. rtty_soda/.mypy_cache/3.13/pydantic/v1/fields.data.json +1 -0
  399. rtty_soda/.mypy_cache/3.13/pydantic/v1/fields.meta.json +1 -0
  400. rtty_soda/.mypy_cache/3.13/pydantic/v1/json.data.json +1 -0
  401. rtty_soda/.mypy_cache/3.13/pydantic/v1/json.meta.json +1 -0
  402. rtty_soda/.mypy_cache/3.13/pydantic/v1/main.data.json +1 -0
  403. rtty_soda/.mypy_cache/3.13/pydantic/v1/main.meta.json +1 -0
  404. rtty_soda/.mypy_cache/3.13/pydantic/v1/networks.data.json +1 -0
  405. rtty_soda/.mypy_cache/3.13/pydantic/v1/networks.meta.json +1 -0
  406. rtty_soda/.mypy_cache/3.13/pydantic/v1/parse.data.json +1 -0
  407. rtty_soda/.mypy_cache/3.13/pydantic/v1/parse.meta.json +1 -0
  408. rtty_soda/.mypy_cache/3.13/pydantic/v1/schema.data.json +1 -0
  409. rtty_soda/.mypy_cache/3.13/pydantic/v1/schema.meta.json +1 -0
  410. rtty_soda/.mypy_cache/3.13/pydantic/v1/tools.data.json +1 -0
  411. rtty_soda/.mypy_cache/3.13/pydantic/v1/tools.meta.json +1 -0
  412. rtty_soda/.mypy_cache/3.13/pydantic/v1/types.data.json +1 -0
  413. rtty_soda/.mypy_cache/3.13/pydantic/v1/types.meta.json +1 -0
  414. rtty_soda/.mypy_cache/3.13/pydantic/v1/typing.data.json +1 -0
  415. rtty_soda/.mypy_cache/3.13/pydantic/v1/typing.meta.json +1 -0
  416. rtty_soda/.mypy_cache/3.13/pydantic/v1/utils.data.json +1 -0
  417. rtty_soda/.mypy_cache/3.13/pydantic/v1/utils.meta.json +1 -0
  418. rtty_soda/.mypy_cache/3.13/pydantic/v1/validators.data.json +1 -0
  419. rtty_soda/.mypy_cache/3.13/pydantic/v1/validators.meta.json +1 -0
  420. rtty_soda/.mypy_cache/3.13/pydantic/v1/version.data.json +1 -0
  421. rtty_soda/.mypy_cache/3.13/pydantic/v1/version.meta.json +1 -0
  422. rtty_soda/.mypy_cache/3.13/pydantic/validate_call_decorator.data.json +1 -0
  423. rtty_soda/.mypy_cache/3.13/pydantic/validate_call_decorator.meta.json +1 -0
  424. rtty_soda/.mypy_cache/3.13/pydantic/version.data.json +1 -0
  425. rtty_soda/.mypy_cache/3.13/pydantic/version.meta.json +1 -0
  426. rtty_soda/.mypy_cache/3.13/pydantic/warnings.data.json +1 -0
  427. rtty_soda/.mypy_cache/3.13/pydantic/warnings.meta.json +1 -0
  428. rtty_soda/.mypy_cache/3.13/pydantic_core/__init__.data.json +1 -0
  429. rtty_soda/.mypy_cache/3.13/pydantic_core/__init__.meta.json +1 -0
  430. rtty_soda/.mypy_cache/3.13/pydantic_core/_pydantic_core.data.json +1 -0
  431. rtty_soda/.mypy_cache/3.13/pydantic_core/_pydantic_core.meta.json +1 -0
  432. rtty_soda/.mypy_cache/3.13/pydantic_core/core_schema.data.json +1 -0
  433. rtty_soda/.mypy_cache/3.13/pydantic_core/core_schema.meta.json +1 -0
  434. rtty_soda/.mypy_cache/3.13/re.data.json +1 -0
  435. rtty_soda/.mypy_cache/3.13/re.meta.json +1 -0
  436. rtty_soda/.mypy_cache/3.13/resource.data.json +1 -0
  437. rtty_soda/.mypy_cache/3.13/resource.meta.json +1 -0
  438. rtty_soda/.mypy_cache/3.13/rtty_soda/__init__.data.json +1 -0
  439. rtty_soda/.mypy_cache/3.13/rtty_soda/__init__.meta.json +1 -0
  440. rtty_soda/.mypy_cache/3.13/rtty_soda/app/__init__.data.json +1 -0
  441. rtty_soda/.mypy_cache/3.13/rtty_soda/app/__init__.meta.json +1 -0
  442. rtty_soda/.mypy_cache/3.13/rtty_soda/app/soda_private_key.data.json +1 -0
  443. rtty_soda/.mypy_cache/3.13/rtty_soda/app/soda_private_key.meta.json +1 -0
  444. rtty_soda/.mypy_cache/3.13/rtty_soda/app/soda_public_key.data.json +1 -0
  445. rtty_soda/.mypy_cache/3.13/rtty_soda/app/soda_public_key.meta.json +1 -0
  446. rtty_soda/.mypy_cache/3.13/rtty_soda/archivers.data.json +1 -0
  447. rtty_soda/.mypy_cache/3.13/rtty_soda/archivers.meta.json +1 -0
  448. rtty_soda/.mypy_cache/3.13/rtty_soda/cli_io/message_io.data.json +1 -0
  449. rtty_soda/.mypy_cache/3.13/rtty_soda/cli_io/message_io.meta.json +1 -0
  450. rtty_soda/.mypy_cache/3.13/rtty_soda/cli_io.data.json +1 -0
  451. rtty_soda/.mypy_cache/3.13/rtty_soda/cli_io.meta.json +1 -0
  452. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/__init__.data.json +1 -0
  453. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/__init__.meta.json +1 -0
  454. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/kdf.data.json +1 -0
  455. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/kdf.meta.json +1 -0
  456. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/private_key_ext.data.json +1 -0
  457. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/private_key_ext.meta.json +1 -0
  458. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/public.data.json +1 -0
  459. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/public.meta.json +1 -0
  460. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/public_key_ext.data.json +1 -0
  461. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/public_key_ext.meta.json +1 -0
  462. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/secret.data.json +1 -0
  463. rtty_soda/.mypy_cache/3.13/rtty_soda/cryptography/secret.meta.json +1 -0
  464. rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/__init__.data.json +1 -0
  465. rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/__init__.meta.json +1 -0
  466. rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base26_encoder.data.json +1 -0
  467. rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base26_encoder.meta.json +1 -0
  468. rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base36_encoder.data.json +1 -0
  469. rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base36_encoder.meta.json +1 -0
  470. rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base94_encoder.data.json +1 -0
  471. rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/base94_encoder.meta.json +1 -0
  472. rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/functions.data.json +1 -0
  473. rtty_soda/.mypy_cache/3.13/rtty_soda/encoders/functions.meta.json +1 -0
  474. rtty_soda/.mypy_cache/3.13/rtty_soda/error_search.data.json +1 -0
  475. rtty_soda/.mypy_cache/3.13/rtty_soda/error_search.meta.json +1 -0
  476. rtty_soda/.mypy_cache/3.13/rtty_soda/format_table.data.json +1 -0
  477. rtty_soda/.mypy_cache/3.13/rtty_soda/format_table.meta.json +1 -0
  478. rtty_soda/.mypy_cache/3.13/rtty_soda/handles/__init__.data.json +1 -0
  479. rtty_soda/.mypy_cache/3.13/rtty_soda/handles/__init__.meta.json +1 -0
  480. rtty_soda/.mypy_cache/3.13/rtty_soda/handles/message_handle.data.json +1 -0
  481. rtty_soda/.mypy_cache/3.13/rtty_soda/handles/message_handle.meta.json +1 -0
  482. rtty_soda/.mypy_cache/3.13/rtty_soda/handles/private_key_handle.data.json +1 -0
  483. rtty_soda/.mypy_cache/3.13/rtty_soda/handles/private_key_handle.meta.json +1 -0
  484. rtty_soda/.mypy_cache/3.13/rtty_soda/handles/public_key_handle.data.json +1 -0
  485. rtty_soda/.mypy_cache/3.13/rtty_soda/handles/public_key_handle.meta.json +1 -0
  486. rtty_soda/.mypy_cache/3.13/rtty_soda/handles/types.data.json +1 -0
  487. rtty_soda/.mypy_cache/3.13/rtty_soda/handles/types.meta.json +1 -0
  488. rtty_soda/.mypy_cache/3.13/rtty_soda/io_utils.data.json +1 -0
  489. rtty_soda/.mypy_cache/3.13/rtty_soda/io_utils.meta.json +1 -0
  490. rtty_soda/.mypy_cache/3.13/rtty_soda/main.data.json +1 -0
  491. rtty_soda/.mypy_cache/3.13/rtty_soda/main.meta.json +1 -0
  492. rtty_soda/.mypy_cache/3.13/shlex.data.json +1 -0
  493. rtty_soda/.mypy_cache/3.13/shlex.meta.json +1 -0
  494. rtty_soda/.mypy_cache/3.13/shutil.data.json +1 -0
  495. rtty_soda/.mypy_cache/3.13/shutil.meta.json +1 -0
  496. rtty_soda/.mypy_cache/3.13/signal.data.json +1 -0
  497. rtty_soda/.mypy_cache/3.13/signal.meta.json +1 -0
  498. rtty_soda/.mypy_cache/3.13/sre_compile.data.json +1 -0
  499. rtty_soda/.mypy_cache/3.13/sre_compile.meta.json +1 -0
  500. rtty_soda/.mypy_cache/3.13/sre_constants.data.json +1 -0
  501. rtty_soda/.mypy_cache/3.13/sre_constants.meta.json +1 -0
  502. rtty_soda/.mypy_cache/3.13/sre_parse.data.json +1 -0
  503. rtty_soda/.mypy_cache/3.13/sre_parse.meta.json +1 -0
  504. rtty_soda/.mypy_cache/3.13/stat.data.json +1 -0
  505. rtty_soda/.mypy_cache/3.13/stat.meta.json +1 -0
  506. rtty_soda/.mypy_cache/3.13/string/__init__.data.json +1 -0
  507. rtty_soda/.mypy_cache/3.13/string/__init__.meta.json +1 -0
  508. rtty_soda/.mypy_cache/3.13/subprocess.data.json +1 -0
  509. rtty_soda/.mypy_cache/3.13/subprocess.meta.json +1 -0
  510. rtty_soda/.mypy_cache/3.13/sys/__init__.data.json +1 -0
  511. rtty_soda/.mypy_cache/3.13/sys/__init__.meta.json +1 -0
  512. rtty_soda/.mypy_cache/3.13/sys/_monitoring.data.json +1 -0
  513. rtty_soda/.mypy_cache/3.13/sys/_monitoring.meta.json +1 -0
  514. rtty_soda/.mypy_cache/3.13/tarfile.data.json +1 -0
  515. rtty_soda/.mypy_cache/3.13/tarfile.meta.json +1 -0
  516. rtty_soda/.mypy_cache/3.13/tempfile.data.json +1 -0
  517. rtty_soda/.mypy_cache/3.13/tempfile.meta.json +1 -0
  518. rtty_soda/.mypy_cache/3.13/termios.data.json +1 -0
  519. rtty_soda/.mypy_cache/3.13/termios.meta.json +1 -0
  520. rtty_soda/.mypy_cache/3.13/textwrap.data.json +1 -0
  521. rtty_soda/.mypy_cache/3.13/textwrap.meta.json +1 -0
  522. rtty_soda/.mypy_cache/3.13/threading.data.json +1 -0
  523. rtty_soda/.mypy_cache/3.13/threading.meta.json +1 -0
  524. rtty_soda/.mypy_cache/3.13/time.data.json +1 -0
  525. rtty_soda/.mypy_cache/3.13/time.meta.json +1 -0
  526. rtty_soda/.mypy_cache/3.13/tty.data.json +1 -0
  527. rtty_soda/.mypy_cache/3.13/tty.meta.json +1 -0
  528. rtty_soda/.mypy_cache/3.13/types.data.json +1 -0
  529. rtty_soda/.mypy_cache/3.13/types.meta.json +1 -0
  530. rtty_soda/.mypy_cache/3.13/typing.data.json +1 -0
  531. rtty_soda/.mypy_cache/3.13/typing.meta.json +1 -0
  532. rtty_soda/.mypy_cache/3.13/typing_extensions.data.json +1 -0
  533. rtty_soda/.mypy_cache/3.13/typing_extensions.meta.json +1 -0
  534. rtty_soda/.mypy_cache/3.13/typing_inspection/__init__.data.json +1 -0
  535. rtty_soda/.mypy_cache/3.13/typing_inspection/__init__.meta.json +1 -0
  536. rtty_soda/.mypy_cache/3.13/typing_inspection/introspection.data.json +1 -0
  537. rtty_soda/.mypy_cache/3.13/typing_inspection/introspection.meta.json +1 -0
  538. rtty_soda/.mypy_cache/3.13/typing_inspection/typing_objects.data.json +1 -0
  539. rtty_soda/.mypy_cache/3.13/typing_inspection/typing_objects.meta.json +1 -0
  540. rtty_soda/.mypy_cache/3.13/uuid.data.json +1 -0
  541. rtty_soda/.mypy_cache/3.13/uuid.meta.json +1 -0
  542. rtty_soda/.mypy_cache/3.13/warnings.data.json +1 -0
  543. rtty_soda/.mypy_cache/3.13/warnings.meta.json +1 -0
  544. rtty_soda/.mypy_cache/3.13/weakref.data.json +1 -0
  545. rtty_soda/.mypy_cache/3.13/weakref.meta.json +1 -0
  546. rtty_soda/.mypy_cache/3.13/zipfile/__init__.data.json +1 -0
  547. rtty_soda/.mypy_cache/3.13/zipfile/__init__.meta.json +1 -0
  548. rtty_soda/.mypy_cache/3.13/zipfile/_path/__init__.data.json +1 -0
  549. rtty_soda/.mypy_cache/3.13/zipfile/_path/__init__.meta.json +1 -0
  550. rtty_soda/.mypy_cache/3.13/zipimport.data.json +1 -0
  551. rtty_soda/.mypy_cache/3.13/zipimport.meta.json +1 -0
  552. rtty_soda/.mypy_cache/3.13/zlib.data.json +1 -0
  553. rtty_soda/.mypy_cache/3.13/zlib.meta.json +1 -0
  554. rtty_soda/.mypy_cache/3.13/zoneinfo/__init__.data.json +1 -0
  555. rtty_soda/.mypy_cache/3.13/zoneinfo/__init__.meta.json +1 -0
  556. rtty_soda/.mypy_cache/3.13/zoneinfo/_common.data.json +1 -0
  557. rtty_soda/.mypy_cache/3.13/zoneinfo/_common.meta.json +1 -0
  558. rtty_soda/.mypy_cache/3.13/zoneinfo/_tzpath.data.json +1 -0
  559. rtty_soda/.mypy_cache/3.13/zoneinfo/_tzpath.meta.json +1 -0
  560. rtty_soda/.mypy_cache/CACHEDIR.TAG +3 -0
  561. rtty_soda/__init__.py +0 -0
  562. rtty_soda/archivers.py +57 -0
  563. rtty_soda/cli_io.py +77 -0
  564. rtty_soda/cryptography/__init__.py +0 -0
  565. rtty_soda/cryptography/kdf.py +42 -0
  566. rtty_soda/cryptography/public.py +20 -0
  567. rtty_soda/cryptography/secret.py +17 -0
  568. rtty_soda/encoders/__init__.py +26 -0
  569. rtty_soda/encoders/base26_encoder.py +19 -0
  570. rtty_soda/encoders/base36_encoder.py +19 -0
  571. rtty_soda/encoders/base94_encoder.py +17 -0
  572. rtty_soda/encoders/functions.py +48 -0
  573. rtty_soda/main.py +318 -0
  574. rtty_soda/py.typed +0 -0
  575. rtty_soda-0.1.2.dist-info/METADATA +254 -0
  576. rtty_soda-0.1.2.dist-info/RECORD +578 -0
  577. rtty_soda-0.1.2.dist-info/WHEEL +4 -0
  578. 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.